[gnome-settings-daemon] common: move screensaver proxy fetching into common code



commit 4a0fabd4e7cb83a409c30a3a8aac83179e53ad43
Author: Ray Strode <rstrode redhat com>
Date:   Fri Aug 2 17:14:49 2013 -0400

    common: move screensaver proxy fetching into common code
    
    Much like with the session manager, several plugins need to connect
    to the screen saver (to lock the screen in response to various events).
    
    This commit adds a new api:
    
    gnome_settings_bus_get_screen_saver_proxy
    
    that parallels the existing gnome_settings_bus_get_session_proxy call, and
    changes all users of their own screen saver proxies to use this shared proxy.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=705127

 gnome-settings-daemon/Makefile.am                  |   15 +++
 gnome-settings-daemon/gnome-settings-bus.c         |   30 +++++
 gnome-settings-daemon/gnome-settings-bus.h         |    4 +-
 .../org.gnome.ScreenSaver.xml                      |    0
 plugins/media-keys/gsd-media-keys-manager.c        |   45 +++++---
 plugins/power/gsd-power-manager.c                  |  114 ++------------------
 plugins/smartcard/Makefile.am                      |   15 +---
 plugins/smartcard/gsd-smartcard-manager.c          |   40 +-------
 8 files changed, 88 insertions(+), 175 deletions(-)
---
diff --git a/gnome-settings-daemon/Makefile.am b/gnome-settings-daemon/Makefile.am
index 5c3c3ec..f9e209e 100644
--- a/gnome-settings-daemon/Makefile.am
+++ b/gnome-settings-daemon/Makefile.am
@@ -31,8 +31,22 @@ $(session_manager_dbus_built_sources) : Makefile.am org.gnome.SessionManager.xml
                           "org.gtk.GDBus.C.Name" SessionManager        \
                $(srcdir)/org.gnome.SessionManager.xml
 
+screen_saver_dbus_built_sources = gsd-screen-saver-glue.c gsd-screen-saver-glue.h
+
+BUILT_SOURCES += $(screen_saver_dbus_built_sources)
+
+$(screen_saver_dbus_built_sources) : Makefile.am org.gnome.ScreenSaver.xml
+       gdbus-codegen                                           \
+               --interface-prefix org.gnome.ScreenSaver.       \
+               --generate-c-code gsd-screen-saver-glue         \
+               --c-namespace Gsd                               \
+               --annotate "org.gnome.ScreenSaver"              \
+                          "org.gtk.GDBus.C.Name" ScreenSaver   \
+               $(srcdir)/org.gnome.ScreenSaver.xml
+
 libgsd_la_SOURCES =            \
        $(session_manager_dbus_built_sources) \
+       $(screen_saver_dbus_built_sources) \
        gnome-settings-profile.c        \
        gnome-settings-profile.h        \
        gnome-settings-bus.c    \
@@ -69,6 +83,7 @@ gsd_SCRIPTS = \
 EXTRA_DIST = \
        gnome-settings-daemon-localeexec.in \
        org.gnome.SessionManager.xml        \
+       org.gnome.ScreenSaver.xml           \
        $(NULL)
 
 gnome-settings-daemon-localeexec: gnome-settings-daemon-localeexec.in
diff --git a/gnome-settings-daemon/gnome-settings-bus.c b/gnome-settings-daemon/gnome-settings-bus.c
index 10ebaae..dbd5df3 100644
--- a/gnome-settings-daemon/gnome-settings-bus.c
+++ b/gnome-settings-daemon/gnome-settings-bus.c
@@ -32,6 +32,9 @@
 #define GNOME_SESSION_DBUS_NAME      "org.gnome.SessionManager"
 #define GNOME_SESSION_DBUS_OBJECT    "/org/gnome/SessionManager"
 
+#define GNOME_SCREENSAVER_DBUS_NAME      "org.gnome.ScreenSaver"
+#define GNOME_SCREENSAVER_DBUS_OBJECT    "/org/gnome/ScreenSaver"
+
 GsdSessionManager *
 gnome_settings_bus_get_session_proxy (void)
 {
@@ -57,3 +60,30 @@ gnome_settings_bus_get_session_proxy (void)
 
         return session_proxy;
 }
