[Xfce4-commits] [apps/xfce4-screensaver] 382/425: Fix background pulling for different monitors

noreply at xfce.org noreply at xfce.org
Mon Oct 15 01:53:49 CEST 2018


This is an automated email from the git hooks/post-receive script.

b   l   u   e   s   a   b   r   e       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository apps/xfce4-screensaver.

commit 0f7955d344f77c70cae4d21c2a2502d208e84f90
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Mon Oct 8 21:37:20 2018 -0400

    Fix background pulling for different monitors
---
 src/gs-lock-plug.c             | 91 +++++++++++++++++++++++++++++++++---------
 src/gs-window-x11.c            | 18 +++++++++
 src/xfce4-screensaver-dialog.c |  4 ++
 3 files changed, 95 insertions(+), 18 deletions(-)

diff --git a/src/gs-lock-plug.c b/src/gs-lock-plug.c
index 66e7236..bfae612 100644
--- a/src/gs-lock-plug.c
+++ b/src/gs-lock-plug.c
@@ -70,10 +70,11 @@ enum
 #define DIALOG_TIMEOUT_MSEC 60000
 
 static void gs_lock_plug_finalize   (GObject         *object);
+static void redraw_background       (GSLockPlug      *plug);
 
 #define GS_LOCK_PLUG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GS_TYPE_LOCK_PLUG, GSLockPlugPrivate))
 
-struct GSLockPlugPrivate
+	struct GSLockPlugPrivate
 {
 	GtkWidget   *vbox;
 	GtkWidget   *auth_action_area;
@@ -88,6 +89,7 @@ struct GSLockPlugPrivate
 	GtkWidget   *auth_capslock_label;
 	GtkWidget   *auth_message_label;
 	GtkWidget   *status_message_label;
+	GtkWidget   *background_image;
 
 	GtkWidget   *auth_unlock_button;
 	GtkWidget   *auth_switch_button;
@@ -109,6 +111,8 @@ struct GSLockPlugPrivate
 	guint        auth_check_idle_id;
 	guint        response_idle_id;
 
+	gint         monitor_index;
+
 	GList       *key_events;
 };
 
@@ -133,7 +137,8 @@ enum
     PROP_LOGOUT_ENABLED,
     PROP_LOGOUT_COMMAND,
     PROP_SWITCH_ENABLED,
-    PROP_STATUS_MESSAGE
+    PROP_STATUS_MESSAGE,
+    PROP_MONITOR_INDEX
 };
 
 static guint lock_plug_signals [LAST_SIGNAL] = { 0 };
@@ -1073,6 +1078,23 @@ gs_lock_plug_set_logout_enabled (GSLockPlug *plug,
 }
 
 static void
