inspector: Force a full redraw for debug nodes
authorMatthias Clasen <mclasen@redhat.com>
Sat, 11 Mar 2023 11:30:44 +0000 (12:30 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 11 Mar 2023 11:43:38 +0000 (12:43 +0100)
Without this, debug nodes randomly are missing
in the tree, where we are reusing older render
nodes.

gtk/inspector/window.c
gtk/inspector/window.ui

index 510fcf0e00e0b6e8da730bf13fbbfb37908205ae..3884b98b750c17c03174306fa9153a187fbf9eb5 100644 (file)
@@ -584,6 +584,31 @@ gtk_inspector_window_enable_debugging (GtkWindow *window,
   return FALSE;
 }
 
+static void
+force_one_full_redraw (GtkWidget *w)
+{
+  gtk_widget_queue_draw (w);
+  for (w = gtk_widget_get_first_child (w); w; w = gtk_widget_get_next_sibling (w))
+    force_one_full_redraw (w);
+}
+
+static void
+force_full_redraw (GtkInspectorWindow *window)
+{
+  GListModel *toplevels;
+
+  toplevels = gtk_window_get_toplevels ();
+  for (unsigned int i = 0; i < g_list_model_get_n_items (toplevels); i++)
+    {
+      GtkWidget *w = GTK_WIDGET (g_list_model_get_item (toplevels, i));
+
+      if (gtk_widget_get_display (w) == window->inspected_display)
+        force_one_full_redraw (w);
+
+      g_object_unref (w);
+    }
+}
+
 static void
 gtk_inspector_window_class_init (GtkInspectorWindowClass *klass)
 {
@@ -671,6 +696,7 @@ gtk_inspector_window_class_init (GtkInspectorWindowClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, go_up_cb);
   gtk_widget_class_bind_template_callback (widget_class, go_down_cb);
   gtk_widget_class_bind_template_callback (widget_class, go_next_cb);
+  gtk_widget_class_bind_template_callback (widget_class, force_full_redraw);
 }
 
 static GdkDisplay *
index 2345a9393c6b92702645464609c74816f494213e..76414a763c628f9e07ef979c18533514d630963a 100644 (file)
             <property name="name">recorder</property>
             <property name="title" translatable="yes">Recorder</property>
             <property name="child">
-              <object class="GtkInspectorRecorder" id="widget_recorder"/>
+              <object class="GtkInspectorRecorder" id="widget_recorder">
+                <signal name="notify::debug-nodes" handler="force_full_redraw" swapped='true'/>
+              </object>
             </property>
           </object>
         </child>