forked from AuroraMiddleware/gtk
inspector: Refactor object tree construction
Instead of having lots of if statements, create a vtable. This will be useful for the following patches.
This commit is contained in:
parent
5037d134c5
commit
c7ed2c2130
@ -83,10 +83,477 @@ struct _GtkInspectorObjectTreePrivate
|
|||||||
gint search_length;
|
gint search_length;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct _ObjectTreeClassFuncs ObjectTreeClassFuncs;
|
||||||
|
typedef void (* ObjectTreeForallFunc) (GObject *object,
|
||||||
|
const char *name,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
|
struct _ObjectTreeClassFuncs {
|
||||||
|
GType (* get_type) (void);
|
||||||
|
GObject * (* get_parent) (GObject *object);
|
||||||
|
void (* forall) (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data);
|
||||||
|
gboolean (* get_sensitive) (GObject *object);
|
||||||
|
};
|
||||||
|
|
||||||
static guint signals[LAST_SIGNAL] = { 0 };
|
static guint signals[LAST_SIGNAL] = { 0 };
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorObjectTree, gtk_inspector_object_tree, GTK_TYPE_BOX)
|
G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorObjectTree, gtk_inspector_object_tree, GTK_TYPE_BOX)
|
||||||
|
|
||||||
|
static GObject *
|
||||||
|
object_tree_get_parent_default (GObject *object)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_forall_default (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
object_tree_get_sensitive_default (GObject *object)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GObject *
|
||||||
|
object_tree_widget_get_parent (GObject *object)
|
||||||
|
{
|
||||||
|
return G_OBJECT (gtk_widget_get_parent (GTK_WIDGET (object)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_widget_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
GtkPropagationPhase phase;
|
||||||
|
const gchar *name;
|
||||||
|
} phases[] = {
|
||||||
|
{ GTK_PHASE_CAPTURE, "capture" },
|
||||||
|
{ GTK_PHASE_TARGET, "target" },
|
||||||
|
{ GTK_PHASE_BUBBLE, "bubble" },
|
||||||
|
{ GTK_PHASE_NONE, "" }
|
||||||
|
};
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (phases); i++)
|
||||||
|
{
|
||||||
|
GList *list, *l;
|
||||||
|
|
||||||
|
list = _gtk_widget_list_controllers (GTK_WIDGET (object), phases[i].phase);
|
||||||
|
for (l = list; l; l = l->next)
|
||||||
|
{
|
||||||
|
GObject *controller = l->data;
|
||||||
|
forall_func (controller, phases[i].name, forall_data);
|
||||||
|
}
|
||||||
|
g_list_free (list);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gtk_widget_is_toplevel (GTK_WIDGET (object)))
|
||||||
|
{
|
||||||
|
GObject *clock;
|
||||||
|
|
||||||
|
clock = G_OBJECT (gtk_widget_get_frame_clock (GTK_WIDGET (object)));
|
||||||
|
if (clock)
|
||||||
|
forall_func (clock, "frame-clock", forall_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
object_tree_widget_get_sensitive (GObject *object)
|
||||||
|
{
|
||||||
|
return gtk_widget_get_mapped (GTK_WIDGET (object));
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ObjectTreeForallFunc forall_func;
|
||||||
|
gpointer forall_data;
|
||||||
|
} ForallData;
|
||||||
|
|
||||||
|
static void
|
||||||
|
container_children_callback (GtkWidget *widget,
|
||||||
|
gpointer client_data)
|
||||||
|
{
|
||||||
|
ForallData *forall_data = client_data;
|
||||||
|
|
||||||
|
forall_data->forall_func (G_OBJECT (widget), NULL, forall_data->forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_container_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
ForallData data = {
|
||||||
|
forall_func,
|
||||||
|
forall_data
|
||||||
|
};
|
||||||
|
|
||||||
|
gtk_container_forall (GTK_CONTAINER (object),
|
||||||
|
container_children_callback,
|
||||||
|
&data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_tree_model_sort_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GObject *child = G_OBJECT (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (object)));
|
||||||
|
|
||||||
|
if (child)
|
||||||
|
forall_func (child, "model", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_tree_model_filter_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GObject *child = G_OBJECT (gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (object)));
|
||||||
|
|
||||||
|
if (child)
|
||||||
|
forall_func (child, "model", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_menu_item_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GtkWidget *submenu;
|
||||||
|
|
||||||
|
submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (object));
|
||||||
|
if (submenu)
|
||||||
|
forall_func (G_OBJECT (submenu), "submenu", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_combo_box_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GtkWidget *popup;
|
||||||
|
GObject *child;
|
||||||
|
|
||||||
|
popup = gtk_combo_box_get_popup (GTK_COMBO_BOX (object));
|
||||||
|
if (popup)
|
||||||
|
forall_func (G_OBJECT (popup), "popup", forall_data);
|
||||||
|
|
||||||
|
child = G_OBJECT (gtk_combo_box_get_model (GTK_COMBO_BOX (object)));
|
||||||
|
if (child)
|
||||||
|
forall_func (child, "model", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_tree_view_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
gint n_columns, i;
|
||||||
|
GObject *child;
|
||||||
|
|
||||||
|
child = G_OBJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (object)));
|
||||||
|
if (child)
|
||||||
|
forall_func (child, "model", forall_data);
|
||||||
|
|
||||||
|
child = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (object)));
|
||||||
|
if (child)
|
||||||
|
forall_func (child, "selection", forall_data);
|
||||||
|
|
||||||
|
n_columns = gtk_tree_view_get_n_columns (GTK_TREE_VIEW (object));
|
||||||
|
for (i = 0; i < n_columns; i++)
|
||||||
|
{
|
||||||
|
child = G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (object), i));
|
||||||
|
forall_func (child, NULL, forall_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_icon_view_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GObject *child;
|
||||||
|
|
||||||
|
child = G_OBJECT (gtk_icon_view_get_model (GTK_ICON_VIEW (object)));
|
||||||
|
if (child)
|
||||||
|
forall_func (child, "mnodel", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ObjectTreeForallFunc forall_func;
|
||||||
|
gpointer forall_data;
|
||||||
|
GObject *parent;
|
||||||
|
} ParentForallData;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
cell_callback (GtkCellRenderer *renderer,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
ParentForallData *d = data;
|
||||||
|
gpointer cell_layout;
|
||||||
|
|
||||||
|
cell_layout = g_object_get_data (d->parent, "gtk-inspector-cell-layout");
|
||||||
|
g_object_set_data (G_OBJECT (renderer), "gtk-inspector-cell-layout", cell_layout);
|
||||||
|
d->forall_func (G_OBJECT (renderer), NULL, d->forall_data);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_cell_area_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
ParentForallData data = {
|
||||||
|
forall_func,
|
||||||
|
forall_data,
|
||||||
|
object
|
||||||
|
};
|
||||||
|
|
||||||
|
gtk_cell_area_foreach (GTK_CELL_AREA (object), cell_callback, &data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_cell_layout_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GtkCellArea *area;
|
||||||
|
|
||||||
|
/* cell areas handle their own stuff */
|
||||||
|
if (GTK_IS_CELL_AREA (object))
|
||||||
|
return;
|
||||||
|
|
||||||
|
area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (object));
|
||||||
|
g_object_set_data (G_OBJECT (area), "gtk-inspector-cell-layout", object);
|
||||||
|
forall_func (G_OBJECT (area), "cell-area", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_text_view_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GtkTextBuffer *buffer;
|
||||||
|
|
||||||
|
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (object));
|
||||||
|
forall_func (G_OBJECT (buffer), "buffer", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_text_buffer_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GtkTextTagTable *tags;
|
||||||
|
|
||||||
|
tags = gtk_text_buffer_get_tag_table (GTK_TEXT_BUFFER (object));
|
||||||
|
forall_func (G_OBJECT (tags), "tag-table", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
tag_callback (GtkTextTag *tag,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
ForallData *d = data;
|
||||||
|
gchar *name;
|
||||||
|
|
||||||
|
g_object_get (tag, "name", &name, NULL);
|
||||||
|
d->forall_func (G_OBJECT (tag), name, d->forall_data);
|
||||||
|
g_free (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_text_tag_table_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
ForallData data = {
|
||||||
|
forall_func,
|
||||||
|
forall_data
|
||||||
|
};
|
||||||
|
|
||||||
|
gtk_text_tag_table_foreach (GTK_TEXT_TAG_TABLE (object), tag_callback, &data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_tree_application_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GObject *menu;
|
||||||
|
|
||||||
|
menu = (GObject *)gtk_application_get_app_menu (GTK_APPLICATION (object));
|
||||||
|
if (menu)
|
||||||
|
forall_func (menu, "app-menu", forall_data);
|
||||||
|
|
||||||
|
menu = (GObject *)gtk_application_get_menubar (GTK_APPLICATION (object));
|
||||||
|
if (menu)
|
||||||
|
forall_func (menu, "menubar", forall_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Note:
|
||||||
|
* This tree must be sorted with the most specific types first.
|
||||||
|
* We iterate over it top to bottom and return the first match
|
||||||
|
* using g_type_is_a ()
|
||||||
|
*/
|
||||||
|
static const ObjectTreeClassFuncs object_tree_class_funcs[] = {
|
||||||
|
{
|
||||||
|
gtk_application_get_type,
|
||||||
|
object_tree_get_parent_default,
|
||||||
|
object_tree_application_forall,
|
||||||
|
object_tree_get_sensitive_default
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_text_tag_table_get_type,
|
||||||
|
object_tree_get_parent_default,
|
||||||
|
object_tree_text_tag_table_forall,
|
||||||
|
object_tree_get_sensitive_default
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_text_buffer_get_type,
|
||||||
|
object_tree_get_parent_default,
|
||||||
|
object_tree_text_buffer_forall,
|
||||||
|
object_tree_get_sensitive_default
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_text_view_get_type,
|
||||||
|
object_tree_widget_get_parent,
|
||||||
|
object_tree_text_view_forall,
|
||||||
|
object_tree_widget_get_sensitive
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_icon_view_get_type,
|
||||||
|
object_tree_widget_get_parent,
|
||||||
|
object_tree_icon_view_forall,
|
||||||
|
object_tree_widget_get_sensitive
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_tree_view_get_type,
|
||||||
|
object_tree_widget_get_parent,
|
||||||
|
object_tree_tree_view_forall,
|
||||||
|
object_tree_widget_get_sensitive
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_combo_box_get_type,
|
||||||
|
object_tree_widget_get_parent,
|
||||||
|
object_tree_combo_box_forall,
|
||||||
|
object_tree_widget_get_sensitive
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_menu_item_get_type,
|
||||||
|
object_tree_widget_get_parent,
|
||||||
|
object_tree_menu_item_forall,
|
||||||
|
object_tree_widget_get_sensitive
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_container_get_type,
|
||||||
|
object_tree_widget_get_parent,
|
||||||
|
object_tree_container_forall,
|
||||||
|
object_tree_widget_get_sensitive
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_widget_get_type,
|
||||||
|
object_tree_widget_get_parent,
|
||||||
|
object_tree_widget_forall,
|
||||||
|
object_tree_widget_get_sensitive
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_tree_model_filter_get_type,
|
||||||
|
object_tree_get_parent_default,
|
||||||
|
object_tree_tree_model_filter_forall,
|
||||||
|
object_tree_get_sensitive_default
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_tree_model_sort_get_type,
|
||||||
|
object_tree_get_parent_default,
|
||||||
|
object_tree_tree_model_sort_forall,
|
||||||
|
object_tree_get_sensitive_default
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_cell_area_get_type,
|
||||||
|
object_tree_get_parent_default,
|
||||||
|
object_tree_cell_area_forall,
|
||||||
|
object_tree_get_sensitive_default
|
||||||
|
},
|
||||||
|
{
|
||||||
|
gtk_cell_layout_get_type,
|
||||||
|
object_tree_get_parent_default,
|
||||||
|
object_tree_cell_layout_forall,
|
||||||
|
object_tree_get_sensitive_default
|
||||||
|
},
|
||||||
|
{
|
||||||
|
g_object_get_type,
|
||||||
|
object_tree_get_parent_default,
|
||||||
|
object_tree_forall_default,
|
||||||
|
object_tree_get_sensitive_default
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const ObjectTreeClassFuncs *
|
||||||
|
find_class_funcs (GObject *object)
|
||||||
|
{
|
||||||
|
GType object_type;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
object_type = G_OBJECT_TYPE (object);
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (object_tree_class_funcs); i++)
|
||||||
|
{
|
||||||
|
if (g_type_is_a (object_type, object_tree_class_funcs[i].get_type ()))
|
||||||
|
return &object_tree_class_funcs[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static G_GNUC_UNUSED GObject *
|
||||||
|
object_get_parent (GObject *object)
|
||||||
|
{
|
||||||
|
const ObjectTreeClassFuncs *funcs;
|
||||||
|
|
||||||
|
funcs = find_class_funcs (object);
|
||||||
|
|
||||||
|
return funcs->get_parent (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
object_forall (GObject *object,
|
||||||
|
ObjectTreeForallFunc forall_func,
|
||||||
|
gpointer forall_data)
|
||||||
|
{
|
||||||
|
GType object_type;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
object_type = G_OBJECT_TYPE (object);
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (object_tree_class_funcs); i++)
|
||||||
|
{
|
||||||
|
if (g_type_is_a (object_type, object_tree_class_funcs[i].get_type ()))
|
||||||
|
object_tree_class_funcs[i].forall (object, forall_func, forall_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
object_get_sensitive (GObject *object)
|
||||||
|
{
|
||||||
|
const ObjectTreeClassFuncs *funcs;
|
||||||
|
|
||||||
|
funcs = find_class_funcs (object);
|
||||||
|
|
||||||
|
return funcs->get_sensitive (object);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_row_activated (GtkTreeView *tree,
|
on_row_activated (GtkTreeView *tree,
|
||||||
GtkTreePath *path,
|
GtkTreePath *path,
|
||||||
@ -511,38 +978,13 @@ typedef struct
|
|||||||
} FindAllData;
|
} FindAllData;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
child_callback (GtkWidget *widget,
|
child_callback (GObject *object,
|
||||||
|
const char *name,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
FindAllData *d = data;
|
FindAllData *d = data;
|
||||||
|
|
||||||
gtk_inspector_object_tree_append_object (d->wt, G_OBJECT (widget), d->iter, NULL);
|
gtk_inspector_object_tree_append_object (d->wt, object, d->iter, NULL);
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
cell_callback (GtkCellRenderer *renderer,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
FindAllData *d = data;
|
|
||||||
gpointer cell_layout;
|
|
||||||
|
|
||||||
cell_layout = g_object_get_data (d->parent, "gtk-inspector-cell-layout");
|
|
||||||
g_object_set_data (G_OBJECT (renderer), "gtk-inspector-cell-layout", cell_layout);
|
|
||||||
gtk_inspector_object_tree_append_object (d->wt, G_OBJECT (renderer), d->iter, NULL);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
tag_callback (GtkTextTag *tag,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
FindAllData *d = data;
|
|
||||||
gchar *name;
|
|
||||||
|
|
||||||
g_object_get (tag, "name", &name, NULL);
|
|
||||||
gtk_inspector_object_tree_append_object (d->wt, G_OBJECT (tag), d->iter, name);
|
|
||||||
g_free (name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -555,19 +997,11 @@ gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
|
|||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
const gchar *class_name;
|
const gchar *class_name;
|
||||||
gchar *classes;
|
gchar *classes;
|
||||||
gboolean mapped;
|
|
||||||
ObjectData *od;
|
ObjectData *od;
|
||||||
const gchar *label;
|
const gchar *label;
|
||||||
|
FindAllData data;
|
||||||
|
|
||||||
if (GTK_IS_WIDGET (object))
|
|
||||||
mapped = gtk_widget_get_mapped (GTK_WIDGET (object));
|
|
||||||
else
|
|
||||||
mapped = TRUE;
|
|
||||||
|
|
||||||
if (G_OBJECT (object))
|
|
||||||
class_name = G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (object));
|
class_name = G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (object));
|
||||||
else
|
|
||||||
class_name = "";
|
|
||||||
|
|
||||||
if (GTK_IS_WIDGET (object))
|
if (GTK_IS_WIDGET (object))
|
||||||
{
|
{
|
||||||
@ -624,7 +1058,7 @@ gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
|
|||||||
OBJECT_NAME, name,
|
OBJECT_NAME, name,
|
||||||
OBJECT_LABEL, label,
|
OBJECT_LABEL, label,
|
||||||
OBJECT_CLASSES, classes,
|
OBJECT_CLASSES, classes,
|
||||||
SENSITIVE, mapped,
|
SENSITIVE, object_get_sensitive (object),
|
||||||
-1);
|
-1);
|
||||||
|
|
||||||
if (name && *name)
|
if (name && *name)
|
||||||
@ -650,182 +1084,11 @@ gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
|
|||||||
g_hash_table_insert (wt->priv->iters, object, od);
|
g_hash_table_insert (wt->priv->iters, object, od);
|
||||||
g_object_weak_ref (object, gtk_object_tree_remove_dead_object, od);
|
g_object_weak_ref (object, gtk_object_tree_remove_dead_object, od);
|
||||||
|
|
||||||
if (GTK_IS_CONTAINER (object))
|
|
||||||
{
|
|
||||||
FindAllData data;
|
|
||||||
|
|
||||||
data.wt = wt;
|
data.wt = wt;
|
||||||
data.iter = &iter;
|
data.iter = &iter;
|
||||||
data.parent = object;
|
data.parent = object;
|
||||||
|
|
||||||
gtk_container_forall (GTK_CONTAINER (object), child_callback, &data);
|
object_forall (object, child_callback, &data);
|
||||||
}
|
|
||||||
|
|
||||||
/* Below are special cases for dependent objects which are not
|
|
||||||
* children in the GtkContainer sense, but which we still want
|
|
||||||
* to show in the tree right away.
|
|
||||||
*/
|
|
||||||
if (GTK_IS_TREE_MODEL_SORT (object))
|
|
||||||
{
|
|
||||||
GObject *child = G_OBJECT (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (object)));
|
|
||||||
if (child)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_TREE_MODEL_FILTER (object))
|
|
||||||
{
|
|
||||||
GObject *child = G_OBJECT (gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (object)));
|
|
||||||
if (child)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_MENU_ITEM (object))
|
|
||||||
{
|
|
||||||
GtkWidget *submenu;
|
|
||||||
|
|
||||||
submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (object));
|
|
||||||
if (submenu)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, G_OBJECT (submenu), &iter, "submenu");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_COMBO_BOX (object))
|
|
||||||
{
|
|
||||||
GtkWidget *popup;
|
|
||||||
GObject *child;
|
|
||||||
|
|
||||||
popup = gtk_combo_box_get_popup (GTK_COMBO_BOX (object));
|
|
||||||
if (popup)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, G_OBJECT (popup), &iter, "popup");
|
|
||||||
|
|
||||||
child = G_OBJECT (gtk_combo_box_get_model (GTK_COMBO_BOX (object)));
|
|
||||||
if (child)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_TREE_VIEW (object))
|
|
||||||
{
|
|
||||||
gint n_columns, i;
|
|
||||||
GObject *child;
|
|
||||||
|
|
||||||
child = G_OBJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (object)));
|
|
||||||
if (child)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
|
|
||||||
|
|
||||||
child = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (object)));
|
|
||||||
if (child)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, child, &iter, "selection");
|
|
||||||
|
|
||||||
n_columns = gtk_tree_view_get_n_columns (GTK_TREE_VIEW (object));
|
|
||||||
for (i = 0; i < n_columns; i++)
|
|
||||||
{
|
|
||||||
child = G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (object), i));
|
|
||||||
gtk_inspector_object_tree_append_object (wt, child, &iter, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_ICON_VIEW (object))
|
|
||||||
{
|
|
||||||
GObject *child;
|
|
||||||
|
|
||||||
child = G_OBJECT (gtk_icon_view_get_model (GTK_ICON_VIEW (object)));
|
|
||||||
if (child)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_CELL_AREA (object))
|
|
||||||
{
|
|
||||||
FindAllData data;
|
|
||||||
|
|
||||||
data.wt = wt;
|
|
||||||
data.iter = &iter;
|
|
||||||
data.parent = object;
|
|
||||||
|
|
||||||
gtk_cell_area_foreach (GTK_CELL_AREA (object), cell_callback, &data);
|
|
||||||
}
|
|
||||||
else if (GTK_IS_CELL_LAYOUT (object))
|
|
||||||
{
|
|
||||||
GtkCellArea *area;
|
|
||||||
|
|
||||||
area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (object));
|
|
||||||
g_object_set_data (G_OBJECT (area), "gtk-inspector-cell-layout", object);
|
|
||||||
gtk_inspector_object_tree_append_object (wt, G_OBJECT (area), &iter, "cell-area");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_TEXT_VIEW (object))
|
|
||||||
{
|
|
||||||
GtkTextBuffer *buffer;
|
|
||||||
|
|
||||||
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (object));
|
|
||||||
gtk_inspector_object_tree_append_object (wt, G_OBJECT (buffer), &iter, "buffer");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_TEXT_BUFFER (object))
|
|
||||||
{
|
|
||||||
GtkTextTagTable *tags;
|
|
||||||
|
|
||||||
tags = gtk_text_buffer_get_tag_table (GTK_TEXT_BUFFER (object));
|
|
||||||
gtk_inspector_object_tree_append_object (wt, G_OBJECT (tags), &iter, "tag-table");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_TEXT_TAG_TABLE (object))
|
|
||||||
{
|
|
||||||
FindAllData data;
|
|
||||||
|
|
||||||
data.wt = wt;
|
|
||||||
data.iter = &iter;
|
|
||||||
data.parent = object;
|
|
||||||
|
|
||||||
gtk_text_tag_table_foreach (GTK_TEXT_TAG_TABLE (object), tag_callback, &data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_WIDGET (object))
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
GtkPropagationPhase phase;
|
|
||||||
const gchar *name;
|
|
||||||
} phases[] = {
|
|
||||||
{ GTK_PHASE_CAPTURE, "capture" },
|
|
||||||
{ GTK_PHASE_TARGET, "target" },
|
|
||||||
{ GTK_PHASE_BUBBLE, "bubble" },
|
|
||||||
{ GTK_PHASE_NONE, "" }
|
|
||||||
};
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (phases); i++)
|
|
||||||
{
|
|
||||||
GList *list, *l;
|
|
||||||
|
|
||||||
list = _gtk_widget_list_controllers (GTK_WIDGET (object), phases[i].phase);
|
|
||||||
for (l = list; l; l = l->next)
|
|
||||||
{
|
|
||||||
GObject *controller = l->data;
|
|
||||||
gtk_inspector_object_tree_append_object (wt, controller, &iter, phases[i].name);
|
|
||||||
}
|
|
||||||
g_list_free (list);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gtk_widget_is_toplevel (GTK_WIDGET (object)))
|
|
||||||
{
|
|
||||||
GObject *clock;
|
|
||||||
|
|
||||||
clock = (GObject *)gtk_widget_get_frame_clock (GTK_WIDGET (object));
|
|
||||||
if (clock)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, clock, &iter, "frame-clock");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_IS_APPLICATION (object))
|
|
||||||
{
|
|
||||||
GObject *menu;
|
|
||||||
|
|
||||||
menu = (GObject *)gtk_application_get_app_menu (GTK_APPLICATION (object));
|
|
||||||
if (menu)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, menu, &iter, "app-menu");
|
|
||||||
|
|
||||||
menu = (GObject *)gtk_application_get_menubar (GTK_APPLICATION (object));
|
|
||||||
if (menu)
|
|
||||||
gtk_inspector_object_tree_append_object (wt, menu, &iter, "menubar");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -878,8 +1141,8 @@ gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
|
|||||||
|
|
||||||
selected = gtk_inspector_object_tree_get_selected (wt);
|
selected = gtk_inspector_object_tree_get_selected (wt);
|
||||||
|
|
||||||
gtk_tree_store_clear (wt->priv->model);
|
|
||||||
g_hash_table_remove_all (wt->priv->iters);
|
g_hash_table_remove_all (wt->priv->iters);
|
||||||
|
gtk_tree_store_clear (wt->priv->model);
|
||||||
gtk_inspector_object_tree_append_object (wt, G_OBJECT (gtk_settings_get_default ()), NULL, NULL);
|
gtk_inspector_object_tree_append_object (wt, G_OBJECT (gtk_settings_get_default ()), NULL, NULL);
|
||||||
if (g_application_get_default ())
|
if (g_application_get_default ())
|
||||||
gtk_inspector_object_tree_append_object (wt, G_OBJECT (g_application_get_default ()), NULL, NULL);
|
gtk_inspector_object_tree_append_object (wt, G_OBJECT (g_application_get_default ()), NULL, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user