[Xfce4-commits] [apps/xfce4-screensaver] 01/01: Integrate xfce4-screensaver-configure with screensaver preferences

noreply at xfce.org noreply at xfce.org
Sat Jul 13 23:20:32 CEST 2019


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 28a6857f891cac6d73185f91d4ac99b547ecd4f6
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Sat Jul 13 17:20:27 2019 -0400

    Integrate xfce4-screensaver-configure with screensaver preferences
---
 src/Makefile.am                      |  4 ++
 src/xfce4-screensaver-configure      | 66 ++++++++++++++++++------
 src/xfce4-screensaver-preferences.c  | 61 ++++++++++++++++++++--
 src/xfce4-screensaver-preferences.ui | 99 ++++++++++++++++++++++++++----------
 4 files changed, 186 insertions(+), 44 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 0147413..8ee7b55 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -41,6 +41,10 @@ bin_PROGRAMS = \
 	xfce4-screensaver-preferences  \
 	$(NULL)
 
+bin_SCRIPTS = \
+	xfce4-screensaver-configure    \
+	$(NULL)
+
 libexec_PROGRAMS = \
 	xfce4-screensaver-dialog     \
 	xfce4-screensaver-gl-helper  \
diff --git a/src/xfce4-screensaver-configure b/src/xfce4-screensaver-configure
index 4ebf33c..2a110f6 100755
--- a/src/xfce4-screensaver-configure
+++ b/src/xfce4-screensaver-configure
@@ -48,7 +48,7 @@ class XfconfChannel:
         self.prefix = prefix
 
     def _get_property(self, prop, default=""):
-        prop = "%s%s" % (self.prefix, prop)
+        prop = "%s/%s" % (self.prefix, prop)
         command = ["xfconf-query", "-c", self.channel, "-p", prop, "-l", "-v"]
         response = subprocess.check_output(command).decode("utf-8")
         if prop in response:
@@ -57,11 +57,15 @@ class XfconfChannel:
         return default
 
     def _set_property(self, prop_type, prop, value):
-        prop = "%s%s" % (self.prefix, prop)
+        prop = "%s/%s" % (self.prefix, prop)
         command = ["xfconf-query", "-c", self.channel, "-p",
                    prop, "-n", "-t", prop_type, "-s", str(value)]
         return subprocess.call(command)
 
+    def restore_defaults(self):
+        command = ["xfconf-query", "-c", self.channel, "-p", self.prefix, "-r", "-R"]
+        return subprocess.call(command)
+
     def get_boolean(self, prop, default):
         value = self._get_property(prop, default)
         if value in ["true", True]:
@@ -329,7 +333,7 @@ class ConfigurationWindow(Gtk.Window):
         self.inner_margin = 12
         self.screensaver_args = parsed["arguments"]
         self.xfconf_channel = XfconfChannel(
-            "xfce4-screensaver", "/screensavers/%s/" % parsed["name"])
+            "xfce4-screensaver", "/screensavers/%s" % parsed["name"])
 
         self.notebook = Gtk.Notebook.new()
         self.grid = Gtk.Grid.new()
@@ -556,6 +560,7 @@ class ConfigurationWindow(Gtk.Window):
                 color = self.defaults[widget_id]
                 widget.set_rgba(hex_to_rgba(color))
                 self.set_string(widget_id, color)
+        self.xfconf_channel.restore_defaults()
 
     def write_arguments(self):
         arguments = []
@@ -622,10 +627,30 @@ def get_key(dct, keyname, default=""):
 
 
 def configure(parsed):
-    win = ConfigurationWindow(parsed)
-    win.connect("destroy", Gtk.main_quit)
-    win.show_all()
-    Gtk.main()
+    try:
+        win = ConfigurationWindow(parsed)
+        win.connect("destroy", Gtk.main_quit)
+        win.show_all()
+        Gtk.main()
+    except KeyboardInterrupt:
+        pass
+
+
+def show_fatal(primary, secondary):
+    if not graphical:
+        print("%s: %s" % (primary, secondary))
+        sys.exit(1)
+    try:
+        dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
+                                Gtk.ButtonsType.OK, primary)
+        dlg.format_secondary_text(secondary)
+        dlg.connect("close", Gtk.main_quit)
+        dlg.connect("response", Gtk.main_quit)
+        dlg.show_all()
+        Gtk.main()
+    except KeyboardInterrupt:
+        pass
+    sys.exit(1)
 
 
 if __name__ == "__main__":
@@ -638,32 +663,43 @@ if __name__ == "__main__":
                         help=_('check if screensaver is configurable'))
     args = parser.parse_args()
 
-    fname = get_filename(args.screensaver)
+    graphical = not args.check
+
+    saver = args.screensaver
+    if saver.startswith("screensavers-"):
+        saver = saver[13:]
+
+    primary = _("Unable to configure screensaver")
+
+    fname = get_filename(saver)
     if fname is None:
-        print(_("No file found for screensaver %s") % args.screensaver)
+        show_fatal(primary, _("File not found: %s") % saver)
         sys.exit(1)
 
     if fname.endswith(".xml"):
