summaryrefslogtreecommitdiff
path: root/gtk/gtkwidget.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>1999-01-27 18:21:20 +0000
committerOwen Taylor <otaylor@src.gnome.org>1999-01-27 18:21:20 +0000
commit14724626395882260fc73ae008a9df4fe7cbd877 (patch)
treed16769df30f0409e3faacd27a94b4a22a2be332d /gtk/gtkwidget.c
parent90c7ea0b9138bb94bef9b01f37c7d3faffcbc6b7 (diff)
downloadgdk-pixbuf-14724626395882260fc73ae008a9df4fe7cbd877.tar.gz
Use floor() instead of truncating to integer values so we get translation
Wed Jan 20 11:19:00 1999 Owen Taylor <otaylor@redhat.com> * gtk/gtklabel.c: Use floor() instead of truncating to integer values so we get translation invariance. * gtk/gtklayout.c (gtk_layout_size_allocate): Set upper and lower values for adjustments in size_allocate(). * gdk/gdkwindow.c gdk/gdk.h gdk/gdkprivate.h: New function gdk_window_set_static_gravities() to set up a window for guffaw scrolling. * gdk/gdkwindow.c (gdk_window_internal_destroy): Set flags indicating destroyed state before cleanup. * gtk/gtkprivate.h gtk/gtkwidget.c: Add a new private flag IS_OFFSCREEN. If set, this indicates to GTK+ that the widget is not to be considered viewable regardless of its map state. Queued draws on offscreen widgets are suppressed. Added new function static gtk_widget_is_offscreen() to check this flag on a widget and its ancestors. * gtk/gtklayout.[ch]: Major revisions. - Use gdk_window_set_static_gravities to set static gravity on all child windows, and thus avoid having to create a window for NO_WINDOW children. - Adjust allocations of children as we scroll them so queued draws work correctly. - Don't allocate our children directly in a put() or move(); just queue a resize() like every other widget. * gtk/testgtk.c: Make the arrows on the scrollbars work, create a larger and more demanding test.
Diffstat (limited to 'gtk/gtkwidget.c')
-rw-r--r--gtk/gtkwidget.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index b00272d14..138dcf771 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -172,6 +172,8 @@ static void gtk_widget_set_style_internal (GtkWidget *widget,
static void gtk_widget_set_style_recurse (GtkWidget *widget,
gpointer client_data);
+static gboolean gtk_widget_is_offscreen (GtkWidget *widget);
+
static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
@@ -1214,8 +1216,13 @@ gtk_widget_queue_clear_child (GtkWidget *widget)
{
GtkWidget *parent;
+ /* We check for GTK_WIDGET_IS_OFFSCREEN (widget),
+ * and queue_clear_area(parent...) will check the rest of
+ * way up the tree with gtk_widget_is_offscreen (parent)
+ */
parent = widget->parent;
- if (parent && GTK_WIDGET_DRAWABLE (parent))
+ if (parent && GTK_WIDGET_DRAWABLE (parent) &&
+ !GTK_WIDGET_IS_OFFSCREEN (widget))
gtk_widget_queue_clear_area (parent,
widget->allocation.x,
widget->allocation.y,
@@ -1800,7 +1807,8 @@ gtk_widget_queue_draw_area (GtkWidget *widget,
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
- if (widget->window && gdk_window_is_viewable (widget->window))
+ if (widget->window && gdk_window_is_viewable (widget->window) &&
+ !gtk_widget_is_offscreen (widget))
gtk_widget_queue_draw_data (widget, x, y, width, height, NULL);
}
@@ -1810,7 +1818,8 @@ gtk_widget_queue_draw (GtkWidget *widget)
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
- if (widget->window && gdk_window_is_viewable (widget->window))
+ if (widget->window && gdk_window_is_viewable (widget->window) &&
+ !gtk_widget_is_offscreen (widget))
gtk_widget_queue_draw_data (widget, 0, 0, -1, -1, NULL);
}
@@ -1826,7 +1835,8 @@ gtk_widget_queue_clear_area (GtkWidget *widget,
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
- if (!(widget->window && gdk_window_is_viewable (widget->window)))
+ if (!(widget->window && gdk_window_is_viewable (widget->window)) ||
+ gtk_widget_is_offscreen (widget))
return;
/* Find the correct widget */
@@ -4587,6 +4597,29 @@ gtk_widget_propagate_state (GtkWidget *widget,
}
}
+/*************************************************************
+ * gtk_widget_is_offscreen:
+ * Check if a widget is "offscreen"
+ * arguments:
+ * widget: a widget
+ * results:
+ * TRUE if the widget or any of ancestors has the
+ * PRIVATE_GTK_WIDGET_IS_OFFSCREEN set.
+ *************************************************************/
+
+static gboolean
+gtk_widget_is_offscreen (GtkWidget *widget)
+{
+ while (widget)
+ {
+ if (GTK_WIDGET_IS_OFFSCREEN (widget))
+ return TRUE;
+ widget = widget->parent;
+ }
+
+ return FALSE;
+}
+
/*****************************************
* gtk_widget_aux_info_new:
*