diff options
author | Thomas Wood <thomas.wood@intel.com> | 2010-07-05 17:57:24 +0100 |
---|---|---|
committer | Thomas Wood <thomas.wood@intel.com> | 2010-07-05 17:57:24 +0100 |
commit | 59920f88a0ebfa4d4bb9b19029a99c108989e583 (patch) | |
tree | 38ce4ff752565e0ac66b7c212a5af0da1f4a3a5d | |
parent | a5b092326dc03375df3966f11a6008f9af161a06 (diff) | |
download | gnome-control-center-59920f88a0ebfa4d4bb9b19029a99c108989e583.tar.gz |
display: replace the use of GdkRegion with cairo_region_t
GdkRegion has been removed in Gtk+ 3 and replaced with cairo_region_t.
-rw-r--r-- | panels/display/scrollarea.c | 437 | ||||
-rw-r--r-- | panels/display/scrollarea.h | 12 | ||||
-rw-r--r-- | panels/display/xrandr-capplet.c | 10 |
3 files changed, 97 insertions, 362 deletions
diff --git a/panels/display/scrollarea.c b/panels/display/scrollarea.c index af164f42a..26b7d840e 100644 --- a/panels/display/scrollarea.c +++ b/panels/display/scrollarea.c @@ -28,30 +28,9 @@ static GtkWidgetClass *parent_class; typedef struct BackingStore BackingStore; -typedef void (* ExposeFunc) (cairo_t *cr, GdkRegion *region, gpointer data); - -#if 0 -static void backing_store_draw (BackingStore *store, - GdkDrawable *dest, - GdkRegion *clip, - int dest_x, - int dest_y); -static void backing_store_scroll (BackingStore *store, - int dx, int dy); -static void backing_store_invalidate_rect (BackingStore *store, - GdkRectangle *rect); -static void backing_store_invalidate_region (BackingStore *store, - GdkRegion *region); -static void backing_store_invalidate_all (BackingStore *store); -static BackingStore *backing_store_new (GdkWindow *window, - int width, int height); -static void backing_store_resize (BackingStore *store, - int width, int height); -static void backing_store_process_updates (BackingStore *store, - ExposeFunc func, - gpointer data); -static void backing_store_free (BackingStore *store); -#endif +typedef void (* ExposeFunc) (cairo_t *cr, + cairo_region_t *region, + gpointer data); typedef struct InputPath InputPath; typedef struct InputRegion InputRegion; @@ -73,7 +52,9 @@ struct InputPath /* InputRegions are mutually disjoint */ struct InputRegion { - GdkRegion *region; /* the boundary of this area in canvas coordinates */ + /* the boundary of this area in canvas coordinates */ + cairo_region_t *region; + InputPath *paths; }; @@ -113,7 +94,7 @@ struct FooScrollAreaPrivate * * It is used for clipping of input areas */ - GdkRegion *expose_region; + cairo_region_t *expose_region; InputRegion *current_input; gboolean grabbed; @@ -121,7 +102,7 @@ struct FooScrollAreaPrivate gpointer grab_data; GdkPixmap *pixmap; - GdkRegion *update_region; /* In canvas coordinates */ + cairo_region_t *update_region; /* In canvas coordinates */ }; enum @@ -279,7 +260,7 @@ foo_scroll_area_init (FooScrollArea *scroll_area) scroll_area->priv->auto_scroll_info = NULL; scroll_area->priv->input_regions = g_ptr_array_new (); scroll_area->priv->pixmap = NULL; - scroll_area->priv->update_region = gdk_region_new (); + scroll_area->priv->update_region = cairo_region_create (); gtk_widget_set_double_buffered (widget, FALSE); } @@ -299,26 +280,6 @@ translate_cairo_device (cairo_t *cr, cairo_surface_set_device_offset (surface, dev_x, dev_y); } -#if 0 -static void -print_region (const char *header, GdkRegion *region) -{ - GdkRectangle *rects; - int n_rects; - int i; - - g_print ("%s\n", header); - - gdk_region_get_rectangles (region, &rects, &n_rects); - for (i = 0; i < n_rects; ++i) - { - GdkRectangle *rect = &(rects[i]); - g_print (" %d %d %d %d\n", - rect->x, rect->y, rect->width, rect->height); - } -} -#endif - typedef void (* PathForeachFunc) (double *x, double *y, gpointer data); @@ -412,7 +373,7 @@ static void input_region_free (InputRegion *region) { input_path_free_list (region->paths); - gdk_region_destroy (region->region); + cairo_region_destroy (region->region); g_free (region); } @@ -442,58 +403,35 @@ allocation_to_canvas (FooScrollArea *area, } static void -clear_exposed_input_region (FooScrollArea *area, - GdkRegion *exposed) /* in canvas coordinates */ +clear_exposed_input_region (FooScrollArea *area, + cairo_region_t *exposed) /* in canvas coordinates */ { int i; - GdkRegion *viewport; + cairo_region_t *viewport; GdkRectangle allocation; gtk_widget_get_allocation (GTK_WIDGET (area), &allocation); allocation.x = 0; allocation.y = 0; allocation_to_canvas (area, &allocation.x, &allocation.y); - viewport = gdk_region_rectangle (&allocation); - gdk_region_subtract (viewport, exposed); + + viewport = cairo_region_create_rectangle (&allocation); + cairo_region_subtract (viewport, exposed); for (i = 0; i < area->priv->input_regions->len; ++i) { InputRegion *region = area->priv->input_regions->pdata[i]; - gdk_region_intersect (region->region, viewport); + cairo_region_intersect (region->region, viewport); - if (gdk_region_empty (region->region)) + if (cairo_region_is_empty (region->region)) { input_region_free (region); g_ptr_array_remove_index_fast (area->priv->input_regions, i--); } } - gdk_region_destroy (viewport); - -#if 0 - path = region->paths; - while (path != NULL) - { - GdkRectangle rect; - - path_compute_extents (path->path, &rect); - - if (gdk_region_rect_in (area->priv->expose_region, &rect) == GDK_OVERLAP_RECTANGLE_IN) - g_print ("we would have deleted it\n"); -#if 0 - else - g_print ("nope (%d %d %d %d)\n", ); -#endif - - path = path->next; - } - - /* FIXME: we should also delete paths (and path segments) - * completely contained in the expose_region - */ - } -#endif + cairo_region_destroy (viewport); } static void @@ -521,8 +459,8 @@ setup_background_cr (GdkWindow *window, setup_background_cr (parent, cr, x_offset, y_offset); } else if (pixmap && - !parent_relative && - pixmap != GDK_NO_BG) + !parent_relative/* && + pixmap != GDK_NO_BG*/) { gdk_cairo_set_source_pixmap (cr, pixmap, -x_offset, -y_offset); } @@ -542,23 +480,10 @@ initialize_background (GtkWidget *widget, } static void -clip_to_region (cairo_t *cr, GdkRegion *region) +clip_to_region (cairo_t *cr, cairo_region_t *region) { - int n_rects; - GdkRectangle *rects; - - gdk_region_get_rectangles (region, &rects, &n_rects); - - cairo_new_path (cr); - while (n_rects--) - { - GdkRectangle *rect = &(rects[n_rects]); - - cairo_rectangle (cr, rect->x, rect->y, rect->width, rect->height); - } + gdk_cairo_region (cr, region); cairo_clip (cr); - - g_free (rects); } static void @@ -585,7 +510,7 @@ foo_scroll_area_expose (GtkWidget *widget, FooScrollArea *scroll_area = FOO_SCROLL_AREA (widget); cairo_t *cr; GdkRectangle extents; - GdkRegion *region; + cairo_region_t *region; int x_offset, y_offset; GdkGC *gc; GtkAllocation widget_allocation; @@ -613,13 +538,13 @@ foo_scroll_area_expose (GtkWidget *widget, clear_exposed_input_region (scroll_area, scroll_area->priv->update_region); scroll_area->priv->current_input = g_new0 (InputRegion, 1); - scroll_area->priv->current_input->region = gdk_region_copy (scroll_area->priv->update_region); + scroll_area->priv->current_input->region = cairo_region_copy (scroll_area->priv->update_region); scroll_area->priv->current_input->paths = NULL; g_ptr_array_add (scroll_area->priv->input_regions, scroll_area->priv->current_input); region = scroll_area->priv->update_region; - scroll_area->priv->update_region = gdk_region_new (); + scroll_area->priv->update_region = cairo_region_create (); /* Create cairo context */ cr = gdk_cairo_create (scroll_area->priv->pixmap); @@ -628,7 +553,7 @@ foo_scroll_area_expose (GtkWidget *widget, initialize_background (widget, cr); /* Create regions */ - gdk_region_get_clipbox (region, &extents); + cairo_region_get_extents (region, &extents); g_signal_emit (widget, signals[PAINT], 0, cr, &extents, region); @@ -649,7 +574,7 @@ foo_scroll_area_expose (GtkWidget *widget, widget_allocation.width, widget_allocation.height); g_object_unref (gc); - gdk_region_destroy (region); + cairo_region_destroy (region); return TRUE; } @@ -822,12 +747,27 @@ create_new_pixmap (GtkWidget *widget, } static void -allocation_to_canvas_region (FooScrollArea *area, - GdkRegion *region) +allocation_to_canvas_region (FooScrollArea *area, + cairo_region_t *region) { - gdk_region_offset (region, area->priv->x_offset, area->priv->y_offset); + cairo_region_translate (region, area->priv->x_offset, area->priv->y_offset); +} + +static void +_cairo_region_xor (cairo_region_t *dst, + const cairo_region_t *src) +{ + cairo_region_t *trb; + + trb = cairo_region_copy (src); + + cairo_region_subtract (trb, dst); + cairo_region_subtract (dst, src); + + cairo_region_union (dst, trb); + + cairo_region_destroy (trb); } - static void foo_scroll_area_size_allocate (GtkWidget *widget, @@ -836,23 +776,26 @@ foo_scroll_area_size_allocate (GtkWidget *widget, FooScrollArea *scroll_area = FOO_SCROLL_AREA (widget); GdkRectangle new_viewport; GdkRectangle old_viewport; - GdkRegion *old_allocation; - GdkRegion *invalid; + cairo_region_t *old_allocation; + cairo_region_t *invalid; GtkAllocation widget_allocation; get_viewport (scroll_area, &old_viewport); gtk_widget_get_allocation (widget, &widget_allocation); - old_allocation = gdk_region_rectangle (&widget_allocation); - gdk_region_offset (old_allocation, - -widget_allocation.x, -widget_allocation.y); - invalid = gdk_region_rectangle (allocation); - gdk_region_offset (invalid, -allocation->x, -allocation->y); - gdk_region_xor (invalid, old_allocation); + + old_allocation = cairo_region_create_rectangle (&widget_allocation); + cairo_region_translate (old_allocation, + -widget_allocation.x, -widget_allocation.y); + + invalid = cairo_region_create_rectangle (allocation); + cairo_region_translate (invalid, -allocation->x, -allocation->y); + _cairo_region_xor (invalid, old_allocation); allocation_to_canvas_region (scroll_area, invalid); foo_scroll_area_invalidate_region (scroll_area, invalid); - gdk_region_destroy (old_allocation); - gdk_region_destroy (invalid); + + cairo_region_destroy (old_allocation); + cairo_region_destroy (invalid); gtk_widget_set_allocation (widget, allocation); @@ -978,7 +921,7 @@ process_event (FooScrollArea *scroll_area, print_region ("region:", region->region); #endif - if (gdk_region_point_in (region->region, x, y)) + if (cairo_region_contains_point (region->region, x, y)) { InputPath *path; @@ -1184,28 +1127,6 @@ translate_input_regions (FooScrollArea *scroll_area, #endif } -#if 0 -static void -paint_region (FooScrollArea *area, GdkRegion *region) -{ - int n_rects; - GdkRectangle *rects; - region = gdk_region_copy (region); - - gdk_region_get_rectangles (region, &rects, &n_rects); - - gdk_region_offset (region, - GTK_WIDGET (area)->allocation.x, - GTK_WIDGET (area)->allocation.y); - - GdkGC *gc = gdk_gc_new (GTK_WIDGET (area)->window); - gdk_gc_set_clip_region (gc, region); - gdk_draw_rectangle (GTK_WIDGET (area)->window, gc, TRUE, 0, 0, -1, -1); - g_object_unref (gc); - g_free (rects); -} -#endif - static void foo_scroll_area_scroll (FooScrollArea *area, gint dx, @@ -1214,7 +1135,7 @@ foo_scroll_area_scroll (FooScrollArea *area, GdkRectangle allocation; GdkRectangle src_area; GdkRectangle move_area; - GdkRegion *invalid_region; + cairo_region_t *invalid_region; gtk_widget_get_allocation (GTK_WIDGET (area), &allocation); allocation.x = 0; @@ -1224,11 +1145,11 @@ foo_scroll_area_scroll (FooScrollArea *area, src_area.x -= dx; src_area.y -= dy; - invalid_region = gdk_region_rectangle (&allocation); + invalid_region = cairo_region_create_rectangle (&allocation); if (gdk_rectangle_intersect (&allocation, &src_area, &move_area)) { - GdkRegion *move_region; + cairo_region_t *move_region; #if 0 g_print ("scrolling %d %d %d %d (%d %d)\n", @@ -1243,10 +1164,10 @@ foo_scroll_area_scroll (FooScrollArea *area, move_area.width, move_area.height); gtk_widget_queue_draw (GTK_WIDGET (area)); - move_region = gdk_region_rectangle (&move_area); - gdk_region_offset (move_region, dx, dy); - gdk_region_subtract (invalid_region, move_region); - gdk_region_destroy (move_region); + move_region = cairo_region_create_rectangle (&move_area); + cairo_region_translate (move_region, dx, dy); + cairo_region_subtract (invalid_region, move_region); + cairo_region_destroy (move_region); } #if 0 @@ -1257,7 +1178,7 @@ foo_scroll_area_scroll (FooScrollArea *area, foo_scroll_area_invalidate_region (area, invalid_region); - gdk_region_destroy (invalid_region); + cairo_region_destroy (invalid_region); } static void @@ -1467,34 +1388,34 @@ foo_scroll_area_invalidate (FooScrollArea *scroll_area) } static void -canvas_to_window (FooScrollArea *area, - GdkRegion *region) +canvas_to_window (FooScrollArea *area, + cairo_region_t *region) { GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (area); gtk_widget_get_allocation (widget, &allocation); - gdk_region_offset (region, - -area->priv->x_offset + allocation.x, - -area->priv->y_offset + allocation.y); + cairo_region_translate (region, + -area->priv->x_offset + allocation.x, + -area->priv->y_offset + allocation.y); } static void -window_to_canvas (FooScrollArea *area, - GdkRegion *region) +window_to_canvas (FooScrollArea *area, + cairo_region_t *region) { GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (area); gtk_widget_get_allocation (widget, &allocation); - gdk_region_offset (region, - area->priv->x_offset - allocation.x, - area->priv->y_offset - allocation.y); + cairo_region_translate (region, + area->priv->x_offset - allocation.x, + area->priv->y_offset - allocation.y); } void -foo_scroll_area_invalidate_region (FooScrollArea *area, - GdkRegion *region) +foo_scroll_area_invalidate_region (FooScrollArea *area, + cairo_region_t *region) { GtkWidget *widget; @@ -1502,7 +1423,7 @@ foo_scroll_area_invalidate_region (FooScrollArea *area, widget = GTK_WIDGET (area); - gdk_region_union (area->priv->update_region, region); + cairo_region_union (area->priv->update_region, region); if (gtk_widget_get_realized (widget)) { @@ -1522,16 +1443,16 @@ foo_scroll_area_invalidate_rect (FooScrollArea *scroll_area, int width, int height) { - GdkRectangle rect = { x, y, width, height }; - GdkRegion *region; + cairo_rectangle_int_t rect = { x, y, width, height }; + cairo_region_t *region; g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area)); - region = gdk_region_rectangle (&rect); + region = cairo_region_create_rectangle (&rect); foo_scroll_area_invalidate_region (scroll_area, region); - gdk_region_destroy (region); + cairo_region_destroy (region); } void @@ -1767,189 +1688,3 @@ foo_scroll_area_end_auto_scroll (FooScrollArea *scroll_area) stop_scrolling (scroll_area); } - - -#if 0 -/* - * Backing Store - */ -struct BackingStore -{ - GdkPixmap *pixmap; - GdkRegion *update_region; - int width; - int height; -}; - -static BackingStore * -backing_store_new (GdkWindow *window, - int width, int height) -{ - BackingStore *store = g_new0 (BackingStore, 1); - GdkRectangle rect = { 0, 0, width, height }; - - store->pixmap = gdk_pixmap_new (window, width, height, -1); - store->update_region = gdk_region_rectangle (&rect); - store->width = width; - store->height = height; - - return store; -} - -static void -backing_store_free (BackingStore *store) -{ - g_object_unref (store->pixmap); - gdk_region_destroy (store->update_region); - g_free (store); -} - -static void -backing_store_draw (BackingStore *store, - GdkDrawable *dest, - GdkRegion *clip, - int x, - int y) -{ - GdkGC *gc = gdk_gc_new (dest); - - gdk_gc_set_clip_region (gc, clip); - - gdk_draw_drawable (dest, gc, store->pixmap, - 0, 0, x, y, store->width, store->height); - - g_object_unref (gc); -} - -static void -backing_store_scroll (BackingStore *store, - int dx, - int dy) -{ - GdkGC *gc = gdk_gc_new (store->pixmap); - GdkRectangle rect; - - gdk_draw_drawable (store->pixmap, gc, store->pixmap, - 0, 0, dx, dy, - store->width, store->height); - - /* Invalidate vertically */ - rect.x = 0; - rect.width = store->width; - - if (dy > 0) - { - rect.y = 0; - rect.height = dy; - } - else - { - rect.y = store->height + dy; - rect.y = -dy; - } - - gdk_region_union_with_rect (store->update_region, &rect); - - /* Invalidate horizontally */ - rect.y = 0; - rect.height = store->height; - - if (dx > 0) - { - rect.x = 0; - rect.width = dx; - } - else - { - rect.x = store->width + dx; - rect.width = -dx; - } - - gdk_region_union_with_rect (store->update_region, &rect); -} - -static void -backing_store_invalidate_rect (BackingStore *store, - GdkRectangle *rect) -{ - gdk_region_union_with_rect (store->update_region, rect); -} - -static void -backing_store_invalidate_region (BackingStore *store, - GdkRegion *region) -{ - gdk_region_union (store->update_region, region); -} - -static void -backing_store_invalidate_all (BackingStore *store) -{ - GdkRectangle rect = { 0, 0, store->width, store->height }; - gdk_region_destroy (store->update_region); - store->update_region = gdk_region_rectangle (&rect); -} - -static void -backing_store_resize (BackingStore *store, - int width, - int height) -{ - GdkPixmap *pixmap = gdk_pixmap_new (store->pixmap, width, height, -1); - - /* Unfortunately we don't know in which direction we were resized, - * so we just assume we were dragged from the south-east corner. - * - * Although, maybe we could get the root coordinates of the input-window? - * That might just work, actually. We need to make sure metacity uses - * static gravity for the window before this will be useful. - */ - simple_draw_drawable (pixmap, store->pixmap, 0, 0, 0, 0, -1, -1); - - g_object_unref (store->pixmap); - - store->pixmap = pixmap; - - /* FIXME: invalidate uncovered strip only */ - - backing_store_invalidate_all (store); -} - -static void -cclip_to_region (cairo_t *cr, GdkRegion *region) -{ - int n_rects; - GdkRectangle *rects; - - gdk_region_get_rectangles (region, &rects, &n_rects); - - cairo_new_path (cr); - while (n_rects--) - { - GdkRectangle *rect = &(rects[n_rects]); - - cairo_rectangle (cr, rect->x, rect->y, rect->width, rect->height); - } - cairo_clip (cr); - - g_free (rects); -} - -static void -backing_store_process_updates (BackingStore *store, - ExposeFunc func, - gpointer data) -{ - cairo_t *cr = gdk_cairo_create (store->pixmap); - GdkRegion *region = store->update_region; - store->update_region = gdk_region_new (); - - cclip_to_region (cr, store->update_region); - - func (cr, store->update_region, data); - - gdk_region_destroy (region); - cairo_destroy (cr); -} - -#endif diff --git a/panels/display/scrollarea.h b/panels/display/scrollarea.h index d1695fad4..77588aa3b 100644 --- a/panels/display/scrollarea.h +++ b/panels/display/scrollarea.h @@ -67,10 +67,10 @@ struct FooScrollAreaClass GdkRectangle *old_viewport, GdkRectangle *new_viewport); - void (*paint) (FooScrollArea *scroll_area, - cairo_t *cr, - GdkRectangle *extents, - GdkRegion *region); + void (*paint) (FooScrollArea *scroll_area, + cairo_t *cr, + GdkRectangle *extents, + cairo_region_t *region); }; GType foo_scroll_area_get_type (void); @@ -104,8 +104,8 @@ void foo_scroll_area_add_input_from_fill (FooScrollArea *scroll_area, cairo_t *cr, FooScrollAreaEventFunc func, gpointer data); -void foo_scroll_area_invalidate_region (FooScrollArea *area, - GdkRegion *region); +void foo_scroll_area_invalidate_region (FooScrollArea *area, + cairo_region_t *region); void foo_scroll_area_invalidate (FooScrollArea *scroll_area); void foo_scroll_area_invalidate_rect (FooScrollArea *scroll_area, int x, diff --git a/panels/display/xrandr-capplet.c b/panels/display/xrandr-capplet.c index 9ba1f1a3d..ab6a79c6d 100644 --- a/panels/display/xrandr-capplet.c +++ b/panels/display/xrandr-capplet.c @@ -1825,11 +1825,11 @@ paint_output (App *app, cairo_t *cr, int i) } static void -on_area_paint (FooScrollArea *area, - cairo_t *cr, - GdkRectangle *extent, - GdkRegion *region, - gpointer data) +on_area_paint (FooScrollArea *area, + cairo_t *cr, + GdkRectangle *extent, + cairo_region_t *region, + gpointer data) { App *app = data; double scale; |