Made MooGladeXML a GObject; fixed not-freeing of it

master
Yevgen Muntyan 2006-02-25 23:45:30 -06:00
parent f269a4a40a
commit 21cfa159be
14 changed files with 140 additions and 145 deletions

View File

@ -17,3 +17,5 @@ ltmain\.sh
missing
.*\.pyc
.*~
.*\.pcs
.*\.kdevses

View File

@ -428,7 +428,7 @@ moo_edit_save_multiple_changes_dialog (GSList *docs,
g_free (msg);
gtk_widget_destroy (dialog);
moo_glade_xml_unref (xml);
g_object_unref (xml);
return retval;
}
@ -745,7 +745,7 @@ moo_text_prompt_on_replace_dialog (GtkWidget *parent)
xml = moo_glade_xml_new_from_buf (MOO_TEXT_FIND_GLADE_UI, -1,
"prompt_on_replace_dialog", NULL);
dialog = moo_glade_xml_get_widget (xml, "prompt_on_replace_dialog");
moo_glade_xml_unref (xml);
g_object_unref (xml);
moo_position_window (dialog, parent, FALSE, FALSE, 0, 0);

View File

@ -89,7 +89,7 @@ moo_find_init (MooFind *find)
if (!moo_glade_xml_parse_memory (find->xml, MOO_TEXT_FIND_GLADE_UI, -1, "vbox"))
{
moo_glade_xml_unref (find->xml);
g_object_unref (find->xml);
find->xml = NULL;
g_return_if_reached ();
}
@ -196,7 +196,7 @@ moo_find_finalize (GObject *object)
{
MooFind *find = MOO_FIND (object);
moo_glade_xml_unref (find->xml);
g_object_unref (find->xml);
egg_regex_unref (find->regex);
G_OBJECT_CLASS(moo_find_parent_class)->finalize (object);
@ -972,7 +972,7 @@ moo_text_view_run_goto_line (GtkTextView *view)
moo_position_window (dialog, GTK_WIDGET (view), FALSE, FALSE, 0, 0);
moo_glade_xml_unref (xml);
g_object_unref (xml);
if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
{

View File

@ -664,7 +664,7 @@ save_as_dialog (GtkWidget *parent,
out:
if (xml)
moo_glade_xml_unref (xml);
g_object_unref (xml);
if (dialog)
gtk_widget_destroy (dialog);
return fullname;

View File

@ -815,9 +815,9 @@ find_window_plugin_destroy (WindowStuff *stuff)
if (stuff->find_dialog)
gtk_widget_destroy (stuff->find_dialog);
if (stuff->grep_xml)
moo_glade_xml_unref (stuff->grep_xml);
g_object_unref (stuff->grep_xml);
if (stuff->find_xml)
moo_glade_xml_unref (stuff->find_xml);
g_object_unref (stuff->find_xml);
if (stuff->grep_completion)
g_object_unref (stuff->grep_completion);
if (stuff->find_completion)

View File

@ -36,6 +36,13 @@
(gtype-id "MOO_TYPE_FILTER_MGR")
)
(define-object GladeXML
(in-module "Moo")
(parent "GObject")
(c-name "MooGladeXML")
(gtype-id "MOO_TYPE_GLADE_XML")
)
(define-object HistoryEntry
(in-module "Moo")
(parent "MooCombo")
@ -849,18 +856,6 @@
)
)
(define-method ref
(of-object "MooGladeXML")
(c-name "moo_glade_xml_ref")
(return-type "MooGladeXML*")
)
(define-method unref
(of-object "MooGladeXML")
(c-name "moo_glade_xml_unref")
(return-type "none")
)
(define-method get_widget
(of-object "MooGladeXML")
(c-name "moo_glade_xml_get_widget")

View File

@ -579,7 +579,7 @@ moo_accel_prefs_page_new (MooActionGroup *actions)
stuff->shortcut = moo_glade_xml_get_widget (xml, "shortcut");
stuff->default_label = moo_glade_xml_get_widget (xml, "default_label");
moo_glade_xml_unref (xml);
g_object_unref (xml);
stuff->store = gtk_tree_store_new (N_COLUMNS,
G_TYPE_STRING,
@ -1055,7 +1055,7 @@ moo_accel_prefs_dialog_new (MooActionGroup *group)
page_holder = moo_glade_xml_get_widget (xml, "page_holder");
gtk_container_add (GTK_CONTAINER (page_holder), page);
moo_glade_xml_unref (xml);
g_object_unref (xml);
#if GTK_MINOR_VERSION >= 6
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),

View File

@ -292,7 +292,7 @@ static void moo_accel_button_clicked (MooAccelButton *button)
response = gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
moo_glade_xml_unref (xml);
g_object_unref (xml);
if (response == GTK_RESPONSE_OK)
{

View File

@ -820,7 +820,7 @@ GtkWidget *moo_bookmark_mgr_get_editor (MooBookmarkMgr *mgr)
g_assert (dialog != NULL);
g_object_set_data_full (G_OBJECT (dialog), "dialog-glade-xml",
xml, (GDestroyNotify) moo_glade_xml_unref);
xml, (GDestroyNotify) g_object_unref);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);

View File

@ -55,7 +55,7 @@ moo_file_props_dialog_init (MooFilePropsDialog *dialog)
if (!moo_glade_xml_parse_memory (dialog->xml, MOO_FILE_PROPS_GLADE_UI, -1, "notebook"))
{
moo_glade_xml_unref (dialog->xml);
g_object_unref (dialog->xml);
dialog->xml = NULL;
g_return_if_reached ();
}
@ -263,7 +263,7 @@ moo_file_props_dialog_destroy (GtkObject *object)
if (dialog->xml)
{
moo_glade_xml_unref (dialog->xml);
g_object_unref (dialog->xml);
if (dialog->file)
moo_file_unref (dialog->file);
if (dialog->folder)
@ -341,7 +341,7 @@ moo_create_folder_dialog (GtkWidget *parent,
else
new_folder_name = NULL;
moo_glade_xml_unref (xml);
g_object_unref (xml);
gtk_widget_destroy (dialog);
return new_folder_name;
}
@ -484,7 +484,7 @@ moo_file_view_save_drop_dialog (GtkWidget *parent,
}
out:
moo_glade_xml_unref (xml);
g_object_unref (xml);
gtk_widget_destroy (dialog);
g_free (start_name);
return fullname;

View File

@ -32,6 +32,9 @@
#endif
G_DEFINE_TYPE (MooGladeXML, moo_glade_xml, G_TYPE_OBJECT)
#define FOREACH_ELM_START(parent,elm) \
G_STMT_START { \
MooMarkupNode *elm; \
@ -117,8 +120,7 @@ struct _PackingProps {
PackPropMask mask;
};
struct _MooGladeXML {
guint ref_count;
struct _MooGladeXMLPrivate {
MooMarkupDoc *doc;
MooMarkupNode *root;
GHashTable *widgets;
@ -181,7 +183,7 @@ static gboolean parse_property (GParamSpec *param_spec,
static gboolean moo_glade_xml_parse_markup (MooGladeXML *xml,
MooMarkupDoc *doc,
const char *root);
static void moo_glade_xml_free (MooGladeXML *xml);
static void moo_glade_xml_dispose (GObject *object);
static void moo_glade_xml_add_widget (MooGladeXML *xml,
const char *id,
GtkWidget *widget);
@ -408,14 +410,15 @@ connect_signals (MooGladeXML *xml,
if (connect_special_signal (xml, node, signal))
continue;
if (xml->signal_func)
if (xml->priv->signal_func)
{
connected = xml->signal_func (xml, node->id,
node->widget,
signal->name,
signal->handler,
signal->object,
xml->signal_func_data);
connected = xml->priv->signal_func (xml, node->id,
node->widget,
signal->name,
signal->handler,
signal->object,
xml->priv->signal_func_data);
if (connected)
continue;
}
@ -548,7 +551,7 @@ moo_glade_xml_create_widget (MooGladeXML *xml,
g_return_val_if_fail (node != NULL, NULL);
pair = g_hash_table_lookup (xml->id_to_func, node->id);
pair = g_hash_table_lookup (xml->priv->id_to_func, node->id);
if (pair)
{
@ -976,20 +979,20 @@ widget_new (MooGladeXML *xml,
id = moo_markup_get_prop (node, "id");
if (g_hash_table_lookup (xml->id_to_func, id))
if (g_hash_table_lookup (xml->priv->id_to_func, id))
{
type = GTK_TYPE_WIDGET;
}
else
{
type = GPOINTER_TO_SIZE (g_hash_table_lookup (xml->id_to_type, id));
type = GPOINTER_TO_SIZE (g_hash_table_lookup (xml->priv->id_to_type, id));
if (!type)
{
class_name = moo_markup_get_prop (node, "class");
g_return_val_if_fail (id != NULL && class_name != NULL, NULL);
type = GPOINTER_TO_SIZE (g_hash_table_lookup (xml->class_to_type, class_name));
type = GPOINTER_TO_SIZE (g_hash_table_lookup (xml->priv->class_to_type, class_name));
if (!type)
{
@ -1688,55 +1691,33 @@ out:
}
GType
moo_glade_xml_get_type (void)
static void
moo_glade_xml_class_init (MooGladeXMLClass *klass)
{
static GType type = 0;
if (!type)
type = g_boxed_type_register_static ("MooGladeXML",
(GBoxedCopyFunc) moo_glade_xml_ref,
(GBoxedFreeFunc) moo_glade_xml_unref);
return type;
G_OBJECT_CLASS(klass)->dispose = moo_glade_xml_dispose;
}
MooGladeXML*
moo_glade_xml_ref (MooGladeXML *xml)
static void
moo_glade_xml_init (MooGladeXML *xml)
{
if (xml)
++xml->ref_count;
return xml;
xml->priv = g_new0 (MooGladeXMLPrivate, 1);
xml->priv->widgets = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
xml->priv->class_to_type = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
xml->priv->id_to_type = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
xml->priv->id_to_func = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, (GDestroyNotify) func_data_pair_free);
}
void
moo_glade_xml_unref (MooGladeXML *xml)
{
if (xml && !--xml->ref_count)
moo_glade_xml_free (xml);
}
MooGladeXML*
MooGladeXML *
moo_glade_xml_new_empty (void)
{
MooGladeXML *xml;
xml = g_new0 (MooGladeXML, 1);
xml->widgets = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
xml->class_to_type = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
xml->id_to_type = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
xml->id_to_func = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free,
(GDestroyNotify) func_data_pair_free);
return xml;
return g_object_new (MOO_TYPE_GLADE_XML, NULL);
}
@ -1822,7 +1803,7 @@ moo_glade_xml_new (const char *file,
if (!moo_glade_xml_parse_file (xml, file, root))
{
moo_glade_xml_unref (xml);
g_object_unref (xml);
return NULL;
}
@ -1844,7 +1825,7 @@ moo_glade_xml_new_from_buf (const char *buffer,
if (!moo_glade_xml_parse_memory (xml, buffer, size, root))
{
moo_glade_xml_unref (xml);
g_object_unref (xml);
return NULL;
}
@ -1898,7 +1879,7 @@ moo_glade_xml_parse_markup (MooGladeXML *xml,
Widget *widget;
g_return_val_if_fail (doc != NULL, FALSE);
g_return_val_if_fail (xml->doc == NULL, FALSE);
g_return_val_if_fail (xml->priv->doc == NULL, FALSE);
glade_elm = moo_markup_get_root_element (doc, "glade-interface");
g_return_val_if_fail (glade_elm != NULL, FALSE);
@ -1942,16 +1923,16 @@ moo_glade_xml_parse_markup (MooGladeXML *xml,
return FALSE;
}
xml->doc = moo_markup_doc_ref (doc);
xml->root = root;
xml->priv->doc = moo_markup_doc_ref (doc);
xml->priv->root = root;
widget = widget_new (xml, NULL, xml->root);
widget = widget_new (xml, NULL, xml->priv->root);
if (!widget)
{
moo_markup_doc_unref (xml->doc);
xml->doc = NULL;
xml->root = NULL;
moo_markup_doc_unref (xml->priv->doc);
xml->priv->doc = NULL;
xml->priv->root = NULL;
return FALSE;
}
@ -1959,9 +1940,9 @@ moo_glade_xml_parse_markup (MooGladeXML *xml,
if (!moo_glade_xml_build (xml, widget))
{
moo_markup_doc_unref (xml->doc);
xml->doc = NULL;
xml->root = NULL;
moo_markup_doc_unref (xml->priv->doc);
xml->priv->doc = NULL;
xml->priv->root = NULL;
widget_free (widget);
return FALSE;
}
@ -1970,45 +1951,36 @@ moo_glade_xml_parse_markup (MooGladeXML *xml,
gtk_widget_show_all (widget->widget);
#endif
xml->root_id = g_strdup (widget->id);
xml->priv->root_id = g_strdup (widget->id);
return TRUE;
}
static gboolean
cmp_widget (G_GNUC_UNUSED gpointer key,
gpointer value,
gpointer widget)
{
return widget == value;
}
static const char*
get_widget_id (MooGladeXML *xml,
GtkWidget *widget)
{
return g_hash_table_find (xml->widgets,
(GHRFunc) cmp_widget,
widget);
}
GtkWidget*
moo_glade_xml_get_root (MooGladeXML *xml)
{
g_return_val_if_fail (xml != NULL, NULL);
return moo_glade_xml_get_widget (xml, xml->root_id);
return moo_glade_xml_get_widget (xml, xml->priv->root_id);
}
static gboolean
cmp_widget (G_GNUC_UNUSED gpointer key,
gpointer widget,
gpointer dead)
{
return widget == dead;
}
static void
widget_destroyed (MooGladeXML *xml,
gpointer widget)
{
const char *id = get_widget_id (xml, widget);
g_return_if_fail (id != NULL);
g_hash_table_remove (xml->widgets, id);
guint removed;
removed = g_hash_table_foreach_remove (xml->priv->widgets,
(GHRFunc) cmp_widget, widget);
g_return_if_fail (removed == 1);
}
static void
@ -2018,8 +1990,8 @@ moo_glade_xml_add_widget (MooGladeXML *xml,
{
g_return_if_fail (id != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
g_hash_table_insert (xml->widgets, g_strdup (id), widget);
g_assert (!g_hash_table_lookup (xml->priv->widgets, id));
g_hash_table_insert (xml->priv->widgets, g_strdup (id), widget);
g_object_weak_ref (G_OBJECT (widget), (GWeakNotify) widget_destroyed, xml);
}
@ -2033,20 +2005,25 @@ unref_widget (G_GNUC_UNUSED gpointer key,
}
static void
moo_glade_xml_free (MooGladeXML *xml)
moo_glade_xml_dispose (GObject *object)
{
if (xml)
MooGladeXML *xml = MOO_GLADE_XML (object);
if (xml->priv)
{
g_hash_table_foreach (xml->widgets,
(GHFunc) unref_widget, NULL);
g_hash_table_destroy (xml->widgets);
g_hash_table_destroy (xml->class_to_type);
g_hash_table_destroy (xml->id_to_type);
g_hash_table_destroy (xml->id_to_func);
moo_markup_doc_unref (xml->doc);
g_free (xml->root_id);
g_free (xml);
g_hash_table_foreach (xml->priv->widgets,
(GHFunc) unref_widget, xml);
g_hash_table_destroy (xml->priv->widgets);
g_hash_table_destroy (xml->priv->class_to_type);
g_hash_table_destroy (xml->priv->id_to_type);
g_hash_table_destroy (xml->priv->id_to_func);
moo_markup_doc_unref (xml->priv->doc);
g_free (xml->priv->root_id);
g_free (xml->priv);
xml->priv = NULL;
}
G_OBJECT_CLASS(moo_glade_xml_parent_class)->dispose (object);
}
@ -2056,7 +2033,7 @@ moo_glade_xml_get_widget (MooGladeXML *xml,
{
g_return_val_if_fail (xml != NULL, NULL);
g_return_val_if_fail (id != NULL, NULL);
return g_hash_table_lookup (xml->widgets, id);
return g_hash_table_lookup (xml->priv->widgets, id);
}
@ -2069,11 +2046,11 @@ moo_glade_xml_map_class (MooGladeXML *xml,
g_return_if_fail (class_name != NULL);
if (type)
g_hash_table_insert (xml->class_to_type,
g_hash_table_insert (xml->priv->class_to_type,
g_strdup (class_name),
GSIZE_TO_POINTER (type));
else
g_hash_table_remove (xml->class_to_type,
g_hash_table_remove (xml->priv->class_to_type,
class_name);
}
@ -2087,11 +2064,11 @@ moo_glade_xml_map_id (MooGladeXML *xml,
g_return_if_fail (id != NULL);
if (use_type)
g_hash_table_insert (xml->id_to_type,
g_hash_table_insert (xml->priv->id_to_type,
g_strdup (id),
GSIZE_TO_POINTER (use_type));
else
g_hash_table_remove (xml->id_to_type, id);
g_hash_table_remove (xml->priv->id_to_type, id);
}
@ -2104,11 +2081,11 @@ void moo_glade_xml_map_custom (MooGladeXML *xml,
g_return_if_fail (id != NULL);
if (func)
g_hash_table_insert (xml->id_to_func,
g_hash_table_insert (xml->priv->id_to_func,
g_strdup (id),
func_data_pair_new (func, data));
else
g_hash_table_remove (xml->id_to_func, id);
g_hash_table_remove (xml->priv->id_to_func, id);
}
@ -2118,8 +2095,8 @@ moo_glade_xml_map_signal (MooGladeXML *xml,
gpointer data)
{
g_return_if_fail (xml != NULL);
xml->signal_func = func;
xml->signal_func_data = data;
xml->priv->signal_func = func;
xml->priv->signal_func_data = data;
}

View File

@ -18,9 +18,29 @@
G_BEGIN_DECLS
typedef struct _MooGladeXML MooGladeXML;
#define MOO_TYPE_GLADE_XML (moo_glade_xml_get_type ())
#define MOO_TYPE_GLADE_XML (moo_glade_xml_get_type ())
#define MOO_GLADE_XML(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_GLADE_XML, MooGladeXML))
#define MOO_GLADE_XML_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_GLADE_XML, MooGladeXMLClass))
#define MOO_IS_GLADE_XML(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_GLADE_XML))
#define MOO_IS_GLADE_XML_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_GLADE_XML))
#define MOO_GLADE_XML_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_GLADE_XML, MooGladeXMLClass))
typedef struct _MooGladeXML MooGladeXML;
typedef struct _MooGladeXMLPrivate MooGladeXMLPrivate;
typedef struct _MooGladeXMLClass MooGladeXMLClass;
struct _MooGladeXML {
GObject base;
MooGladeXMLPrivate *priv;
};
struct _MooGladeXMLClass {
GObjectClass base_class;
};
typedef GtkWidget* (*MooGladeCreateFunc) (MooGladeXML *xml,
const char *id,
@ -68,9 +88,6 @@ MooGladeXML *moo_glade_xml_new_from_buf (const char *buffer,
const char *root,
const char *unused);
MooGladeXML *moo_glade_xml_ref (MooGladeXML *xml);
void moo_glade_xml_unref (MooGladeXML *xml);
gpointer moo_glade_xml_get_widget (MooGladeXML *xml,
const char *id);
GtkWidget *moo_glade_xml_get_root (MooGladeXML *xml);

View File

@ -179,6 +179,10 @@ moo_prefs_dialog_destroy (GtkObject *object)
if (dialog->store)
{
GtkTreeSelection *selection = gtk_tree_view_get_selection (dialog->pages_list);
g_signal_handlers_disconnect_by_func (selection,
(gpointer) pages_list_selection_changed,
dialog);
gtk_tree_view_set_model (dialog->pages_list, NULL);
gtk_tree_model_foreach (GTK_TREE_MODEL (dialog->store),
(GtkTreeModelForeachFunc) destroy_page, NULL);

View File

@ -149,7 +149,7 @@ static void moo_prefs_dialog_page_finalize (GObject *object)
if (page->icon)
g_object_unref (page->icon);
if (page->xml)
moo_glade_xml_unref (page->xml);
g_object_unref (page->xml);
g_slist_free (page->widgets);
G_OBJECT_CLASS (moo_prefs_dialog_page_parent_class)->finalize (object);
@ -324,7 +324,7 @@ moo_prefs_dialog_page_new_from_xml (const char *label,
if (!moo_glade_xml_parse_memory (xml, buffer, buffer_size, page_id))
{
g_critical ("%s: could not parse xml", G_STRLOC);
moo_glade_xml_unref (xml);
g_object_unref (xml);
return NULL;
}