+
+GsdScreenSaver *
+gnome_settings_bus_get_screen_saver_proxy (void)
+{
+        static GsdScreenSaver *screen_saver_proxy;
+        GError *error =  NULL;
+
+        if (screen_saver_proxy != NULL) {
+                g_object_ref (screen_saver_proxy);
+        } else {
+                screen_saver_proxy = gsd_screen_saver_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+                                                                              
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+                                                                              
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+                                                                              GNOME_SCREENSAVER_DBUS_NAME,
+                                                                              GNOME_SCREENSAVER_DBUS_OBJECT,
+                                                                              NULL,
+                                                                              &error);
+                if (error) {
+                        g_warning ("Failed to connect to the screen saver: %s", error->message);
+                        g_error_free (error);
+                } else {
+                        g_object_add_weak_pointer (G_OBJECT (screen_saver_proxy), 
(gpointer*)&screen_saver_proxy);
+                }
+        }
+
+        return screen_saver_proxy;
+}
diff --git a/gnome-settings-daemon/gnome-settings-bus.h b/gnome-settings-daemon/gnome-settings-bus.h
index 666b493..f569f14 100644
--- a/gnome-settings-daemon/gnome-settings-bus.h
+++ b/gnome-settings-daemon/gnome-settings-bus.h
@@ -24,10 +24,12 @@
 
 #include <glib-object.h>
 #include "gsd-session-manager-glue.h"
+#include "gsd-screen-saver-glue.h"
 
 G_BEGIN_DECLS
 
-GsdSessionManager        *gnome_settings_bus_get_session_proxy  (void);
+GsdSessionManager        *gnome_settings_bus_get_session_proxy       (void);
+GsdScreenSaver           *gnome_settings_bus_get_screen_saver_proxy  (void);
 
 G_END_DECLS
 
diff --git a/plugins/smartcard/org.gnome.ScreenSaver.xml b/gnome-settings-daemon/org.gnome.ScreenSaver.xml
similarity index 100%
rename from plugins/smartcard/org.gnome.ScreenSaver.xml
rename to gnome-settings-daemon/org.gnome.ScreenSaver.xml
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index ae1baab..cf677e8 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -69,10 +69,6 @@
 #define GNOME_KEYRING_DBUS_PATH "/org/gnome/keyring/daemon"
 #define GNOME_KEYRING_DBUS_INTERFACE "org.gnome.keyring.Daemon"
 
-#define GS_DBUS_NAME                            "org.gnome.ScreenSaver"
-#define GS_DBUS_PATH                            "/org/gnome/ScreenSaver"
-#define GS_DBUS_INTERFACE                       "org.gnome.ScreenSaver"
-
 #define SHELL_DBUS_NAME "org.gnome.Shell"
 #define SHELL_DBUS_PATH "/org/gnome/Shell"
 
@@ -172,6 +168,9 @@ struct GsdMediaKeysManagerPrivate
         GCancellable    *shell_cancellable;
         GCancellable    *grab_cancellable;
 
+        /* ScreenSaver stuff */
+        GsdScreenSaver  *screen_saver_proxy;
+
         /* systemd stuff */
         GDBusProxy      *logind_proxy;
         gint             inhibit_keys_fd;
@@ -1010,22 +1009,34 @@ do_touchpad_action (GsdMediaKeysManager *manager)
 }
 
 static void
-do_lock_screensaver (GsdMediaKeysManager *manager)
+on_screen_locked (GsdScreenSaver      *screen_saver,
+                  GAsyncResult        *result,
+                  GsdMediaKeysManager *manager)
 {
-        GsdMediaKeysManagerPrivate *priv = manager->priv;
+        gboolean is_locked;
+        GError *error = NULL;
+
+        is_locked = gsd_screen_saver_call_lock_finish (screen_saver, result, &error);
 
-        if (priv->connection == NULL) {
-                g_warning ("No existing D-Bus connection trying to handle screensaver lock key");
+        if (!is_locked) {
+                g_warning ("Couldn't lock screen: %s", error->message);
+                g_error_free (error);
                 return;
         }
-        g_dbus_connection_call (manager->priv->connection,
-                                GS_DBUS_NAME,
-                                GS_DBUS_PATH,
-                                GS_DBUS_INTERFACE,
-                                "Lock",
-                                NULL, NULL,
-                                G_DBUS_CALL_FLAGS_NONE, -1,
-                                NULL, NULL, NULL);
+}
+
+static void
+do_lock_screensaver (GsdMediaKeysManager *manager)
+{
+        GsdMediaKeysManagerPrivate *priv = manager->priv;
+
+        if (priv->screen_saver_proxy == NULL)
+                priv->screen_saver_proxy = gnome_settings_bus_get_screen_saver_proxy ();
+
+        gsd_screen_saver_call_lock (priv->screen_saver_proxy,
+                                    priv->cancellable,
+                                    (GAsyncReadyCallback) on_screen_locked,
+                                    manager);
 }
 
 static void
@@ -2571,6 +2582,8 @@ gsd_media_keys_manager_finalize (GObject *object)
         if (media_keys_manager->priv->inhibit_keys_fd != -1)
                 close (media_keys_manager->priv->inhibit_keys_fd);
 
+        g_clear_object (&media_keys_manager->priv->screen_saver_proxy);
+
         G_OBJECT_CLASS (gsd_media_keys_manager_parent_class)->finalize (object);
 }
 
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index 297fe8d..b5a8c02 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -69,10 +69,6 @@
 #define GSD_POWER_DBUS_INTERFACE_SCREEN         GSD_POWER_DBUS_INTERFACE ".Screen"
 #define GSD_POWER_DBUS_INTERFACE_KEYBOARD       GSD_POWER_DBUS_INTERFACE ".Keyboard"
 
