From 866cdb442c6100e340efe7a47b75b53c70338f0b Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Sat, 23 Feb 2013 12:07:39 +0300 Subject: [PATCH] Clip overlapping backdrops (Bug #9052) In a multi-monitor setup each successive wallpaper drawn has the previous area subtracted from it so that the wallpapers aren't drawn over each other. --- src/xfce-desktop.c | 39 ++++++++++++++++++++++++++++++++++++++- src/xfce-workspace.c | 1 - 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c index 95c30f6..fb63d00 100644 --- a/src/xfce-desktop.c +++ b/src/xfce-desktop.c @@ -310,6 +310,7 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data) cairo_t *cr; GdkPixbuf *pix; GdkRectangle rect; + GdkRegion *clip_region = NULL; gint i, monitor = -1, current_workspace; TRACE("entering"); @@ -366,10 +367,46 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data) cr = gdk_cairo_create(GDK_DRAWABLE(pmap)); gdk_cairo_set_source_pixbuf(cr, pix, rect.x, rect.y); + + if(monitor > 0 + && !xfce_workspace_get_xinerama_stretch(desktop->priv->workspaces[current_workspace])) { + clip_region = gdk_region_rectangle(&rect); + + DBG("clip_region: x: %d, y: %d, w: %d, h: %d", + rect.x, rect.y, rect.width, rect.height); + + /* If we are not monitor 0 on a multi-monitor setup we need to subtract + * all the previous monitor regions so we don't draw over them. This + * should prevent the overlap and double backdrop drawing bugs. + */ + for(i = 0; i < monitor; i++) { + GdkRectangle previous_monitor; + GdkRegion *previous_region; + gdk_screen_get_monitor_geometry(gscreen, i, &previous_monitor); + + DBG("previous_monitor: x: %d, y: %d, w: %d, h: %d", + previous_monitor.x, previous_monitor.y, + previous_monitor.width, previous_monitor.height); + + previous_region = gdk_region_rectangle(&previous_monitor); + + gdk_region_subtract(clip_region, previous_region); + + gdk_region_destroy(previous_region); + } + + gdk_cairo_region(cr, clip_region); + cairo_clip(cr); + } + cairo_paint(cr); g_object_unref(G_OBJECT(pix)); + + if(clip_region != NULL) + gdk_region_destroy(clip_region); + cairo_destroy(cr); - + /* tell gtk to redraw the repainted area */ gtk_widget_queue_draw_area(GTK_WIDGET(desktop), rect.x, rect.y, rect.width, rect.height); diff --git a/src/xfce-workspace.c b/src/xfce-workspace.c index ba9f327..dd32aaf 100644 --- a/src/xfce-workspace.c +++ b/src/xfce-workspace.c @@ -148,7 +148,6 @@ backdrop_cycle_cb(XfceBackdrop *backdrop, gpointer user_data) if(g_strcmp0(backdrop_file, new_backdrop) != 0) { xfce_backdrop_set_image_filename(backdrop, new_backdrop); g_free(new_backdrop); - g_signal_emit(G_OBJECT(user_data), signals[WORKSPACE_BACKDROP_CHANGED], 0, backdrop); } } -- 1.7.10.4