summaryrefslogtreecommitdiff
path: root/gtk/gtksizegroup.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2001-11-04 22:57:03 +0000
committerOwen Taylor <otaylor@src.gnome.org>2001-11-04 22:57:03 +0000
commit21457ced17e61cf260e83a64152fe4573a2883da (patch)
tree73fd9a02301ff278680f3761fec932a32b2e4ee1 /gtk/gtksizegroup.c
parentbc5849a5e0d3c30a781cd433691bf3caef989c12 (diff)
downloadgtk+-21457ced17e61cf260e83a64152fe4573a2883da.tar.gz
Add a function gdk_window_invalidate_maybe_recurse() for use in "shallow
Sun Nov 4 16:02:08 2001 Owen Taylor <otaylor@redhat.com> * gdk/gdkwindow.[ch]: Add a function gdk_window_invalidate_maybe_recurse() for use in "shallow invalidation" of a widget. (Windows belonging to the widget, but not to the widget's children) * gtk/gtkprivate.h gtk/gtkwidget.c gtk/gtksizegroup.c: Add private flags GTK_ALLOC_NEEDED, GTK_REQUEST_NEEDED. These flags are set up on ancestors up to the resize container on queue_resize. Size requests only actually take place if GTK_REQUEST_NEEDED, size allocations only take place if GTK_ALLOC_NEEDED or the size changed. * gtk/gtkcontainer.c gtk/gtkwidget.c: Remove container->resize_widgets and the RESIZE_NEEDED flag since the above flags are sufficient to figure out what needs to be resized/reallocated. Remove code manipulating container->resize_widget. * gtk/gtkwidget.[ch]: Add gtk_widget_set_redraw_on_alloc(); this allows widgets to turn off being automatically invalidated is when they are resized. * gtk/gtkwidget.[ch] (gtk_widget_size_allocate): Invalidation when a widget is resized or moved is "shallow" as described above - only the windows that need to be invalidated are invalidated. * gtk/gtkbox.c gtk/gtktable.c gtk/gtkalignment.c docs/Changes-2.0.txt: Make these widget's init functions call gtk_widget_set_redraw_on_allocate(widget,FALSE). * gtk/gtkwindow.c (gtk_window_configure_event): Call _gtk_container_queue_resize(), since we don't want redrawing. (Probably could be done for other calls to gtk_widget_queue_resize() in gtkwindow.c, but this is the most important one.) * gtk/gtkwindow.c (gtk_window_move_resize): Don't call gtk_widget_queue_draw() - size_allocate() handles that as appropriate. * gtk/gtkframe.c (gtk_frame_size_allocate): Invalidate instead of queue_clear() to avoid invalidating children.
Diffstat (limited to 'gtk/gtksizegroup.c')
-rw-r--r--gtk/gtksizegroup.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/gtk/gtksizegroup.c b/gtk/gtksizegroup.c
index 3116183ae4..2ceca3c4d8 100644
--- a/gtk/gtksizegroup.c
+++ b/gtk/gtksizegroup.c
@@ -20,6 +20,7 @@
#include "gtkcontainer.h"
#include "gtkintl.h"
+#include "gtkprivate.h"
#include "gtksignal.h"
#include "gtksizegroup.h"
@@ -116,8 +117,8 @@ add_widget_to_closure (GtkWidget *widget,
static void
real_queue_resize (GtkWidget *widget)
{
- if (GTK_IS_RESIZE_CONTAINER (widget))
- _gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
+ GTK_PRIVATE_SET_FLAG (widget, GTK_ALLOC_NEEDED);
+ GTK_PRIVATE_SET_FLAG (widget, GTK_REQUEST_NEEDED);
if (widget->parent)
_gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
@@ -476,12 +477,23 @@ get_base_dimension (GtkWidget *widget,
}
}
+static void
+do_size_request (GtkWidget *widget)
+{
+ if (GTK_WIDGET_REQUEST_NEEDED (widget))
+ {
+ gtk_widget_ensure_style (widget);
+ gtk_signal_emit_by_name (GTK_OBJECT (widget), "size_request", &widget->requisition);
+
+ GTK_PRIVATE_UNSET_FLAG (widget, GTK_REQUEST_NEEDED);
+ }
+}
+
static gint
compute_base_dimension (GtkWidget *widget,
GtkSizeGroupMode mode)
{
- gtk_widget_ensure_style (widget);
- gtk_signal_emit_by_name (GTK_OBJECT (widget), "size_request", &widget->requisition);
+ do_size_request (widget);
return get_base_dimension (widget, mode);
}
@@ -658,9 +670,8 @@ _gtk_size_group_compute_requisition (GtkWidget *widget,
}
else
{
- gtk_widget_ensure_style (widget);
- gtk_signal_emit_by_name (GTK_OBJECT (widget), "size_request", &widget->requisition);
-
+ do_size_request (widget);
+
if (requisition)
get_fast_child_requisition (widget, requisition);
}