While coding a custom widget library i realize we do not take into
account GTK_WIDGET_COMPOSITE_CHILD() and i am not sayin we should but
this make me think we might be able to get rid of get_children() and
get_internal_child functions :)
So, less words more action!
Just take a look at the patch, it only needs some cleanup but you can
get the idea anywas
greets
Juan Pablo
Index: plugins/gtk+/glade-gtk.c
===================================================================
--- plugins/gtk+/glade-gtk.c (revision 1244)
+++ plugins/gtk+/glade-gtk.c (working copy)
@@ -806,8 +806,9 @@ glade_gtk_box_get_first_blank (GtkBox *b
gint gwidget_position;
GladeProperty *property =
glade_widget_get_property (gwidget, "position");
- gwidget_position = g_value_get_int (property->value);
-
+ if (property)
+ gwidget_position = g_value_get_int (property->value);
+
if (gwidget_position > position)
return position;
}
@@ -962,35 +963,6 @@ glade_gtk_box_add_child (GladeWidgetAdap
glade_widget_pack_property_set (gchild, "position", num_children - 1);
}
-GObject * GLADEGTK_API
-glade_gtk_box_get_internal_child (GladeWidgetAdaptor *adaptor,
- GObject *object,
- const gchar *name)
-{
- GList *children, *l;
- GObject *child = NULL;
-
- g_return_val_if_fail (GTK_IS_BOX (object), NULL);
-
- children = l = gtk_container_get_children (GTK_CONTAINER (object));
-
- while (l)
- {
- GladeWidget *gw = glade_widget_get_from_gobject (l->data);
-
- if (gw && gw->internal && strcmp (gw->internal, name) == 0)
- {
- child = G_OBJECT (l->data);
- break;
- }
-
- l= l->next;
- }
- g_list_free (children);
-
- return child;
-}
-
void GLADEGTK_API
glade_gtk_box_remove_child (GladeWidgetAdaptor *adaptor,
GObject *object,
@@ -2976,8 +2948,6 @@ glade_gtk_dialog_post_create (GladeWidge
GtkDialog *dialog = GTK_DIALOG (object);
GladeWidget *widget;
GladeWidget *vbox_widget, *actionarea_widget, *colorsel, *fontsel;
- GladeWidget *save_button = NULL, *close_button = NULL, *ok_button = NULL,
- *cancel_button = NULL, *help_button = NULL, *apply_button = NULL;
g_return_if_fail (GTK_IS_DIALOG (dialog));
@@ -2996,42 +2966,30 @@ glade_gtk_dialog_post_create (GladeWidge
if (GTK_IS_INPUT_DIALOG (object))
{
- save_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_INPUT_DIALOG (dialog)->save_button),
- "save_button", "inputdialog", FALSE, reason);
-
- close_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_INPUT_DIALOG (dialog)->close_button),
- "close_button", "inputdialog", FALSE, reason);
-
+ GtkInputDialog *d = GTK_INPUT_DIALOG (dialog);
+ glade_widget_add_internals (widget,
+ d->save_button, "save_button",
+ d->close_button, "close_button",
+ NULL);
}
else if (GTK_IS_FILE_SELECTION (object))
{
- ok_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_FILE_SELECTION (object)->ok_button),
- "ok_button", "filesel", FALSE, reason);
-
- cancel_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_FILE_SELECTION (object)->cancel_button),
- "cancel_button", "filesel", FALSE, reason);
+ GtkFileSelection *d = GTK_FILE_SELECTION (dialog);
+ glade_widget_add_internals (widget,
+ d->ok_button, "ok_button",
+ d->cancel_button, "cancel_button",
+ NULL);
}
else if (GTK_IS_COLOR_SELECTION_DIALOG (object))
{
- ok_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_COLOR_SELECTION_DIALOG (object)->ok_button),
- "ok_button", "colorsel", FALSE, reason);
-
- cancel_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_COLOR_SELECTION_DIALOG (object)->cancel_button),
- "cancel_button", "colorsel", FALSE, reason);
-
- help_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_COLOR_SELECTION_DIALOG (object)->help_button),
- "help_button", "colorsel", FALSE, reason);
-
- colorsel = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_COLOR_SELECTION_DIALOG (object)->colorsel),
- "color_selection", "colorsel", FALSE, reason);
+ GtkColorSelectionDialog *d = GTK_COLOR_SELECTION_DIALOG (dialog);
+ glade_widget_add_internals (widget,
+ d->ok_button, "ok_button",
+ d->cancel_button, "cancel_button",
+ d->help_button, "help_button",
+ d->colorsel, "color_selection",
+ NULL);
+ colorsel = glade_widget_get_from_gobject (d->colorsel);
/* Set this to 1 at load time, if there are any children then
* size will adjust appropriately (otherwise the default "3" gets
@@ -3043,21 +3001,14 @@ glade_gtk_dialog_post_create (GladeWidge
}
else if (GTK_IS_FONT_SELECTION_DIALOG (object))
{
- ok_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_FONT_SELECTION_DIALOG (object)->ok_button),
- "ok_button", "fontsel", FALSE, reason);
-
- apply_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_FONT_SELECTION_DIALOG (object)->apply_button),
- "apply_button", "fontsel", FALSE, reason);
-
- cancel_button = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_FONT_SELECTION_DIALOG (object)->cancel_button),
- "cancel_button", "fontsel", FALSE, reason);
-
- fontsel = glade_widget_adaptor_create_internal
- (widget, G_OBJECT (GTK_FONT_SELECTION_DIALOG (object)->fontsel),
- "font_selection", "fontsel", FALSE, reason);
+ GtkFontSelectionDialog *d = GTK_FONT_SELECTION_DIALOG (dialog);
+ glade_widget_add_internals (widget,
+ d->ok_button, "ok_button",
+ d->cancel_button, "cancel_button",
+ d->apply_button, "apply_button",
+ d->fontsel, "font_selection",
+ NULL);
+ fontsel = glade_widget_get_from_gobject (d->fontsel);
/* Set this to 1 at load time, if there are any children then
* size will adjust appropriately (otherwise the default "3" gets
@@ -3066,15 +3017,16 @@ glade_gtk_dialog_post_create (GladeWidge
if (reason == GLADE_CREATE_LOAD)
glade_widget_property_set (fontsel, "size", 2);
}
+ else if (GTK_IS_ABOUT_DIALOG (object));
else
{
- vbox_widget = glade_widget_adaptor_create_internal
- (widget, G_OBJECT(dialog->vbox),
- "vbox", "dialog", FALSE, reason);
-
- actionarea_widget = glade_widget_adaptor_create_internal
- (vbox_widget, G_OBJECT(dialog->action_area),
- "action_area", "dialog", FALSE, reason);
+ glade_widget_add_internals (widget,
+ dialog->vbox, "vbox",
+ dialog->action_area, "action_area",
+ NULL);
+
+ vbox_widget = glade_widget_get_from_gobject (dialog->vbox);
+ actionarea_widget = glade_widget_get_from_gobject (dialog->action_area);
/* These properties are controlled by the GtkDialog style properties:
* "content-area-border", "button-spacing" and "action-area-border",
@@ -3106,103 +3058,6 @@ glade_gtk_dialog_post_create (GladeWidge
}
}
-
-GtkWidget * GLADEGTK_API
-glade_gtk_dialog_get_internal_child (GladeWidgetAdaptor *adaptor,
- GtkDialog *dialog,
- const gchar *name)
-{
- GtkWidget *child = NULL;
-
- g_return_val_if_fail (GTK_IS_DIALOG (dialog), NULL);
-
- if (GTK_IS_INPUT_DIALOG (dialog))
- {
- if (strcmp ("close_button", name) == 0)
- child = GTK_INPUT_DIALOG (dialog)->close_button;
- else if (strcmp ("save_button", name) == 0)
- child = GTK_INPUT_DIALOG (dialog)->save_button;
- }
- else if (GTK_IS_FILE_SELECTION (dialog))
- {
- if (strcmp ("ok_button", name) == 0)
- child = GTK_FILE_SELECTION (dialog)->ok_button;
- else if (strcmp ("cancel_button", name) == 0)
- child = GTK_FILE_SELECTION (dialog)->cancel_button;
- }
- else if (GTK_IS_COLOR_SELECTION_DIALOG (dialog))
- {
- if (strcmp ("ok_button", name) == 0)
- child = GTK_COLOR_SELECTION_DIALOG (dialog)->ok_button;
- else if (strcmp ("cancel_button", name) == 0)
- child = GTK_COLOR_SELECTION_DIALOG (dialog)->cancel_button;
- else if (strcmp ("help_button", name) == 0)
- child = GTK_COLOR_SELECTION_DIALOG (dialog)->help_button;
- else if (strcmp ("color_selection", name) == 0)
- child = GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel;
- }
- else if (GTK_IS_FONT_SELECTION_DIALOG (dialog))
- {
- if (strcmp ("ok_button", name) == 0)
- child = GTK_FONT_SELECTION_DIALOG (dialog)->ok_button;
- else if (strcmp ("apply_button", name) == 0)
- child = GTK_FONT_SELECTION_DIALOG (dialog)->apply_button;
- else if (strcmp ("cancel_button", name) == 0)
- child = GTK_FONT_SELECTION_DIALOG (dialog)->cancel_button;
- else if (strcmp ("font_selection", name) == 0)
- child = GTK_FONT_SELECTION_DIALOG (dialog)->fontsel;
- }
- else
- {
- /* Default generic dialog handling
- */
- if (strcmp ("vbox", name) == 0)
- child = dialog->vbox;
- else if (strcmp ("action_area", name) == 0)
- child = dialog->action_area;
- }
-
- return child;
-}
-
-GList * GLADEGTK_API
-glade_gtk_dialog_get_children (GladeWidgetAdaptor *adaptor,
- GtkDialog *dialog)
-{
- GList *list = NULL;
-
- g_return_val_if_fail (GTK_IS_DIALOG (dialog), NULL);
-
- list = glade_util_container_get_all_children (GTK_CONTAINER (dialog));
-
- if (GTK_IS_INPUT_DIALOG (dialog))
- {
- list = g_list_prepend (list, GTK_INPUT_DIALOG (dialog)->close_button);
- list = g_list_prepend (list, GTK_INPUT_DIALOG (dialog)->save_button);
- }
- else if (GTK_IS_FILE_SELECTION (dialog))
- {
- list = g_list_prepend (list, GTK_FILE_SELECTION (dialog)->ok_button);
- list = g_list_prepend (list, GTK_FILE_SELECTION (dialog)->cancel_button);
- }
- else if (GTK_IS_COLOR_SELECTION_DIALOG (dialog))
- {
- list = g_list_prepend (list, GTK_COLOR_SELECTION_DIALOG (dialog)->ok_button);
- list = g_list_prepend (list, GTK_COLOR_SELECTION_DIALOG (dialog)->cancel_button);
- list = g_list_prepend (list, GTK_COLOR_SELECTION_DIALOG (dialog)->help_button);
- list = g_list_prepend (list, GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel);
- }
- else if (GTK_IS_FONT_SELECTION_DIALOG (dialog))
- {
- list = g_list_prepend (list, GTK_FONT_SELECTION_DIALOG (dialog)->ok_button);
- list = g_list_prepend (list, GTK_FONT_SELECTION_DIALOG (dialog)->apply_button);
- list = g_list_prepend (list, GTK_FONT_SELECTION_DIALOG (dialog)->cancel_button);
- list = g_list_prepend (list, GTK_FONT_SELECTION_DIALOG (dialog)->fontsel);
- }
- return list;
-}
-
-
void GLADEGTK_API
glade_gtk_dialog_set_property (GladeWidgetAdaptor *adaptor,
GObject *object,
@@ -5312,28 +5167,11 @@ glade_gtk_combo_box_entry_post_create (G
GObject *object,
GladeCreateReason reason)
{
- GladeWidget *gcombo = glade_widget_get_from_gobject (object);
-
/* Chain up */
GWA_GET_CLASS (GTK_TYPE_CONTAINER)->post_create (adaptor, object, reason);
- glade_widget_adaptor_create_internal
- (gcombo, G_OBJECT (GTK_BIN (object)->child),
- "entry", "comboboxentry", FALSE, reason);
-}
-
-GObject * GLADEGTK_API
-glade_gtk_combo_box_entry_get_internal_child (GladeWidgetAdaptor *adaptor,
- GObject *object,
- const gchar *name)
-{
- GObject *child = NULL;
- g_return_val_if_fail (GTK_IS_COMBO_BOX_ENTRY (object), NULL);
-
- if (strcmp ("entry", name) == 0)
- child = G_OBJECT (gtk_bin_get_child (GTK_BIN (object)));
-
- return child;
+ glade_widget_add_internals (glade_widget_get_from_gobject (object),
+ GTK_BIN (object)->child, "entry", NULL);
}
/* ----------------------------- GtkSpinButton ------------------------------ */
@@ -5403,55 +5241,18 @@ glade_gtk_combo_post_create (GladeWidget
GObject *object,
GladeCreateReason reason)
{
- GladeWidget *gcombo, *gentry, *glist;
-
+ GladeWidget *widget;
+ GtkCombo *combo;
+
g_return_if_fail (GTK_IS_COMBO (object));
- if ((gcombo = glade_widget_get_from_gobject (object)) == NULL)
- return;
+ widget = glade_widget_get_from_gobject (object);
+ combo = GTK_COMBO (object);
- gentry = glade_widget_adaptor_create_internal
- (gcombo, G_OBJECT (GTK_COMBO (object)->entry),
- "entry", "combo", FALSE, reason);
-
- /* We mark this 'anarchist' since its outside of the hierarchy */
- glist = glade_widget_adaptor_create_internal
- (gcombo, G_OBJECT (GTK_COMBO (object)->list),
- "list", "combo", TRUE, reason);
-
-}
-
-GObject * GLADEGTK_API
-glade_gtk_combo_get_internal_child (GladeWidgetAdaptor *adaptor,
- GtkCombo *combo,
- const gchar *name)
-{
- GObject *child = NULL;
-
- g_return_val_if_fail (GTK_IS_COMBO (combo), NULL);
-
- if (strcmp ("list", name) == 0)
- child = G_OBJECT (combo->list);
- else if (strcmp ("entry", name) == 0)
- child = G_OBJECT (combo->entry);
-
- return child;
-}
-
-GList * GLADEGTK_API
-glade_gtk_combo_get_children (GtkCombo *combo)
-{
- GList *list = NULL;
-
- g_return_val_if_fail (GTK_IS_COMBO (combo), NULL);
-
- list = glade_util_container_get_all_children (GTK_CONTAINER (combo));
-
- /* Ensure that we only return one 'combo->list' */
- if (g_list_find (list, combo->list) == NULL)
- list = g_list_append (list, combo->list);
-
- return list;
+ glade_widget_add_internals (widget,
+ combo->entry, "entry",
+ combo->list, "list",
+ NULL);
}
/* ----------------------------- GtkListItem ------------------------------ */
Index: gladeui/glade-widget.c
===================================================================
--- gladeui/glade-widget.c (revision 1244)
+++ gladeui/glade-widget.c (working copy)
@@ -898,6 +898,7 @@ glade_widget_init (GladeWidget *widget)
widget->packing_properties = NULL;
widget->prop_refs = NULL;
widget->prop_refs_readonly = FALSE;
+ widget->internals = NULL;
widget->signals = g_hash_table_new_full
(g_str_hash, g_str_equal,
(GDestroyNotify) g_free,
@@ -1257,14 +1258,14 @@ static GObject *
glade_widget_get_internal_child (GladeWidget *parent,
const gchar *internal)
{
+ GObject *child;
+
while (parent)
{
- GladeWidgetAdaptorClass *adaptor_class =
- GLADE_WIDGET_ADAPTOR_GET_CLASS (parent->adaptor);
-
- if (adaptor_class->get_internal_child)
- return glade_widget_adaptor_get_internal_child
- (parent->adaptor, parent->object, internal);
+ child = glade_widget_adaptor_get_internal_child (parent->adaptor,
+ parent->object,
+ internal);
+ if (child) return child;
parent = glade_widget_get_parent (parent);
}
@@ -4289,3 +4290,46 @@ glade_widget_placeholder_relation (Glade
GTK_IS_WIDGET (widget->object) &&
GWA_USE_PLACEHOLDERS (parent->adaptor));
}
+
+void
+glade_widget_add_internals (GladeWidget *parent, GtkWidget *internal,
+ const gchar *name, ...)
+{
+ GList *n, *o, *names = NULL, *objects = NULL;
+ va_list va;
+
+ va_start (va, name);
+
+ printf ("glade_widget_add_internals %s\n", parent->name);
+ while (internal && name)
+ {
+ printf ("\t 1 %p %s\n", internal, name);
+
+ objects = g_list_append (objects, internal);
+ names = g_list_append (names, (gchar*) name);
+
+ internal = va_arg (va, GtkWidget *);
+ name = va_arg (va, gchar *);
+ }
+
+ va_end (va);
+
+ parent->internals = g_list_concat (parent->internals, objects);
+
+ for (o = objects, n = names;
+ o && n && o->data && n->data;
+ o = g_list_next (o), n = g_list_next (n))
+ {
+ printf ("\t 2 %p %s %d\n", o->data, n->data,
+ (glade_widget_get_from_gobject (gtk_widget_get_parent (o->data))) ? FALSE : TRUE);
+ glade_widget_adaptor_create_internal (parent,
+ G_OBJECT (o->data),
+ n->data,
+ parent->adaptor->generic_name,
+ (glade_widget_get_from_gobject (gtk_widget_get_parent (o->data))) ? FALSE : TRUE,
+ parent->construct_reason);
+ }
+ printf ("glade_widget_add_internals %s end\n", parent->name);
+ g_list_free (names);
+ parent->internals = objects;
+}
Index: gladeui/glade-widget.h
===================================================================
--- gladeui/glade-widget.h (revision 1244)
+++ gladeui/glade-widget.h (working copy)
@@ -88,6 +88,8 @@ struct _GladeWidget
gint height; /* usefull for parentless widgets in the
* GladeDesignLayout */
+ GList *internals; /* A list of internal widgets */
+
/* Construct parameters: */
GladeWidget *construct_template;
GladeWidgetInfo *construct_info;
@@ -326,6 +328,12 @@ void glade_widget_pus
LIBGLADEUI_API
void glade_widget_pop_superuser (void);
+LIBGLADEUI_API
+void glade_widget_add_internals (GladeWidget *parent,
+ GtkWidget *internal,
+ const gchar *name,
+ ...);
+
G_END_DECLS
#endif /* __GLADE_WIDGET_H__ */
Index: gladeui/glade-widget-adaptor.c
===================================================================
--- gladeui/glade-widget-adaptor.c (revision 1244)
+++ gladeui/glade-widget-adaptor.c (working copy)
@@ -351,6 +351,13 @@ gwa_clone_parent_properties (GladeWidget
return g_list_reverse (properties);
}
+static gint
+gwa_props_cmp (gconstpointer a, gconstpointer b)
+{
+ const GladePropertyClass *class_a = a, *class_b = b;
+ return strcmp (class_a->id, class_b->id);
+}
+
static void
gwa_setup_introspected_props_from_pspecs (GladeWidgetAdaptor *adaptor,
GParamSpec **specs,
@@ -386,14 +393,12 @@ gwa_setup_introspected_props_from_pspecs
list = g_list_prepend (list, property_class);
}
+ list = g_list_sort (list, gwa_props_cmp);
+
if (is_packing)
- adaptor->packing_props =
- g_list_concat (adaptor->packing_props,
- g_list_reverse (list));
+ adaptor->packing_props = g_list_concat (adaptor->packing_props, list);
else
- adaptor->properties =
- g_list_concat (adaptor->properties,
- g_list_reverse (list));
+ adaptor->properties = g_list_concat (adaptor->properties, list);
}
/* XXX Atk relations and accel props disregarded - they should
@@ -2041,7 +2046,21 @@ glade_widget_adaptor_get_internal_child
g_return_val_if_fail (G_IS_OBJECT (object), NULL);
g_return_val_if_fail (internal_name != NULL, NULL);
g_return_val_if_fail (g_type_is_a (G_OBJECT_TYPE (object), adaptor->type), NULL);
+ GladeWidget *widget = glade_widget_get_from_gobject (object);
+ printf ("glade_widget_adaptor_get_internal_child %s %p\n",widget->name, widget->internals);
+ if (widget && widget->internals)
+ {
+ GList *l;
+ for (l = widget->internals; l && l->data; l = g_list_next (l))
+ {
+ GladeWidget *internal = glade_widget_get_from_gobject (l->data);
+ printf ("glade_widget_adaptor_get_internal_child %s %s\n",internal_name, internal->internal);
+ if (internal && strcmp (internal_name, internal->internal) == 0)
+ return internal->object;
+ }
+ }
+
if (GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->get_internal_child)
return GLADE_WIDGET_ADAPTOR_GET_CLASS
(adaptor)->get_internal_child (adaptor, object, internal_name);
@@ -2211,6 +2230,33 @@ glade_widget_adaptor_remove (GladeWidget
g_critical ("No remove() support in adaptor %s", adaptor->name);
}
+static gboolean
+glade_widget_adaptor_has_child_hierarchy (GladeWidget *widget,
+ GObject *child)
+{
+ GList *list, *children = NULL;
+ gboolean found = FALSE;
+
+ children = glade_util_container_get_all_children (GTK_CONTAINER(widget->object));
+
+ for (list = children; list && list->data; list = list->next)
+ {
+ GladeWidget *gwidget = glade_widget_get_from_gobject (list->data);
+
+ if (gwidget && GTK_IS_CONTAINER (gwidget->object))
+ found = glade_widget_adaptor_has_child_hierarchy (gwidget, child);
+
+ if (list->data == child)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ g_list_free (children);
+ return found;
+}
+
/**
* glade_widget_adaptor_remove:
* @adaptor: A #GladeWidgetAdaptor
@@ -2224,17 +2270,32 @@ GList *
glade_widget_adaptor_get_children (GladeWidgetAdaptor *adaptor,
GObject *container)
{
+ GladeWidget *widget;
+ GList *l, *children;
+
g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
g_return_val_if_fail (G_IS_OBJECT (container), NULL);
g_return_val_if_fail (g_type_is_a (G_OBJECT_TYPE (container), adaptor->type), NULL);
-
+/*
if (GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->get_children)
- return GLADE_WIDGET_ADAPTOR_GET_CLASS
+ children = GLADE_WIDGET_ADAPTOR_GET_CLASS
(adaptor)->get_children (adaptor, container);
-
+ else
+ children = NULL;*/
+
+ children = glade_util_container_get_all_children (GTK_CONTAINER (container));
+
/* Dont complain here if no implementation is found */
- return NULL;
+ if ((widget = glade_widget_get_from_gobject (container)) == NULL)
+ return children;
+
+ for (l = widget->internals; l && l->data; l = g_list_next (l))
+ if (g_list_find (children, G_OBJECT (l->data)) == NULL &&
+ glade_widget_adaptor_has_child_hierarchy (widget, G_OBJECT (l->data)) == FALSE)
+ children = g_list_append (children, G_OBJECT (l->data));
+
+ return children;
}
/**
_______________________________________________
Glade-devel maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/glade-devel