From 0978e25db8d8032347df820a25f2ea18159e258c Mon Sep 17 00:00:00 2001
From: rbuj <robert.buj@gmail.com>
Date: Sun, 15 Mar 2020 22:36:39 +0100
Subject: [PATCH] Custom background image for lock screen

---
 configure.ac                             |  1 -
 data/Makefile.am                         |  3 ++
 data/mate-screensaver-preferences.ui     | 61 +++++++++++++++++++++++-
 data/org.mate.screensaver.gschema.xml.in |  7 ++-
 src/gs-manager.c                         | 20 +++++++-
 src/mate-screensaver-preferences.c       | 15 ++++++
 6 files changed, 102 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index e6b1b4f..6a30794 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1112,7 +1112,6 @@ data/Makefile
 data/mate-screensavers.menu
 data/mate-screensaver.pc
 data/org.mate.ScreenSaver.service
-data/org.mate.screensaver.gschema.xml
 data/images/Makefile
 data/images/cosmos/Makefile
 savers/Makefile
diff --git a/data/Makefile.am b/data/Makefile.am
index 942fd55..f842873 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -46,6 +46,9 @@ dbussessionservice_DATA = org.mate.ScreenSaver.service
 gsettingsschema_in_files = org.mate.screensaver.gschema.xml.in
 gsettings_SCHEMAS = $(gsettingsschema_in_files:.xml.in=.xml)
 
+org.mate.screensaver.gschema.xml: org.mate.screensaver.gschema.xml.in
+	$(AM_V_GEN) sed -e 's|@datadir[@]|$(datadir)|g' $< > $@
+
 EXTRA_DIST = 				\
 	$(gsettingsschema_in_files)	\
 	$(desktop_in_files)		\
diff --git a/data/mate-screensaver-preferences.ui b/data/mate-screensaver-preferences.ui
index cd3855b..0311064 100644
--- a/data/mate-screensaver-preferences.ui
+++ b/data/mate-screensaver-preferences.ui
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.22.2 -->
 <interface>
   <requires lib="gtk+" version="3.14"/>
   <!-- interface-license-type gplv2 -->
@@ -24,6 +24,9 @@
     <property name="skip_taskbar_hint">True</property>
     <property name="skip_pager_hint">True</property>
     <property name="decorated">False</property>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
     <child>
       <object class="GtkBox" id="vbox10">
         <property name="visible">True</property>
@@ -149,6 +152,7 @@
       </object>
     </child>
   </object>
+  <object class="GtkFileFilter" id="picture_filefilter"/>
   <object class="GtkImage" id="power_image">
     <property name="can_focus">False</property>
     <property name="stock">gtk-jump-to</property>
@@ -165,6 +169,9 @@
     <property name="default_width">600</property>
     <property name="default_height">400</property>
     <property name="type_hint">dialog</property>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">
         <property name="visible">True</property>
@@ -458,6 +465,56 @@
                                     <property name="position">2</property>
                                   </packing>
                                 </child>
+                                <child>
+                                  <object class="GtkBox" id="activate_delay_hbox1">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="spacing">12</property>
+                                    <child>
+                                      <object class="GtkLabel">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="label" translatable="yes">Background picture for lock screen:</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkBox" id="hbox5">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="spacing">6</property>
+                                        <child>
+                                          <object class="GtkFileChooserButton" id="picture_filename">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="create_folders">False</property>
+                                            <property name="filter">picture_filefilter</property>
+                                            <property name="title" translatable="yes">Select Background Image</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">3</property>
+                                  </packing>
+                                </child>
                                 <child>
                                   <object class="GtkLabel" id="root_warning_label">
                                     <property name="can_focus">False</property>
@@ -469,7 +526,7 @@
                                   <packing>
                                     <property name="expand">False</property>
                                     <property name="fill">False</property>
-                                    <property name="position">3</property>
+                                    <property name="position">4</property>
                                   </packing>
                                 </child>
                               </object>
diff --git a/data/org.mate.screensaver.gschema.xml.in b/data/org.mate.screensaver.gschema.xml.in
index 7671144..5e2cf06 100644
--- a/data/org.mate.screensaver.gschema.xml.in
+++ b/data/org.mate.screensaver.gschema.xml.in
@@ -1,4 +1,4 @@
-<schemalist gettext-domain="@GETTEXT_PACKAGE@">
+<schemalist gettext-domain="mate-screensaver">
   <enum id="org.mate.screensaver.Mode">
     <value nick="blank-only" value="0"/>
     <value nick="random" value="1"/>
