diff options
author | Timm Bäder <mail@baedert.org> | 2020-06-02 09:53:28 +0200 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2020-06-03 08:18:56 +0200 |
commit | 3b089714738d30df53adf3466237556b5f0fc466 (patch) | |
tree | 714ea62b2ab6b1fe30cbbf802ed7c7da2f085c56 | |
parent | faeab008bfc5a706802eeb757f013f34c2d967c0 (diff) | |
download | gtk+-wip/baedert/resize2.tar.gz |
-rw-r--r-- | gtk/gtkroot.c | 62 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 23 | ||||
-rw-r--r-- | gtk/gtkwindow.c | 11 | ||||
-rw-r--r-- | tests/testwidgetfocus.c | 19 |
4 files changed, 89 insertions, 26 deletions
diff --git a/gtk/gtkroot.c b/gtk/gtkroot.c index e9753bfb5f..1e5169cae0 100644 --- a/gtk/gtkroot.c +++ b/gtk/gtkroot.c @@ -177,7 +177,7 @@ gtk_root_needs_layout (GtkRoot *self) if (resize_widgets && resize_widgets->len > 0) return TRUE; - return gtk_widget_needs_allocate (GTK_WIDGET (self)); + return FALSE; } static void @@ -205,19 +205,19 @@ gtk_root_layout_cb (GdkFrameClock *clock, resize_widgets = g_object_get_qdata (G_OBJECT (self), quark_resize_widgets); - /*g_print ("===================\n");*/ + g_print ("===================\n"); - if (!resize_widgets) + if (!resize_widgets || resize_widgets->len == 0) { gtk_root_stop_layout (self); return; } - /*g_message ("Resize widgets: ");*/ + g_message ("Resize widgets: "); for (guint p = 0; p < resize_widgets->len; p++) { GtkWidget *w = g_ptr_array_index (resize_widgets, p); - /*g_message ("%u: %s %p", p, G_OBJECT_TYPE_NAME (w), w);*/ + g_message ("%u: %s %p", p, G_OBJECT_TYPE_NAME (w), w); } for (int i = 0; i < MAX_RESIZE_ITERATIONS; i++) @@ -238,25 +238,49 @@ gtk_root_layout_cb (GdkFrameClock *clock, } gtk_root_unqueue_resize (self, GTK_WIDGET (self)); - gtk_native_check_resize (GTK_NATIVE (self)); + g_message ("After Iteration %d:", i); + for (guint p = 0; p < resize_widgets->len; p++) + { + GtkWidget *w = g_ptr_array_index (resize_widgets, p); + g_message ("%p: %u: %s %p", self, p, G_OBJECT_TYPE_NAME (w), w); + } + + if (resize_widgets->len > 0) + { + g_warning ("Resize widgets added during size-allocate:"); + for (guint p = 0; p < resize_widgets->len; p++) + { + GtkWidget *w = g_ptr_array_index (resize_widgets, p); + g_message ("\t %s %p", G_OBJECT_TYPE_NAME (w), w); + } + } + + + + if (!gtk_root_needs_layout (self)) { gtk_root_stop_layout (self); break; } + else { + g_message ("Need another layout iteration.."); + } } g_object_set_qdata (G_OBJECT (self), quark_resize_iteration, NULL); + g_message ("#############################################"); + if (resize_widgets->len > 0) { g_message ("After %d Iterations:", MAX_RESIZE_ITERATIONS); for (guint p = 0; p < resize_widgets->len; p++) { GtkWidget *w = g_ptr_array_index (resize_widgets, p); - g_message ("%p: %u: %s %p", self, p, G_OBJECT_TYPE_NAME (w), w); + g_warning ("%p: %u: %s %p", self, p, G_OBJECT_TYPE_NAME (w), w); } g_ptr_array_set_size (resize_widgets, 0); @@ -309,15 +333,24 @@ gtk_root_queue_resize (GtkRoot *self, if (iteration != 0) { - g_warning ("Adding widget %s %p to be resized while root %s %p is in resize iteration %d", - G_OBJECT_TYPE_NAME (widget), widget, - G_OBJECT_TYPE_NAME (self), self, - iteration); + /*g_warning ("Adding widget %s %p to be resized while root %s %p is in resize iteration %d",*/ + /*G_OBJECT_TYPE_NAME (widget), widget,*/ + /*G_OBJECT_TYPE_NAME (self), self,*/ + /*iteration);*/ } + g_message (">> Adding %s %p to resize widgets", G_OBJECT_TYPE_NAME (widget), widget); if (!g_ptr_array_find (resize_widgets, widget, NULL)) { g_ptr_array_add (resize_widgets, widget); - /*g_message ("Adding %s %p to resize widgets", G_OBJECT_TYPE_NAME (widget), widget);*/ + /*g_message (">> Adding %s %p to resize widgets", G_OBJECT_TYPE_NAME (widget), widget);*/ + + /*if (strcmp (G_OBJECT_TYPE_NAME (widget), "GtkBox") == 0)*/ + /*g_message ("BOX IN %s", G_OBJECT_TYPE_NAME (self));*/ + + /*if (strcmp (G_OBJECT_TYPE_NAME (widget), "GtkBox") == 0 &&*/ + /*strcmp (G_OBJECT_TYPE_NAME (self), "GtkTooltipWindow") != 0)*/ + /*g_warning ("HUH!");*/ + } } @@ -331,11 +364,12 @@ gtk_root_unqueue_resize (GtkRoot *self, if (!resize_widgets) return; + g_message (">> Removing %s %p from resize widgets", G_OBJECT_TYPE_NAME (widget), widget); if (g_ptr_array_find (resize_widgets, widget, &index)) { - /*g_message ("Removing %s %p from resize widgets", G_OBJECT_TYPE_NAME (widget), widget);*/ + /*g_message (">> Removing %s %p from resize widgets", G_OBJECT_TYPE_NAME (widget), widget);*/ g_ptr_array_remove_index_fast (resize_widgets, index); } else { - /*g_critical ("Removing %s %p not possible!", G_OBJECT_TYPE_NAME (widget), widget);*/ + /*g_message ("Removing %s %p not possible!", G_OBJECT_TYPE_NAME (widget), widget);*/ } } diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 81beb126d1..a00f4beacd 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -2721,7 +2721,6 @@ gtk_widget_hide (GtkWidget *widget) if (_gtk_widget_get_visible (widget)) { - GtkWidget *parent; GtkRoot *root; g_object_ref (widget); @@ -2744,11 +2743,17 @@ gtk_widget_hide (GtkWidget *widget) g_signal_emit (widget, widget_signals[HIDE], 0); g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_VISIBLE]); - parent = gtk_widget_get_parent (widget); - if (parent) - gtk_widget_queue_resize (parent); - gtk_widget_queue_allocate (widget); + if (root) + { + GtkWidget *parent; + + /* Unqueue resize on this widget and queue one on the parent */ + gtk_root_unqueue_resize (root, widget); + parent = gtk_widget_get_parent (widget); + if (parent) + gtk_widget_queue_resize (parent); + } gtk_widget_pop_verify_invariants (widget); g_object_unref (widget); @@ -3547,6 +3552,8 @@ gtk_widget_apply_resize_stuff (GtkWidget *widget) if (priv->resize_needed) return; + g_message ("%s: %s %p", __FUNCTION__, G_OBJECT_TYPE_NAME (widget), widget); + priv->resize_needed = TRUE; gtk_widget_set_alloc_needed (widget); @@ -3623,6 +3630,9 @@ gtk_widget_queue_resize (GtkWidget *widget) { g_return_if_fail (GTK_IS_WIDGET (widget)); + if (!gtk_widget_get_mapped (widget)) + return; + if (_gtk_widget_get_realized (widget)) gtk_widget_queue_draw (widget); @@ -3903,6 +3913,8 @@ gtk_widget_allocate (GtkWidget *widget, goto out; } + g_message ("%s: %s %p", __FUNCTION__, G_OBJECT_TYPE_NAME (widget), widget); + #ifdef G_ENABLE_DEBUG if (GTK_DISPLAY_DEBUG_CHECK (_gtk_widget_get_display (widget), RESIZE)) { @@ -10547,6 +10559,7 @@ gtk_widget_ensure_resize (GtkWidget *widget) priv->resize_needed = FALSE; _gtk_size_request_cache_clear (&priv->requests); + gtk_root_unqueue_resize (priv->root, widget); } void diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 4e687fa680..b3e88e5e79 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -1902,10 +1902,13 @@ gtk_window_native_check_resize (GtkNative *native) GtkWidget *widget = GTK_WIDGET (native); gint64 before = g_get_monotonic_time (); - if (!_gtk_widget_get_alloc_needed (widget)) + if (!_gtk_widget_get_alloc_needed (widget)) { + g_message ("%s: 1", __FUNCTION__); gtk_widget_ensure_allocate (widget); - else if (gtk_widget_get_visible (widget)) + } else if (gtk_widget_get_visible (widget)) { + g_message ("%s: 2", __FUNCTION__); gtk_window_move_resize (GTK_WINDOW (native)); + } if (GDK_PROFILER_IS_RUNNING) gdk_profiler_end_mark (before, "size allocation", ""); @@ -5513,6 +5516,7 @@ gtk_window_move_resize (GtkWindow *window) &min, NULL, NULL, NULL); allocation.height = MAX (min, current_height - shadow.top - shadow.bottom); + g_message ("%s: 1", __FUNCTION__); gtk_widget_size_allocate (widget, &allocation, -1); /* If the configure request changed, it means that @@ -5551,7 +5555,7 @@ gtk_window_move_resize (GtkWindow *window) */ info->last = saved_last_info; g_clear_pointer (&priv->layout, gdk_toplevel_layout_unref); - gtk_widget_queue_resize (widget); + /*gtk_widget_queue_resize (widget);*/ } return; /* Bail out, we didn't really process the move/resize */ @@ -5635,6 +5639,7 @@ gtk_window_move_resize (GtkWindow *window) gtk_widget_measure (widget, GTK_ORIENTATION_VERTICAL, allocation.width, &min_height, NULL, NULL, NULL); allocation.height = MAX (current_height - shadow.top - shadow.bottom, min_height); + g_message ("%s: 2", __FUNCTION__); gtk_widget_size_allocate (widget, &allocation, -1); } diff --git a/tests/testwidgetfocus.c b/tests/testwidgetfocus.c index 0d583fe30a..a5643c6532 100644 --- a/tests/testwidgetfocus.c +++ b/tests/testwidgetfocus.c @@ -232,13 +232,24 @@ gtk_focus_widget_init (GtkFocusWidget *self) { GtkEventController *controller; - self->child1 = gtk_button_new_with_label ("1"); + /*self->child1 = gtk_button_new_with_label ("1");*/ + self->child1 = gtk_spinner_new (); + gtk_spinner_set_spinning (GTK_SPINNER (self->child1), TRUE); gtk_widget_set_parent (self->child1, GTK_WIDGET (self)); - self->child2 = gtk_button_new_with_label ("2"); + /*self->child2 = gtk_button_new_with_label ("2");*/ + self->child2 = gtk_spinner_new (); + gtk_spinner_set_spinning (GTK_SPINNER (self->child2), TRUE); + gtk_widget_set_parent (self->child2, GTK_WIDGET (self)); - self->child3 = gtk_button_new_with_label ("3"); + /*self->child3 = gtk_button_new_with_label ("3");*/ + self->child3 = gtk_spinner_new (); + gtk_spinner_set_spinning (GTK_SPINNER (self->child3), TRUE); + gtk_widget_set_parent (self->child3, GTK_WIDGET (self)); - self->child4 = gtk_button_new_with_label ("4"); + /*self->child4 = gtk_button_new_with_label ("4");*/ + self->child4 = gtk_spinner_new (); + gtk_spinner_set_spinning (GTK_SPINNER (self->child4), TRUE); + gtk_widget_set_parent (self->child4, GTK_WIDGET (self)); self->mouse_x = G_MININT; |