-#define GS_DBUS_NAME                            "org.gnome.ScreenSaver"
-#define GS_DBUS_PATH                            "/org/gnome/ScreenSaver"
-#define GS_DBUS_INTERFACE                       "org.gnome.ScreenSaver"
-
 #define GSD_POWER_MANAGER_NOTIFY_TIMEOUT_SHORT          10 * 1000 /* ms */
 #define GSD_POWER_MANAGER_NOTIFY_TIMEOUT_LONG           30 * 1000 /* ms */
 
@@ -158,9 +154,7 @@ struct GsdPowerManagerPrivate
         guint                    low_time;
 
         /* Screensaver */
-        guint                    screensaver_watch_id;
-        GCancellable            *screensaver_cancellable;
-        GDBusProxy              *screensaver_proxy;
+        GsdScreenSaver          *screensaver_proxy;
         gboolean                 screensaver_active;
 
         /* State */
@@ -2135,7 +2129,7 @@ lock_screensaver (GsdPowerManager *manager)
         do_lock = g_settings_get_boolean (manager->priv->settings_screensaver,
                                           "lock-enabled");
         if (!do_lock) {
-                g_dbus_proxy_call_sync (manager->priv->screensaver_proxy,
+                g_dbus_proxy_call_sync (G_DBUS_PROXY (manager->priv->screensaver_proxy),
                                         "SetActive",
                                         g_variant_new ("(b)", TRUE),
                                         G_DBUS_CALL_FLAGS_NONE,
@@ -2143,7 +2137,7 @@ lock_screensaver (GsdPowerManager *manager)
                 return;
         }
 
-        g_dbus_proxy_call_sync (manager->priv->screensaver_proxy,
+        g_dbus_proxy_call_sync (G_DBUS_PROXY (manager->priv->screensaver_proxy),
                                 "Lock",
                                 NULL,
                                 G_DBUS_CALL_FLAGS_NONE,
@@ -2816,83 +2810,6 @@ screensaver_signal_cb (GDBusProxy *proxy,
 }
 
 static void
-get_active_cb (GDBusProxy *proxy,
-               GAsyncResult *result,
-               GsdPowerManager *manager)
-{
-        GVariant *res;
-        GError *error = NULL;
-
-        res = g_dbus_proxy_call_finish (proxy, result, &error);
-        if (!res) {
-                g_warning ("Failed to run GetActive() function on screensaver: %s", error->message);
-                g_error_free (error);
-                return;
-        }
-
-        handle_screensaver_active (manager, res);
-        g_variant_unref (res);
-}
-
-static void
-screensaver_proxy_ready_cb (GObject         *source_object,
-                            GAsyncResult    *res,
-                            GsdPowerManager *manager)
-{
-        GError *error = NULL;
-        GDBusProxy *proxy;
-
-        proxy = g_dbus_proxy_new_finish (res, &error);
-
-        if (proxy == NULL) {
-                if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
-                        g_warning ("Could not connect to screensaver: %s", error->message);
-                g_error_free (error);
-                return;
-        }
-
-        manager->priv->screensaver_proxy = proxy;
-
-        g_signal_connect (manager->priv->screensaver_proxy, "g-signal",
-                          G_CALLBACK (screensaver_signal_cb), manager);
-        g_dbus_proxy_call (manager->priv->screensaver_proxy,
-                           "GetActive",
-                           NULL,
-                           0,
-                           G_MAXINT,
-                           NULL,
-                           (GAsyncReadyCallback)get_active_cb,
-                           manager);
-
-}
-
-static void
-screensaver_appeared_cb (GDBusConnection *connection,
-                         const char      *name,
-                         const char      *name_owner,
-                         GsdPowerManager *manager)
-{
-        g_dbus_proxy_new (connection,
-                          0,
-                          NULL,
-                          GS_DBUS_NAME,
-                          GS_DBUS_PATH,
-                          GS_DBUS_INTERFACE,
-                          manager->priv->screensaver_cancellable,
-                          (GAsyncReadyCallback) screensaver_proxy_ready_cb,
-                          manager);
-
-}
-
-static void
-screensaver_vanished_cb (GDBusConnection *connection,
-                         const char      *name,
-                         GsdPowerManager *manager)
-{
-        g_clear_object (&manager->priv->screensaver_proxy);
-}
-
-static void
 power_keyboard_proxy_ready_cb (GObject             *source_object,
                                GAsyncResult        *res,
                                gpointer             user_data)
@@ -3354,6 +3271,11 @@ gsd_power_manager_start (GsdPowerManager *manager,
                           G_CALLBACK (engine_session_properties_changed_cb),
                           manager);
 
+        manager->priv->screensaver_proxy = gnome_settings_bus_get_screen_saver_proxy ();
+
+        g_signal_connect (manager->priv->screensaver_proxy, "g-signal",
+                          G_CALLBACK (screensaver_signal_cb), manager);
+
         manager->priv->kbd_brightness_old = -1;
         manager->priv->kbd_brightness_pre_dim = -1;
         manager->priv->pre_dim_brightness = -1;
@@ -3398,15 +3320,6 @@ gsd_power_manager_start (GsdPowerManager *manager,
                                   session_presence_proxy_ready_cb,
                                   manager);
 
-        manager->priv->screensaver_watch_id =
-                g_bus_watch_name (G_BUS_TYPE_SESSION,
-                                  GS_DBUS_NAME,
-                                  G_BUS_NAME_WATCHER_FLAGS_NONE,
-                                  (GBusNameAppearedCallback) screensaver_appeared_cb,
-                                  (GBusNameVanishedCallback) screensaver_vanished_cb,
-                                  manager,
-                                  NULL);
-
         manager->priv->devices_array = g_ptr_array_new_with_free_func (g_object_unref);
 
         /* create a fake virtual composite battery */
@@ -3478,16 +3391,6 @@ gsd_power_manager_stop (GsdPowerManager *manager)
                 manager->priv->inhibit_lid_switch_timer_id = 0;
         }
 
-        if (manager->priv->screensaver_cancellable != NULL) {
-                g_cancellable_cancel (manager->priv->screensaver_cancellable);
-                g_clear_object (&manager->priv->screensaver_cancellable);
-        }
-
-        if (manager->priv->screensaver_watch_id != 0) {
-                g_bus_unwatch_name (manager->priv->screensaver_watch_id);
-                manager->priv->screensaver_watch_id = 0;
-        }
-
         if (manager->priv->bus_cancellable != NULL) {
                 g_cancellable_cancel (manager->priv->bus_cancellable);
                 g_object_unref (manager->priv->bus_cancellable);
@@ -3547,7 +3450,6 @@ gsd_power_manager_init (GsdPowerManager *manager)
         manager->priv = GSD_POWER_MANAGER_GET_PRIVATE (manager);
         manager->priv->inhibit_lid_switch_fd = -1;
         manager->priv->inhibit_suspend_fd = -1;
-        manager->priv->screensaver_cancellable = g_cancellable_new ();
         manager->priv->bus_cancellable = g_cancellable_new ();
 }
 
diff --git a/plugins/smartcard/Makefile.am b/plugins/smartcard/Makefile.am
index 298113b..b0e972b 100644
--- a/plugins/smartcard/Makefile.am
+++ b/plugins/smartcard/Makefile.am
@@ -2,9 +2,8 @@ plugin_name = smartcard
 libsmartcard_headers = gsd-smartcard-manager.h \
                       gsd-smartcard-utils.h
 dbus_built_sources = org.gnome.SettingsDaemon.Smartcard.c org.gnome.SettingsDaemon.Smartcard.h
-screensaver_dbus_built_sources = org.gnome.ScreenSaver.c org.gnome.ScreenSaver.h
 enum_built_sources = gsd-smartcard-enum-types.h gsd-smartcard-enum-types.c
-BUILT_SOURCES = $(dbus_built_sources) $(screensaver_dbus_built_sources) $(enum_built_sources)
+BUILT_SOURCES = $(dbus_built_sources) $(enum_built_sources)
 
 libexec_PROGRAMS = gsd-test-smartcard
 
@@ -19,15 +18,6 @@ $(dbus_built_sources) : Makefile.am org.gnome.SettingsDaemon.Smartcard.xml
        --generate-c-code org.gnome.SettingsDaemon.Smartcard \
        $(srcdir)/org.gnome.SettingsDaemon.Smartcard.xml
 
-$(screensaver_dbus_built_sources) : Makefile.am org.gnome.ScreenSaver.xml
-       gdbus-codegen                                           \
-               --interface-prefix org.gnome.ScreenSaver.       \
-               --generate-c-code org.gnome.ScreenSaver         \
-               --c-namespace Gsd                               \
-               --annotate "org.gnome.ScreenSaver"              \
-                          "org.gtk.GDBus.C.Name" ScreenSaver   \
-               $(srcdir)/org.gnome.ScreenSaver.xml
-
 gsd-smartcard-enum-types.h: gsd-smartcard-enum-types.h.in $(libsmartcard_headers)
        $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@
 
@@ -36,7 +26,6 @@ gsd-smartcard-enum-types.c: gsd-smartcard-enum-types.c.in $(libsmartcard_headers
 
 gsd_test_smartcard_SOURCES =        \
        $(dbus_built_sources)   \
-       $(screensaver_dbus_built_sources) \
        $(enum_built_sources)   \
        gsd-smartcard-service.c \
        gsd-smartcard-service.h \
@@ -73,7 +62,6 @@ gsd_test_smartcard_LDADD =                                      \
 libsmartcard_la_SOURCES = \
        $(libsmartcard_headers) \
        $(dbus_built_sources) \
-       $(screensaver_dbus_built_sources) \
        $(enum_built_sources) \
        gsd-smartcard-manager.c \
        gsd-smartcard-plugin.c  \
@@ -114,7 +102,6 @@ plugin_DATA = $(plugin_in_files:.gnome-settings-plugin.in=.gnome-settings-plugin
 EXTRA_DIST = \
        gsd-smartcard-enum-types.c.in \
        gsd-smartcard-enum-types.h.in \
-       org.gnome.ScreenSaver.xml \
        org.gnome.SettingsDaemon.Smartcard.xml \
        $(plugin_in_files)
 
diff --git a/plugins/smartcard/gsd-smartcard-manager.c b/plugins/smartcard/gsd-smartcard-manager.c
index e8c3b75..0385003 100644
--- a/plugins/smartcard/gsd-smartcard-manager.c
+++ b/plugins/smartcard/gsd-smartcard-manager.c
@@ -32,8 +32,6 @@
 #include "gsd-smartcard-enum-types.h"
 #include "gsd-smartcard-utils.h"
 
-#include "org.gnome.ScreenSaver.h"
-
 #include <prerror.h>
 #include <prinit.h>
 #include <nss.h>
@@ -729,32 +727,6 @@ gsd_smartcard_manager_stop (GsdSmartcardManager *self)
 }
 
 static void
-on_got_screen_saver_to_lock_screen (GObject             *object,
-                                    GAsyncResult        *result,
-                                    GsdSmartcardManager *self)
-{
-        GsdSmartcardManagerPrivate *priv = self->priv;
-        GsdScreenSaver *screen_saver;
-        GError *error = NULL;
-
-        screen_saver = gsd_screen_saver_proxy_new_for_bus_finish (result, &error);
-
-        if (screen_saver == NULL) {
-                g_warning ("Couldn't find screen saver service to lock screen: %s",
-                           error->message);
-                g_error_free (error);
-                return;
-        }
-
-        if (priv->screen_saver != NULL)
-                g_object_unref (screen_saver);
-
-        priv->screen_saver = screen_saver;
-
-        lock_screen (self);
-}
-
-static void
 on_screen_locked (GsdScreenSaver      *screen_saver,
                   GAsyncResult        *result,
                   GsdSmartcardManager *self)
@@ -776,16 +748,8 @@ lock_screen (GsdSmartcardManager *self)
 {
         GsdSmartcardManagerPrivate *priv = self->priv;
 
-        if (priv->screen_saver == NULL) {
-                gsd_screen_saver_proxy_new_for_bus (G_BUS_TYPE_SESSION,
-                                                    G_DBUS_PROXY_FLAGS_NONE,
-                                                    "org.gnome.ScreenSaver",
-                                                    "/org/gnome/ScreenSaver",
-                                                    priv->cancellable,
-                                                    (GAsyncReadyCallback) on_got_screen_saver_to_lock_screen,
-                                                    self);
-                return;
-        }
+        if (priv->screen_saver == NULL)
+                priv->screen_saver = gnome_settings_bus_get_screen_saver_proxy ();
 
         gsd_screen_saver_call_lock (priv->screen_saver,
                                     priv->cancellable,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]