summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2020-06-02 09:53:28 +0200
committerTimm Bäder <mail@baedert.org>2020-06-03 08:18:56 +0200
commit3b089714738d30df53adf3466237556b5f0fc466 (patch)
tree714ea62b2ab6b1fe30cbbf802ed7c7da2f085c56
parentfaeab008bfc5a706802eeb757f013f34c2d967c0 (diff)
downloadgtk+-wip/baedert/resize2.tar.gz
-rw-r--r--gtk/gtkroot.c62
-rw-r--r--gtk/gtkwidget.c23
-rw-r--r--gtk/gtkwindow.c11
-rw-r--r--tests/testwidgetfocus.c19
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;