1 /*
2  * Copyright (c) 2014 Red Hat, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include "config.h"
19 #include <glib/gi18n-lib.h>
20 
21 #include "misc-info.h"
22 #include "window.h"
23 #include "object-tree.h"
24 
25 #include "gtktypebuiltins.h"
26 #include "gtktreeview.h"
27 #include "gtkbuildable.h"
28 #include "gtklabel.h"
29 #include "gtkframe.h"
30 #include "gtkbutton.h"
31 #include "gtkwidgetprivate.h"
32 
33 
34 struct _GtkInspectorMiscInfoPrivate {
35   GtkInspectorObjectTree *object_tree;
36 
37   GObject *object;
38 
39   GtkWidget *address;
40   GtkWidget *refcount_row;
41   GtkWidget *refcount;
42   GtkWidget *state_row;
43   GtkWidget *state;
44   GtkWidget *buildable_id_row;
45   GtkWidget *buildable_id;
46   GtkWidget *default_widget_row;
47   GtkWidget *default_widget;
48   GtkWidget *default_widget_button;
49   GtkWidget *focus_widget_row;
50   GtkWidget *focus_widget;
51   GtkWidget *focus_widget_button;
52   GtkWidget *mnemonic_label_row;
53   GtkWidget *mnemonic_label;
54   GtkWidget *request_mode_row;
55   GtkWidget *request_mode;
56   GtkWidget *allocated_size_row;
57   GtkWidget *allocated_size;
58   GtkWidget *baseline_row;
59   GtkWidget *baseline;
60   GtkWidget *clip_area_row;
61   GtkWidget *clip_area;
62   GtkWidget *frame_clock_row;
63   GtkWidget *frame_clock;
64   GtkWidget *frame_clock_button;
65   GtkWidget *tick_callback_row;
66   GtkWidget *tick_callback;
67   GtkWidget *framerate_row;
68   GtkWidget *framerate;
69   GtkWidget *framecount_row;
70   GtkWidget *framecount;
71   GtkWidget *accessible_role_row;
72   GtkWidget *accessible_role;
73   GtkWidget *accessible_name_row;
74   GtkWidget *accessible_name;
75   GtkWidget *accessible_description_row;
76   GtkWidget *accessible_description;
77   GtkWidget *mapped_row;
78   GtkWidget *mapped;
79   GtkWidget *realized_row;
80   GtkWidget *realized;
81   GtkWidget *is_toplevel_row;
82   GtkWidget *is_toplevel;
83   GtkWidget *child_visible_row;
84   GtkWidget *child_visible;
85 
86   guint update_source_id;
87   gint64 last_frame;
88 };
89 
90 enum
91 {
92   PROP_0,
93   PROP_OBJECT_TREE
94 };
95 
G_DEFINE_TYPE_WITH_PRIVATE(GtkInspectorMiscInfo,gtk_inspector_misc_info,GTK_TYPE_SCROLLED_WINDOW)96 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorMiscInfo, gtk_inspector_misc_info, GTK_TYPE_SCROLLED_WINDOW)
97 
98 static gchar *
99 format_state_flags (GtkStateFlags state)
100 {
101   GFlagsClass *fclass;
102   GString *str;
103   gint i;
104 
105   str = g_string_new ("");
106 
107   if (state)
108     {
109       fclass = g_type_class_ref (GTK_TYPE_STATE_FLAGS);
110       for (i = 0; i < fclass->n_values; i++)
111         {
112           if (state & fclass->values[i].value)
113             {
114               if (str->len)
115                 g_string_append (str, " | ");
116               g_string_append (str, fclass->values[i].value_nick);
117             }
118         }
119       g_type_class_unref (fclass);
120     }
121   else
122     g_string_append (str, "normal");
123 
124   return g_string_free (str, FALSE);
125 }
126 
127 static void
state_flags_changed(GtkWidget * w,GtkStateFlags old_flags,GtkInspectorMiscInfo * sl)128 state_flags_changed (GtkWidget *w, GtkStateFlags old_flags, GtkInspectorMiscInfo *sl)
129 {
130   gchar *s;
131 
132   s = format_state_flags (gtk_widget_get_state_flags (w));
133   gtk_label_set_label (GTK_LABEL (sl->priv->state), s);
134   g_free (s);
135 }
136 
137 static void
allocation_changed(GtkWidget * w,GdkRectangle * allocation,GtkInspectorMiscInfo * sl)138 allocation_changed (GtkWidget *w, GdkRectangle *allocation, GtkInspectorMiscInfo *sl)
139 {
140   GtkAllocation alloc;
141   GtkAllocation clip;
142   gchar *size_label;
143   GEnumClass *class;
144   GEnumValue *value;
145 
146   gtk_widget_get_allocation (w, &alloc);
147   size_label = g_strdup_printf ("%d × %d +%d +%d",
148                                 alloc.width, alloc.height,
149                                 alloc.x, alloc.y);
150 
151   gtk_label_set_label (GTK_LABEL (sl->priv->allocated_size), size_label);
152   g_free (size_label);
153 
154   size_label = g_strdup_printf ("%d", gtk_widget_get_allocated_baseline (w));
155   gtk_label_set_label (GTK_LABEL (sl->priv->baseline), size_label);
156   g_free (size_label);
157 
158   gtk_widget_get_clip (w, &clip);
159 
160   size_label = g_strdup_printf ("%d × %d +%d +%d",
161                                 clip.width, clip.height,
162                                 clip.x, clip.y);
163   gtk_label_set_label (GTK_LABEL (sl->priv->clip_area), size_label);
164   g_free (size_label);
165 
166   class = G_ENUM_CLASS (g_type_class_ref (GTK_TYPE_SIZE_REQUEST_MODE));
167   value = g_enum_get_value (class, gtk_widget_get_request_mode (w));
168   gtk_label_set_label (GTK_LABEL (sl->priv->request_mode), value->value_nick);
169   g_type_class_unref (class);
170 }
171 
172 static void
disconnect_each_other(gpointer still_alive,GObject * for_science)173 disconnect_each_other (gpointer  still_alive,
174                        GObject  *for_science)
175 {
176   if (GTK_INSPECTOR_IS_MISC_INFO (still_alive))
177     {
178       GtkInspectorMiscInfo *self = GTK_INSPECTOR_MISC_INFO (still_alive);
179       self->priv->object = NULL;
180     }
181 
182   g_signal_handlers_disconnect_matched (still_alive, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, for_science);
183   g_object_weak_unref (still_alive, disconnect_each_other, for_science);
184 }
185 
186 static void
show_object(GtkInspectorMiscInfo * sl,GObject * object,const gchar * tab)187 show_object (GtkInspectorMiscInfo *sl,
188              GObject              *object,
189              const gchar          *tab)
190 {
191   GtkTreeIter iter;
192 
193   g_object_set_data (G_OBJECT (sl->priv->object_tree), "next-tab", (gpointer)tab);
194   if (gtk_inspector_object_tree_find_object (sl->priv->object_tree, object, &iter))
195     {
196       gtk_inspector_object_tree_select_object (sl->priv->object_tree, object);
197     }
198   else if (GTK_IS_WIDGET (object) &&
199            gtk_inspector_object_tree_find_object (sl->priv->object_tree, G_OBJECT (gtk_widget_get_parent (GTK_WIDGET (object))), &iter))
200 
201     {
202       gtk_inspector_object_tree_append_object (sl->priv->object_tree, object, &iter, NULL);
203       gtk_inspector_object_tree_select_object (sl->priv->object_tree, object);
204     }
205   else
206     {
207       g_warning ("GtkInspector: couldn't find the object in the tree");
208     }
209 }
210 
211 static void
update_default_widget(GtkInspectorMiscInfo * sl)212 update_default_widget (GtkInspectorMiscInfo *sl)
213 {
214   GtkWidget *widget;
215 
216   widget = gtk_window_get_default_widget (GTK_WINDOW (sl->priv->object));
217   if (widget)
218     {
219       gchar *tmp;
220       tmp = g_strdup_printf ("%p", widget);
221       gtk_label_set_label (GTK_LABEL (sl->priv->default_widget), tmp);
222       g_free (tmp);
223       gtk_widget_set_sensitive (sl->priv->default_widget_button, TRUE);
224     }
225   else
226     {
227       gtk_label_set_label (GTK_LABEL (sl->priv->default_widget), "NULL");
228       gtk_widget_set_sensitive (sl->priv->default_widget_button, FALSE);
229     }
230 }
231 
232 static void
show_default_widget(GtkWidget * button,GtkInspectorMiscInfo * sl)233 show_default_widget (GtkWidget *button, GtkInspectorMiscInfo *sl)
234 {
235   GtkWidget *widget;
236 
237   update_default_widget (sl);
238   widget = gtk_window_get_default_widget (GTK_WINDOW (sl->priv->object));
239   if (widget)
240     show_object (sl, G_OBJECT (widget), "properties");
241 }
242 
243 static void
update_focus_widget(GtkInspectorMiscInfo * sl)244 update_focus_widget (GtkInspectorMiscInfo *sl)
245 {
246   GtkWidget *widget;
247 
248   widget = gtk_window_get_focus (GTK_WINDOW (sl->priv->object));
249   if (widget)
250     {
251       gchar *tmp;
252       tmp = g_strdup_printf ("%p", widget);
253       gtk_label_set_label (GTK_LABEL (sl->priv->focus_widget), tmp);
254       g_free (tmp);
255       gtk_widget_set_sensitive (sl->priv->focus_widget_button, TRUE);
256     }
257   else
258     {
259       gtk_label_set_label (GTK_LABEL (sl->priv->focus_widget), "NULL");
260       gtk_widget_set_sensitive (sl->priv->focus_widget_button, FALSE);
261     }
262 }
263 
264 static void
set_focus_cb(GtkWindow * window,GtkWidget * focus,GtkInspectorMiscInfo * sl)265 set_focus_cb (GtkWindow *window, GtkWidget *focus, GtkInspectorMiscInfo *sl)
266 {
267   update_focus_widget (sl);
268 }
269 
270 static void
show_focus_widget(GtkWidget * button,GtkInspectorMiscInfo * sl)271 show_focus_widget (GtkWidget *button, GtkInspectorMiscInfo *sl)
272 {
273   GtkWidget *widget;
274 
275   widget = gtk_window_get_focus (GTK_WINDOW (sl->priv->object));
276   if (widget)
277     show_object (sl, G_OBJECT (widget), "properties");
278 }
279 
280 static void
show_mnemonic_label(GtkWidget * button,GtkInspectorMiscInfo * sl)281 show_mnemonic_label (GtkWidget *button, GtkInspectorMiscInfo *sl)
282 {
283   GtkWidget *widget;
284 
285   widget = g_object_get_data (G_OBJECT (button), "mnemonic-label");
286   if (widget)
287     show_object (sl, G_OBJECT (widget), "properties");
288 }
289 
290 static void
show_frame_clock(GtkWidget * button,GtkInspectorMiscInfo * sl)291 show_frame_clock (GtkWidget *button, GtkInspectorMiscInfo *sl)
292 {
293   GObject *clock;
294 
295   clock = (GObject *)gtk_widget_get_frame_clock (GTK_WIDGET (sl->priv->object));
296   if (clock)
297     show_object (sl, G_OBJECT (clock), "properties");
298 }
299 
300 static void
update_frame_clock(GtkInspectorMiscInfo * sl)301 update_frame_clock (GtkInspectorMiscInfo *sl)
302 {
303   GObject *clock;
304 
305   clock = (GObject *)gtk_widget_get_frame_clock (GTK_WIDGET (sl->priv->object));
306   if (clock)
307     {
308       gchar *tmp;
309       tmp = g_strdup_printf ("%p", clock);
310       gtk_label_set_label (GTK_LABEL (sl->priv->frame_clock), tmp);
311       g_free (tmp);
312       gtk_widget_set_sensitive (sl->priv->frame_clock_button, TRUE);
313     }
314   else
315     {
316       gtk_label_set_label (GTK_LABEL (sl->priv->frame_clock), "NULL");
317       gtk_widget_set_sensitive (sl->priv->frame_clock_button, FALSE);
318     }
319 }
320 
321 static gboolean
update_info(gpointer data)322 update_info (gpointer data)
323 {
324   GtkInspectorMiscInfo *sl = data;
325   gchar *tmp;
326 
327   tmp = g_strdup_printf ("%p", sl->priv->object);
328   gtk_label_set_text (GTK_LABEL (sl->priv->address), tmp);
329   g_free (tmp);
330 
331   if (G_IS_OBJECT (sl->priv->object))
332     {
333       tmp = g_strdup_printf ("%d", sl->priv->object->ref_count);
334       gtk_label_set_text (GTK_LABEL (sl->priv->refcount), tmp);
335       g_free (tmp);
336     }
337 
338   if (GTK_IS_WIDGET (sl->priv->object))
339     {
340       AtkObject *accessible;
341       AtkRole role;
342       GList *list, *l;
343 
344       gtk_container_forall (GTK_CONTAINER (sl->priv->mnemonic_label), (GtkCallback)gtk_widget_destroy, NULL);
345       list = gtk_widget_list_mnemonic_labels (GTK_WIDGET (sl->priv->object));
346       for (l = list; l; l = l->next)
347         {
348           GtkWidget *button;
349 
350           tmp = g_strdup_printf ("%p (%s)", l->data, g_type_name_from_instance ((GTypeInstance*)l->data));
351           button = gtk_button_new_with_label (tmp);
352           g_free (tmp);
353           gtk_widget_show (button);
354           gtk_container_add (GTK_CONTAINER (sl->priv->mnemonic_label), button);
355           g_object_set_data (G_OBJECT (button), "mnemonic-label", l->data);
356           g_signal_connect (button, "clicked", G_CALLBACK (show_mnemonic_label), sl);
357         }
358       g_list_free (list);
359 
360       gtk_widget_set_visible (sl->priv->tick_callback, gtk_widget_has_tick_callback (GTK_WIDGET (sl->priv->object)));
361 
362       accessible = ATK_OBJECT (gtk_widget_get_accessible (GTK_WIDGET (sl->priv->object)));
363       role = atk_object_get_role (accessible);
364       gtk_label_set_text (GTK_LABEL (sl->priv->accessible_role), atk_role_get_name (role));
365       gtk_label_set_text (GTK_LABEL (sl->priv->accessible_name), atk_object_get_name (accessible));
366       gtk_label_set_text (GTK_LABEL (sl->priv->accessible_description), atk_object_get_description (accessible));
367       gtk_widget_set_visible (sl->priv->mapped, gtk_widget_get_mapped (GTK_WIDGET (sl->priv->object)));
368       gtk_widget_set_visible (sl->priv->realized, gtk_widget_get_realized (GTK_WIDGET (sl->priv->object)));
369       gtk_widget_set_visible (sl->priv->is_toplevel, gtk_widget_is_toplevel (GTK_WIDGET (sl->priv->object)));
370       gtk_widget_set_visible (sl->priv->child_visible, gtk_widget_get_child_visible (GTK_WIDGET (sl->priv->object)));
371 
372       update_frame_clock (sl);
373     }
374 
375   if (GTK_IS_BUILDABLE (sl->priv->object))
376     {
377       gtk_label_set_text (GTK_LABEL (sl->priv->buildable_id),
378                           gtk_buildable_get_name (GTK_BUILDABLE (sl->priv->object)));
379     }
380 
381   if (GTK_IS_WINDOW (sl->priv->object))
382     {
383       update_default_widget (sl);
384       update_focus_widget (sl);
385     }
386 
387   if (GDK_IS_FRAME_CLOCK (sl->priv->object))
388     {
389       GdkFrameClock *clock;
390       gint64 frame;
391       gint64 frame_time;
392       gint64 history_start;
393       gint64 history_len;
394       gint64 previous_frame_time;
395       GdkFrameTimings *previous_timings;
396 
397       clock = GDK_FRAME_CLOCK (sl->priv->object);
398       frame = gdk_frame_clock_get_frame_counter (clock);
399       frame_time = gdk_frame_clock_get_frame_time (clock);
400 
401       tmp = g_strdup_printf ("%"G_GINT64_FORMAT, frame);
402       gtk_label_set_label (GTK_LABEL (sl->priv->framecount), tmp);
403       g_free (tmp);
404 
405       history_start = gdk_frame_clock_get_history_start (clock);
406       history_len = frame - history_start;
407 
408       if (history_len > 0 && sl->priv->last_frame != frame)
409         {
410           previous_timings = gdk_frame_clock_get_timings (clock, history_start);
411           previous_frame_time = gdk_frame_timings_get_frame_time (previous_timings);
412           tmp = g_strdup_printf ("%4.1f ⁄ s", (G_USEC_PER_SEC * history_len) / (double) (frame_time - previous_frame_time));
413           gtk_label_set_label (GTK_LABEL (sl->priv->framerate), tmp);
414           g_free (tmp);
415         }
416       else
417         {
418           gtk_label_set_label (GTK_LABEL (sl->priv->framerate), "—");
419         }
420 
421       sl->priv->last_frame = frame;
422     }
423 
424   return G_SOURCE_CONTINUE;
425 }
426 
427 void
gtk_inspector_misc_info_set_object(GtkInspectorMiscInfo * sl,GObject * object)428 gtk_inspector_misc_info_set_object (GtkInspectorMiscInfo *sl,
429                                     GObject              *object)
430 {
431   if (sl->priv->object)
432     {
433       g_signal_handlers_disconnect_by_func (sl->priv->object, state_flags_changed, sl);
434       g_signal_handlers_disconnect_by_func (sl->priv->object, set_focus_cb, sl);
435       g_signal_handlers_disconnect_by_func (sl->priv->object, allocation_changed, sl);
436       disconnect_each_other (sl->priv->object, G_OBJECT (sl));
437       disconnect_each_other (sl, sl->priv->object);
438       sl->priv->object = NULL;
439     }
440 
441   gtk_widget_show (GTK_WIDGET (sl));
442 
443   sl->priv->object = object;
444   g_object_weak_ref (G_OBJECT (sl), disconnect_each_other, object);
445   g_object_weak_ref (object, disconnect_each_other, sl);
446 
447   if (GTK_IS_WIDGET (object))
448     {
449       gtk_widget_show (sl->priv->refcount_row);
450       gtk_widget_show (sl->priv->state_row);
451       gtk_widget_show (sl->priv->request_mode_row);
452       gtk_widget_show (sl->priv->allocated_size_row);
453       gtk_widget_show (sl->priv->baseline_row);
454       gtk_widget_show (sl->priv->clip_area_row);
455       gtk_widget_show (sl->priv->mnemonic_label_row);
456       gtk_widget_show (sl->priv->tick_callback_row);
457       gtk_widget_show (sl->priv->accessible_role_row);
458       gtk_widget_show (sl->priv->accessible_name_row);
459       gtk_widget_show (sl->priv->accessible_description_row);
460       gtk_widget_show (sl->priv->mapped_row);
461       gtk_widget_show (sl->priv->realized_row);
462       gtk_widget_show (sl->priv->is_toplevel_row);
463       gtk_widget_show (sl->priv->is_toplevel_row);
464       gtk_widget_show (sl->priv->frame_clock_row);
465 
466       g_signal_connect_object (object, "state-flags-changed", G_CALLBACK (state_flags_changed), sl, 0);
467       state_flags_changed (GTK_WIDGET (sl->priv->object), 0, sl);
468 
469       g_signal_connect_object (object, "size-allocate", G_CALLBACK (allocation_changed), sl, 0);
470       allocation_changed (GTK_WIDGET (sl->priv->object), NULL, sl);
471     }
472   else
473     {
474       gtk_widget_hide (sl->priv->state_row);
475       gtk_widget_hide (sl->priv->request_mode_row);
476       gtk_widget_hide (sl->priv->mnemonic_label_row);
477       gtk_widget_hide (sl->priv->allocated_size_row);
478       gtk_widget_hide (sl->priv->baseline_row);
479       gtk_widget_hide (sl->priv->clip_area_row);
480       gtk_widget_hide (sl->priv->tick_callback_row);
481       gtk_widget_hide (sl->priv->accessible_role_row);
482       gtk_widget_hide (sl->priv->accessible_name_row);
483       gtk_widget_hide (sl->priv->accessible_description_row);
484       gtk_widget_hide (sl->priv->mapped_row);
485       gtk_widget_hide (sl->priv->realized_row);
486       gtk_widget_hide (sl->priv->is_toplevel_row);
487       gtk_widget_hide (sl->priv->child_visible_row);
488       gtk_widget_hide (sl->priv->frame_clock_row);
489     }
490 
491   if (GTK_IS_BUILDABLE (object))
492     {
493       gtk_widget_show (sl->priv->buildable_id_row);
494     }
495   else
496     {
497       gtk_widget_hide (sl->priv->buildable_id_row);
498     }
499 
500   if (GTK_IS_WINDOW (object))
501     {
502       gtk_widget_show (sl->priv->default_widget_row);
503       gtk_widget_show (sl->priv->focus_widget_row);
504 
505       g_signal_connect_object (object, "set-focus", G_CALLBACK (set_focus_cb), sl, G_CONNECT_AFTER);
506     }
507   else
508     {
509       gtk_widget_hide (sl->priv->default_widget_row);
510       gtk_widget_hide (sl->priv->focus_widget_row);
511     }
512 
513   if (GDK_IS_FRAME_CLOCK (object))
514     {
515       gtk_widget_show (sl->priv->framecount_row);
516       gtk_widget_show (sl->priv->framerate_row);
517     }
518   else
519     {
520       gtk_widget_hide (sl->priv->framecount_row);
521       gtk_widget_hide (sl->priv->framerate_row);
522     }
523 
524   update_info (sl);
525 }
526 
527 static void
gtk_inspector_misc_info_init(GtkInspectorMiscInfo * sl)528 gtk_inspector_misc_info_init (GtkInspectorMiscInfo *sl)
529 {
530   sl->priv = gtk_inspector_misc_info_get_instance_private (sl);
531   gtk_widget_init_template (GTK_WIDGET (sl));
532 }
533 
534 static void
map(GtkWidget * widget)535 map (GtkWidget *widget)
536 {
537   GtkInspectorMiscInfo *sl = GTK_INSPECTOR_MISC_INFO (widget);
538 
539   GTK_WIDGET_CLASS (gtk_inspector_misc_info_parent_class)->map (widget);
540 
541   sl->priv->update_source_id = gdk_threads_add_timeout_seconds (1, update_info, sl);
542   update_info (sl);
543 }
544 
545 static void
unmap(GtkWidget * widget)546 unmap (GtkWidget *widget)
547 {
548   GtkInspectorMiscInfo *sl = GTK_INSPECTOR_MISC_INFO (widget);
549 
550   g_source_remove (sl->priv->update_source_id);
551   sl->priv->update_source_id = 0;
552 
553   GTK_WIDGET_CLASS (gtk_inspector_misc_info_parent_class)->unmap (widget);
554 }
555 
556 static void
get_property(GObject * object,guint param_id,GValue * value,GParamSpec * pspec)557 get_property (GObject    *object,
558               guint       param_id,
559               GValue     *value,
560               GParamSpec *pspec)
561 {
562   GtkInspectorMiscInfo *sl = GTK_INSPECTOR_MISC_INFO (object);
563 
564   switch (param_id)
565     {
566       case PROP_OBJECT_TREE:
567         g_value_take_object (value, sl->priv->object_tree);
568         break;
569 
570       default:
571         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
572         break;
573     }
574 }
575 
576 static void
set_property(GObject * object,guint param_id,const GValue * value,GParamSpec * pspec)577 set_property (GObject      *object,
578               guint         param_id,
579               const GValue *value,
580               GParamSpec   *pspec)
581 {
582   GtkInspectorMiscInfo *sl = GTK_INSPECTOR_MISC_INFO (object);
583 
584   switch (param_id)
585     {
586       case PROP_OBJECT_TREE:
587         sl->priv->object_tree = g_value_get_object (value);
588         break;
589 
590       default:
591         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
592         break;
593     }
594 }
595 
596 static void
gtk_inspector_misc_info_class_init(GtkInspectorMiscInfoClass * klass)597 gtk_inspector_misc_info_class_init (GtkInspectorMiscInfoClass *klass)
598 {
599   GObjectClass *object_class = G_OBJECT_CLASS (klass);
600   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
601 
602   object_class->get_property = get_property;
603   object_class->set_property = set_property;
604 
605   widget_class->map = map;
606   widget_class->unmap = unmap;
607 
608   g_object_class_install_property (object_class, PROP_OBJECT_TREE,
609       g_param_spec_object ("object-tree", "Object Tree", "Object tree",
610                            GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
611 
612   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/misc-info.ui");
613   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, address);
614   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, refcount_row);
615   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, refcount);
616   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, state_row);
617   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, state);
618   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, buildable_id_row);
619   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, buildable_id);
620   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, default_widget_row);
621   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, default_widget);
622   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, default_widget_button);
623   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, focus_widget_row);
624   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, focus_widget);
625   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, focus_widget_button);
626   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, mnemonic_label_row);
627   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, mnemonic_label);
628   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, request_mode_row);
629   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, request_mode);
630   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, allocated_size_row);
631   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, allocated_size);
632   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, baseline_row);
633   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, baseline);
634   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, clip_area_row);
635   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, clip_area);
636   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, frame_clock_row);
637   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, frame_clock);
638   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, frame_clock_button);
639   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, tick_callback_row);
640   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, tick_callback);
641   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, framecount_row);
642   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, framecount);
643   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, framerate_row);
644   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, framerate);
645   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, accessible_role_row);
646   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, accessible_role);
647   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, accessible_name_row);
648   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, accessible_name);
649   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, accessible_description_row);
650   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, accessible_description);
651   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, mapped_row);
652   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, mapped);
653   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, realized_row);
654   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, realized);
655   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, is_toplevel_row);
656   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, is_toplevel);
657   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, child_visible_row);
658   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, child_visible);
659 
660   gtk_widget_class_bind_template_callback (widget_class, show_default_widget);
661   gtk_widget_class_bind_template_callback (widget_class, show_focus_widget);
662   gtk_widget_class_bind_template_callback (widget_class, show_frame_clock);
663 }
664 
665 // vim: set et sw=2 ts=2:
666 
667