summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkstyle.c24
-rw-r--r--gtk/gtkwidget.c87
2 files changed, 74 insertions, 37 deletions
diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c
index 10fb2f7e26..7452c52e88 100644
--- a/gtk/gtkstyle.c
+++ b/gtk/gtkstyle.c
@@ -2905,7 +2905,6 @@ draw_arrow (GdkWindow *window,
if (area)
{
- cairo_save (cr);
cairo_rectangle (cr, area->x, area->y, area->width, area->height);
cairo_clip (cr);
cairo_new_path (cr);
@@ -2939,9 +2938,6 @@ draw_arrow (GdkWindow *window,
cairo_close_path (cr);
cairo_fill (cr);
- if (area)
- cairo_restore (cr);
-
cairo_destroy (cr);
}
@@ -3631,7 +3627,6 @@ gtk_default_draw_check (GtkStyle *style,
if (area)
{
- cairo_save (cr);
cairo_rectangle (cr, area->x, area->y, area->width, area->height);
cairo_clip (cr);
cairo_new_path (cr);
@@ -3726,9 +3721,6 @@ gtk_default_draw_check (GtkStyle *style,
cairo_fill (cr);
}
- if (area)
- cairo_restore (cr);
-
cairo_destroy (cr);
}
@@ -3759,7 +3751,6 @@ gtk_default_draw_option (GtkStyle *style,
if (area)
{
- cairo_save (cr);
cairo_rectangle (cr, area->x, area->y, area->width, area->height);
cairo_clip (cr);
cairo_new_path (cr);
@@ -3784,9 +3775,7 @@ gtk_default_draw_option (GtkStyle *style,
(exterior_size - 1) / 2.,
0, 2 * G_PI);
- cairo_save (cr);
- cairo_fill (cr);
- cairo_restore (cr);
+ cairo_fill_preserve (cr);
if (type == BUTTON)
gdk_cairo_set_source_color (cr, &style->fg[state_type]);
@@ -3853,9 +3842,6 @@ gtk_default_draw_option (GtkStyle *style,
cairo_fill (cr);
}
- if (area)
- cairo_restore (cr);
-
cairo_destroy (cr);
}
@@ -4811,7 +4797,6 @@ gtk_default_draw_expander (GtkStyle *style,
if (area)
{
- cairo_save (cr);
cairo_rectangle (cr, area->x, area->y, area->width, area->height);
cairo_clip (cr);
cairo_new_path (cr);
@@ -4888,7 +4873,6 @@ gtk_default_draw_expander (GtkStyle *style,
cairo_set_line_width (cr, line_width);
- cairo_save (cr);
if (state_type == GTK_STATE_PRELIGHT)
gdk_cairo_set_source_color (cr,
&style->fg[GTK_STATE_PRELIGHT]);
@@ -4899,15 +4883,11 @@ gtk_default_draw_expander (GtkStyle *style,
gdk_cairo_set_source_color (cr,
&style->base[GTK_STATE_NORMAL]);
- cairo_fill (cr);
- cairo_restore (cr);
+ cairo_fill_preserve (cr);
gdk_cairo_set_source_color (cr, &style->fg[state_type]);
cairo_stroke (cr);
- if (area)
- cairo_restore (cr);
-
cairo_destroy (cr);
}
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 44ecea206b..72b78f939c 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -227,6 +227,8 @@ static gboolean gtk_widget_real_can_activate_accel (GtkWidget *widg
static void gtk_widget_set_usize_internal (GtkWidget *widget,
gint width,
gint height);
+static void gtk_widget_get_draw_rectangle (GtkWidget *widget,
+ GdkRectangle *rect);
/* --- variables --- */
@@ -1456,6 +1458,12 @@ gtk_widget_class_init (GtkWidgetClass *klass)
P_("Aspect ratio with which to draw insertion cursor"),
0.0, 1.0, 0.04,
GTK_PARAM_READABLE));
+ gtk_widget_class_install_style_property (klass,
+ g_param_spec_boxed ("draw-border",
+ P_("Draw Border"),
+ P_("Size of areas outside the widget's allocation to draw"),
+ GTK_TYPE_BORDER,
+ GTK_PARAM_READABLE));
}
static void
@@ -2430,6 +2438,55 @@ gtk_widget_queue_draw_area (GtkWidget *widget,
gdk_window_invalidate_rect (widget->window, &invalid_rect, TRUE);
}
+static void
+widget_add_child_draw_rectangle (GtkWidget *widget,
+ GdkRectangle *rect)
+{
+ GdkRectangle child_rect;
+
+ if (!GTK_WIDGET_REALIZED (widget) ||
+ widget->window != widget->parent->window)
+ return;
+
+ gtk_widget_get_draw_rectangle (widget, &child_rect);
+ gdk_rectangle_union (rect, &child_rect, rect);
+}
+
+static void
+gtk_widget_get_draw_rectangle (GtkWidget *widget,
+ GdkRectangle *rect)
+{
+ if (GTK_WIDGET_NO_WINDOW (widget))
+ {
+ GtkBorder *draw_border = NULL;
+
+ *rect = widget->allocation;
+
+ gtk_widget_style_get (widget,
+ "draw-border", &draw_border,
+ NULL);
+ if (draw_border)
+ {
+ rect->x -= draw_border->top;
+ rect->y -= draw_border->left;
+ rect->width += draw_border->left + draw_border->right;
+ rect->height += draw_border->top + draw_border->bottom;
+ }
+
+ if (GTK_IS_CONTAINER (widget))
+ gtk_container_forall (GTK_CONTAINER (widget),
+ (GtkCallback)widget_add_child_draw_rectangle,
+ rect);
+ }
+ else
+ {
+ rect->x = 0;
+ rect->y = 0;
+ rect->width = widget->allocation.width;
+ rect->height = widget->allocation.height;
+ }
+}
+
/**
* gtk_widget_queue_draw:
* @widget: a #GtkWidget
@@ -2441,20 +2498,15 @@ gtk_widget_queue_draw_area (GtkWidget *widget,
void
gtk_widget_queue_draw (GtkWidget *widget)
{
+ GdkRectangle rect;
+
g_return_if_fail (GTK_IS_WIDGET (widget));
- if (widget->allocation.width || widget->allocation.height)
- {
- if (GTK_WIDGET_NO_WINDOW (widget))
- gtk_widget_queue_draw_area (widget, widget->allocation.x,
- widget->allocation.y,
- widget->allocation.width,
- widget->allocation.height);
- else
- gtk_widget_queue_draw_area (widget, 0, 0,
- widget->allocation.width,
- widget->allocation.height);
- }
+ gtk_widget_get_draw_rectangle (widget, &rect);
+
+ gtk_widget_queue_draw_area (widget,
+ rect.x, rect.y,
+ rect.width, rect.height);
}
/* Invalidates the given area (allocation-relative-coordinates)
@@ -2687,11 +2739,13 @@ gtk_widget_invalidate_widget_windows (GtkWidget *widget,
static void
gtk_widget_queue_shallow_draw (GtkWidget *widget)
{
+ GdkRectangle rect;
GdkRegion *region;
g_return_if_fail (GTK_IS_WIDGET (widget));
-
- region = gdk_region_rectangle (&widget->allocation);
+
+ gtk_widget_get_draw_rectangle (widget, &rect);
+ region = gdk_region_rectangle (&rect);
gtk_widget_invalidate_widget_windows (widget, region);
gdk_region_destroy (region);
}
@@ -3883,12 +3937,15 @@ GdkRegion *
gtk_widget_region_intersect (GtkWidget *widget,
GdkRegion *region)
{
+ GdkRectangle rect;
GdkRegion *dest;
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
g_return_val_if_fail (region != NULL, NULL);
+
+ gtk_widget_get_draw_rectangle (widget, &rect);
- dest = gdk_region_rectangle (&widget->allocation);
+ dest = gdk_region_rectangle (&rect);
gdk_region_intersect (dest, region);