@@ -80,5 +80,10 @@
       <summary>Allow the session status message to be displayed</summary>
       <description>Allow the session status message to be displayed when the screen is locked.</description>
     </key>
+    <key name="picture-filename" type="s">
+      <default>'@datadir@/backgrounds/mate/desktop/Stripes.png'</default>
+      <summary>Picture Filename</summary>
+      <description>File to use for the background image.</description>
+    </key>
   </schema>
 </schemalist>
diff --git a/src/gs-manager.c b/src/gs-manager.c
index cca90d8..139a305 100644
--- a/src/gs-manager.c
+++ b/src/gs-manager.c
@@ -1048,6 +1048,13 @@ gs_manager_init (GSManager *manager)
 					  manager);
 
 	mate_bg_load_from_preferences (manager->priv->bg);
+	GSettings *settings = g_settings_new ("org.mate.screensaver");
+	char *filename= g_settings_get_string (settings, "picture-filename");
+	if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+		mate_bg_set_filename (manager->priv->bg, filename);
+	}
+	g_free (filename);
+	g_object_unref (settings);
 }
 
 static void
@@ -1260,11 +1267,22 @@ static void
 apply_background_to_window (GSManager *manager,
                             GSWindow  *window)
 {
+	GSettings       *settings;
+	char            *filename;
 	cairo_surface_t *surface;
 	int              width;
 	int              height;
 
-        mate_bg_load_from_preferences (manager->priv->bg);
+	mate_bg_load_from_preferences(manager->priv->bg);
+
+	settings = g_settings_new ("org.mate.screensaver");
+	filename = g_settings_get_string (settings, "picture-filename");
+
+	if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+		mate_bg_set_filename (manager->priv->bg, filename);
+	}
+	g_free (filename);
+	g_object_unref (settings);
 
 	if (manager->priv->bg == NULL)
 	{
diff --git a/src/mate-screensaver-preferences.c b/src/mate-screensaver-preferences.c
index 4ead5ed..8efb25a 100644
--- a/src/mate-screensaver-preferences.c
+++ b/src/mate-screensaver-preferences.c
@@ -1085,6 +1085,12 @@ enabled_checkbox_toggled (GtkToggleButton *button, gpointer user_data)
 	config_set_enabled (gtk_toggle_button_get_active (button));
 }
 
+static void
+picture_filename_changed (GtkFileChooserButton *button, gpointer user_data)
+{
+	g_settings_set_string (screensaver_settings, "picture-filename", gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (button)));
+}
+
 static void
 ui_disable_lock (gboolean disable)
 {
@@ -1533,6 +1539,7 @@ init_capplet (void)
 	GtkWidget *fullscreen_preview_previous;
 	GtkWidget *fullscreen_preview_next;
 	GtkWidget *fullscreen_preview_close;
+	GtkWidget *picture_filename;
 	gdouble    activate_delay;
 	gboolean   enabled;
 	gboolean   is_writable;
@@ -1579,6 +1586,7 @@ init_capplet (void)
 	fullscreen_preview_close = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_preview_close"));
 	fullscreen_preview_previous = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_preview_previous_button"));
 	fullscreen_preview_next = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_preview_next_button"));
+	picture_filename = GTK_WIDGET (gtk_builder_get_object (builder, "picture_filename"));
 
 	label              = GTK_WIDGET (gtk_builder_get_object (builder, "activate_delay_label"));
 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), activate_delay_hscale);
@@ -1629,6 +1637,13 @@ init_capplet (void)
 	g_signal_connect (lock_checkbox, "toggled",
 	                  G_CALLBACK (lock_checkbox_toggled), NULL);
 
+	char *path = g_settings_get_string (screensaver_settings, "picture-filename");
+	gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (gtk_builder_get_object (builder, "picture_filename")), path);
+	gtk_file_filter_add_pixbuf_formats (GTK_FILE_FILTER (gtk_builder_get_object (builder, "picture_filefilter")));
+	g_free (path);
+	g_signal_connect (picture_filename, "selection-changed",
+	                  G_CALLBACK (picture_filename_changed), NULL);
+
 	enabled = config_get_enabled (&is_writable);
 	ui_set_enabled (enabled);
 	if (! is_writable)
-- 
2.21.1