+gs_lock_plug_set_monitor_index (GSLockPlug *plug,
+                                gint        monitor_index)
+{
+	g_return_if_fail (GS_LOCK_PLUG (plug));
+
+	if (plug->priv->monitor_index == monitor_index)
+	{
+		return;
+	}
+
+	plug->priv->monitor_index = monitor_index;
+	g_object_notify (G_OBJECT (plug), "monitor-index");
+
+	redraw_background (plug);
+}
+
+static void
 gs_lock_plug_set_logout_command (GSLockPlug *plug,
                                  const char *command)
 {
@@ -1138,6 +1160,9 @@ gs_lock_plug_get_property (GObject    *object,
 	case PROP_STATUS_MESSAGE:
 		g_value_set_string (value, self->priv->status_message);
 		break;
+	case PROP_MONITOR_INDEX:
+		g_value_set_int (value, self->priv->monitor_index);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -1216,6 +1241,9 @@ gs_lock_plug_set_property (GObject            *object,
 	case PROP_SWITCH_ENABLED:
 		gs_lock_plug_set_switch_enabled (self, g_value_get_boolean (value));
 		break;
+	case PROP_MONITOR_INDEX:
+		gs_lock_plug_set_monitor_index (self, g_value_get_int (value));
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -1303,6 +1331,15 @@ gs_lock_plug_class_init (GSLockPlugClass *klass)
 	                                         NULL,
 	                                         FALSE,
 	                                         G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+	                                 PROP_MONITOR_INDEX,
+	                                 g_param_spec_int ("monitor-index",
+	                                         NULL,
+	                                         NULL,
+	                                         0,
+	                                         200,
+	                                         0,
+	                                         G_PARAM_READWRITE));
 
 	binding_set = gtk_binding_set_by_class (klass);
 
@@ -1882,10 +1919,17 @@ get_draw_dimensions(GSLockPlug *plug,
 	}
 	screen = gdk_display_get_default_screen(display);
 	scale = gdk_window_get_scale_factor(gdk_screen_get_root_window(screen));
-	if (window != NULL) {
-		monitor = gdk_display_get_monitor_at_window(display, window);
-	} else {
-		monitor = gdk_display_get_primary_monitor (display);
+
+	monitor = gdk_display_get_monitor (display, plug->priv->monitor_index);
+	if (!monitor)
+	{
+		if (window != NULL)
+			monitor = gdk_display_get_monitor_at_window(display, window);
+		else
+			monitor = gdk_display_get_primary_monitor(display);
+
+		if (!monitor)
+			monitor = gdk_display_get_monitor (display, 0);
 	}
 
 	xfce_bg_load_from_preferences(bg, monitor);
@@ -1897,6 +1941,26 @@ get_draw_dimensions(GSLockPlug *plug,
 	*screen_height = HeightOfScreen(gdk_x11_screen_get_xscreen(screen)) / scale;
 }
 
+static void
+redraw_background (GSLockPlug *plug)
+{
+	XfceBG *bg;
+	GdkPixbuf *pixbuf;
+	gint screen_width, screen_height, monitor_width, monitor_height;
+
+	pixbuf = gtk_image_get_pixbuf (GTK_IMAGE (plug->priv->background_image));
+	if (pixbuf)
+	{
+		g_free(pixbuf);
+		pixbuf = NULL;
+	}
+
+	bg = xfce_bg_new();
+	get_draw_dimensions(plug, bg, &screen_width, &screen_height, &monitor_width, &monitor_height);
+	pixbuf = xfce_bg_get_pixbuf(bg, screen_width, screen_height, monitor_width, monitor_height);
+	gtk_image_set_from_pixbuf(GTK_IMAGE(plug->priv->background_image), pixbuf);
+}
+
 static gboolean
 load_theme (GSLockPlug *plug)
 {
@@ -1908,13 +1972,8 @@ load_theme (GSLockPlug *plug)
 	GtkWidget  *lock_overlay;
 	GtkWidget  *lock_panel;
 	GtkWidget  *lock_dialog;
-	GtkWidget  *bg_image;
 	GError     *error=NULL;
 
-	XfceBG     *bg;
-	GdkPixbuf  *pixbuf;
-	gint screen_width, screen_height, monitor_width, monitor_height;
-
 	theme = get_dialog_theme_name (plug);
 	if (theme == NULL)
 	{
@@ -1953,13 +2012,6 @@ load_theme (GSLockPlug *plug)
 	}
 	g_free (gtkbuilder);
 
-	bg_image = GTK_WIDGET (gtk_builder_get_object(builder, "lock-image"));
-
-	bg = xfce_bg_new();
-	get_draw_dimensions(plug, bg, &screen_width, &screen_height, &monitor_width, &monitor_height);
-	pixbuf = xfce_bg_get_pixbuf(bg, screen_width, screen_height, monitor_width, monitor_height);
-	gtk_image_set_from_pixbuf (GTK_IMAGE(bg_image), pixbuf);
-
 	lock_overlay = GTK_WIDGET(gtk_builder_get_object(builder, "lock-overlay"));
 	lock_panel = GTK_WIDGET(gtk_builder_get_object(builder, "lock-panel"));
 	lock_dialog = GTK_WIDGET(gtk_builder_get_object(builder, "lock-dialog"));
@@ -1990,6 +2042,7 @@ load_theme (GSLockPlug *plug)
 	plug->priv->auth_cancel_button = GTK_WIDGET (gtk_builder_get_object(builder, "auth-cancel-button"));
 	plug->priv->auth_logout_button = GTK_WIDGET (gtk_builder_get_object(builder, "auth-logout-button"));
 	plug->priv->auth_switch_button = GTK_WIDGET (gtk_builder_get_object(builder, "auth-switch-button"));
+	plug->priv->background_image = GTK_WIDGET (gtk_builder_get_object(builder, "lock-image"));
 
 	/* Placeholder for the keyboard indicator */
 	plug->priv->auth_prompt_kbd_layout_indicator = GTK_WIDGET (gtk_builder_get_object(builder, "auth-prompt-kbd-layout-indicator"));
@@ -2002,6 +2055,8 @@ load_theme (GSLockPlug *plug)
 		gtk_widget_set_no_show_all (plug->priv->auth_switch_button, TRUE);
 	}
 
+	redraw_background (plug);
+
 	date_time_update (plug);
 	gtk_widget_show_all (lock_dialog);
 
diff --git a/src/gs-window-x11.c b/src/gs-window-x11.c
index bc9c333..9a7cdc1 100644
--- a/src/gs-window-x11.c
+++ b/src/gs-window-x11.c
@@ -1682,6 +1682,23 @@ is_user_switch_enabled (GSWindow *window)
 	return window->priv->user_switch_enabled;
 }
 
+static gint
+get_monitor_index (GSWindow *window)
+{
+	GdkDisplay *display = gs_window_get_display (window);
+	GdkMonitor *monitor;
+	gint idx;
+
+	for (idx = 0; idx < gdk_display_get_n_monitors (display); idx++) {
+		monitor = gdk_display_get_monitor (display, idx);
+		if (g_strcmp0 (gdk_monitor_get_model (monitor), gdk_monitor_get_model (window->priv->monitor)) == 0) {
+			return idx;
+		}
+	}
+
+	return 0;
+}
+
 static void
 popup_dialog (GSWindow *window)
 {
@@ -1695,6 +1712,7 @@ popup_dialog (GSWindow *window)
 	command = g_string_new (tmp);
 	g_free (tmp);
 
+	g_string_append_printf(command, " --monitor='%i'", get_monitor_index (window));
 	g_string_append_printf(command, " --height='%i'", window->priv->geometry.height);
 	g_string_append_printf(command, " --width='%i'", window->priv->geometry.width);
 
diff --git a/src/xfce4-screensaver-dialog.c b/src/xfce4-screensaver-dialog.c
index f464628..90aa077 100644
--- a/src/xfce4-screensaver-dialog.c
+++ b/src/xfce4-screensaver-dialog.c
@@ -56,6 +56,7 @@ static gint dialog_width = 0;
 static char* logout_command = NULL;
 static char* status_message = NULL;
 static char* away_message = NULL;
+static gint monitor_index = 0;
 
 static GOptionEntry entries[] = {
 	{"verbose", 0, 0, G_OPTION_ARG_NONE, &verbose, N_("Show debugging output"), NULL},
@@ -67,6 +68,7 @@ static GOptionEntry entries[] = {
 	{"away-message", 0, 0, G_OPTION_ARG_STRING, &away_message, N_("Not used"), N_("MESSAGE")},
 	{"height", 0, 0, G_OPTION_ARG_INT, &dialog_height, N_("Monitor height"), NULL},
 	{"width", 0, 0, G_OPTION_ARG_INT, &dialog_width, N_("Monitor width"), NULL},
+	{"monitor", 0, 0, G_OPTION_ARG_INT, &monitor_index, N_("Monitor index"), NULL},
 	{NULL}
 };
 
@@ -410,6 +412,8 @@ static gboolean popup_dialog_idle(void)
 		g_object_set(widget, "status-message", status_message, NULL);
 	}
 
+	g_object_set(widget, "monitor-index", monitor_index, NULL);
+
 	gtk_widget_set_size_request(widget, dialog_width, dialog_height);
 
 	g_signal_connect(GS_LOCK_PLUG(widget), "response", G_CALLBACK(response_cb), NULL);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list