diff options
Diffstat (limited to 'gtk/gtkwindow.c')
-rw-r--r-- | gtk/gtkwindow.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index dab50be990..2be4ac06bc 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -266,6 +266,8 @@ typedef struct guint hide_on_close : 1; guint in_emit_close_request : 1; + guint last_allocate_iteration : 1; + GdkSurfaceTypeHint type_hint; GtkGesture *click_gesture; @@ -283,6 +285,10 @@ typedef struct GList *foci; GtkConstraintSolver *constraint_solver; + + GPtrArray *resize_widgets; + GPtrArray *allocate_widgets; + } GtkWindowPrivate; #ifdef GDK_WINDOWING_X11 @@ -1836,6 +1842,9 @@ gtk_window_init (GtkWindow *window) priv->has_user_ref_count = TRUE; gtk_window_update_debugging (); + priv->resize_widgets = g_ptr_array_new (); + priv->allocate_widgets = g_ptr_array_new (); + #ifdef GDK_WINDOWING_X11 g_signal_connect (gtk_settings_get_for_display (priv->display), "notify::gtk-application-prefer-dark-theme", @@ -4720,6 +4729,9 @@ gtk_window_finalize (GObject *object) priv->keys_changed_handler = 0; } + g_ptr_array_free (priv->resize_widgets, TRUE); + g_ptr_array_free (priv->allocate_widgets, TRUE); + g_signal_handlers_disconnect_by_func (gdk_display_get_default_seat (priv->display), device_removed_cb, window); @@ -9521,3 +9533,78 @@ gtk_window_maybe_update_cursor (GtkWindow *window, break; } } + +void +gtk_window_add_resize_widget (GtkWindow *window, + GtkWidget *widget) +{ + GtkWindowPrivate *priv = gtk_window_get_instance_private (window); + + if (g_ptr_array_find (priv->resize_widgets, widget, NULL)) + return; + + if (priv->last_allocate_iteration) + g_critical ("Resize of %s %p caused N+1 allocate iterations.", G_OBJECT_TYPE_NAME (widget), widget); + + g_ptr_array_add (priv->resize_widgets, widget); + gtk_container_start_idle_sizer (GTK_CONTAINER (window)); +} + +void +gtk_window_remove_resize_widget (GtkWindow *window, + GtkWidget *widget) +{ + GtkWindowPrivate *priv = gtk_window_get_instance_private (window); + + g_ptr_array_remove_fast (priv->resize_widgets, widget); +} + +void +gtk_window_add_allocate_widget (GtkWindow *window, + GtkWidget *widget) +{ + GtkWindowPrivate *priv = gtk_window_get_instance_private (window); + + if (g_ptr_array_find (priv->allocate_widgets, widget, NULL)) + return; + + if (priv->last_allocate_iteration) + g_critical ("Allocate of %s %p caused N+1 allocate iterations.", G_OBJECT_TYPE_NAME (widget), widget); + + g_ptr_array_add (priv->allocate_widgets, widget); + gtk_container_start_idle_sizer (GTK_CONTAINER (window)); +} + +void +gtk_window_remove_allocate_widget (GtkWindow *window, + GtkWidget *widget) +{ + GtkWindowPrivate *priv = gtk_window_get_instance_private (window); + + g_ptr_array_remove_fast (priv->allocate_widgets, widget); +} + +GPtrArray * +gtk_window_get_resize_widgets (GtkWindow *window) +{ + GtkWindowPrivate *priv = gtk_window_get_instance_private (window); + + return priv->resize_widgets; +} + +GPtrArray * +gtk_window_get_allocate_widgets (GtkWindow *window) +{ + GtkWindowPrivate *priv = gtk_window_get_instance_private (window); + + return priv->allocate_widgets; +} + +void +gtk_window_set_last_allocate_iteration (GtkWindow *window, + gboolean is_last) +{ + GtkWindowPrivate *priv = gtk_window_get_instance_private (window); + + priv->last_allocate_iteration = is_last; +} |