-        obj = XmlScreensaverSettings(args.screensaver)
+        obj = XmlScreensaverSettings(saver)
     elif fname.endswith(".desktop"):
-        obj = DesktopScreensaverSettings(args.screensaver)
+        obj = DesktopScreensaverSettings(saver)
     else:
         locale.textdomain('xfce4-screensaver')
-        print(_("Unrecognized file type for file %s") % fname)
+        show_fatal(primary, _("Unrecognized file type: %s") % fname)
         sys.exit(1)
 
     locale.textdomain('xfce4-screensaver')
 
     if not obj.load_from_file(fname):
-        print(_("Failed to load screensaver from %s") % fname)
+        show_fatal(primary, _("Failed to process file: %s") % fname)
         sys.exit(1)
 
     if args.check:
         if obj.configurable:
-            print(_("Screensaver %s is configurable.") % args.screensaver)
+            print(_("Screensaver %s is configurable.") % saver)
             sys.exit(0)
         else:
-            print(_("Screensaver %s is not configurable.") % args.screensaver)
+            print(_("Screensaver %s is not configurable.") % saver)
             sys.exit(1)
 
+    if not obj.configurable:
+        show_fatal(primary, _("Screensaver %s has no configuration options.") % saver)
+
     configure(obj.to_dict())
diff --git a/src/xfce4-screensaver-preferences.c b/src/xfce4-screensaver-preferences.c
index 51391b5..af3a8a5 100644
--- a/src/xfce4-screensaver-preferences.c
+++ b/src/xfce4-screensaver-preferences.c
@@ -47,6 +47,7 @@
 #include "xfce4-screensaver-preferences-ui.h"
 
 #define GPM_COMMAND "xfce4-power-manager-settings"
