cac8fbb
From cd770f34590de85b7ea0f0feccf5657590550918 Mon Sep 17 00:00:00 2001
cac8fbb
From: William Jon McCann <jmccann@redhat.com>
cac8fbb
Date: Thu, 3 Dec 2009 23:52:08 -0500
cac8fbb
Subject: [PATCH] Fixes to enable per-monitor backgrounds
cac8fbb
cac8fbb
https://bugzilla.gnome.org/show_bug.cgi?id=147808
cac8fbb
---
cac8fbb
 eel/eel-background.c |   81 +++++++++++++++++++++----------------------------
cac8fbb
 1 files changed, 35 insertions(+), 46 deletions(-)
cac8fbb
306a5e0
diff --git a/eel/eel-background.c b/eel/eel-background.c
cac8fbb
index 9c40629..4d9e8e8 100644
306a5e0
--- a/eel/eel-background.c
306a5e0
+++ b/eel/eel-background.c
cac8fbb
@@ -50,8 +50,8 @@ static void       eel_background_init                      (gpointer       objec
cac8fbb
 static void       eel_background_finalize                  (GObject       *object);
cac8fbb
 static GdkPixmap *eel_background_get_pixmap_and_color      (EelBackground *background,
cac8fbb
 							    GdkWindow     *window,
cac8fbb
-							    GdkColor      *color,
cac8fbb
-							    gboolean      *changes_with_size);
cac8fbb
+							    GdkColor      *color);
cac8fbb
+
cac8fbb
 static void set_image_properties (EelBackground *background);
cac8fbb
 
cac8fbb
 static void init_fade (EelBackground *background, GtkWidget *widget);
