diff options
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkstyle.c | 24 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 87 |
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); |