+#define CONFIGURE_COMMAND "xfce4-screensaver-configure"
 
 enum {
     NAME_COLUMN = 0,
@@ -71,6 +72,7 @@ static gboolean        lock_delay_writable;
 static gboolean        keyboard_command_writable;
 static gboolean        logout_command_writable;
 static gboolean        logout_delay_writable;
+static gchar          *active_theme = NULL;
 
 static gint opt_socket_id = 0;
 static GOptionEntry entries[] = {
@@ -271,8 +273,11 @@ config_set_theme (const char *theme_id) {
         /* set the themes key to contain all available screensavers */
         strv = get_all_theme_ids (theme_manager);
     } else {
+        GtkWidget *configure_button = GTK_WIDGET (gtk_builder_get_object (builder, "configure_button"));
         mode = GS_MODE_SINGLE;
         strv = g_strsplit (theme_id, "%%%", 1);
+        active_theme = g_strdup (theme_id);
+        gtk_widget_set_sensitive (configure_button, TRUE);
     }
 
     config_set_mode (mode);
@@ -757,6 +762,7 @@ tree_selection_next (GtkTreeSelection *selection) {
 static void
 tree_selection_changed_cb (GtkTreeSelection *selection,
                            GtkWidget        *preview) {
+    GtkWidget    *configure_button;
     GtkTreeIter   iter;
     GtkTreeModel *model;
     char         *theme;
@@ -766,6 +772,14 @@ tree_selection_changed_cb (GtkTreeSelection *selection,
         return;
     }
 
+    if (active_theme != NULL) {
+        g_free (active_theme);
+        active_theme = NULL;
+
+        configure_button = GTK_WIDGET (gtk_builder_get_object (builder, "configure_button"));
+        gtk_widget_set_sensitive (configure_button, FALSE);
+    }
+
     gtk_tree_model_get (model, &iter, ID_COLUMN, &theme, NAME_COLUMN, &name, -1);
 
     if (theme == NULL) {
@@ -781,6 +795,26 @@ tree_selection_changed_cb (GtkTreeSelection *selection,
 }
 
 static void
+configure_button_clicked_cb (GtkToolButton *button,
+                             gpointer       user_data) {
+    gchar    *configure_cmd;
+    GError   *error = NULL;
+    gboolean  res;
+
+    configure_cmd = g_strdup_printf ("%s %s", CONFIGURE_COMMAND, active_theme);
+
+    res = xfce_gdk_spawn_command_line_on_screen (gdk_screen_get_default (),
+                                                 configure_cmd,
+                                                 &error);
+    if (!res) {
+        g_warning ("Unable to start configure command: %s", error->message);
+        g_error_free (error);
+    }
+
+    g_free(configure_cmd);
+}
+
+static void
 idle_delay_value_changed_cb (GtkSpinButton *spin,
                                  gpointer  user_data) {
     gdouble value;
@@ -1758,6 +1792,8 @@ configure_capplet (void) {
     GtkWidget *root_warning_infobar;
     GtkWidget *preview_button;
     GtkWidget *gpm_button;
+    GtkWidget *configure_toolbar;
+    GtkWidget *configure_button;
     GtkWidget *fullscreen_preview_window;
     GtkWidget *fullscreen_preview_area;
     GtkWidget *fullscreen_preview_previous;
@@ -1802,6 +1838,8 @@ configure_capplet (void) {
     root_warning_infobar        = GTK_WIDGET (gtk_builder_get_object (builder, "root_warning_infobar"));
     preview_button              = GTK_WIDGET (gtk_builder_get_object (builder, "preview_button"));
     gpm_button                  = GTK_WIDGET (gtk_builder_get_object (builder, "power_management_button"));
+    configure_button            = GTK_WIDGET (gtk_builder_get_object (builder, "configure_button"));
+    configure_toolbar           = GTK_WIDGET (gtk_builder_get_object (builder, "configure_toolbar"));
     fullscreen_preview_window   = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_preview_window"));
     fullscreen_preview_area     = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_preview_area"));
     fullscreen_preview_close    = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_preview_close"));
@@ -1828,6 +1866,16 @@ configure_capplet (void) {
                       G_CALLBACK (key_changed_cb),
                       NULL);
 
+    if (!is_program_in_path (CONFIGURE_COMMAND)) {
+        gtk_widget_set_no_show_all (configure_toolbar, TRUE);
+        gtk_widget_hide (configure_toolbar);
+    } else {
+        g_signal_connect (configure_button,
+                          "clicked",
+                          G_CALLBACK (configure_button_clicked_cb),
+                          screensaver_channel);
+    }
+
     /* Idle delay */
     widget = GTK_WIDGET (gtk_builder_get_object (builder, "saver_idle_activation_delay"));
     delay = config_get_idle_delay (&idle_delay_writable);
@@ -1993,7 +2041,11 @@ configure_capplet (void) {
 
 static void
 finalize_capplet (void) {
-    g_object_unref (screensaver_channel);
+    if (screensaver_channel)
+        g_object_unref (screensaver_channel);
+
+    if (active_theme)
+        g_free (active_theme);
 }
 
 int
@@ -2083,8 +2135,11 @@ main (int    argc,
 
     finalize_capplet ();
 
-    g_object_unref (theme_manager);
-    g_object_unref (job);
+    if (theme_manager)
+        g_object_unref (theme_manager);
+
+    if (job)
+        g_object_unref (job);
 
     return 0;
 }
diff --git a/src/xfce4-screensaver-preferences.ui b/src/xfce4-screensaver-preferences.ui
index 92712ae..e88118c 100644
--- a/src/xfce4-screensaver-preferences.ui
+++ b/src/xfce4-screensaver-preferences.ui
@@ -621,32 +621,6 @@ Simon Steinbeiß
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkScrolledWindow" id="saver_themes_scrolled_window">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="vexpand">True</property>
-                                <property name="hscrollbar_policy">never</property>
-                                <property name="shadow_type">in</property>
-                                <child>
-                                  <object class="GtkTreeView" id="saver_themes_treeview">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="headers_visible">False</property>
-                                    <child internal-child="selection">
-                                      <object class="GtkTreeSelection"/>
-                                    </child>
-                                    <accessibility>
-                                      <relation type="label-for" target="saver_themes_treeview"/>
-                                    </accessibility>
-                                  </object>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="left_attach">0</property>
-                                <property name="top_attach">1</property>
-                              </packing>
-                            </child>
-                            <child>
                               <object class="GtkFrame">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
@@ -671,6 +645,79 @@ Simon Steinbeiß
                                 <property name="width">2</property>
                               </packing>
                             </child>
+                            <child>
+                              <object class="GtkBox">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="vexpand">True</property>
+                                <property name="orientation">vertical</property>
+                                <child>
+                                  <object class="GtkScrolledWindow" id="saver_themes_scrolled_window">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="vexpand">True</property>
+                                    <property name="hscrollbar_policy">never</property>
+                                    <property name="shadow_type">in</property>
+                                    <child>
+                                      <object class="GtkTreeView" id="saver_themes_treeview">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="headers_visible">False</property>
+                                        <child internal-child="selection">
+                                          <object class="GtkTreeSelection"/>
+                                        </child>
+                                        <accessibility>
+                                          <relation type="label-for" target="saver_themes_treeview"/>
+                                        </accessibility>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkToolbar" id="configure_toolbar">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="toolbar_style">both-horiz</property>
+                                    <property name="icon_size">2</property>
+                                    <child>
+                                      <object class="GtkToolButton" id="configure_button">
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="tooltip_text" translatable="yes">Configure screensaver</property>
+                                        <property name="label" translatable="yes">Configure...</property>
+                                        <property name="use_underline">True</property>
+                                        <property name="icon_name">document-properties</property>
+                                        <style>
+                                          <class name="linked"/>
+                                        </style>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="homogeneous">True</property>
+                                      </packing>
+                                    </child>
+                                    <style>
+                                      <class name="inline-toolbar"/>
+                                    </style>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">0</property>
+                                <property name="top_attach">1</property>
+                              </packing>
+                            </child>
                           </object>
                           <packing>
                             <property name="left_attach">0</property>

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


More information about the Xfce4-commits mailing list