cac8fbb
@@ -80,7 +80,6 @@ struct EelBackgroundDetails {
cac8fbb
 	GtkWidget *widget;
cac8fbb
 
cac8fbb
 	/* Realized data: */
cac8fbb
-	gboolean background_changes_with_size;
cac8fbb
 	GdkPixmap *background_pixmap;
cac8fbb
 	gboolean background_pixmap_is_unset_root_pixmap;
cac8fbb
 	GnomeBGCrossfade *fade;
cac8fbb
@@ -94,6 +93,8 @@ struct EelBackgroundDetails {
306a5e0
 	gboolean is_desktop;
306a5e0
 	/* Desktop screen size watcher */
306a5e0
 	gulong screen_size_handler;
306a5e0
+	/* Desktop monitors configuration watcher */
306a5e0
+	gulong screen_monitors_handler;
306a5e0
 	/* Can we use common pixmap for root window and desktop window */
306a5e0
 	gboolean use_common_pixmap;
306a5e0
 	guint change_idle_id;
cac8fbb
@@ -365,14 +366,6 @@ eel_background_ensure_realized (EelBackground *background, GdkWindow *window)
cac8fbb
 		gdk_rgb_find_color (style->colormap, &(background->details->default_color));
cac8fbb
 	}
cac8fbb
 
cac8fbb
-	/* If the pixmap doesn't change with the window size, never update
cac8fbb
-	 * it again.
cac8fbb
-	 */
cac8fbb
-	if (background->details->background_pixmap != NULL &&
cac8fbb
-	    !background->details->background_changes_with_size) {
cac8fbb
-		return FALSE;
cac8fbb
-	}
cac8fbb
-
cac8fbb
 	/* If the window size is the same as last time, don't update */
cac8fbb
 	if (entire_width == background->details->background_entire_width &&
cac8fbb
 	    entire_height == background->details->background_entire_height) {
cac8fbb
@@ -385,7 +378,6 @@ eel_background_ensure_realized (EelBackground *background, GdkWindow *window)
cac8fbb
 
cac8fbb
 	set_image_properties (background);
cac8fbb
 
cac8fbb
-	background->details->background_changes_with_size = gnome_bg_changes_with_size (background->details->bg);
cac8fbb
 	background->details->background_pixmap = gnome_bg_create_pixmap (background->details->bg,
cac8fbb
 									 window,
cac8fbb
 									 entire_width, entire_height,
cac8fbb
@@ -408,8 +400,7 @@ eel_background_ensure_realized (EelBackground *background, GdkWindow *window)
cac8fbb
 static GdkPixmap *
cac8fbb
 eel_background_get_pixmap_and_color (EelBackground *background,
cac8fbb
 				     GdkWindow     *window,
cac8fbb
-				     GdkColor      *color,
cac8fbb
-				     gboolean      *changes_with_size)
cac8fbb
+				     GdkColor      *color)
cac8fbb
 {
cac8fbb
 	int entire_width;
cac8fbb
 	int entire_height;
cac8fbb
@@ -419,7 +410,6 @@ eel_background_get_pixmap_and_color (EelBackground *background,
cac8fbb
 	eel_background_ensure_realized (background, window);
cac8fbb
 	
cac8fbb
 	*color = background->details->default_color;
cac8fbb
-	*changes_with_size = background->details->background_changes_with_size;
cac8fbb
 	
cac8fbb
 	if (background->details->background_pixmap != NULL) {
cac8fbb
 		return g_object_ref (background->details->background_pixmap);
cac8fbb
@@ -434,7 +424,6 @@ eel_background_expose (GtkWidget                   *widget,
cac8fbb
 	GdkColor color;
cac8fbb
 	int window_width;
cac8fbb
 	int window_height;
cac8fbb
-	gboolean changes_with_size;
cac8fbb
 	GdkPixmap *pixmap;
cac8fbb
 	GdkGC *gc;
cac8fbb
 	GdkGCValues gc_values;
cac8fbb
@@ -452,19 +441,8 @@ eel_background_expose (GtkWidget                   *widget,
cac8fbb
 	
cac8fbb
 	pixmap = eel_background_get_pixmap_and_color (background,
cac8fbb
 						      widget->window,
cac8fbb
-						      &color,
cac8fbb
-						      &changes_with_size);
cac8fbb
-
cac8fbb
-        if (!changes_with_size) {
cac8fbb
-                /* The background was already drawn by X, since we set
cac8fbb
-                 * the GdkWindow background/back_pixmap.
cac8fbb
-                 * No need to draw it again. */
cac8fbb
-                if (pixmap) {
cac8fbb
-                        g_object_unref (pixmap);
cac8fbb
-                }
cac8fbb
-                return;
cac8fbb
-        }
cac8fbb
- 
cac8fbb
+						      &color;;
cac8fbb
+
cac8fbb
 	if (pixmap) {
cac8fbb
 		gc_values.tile = pixmap;
cac8fbb
 		gc_values.ts_x_origin = 0;
cac8fbb
@@ -670,12 +648,10 @@ set_root_pixmap (EelBackground *background,
cac8fbb
 	GdkPixmap *pixmap, *root_pixmap;
cac8fbb
 	GdkScreen *screen;
cac8fbb
 	GdkColor color;
cac8fbb
-	gboolean changes_with_size;
cac8fbb
 
cac8fbb
 	pixmap = eel_background_get_pixmap_and_color (background,
cac8fbb
 						      window,
cac8fbb
-						      &color,
cac8fbb
-						      &changes_with_size);
cac8fbb
+						      &color;;
cac8fbb
 	screen = gdk_drawable_get_screen (window);
cac8fbb
 
cac8fbb
 	if (background->details->use_common_pixmap) {
cac8fbb
@@ -730,7 +706,6 @@ eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
cac8fbb
 	int window_height;
cac8fbb
 	
cac8fbb
 	GdkWindow *window;
cac8fbb
-	gboolean changes_with_size;
cac8fbb
 	gboolean in_fade;
cac8fbb
 
cac8fbb
 	if (!GTK_WIDGET_REALIZED (widget)) {
cac8fbb
@@ -741,8 +716,7 @@ eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
cac8fbb
 	
cac8fbb
 	pixmap = eel_background_get_pixmap_and_color (background,
cac8fbb
 						      widget->window,
cac8fbb
-						      &color, 
cac8fbb
-						      &changes_with_size);
cac8fbb
+						      &color;;
cac8fbb
 
cac8fbb
 	style = gtk_widget_get_style (widget);
cac8fbb
 	
cac8fbb
@@ -761,17 +735,14 @@ eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
cac8fbb
 	}
cac8fbb
 
cac8fbb
 	if (!in_fade) {
cac8fbb
-	if (!changes_with_size || background->details->is_desktop) {
cac8fbb
-		gdk_window_set_back_pixmap (window, pixmap, FALSE);
cac8fbb
-	} else {
cac8fbb
-		gdk_window_set_back_pixmap (window, NULL, FALSE);
cac8fbb
-		gdk_window_set_background (window, &color;;
cac8fbb
-	}
cac8fbb
+		if (background->details->is_desktop) {
cac8fbb
+			gdk_window_set_back_pixmap (window, pixmap, FALSE);
cac8fbb
+		} else {
cac8fbb
+			gdk_window_set_back_pixmap (window, NULL, FALSE);
cac8fbb
+			gdk_window_set_background (window, &color;;
cac8fbb
+		}
cac8fbb
         }
cac8fbb
 	
cac8fbb
-	background->details->background_changes_with_size =
cac8fbb
-		gnome_bg_changes_with_size (background->details->bg);
cac8fbb
-	
cac8fbb
 	if (background->details->is_desktop && !in_fade) {
cac8fbb
 		set_root_pixmap (background, window);
cac8fbb
 	}
cac8fbb
@@ -869,7 +840,6 @@ screen_size_changed (GdkScreen *screen, EelBackground *background)
306a5e0
 	g_signal_emit (background, signals[APPEARANCE_CHANGED], 0);
306a5e0
 }
306a5e0
 
306a5e0
-
306a5e0
 static void
306a5e0
 widget_realized_setup (GtkWidget *widget, gpointer data)
306a5e0
 {
cac8fbb
@@ -891,6 +861,13 @@ widget_realized_setup (GtkWidget *widget, gpointer data)
306a5e0
 		background->details->screen_size_handler = 
306a5e0
 			g_signal_connect (screen, "size_changed",
306a5e0
             				  G_CALLBACK (screen_size_changed), background);
306a5e0
+		if (background->details->screen_monitors_handler > 0) {
306a5e0
+		        g_signal_handler_disconnect (screen,
306a5e0
+				                     background->details->screen_monitors_handler);
306a5e0
+		}
306a5e0
+		background->details->screen_monitors_handler =
306a5e0
+			g_signal_connect (screen, "monitors-changed",
306a5e0
+					  G_CALLBACK (screen_size_changed), background);
306a5e0
 
306a5e0
 		root_window = gdk_screen_get_root_window(screen);			
306a5e0
 		
cac8fbb
@@ -928,6 +905,11 @@ widget_unrealize_cb (GtkWidget *widget, gpointer data)
306a5e0
 				                     background->details->screen_size_handler);
306a5e0
 			background->details->screen_size_handler = 0;
306a5e0
 	}
306a5e0
+	if (background->details->screen_monitors_handler > 0) {
306a5e0
+		        g_signal_handler_disconnect (gtk_widget_get_screen (GTK_WIDGET (widget)),
306a5e0
+				                     background->details->screen_monitors_handler);
306a5e0
+			background->details->screen_monitors_handler = 0;
306a5e0
+	}
306a5e0
 	background->details->use_common_pixmap = FALSE;
306a5e0
 }
306a5e0
 
cac8fbb
@@ -1022,7 +1004,14 @@ eel_get_widget_background (GtkWidget *widget)
cac8fbb
 gboolean
cac8fbb
 eel_background_is_dark (EelBackground *background)
cac8fbb
 {
cac8fbb
-	return gnome_bg_is_dark (background->details->bg);
cac8fbb
+	GdkScreen *screen;
cac8fbb
+	GdkRectangle rect;
cac8fbb
+
cac8fbb
+	/* only check for the background on the 0th monitor */
cac8fbb
+	screen = gdk_screen_get_default ();
cac8fbb
+	gdk_screen_get_monitor_geometry (screen, 0, &rect);
cac8fbb
+
cac8fbb
+	return gnome_bg_is_dark (background->details->bg, rect.width, rect.height);
cac8fbb
 }
cac8fbb
    
cac8fbb
 /* handle dropped colors */
cac8fbb
-- 
cac8fbb
1.6.5.2
cac8fbb