[arch-commits] Commit in cinnamon-settings-daemon/trunk (2 files)

Balló György bgyorgy at nymeria.archlinux.org
Wed Mar 19 00:56:38 UTC 2014


    Date: Wednesday, March 19, 2014 @ 01:56:38
  Author: bgyorgy
Revision: 107734

upgpkg: cinnamon-settings-daemon 2.0.8-4

Add systemd support for power and media-keys plugins

Added:
  cinnamon-settings-daemon/trunk/systemd-support.patch
Modified:
  cinnamon-settings-daemon/trunk/PKGBUILD

-----------------------+
 PKGBUILD              |    7 
 systemd-support.patch |  535 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 541 insertions(+), 1 deletion(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2014-03-18 23:34:04 UTC (rev 107733)
+++ PKGBUILD	2014-03-19 00:56:38 UTC (rev 107734)
@@ -4,7 +4,7 @@
 
 pkgname=cinnamon-settings-daemon
 pkgver=2.0.8
-pkgrel=3
+pkgrel=4
 pkgdesc="The Cinnamon Settings daemon"
 arch=('i686' 'x86_64')
 license=('GPL')
@@ -15,10 +15,12 @@
 url="https://github.com/linuxmint/cinnamon-settings-daemon"
 source=("${pkgname}-${pkgver}.tar.gz::https://github.com/linuxmint/cinnamon-settings-daemon/archive/${pkgver}.tar.gz"
         keyboard.patch
+        systemd-support.patch
         automount-plugin.patch
         dpms.patch)
 sha256sums=('6889f021acab93d146c78fe8aa540a83a12260232e1ea5f697037a7c94c877fd'
             '3c05b978cb414c8fc1530f211bab58627a64ac9c156630c9d486f5926a85109c'
+            '28c002628bc97e8b4a2aa7e8a8141bcc8388b250a6c3ebc09a640e110ae815a9'
             '4fc2b3a354b53d41d92d7f95d175a6a18382330353a0579d29c2d33b9400a837'
             '194cc704320a2d6be636191e96f62514f2b5f97655c200991b5690fbf3006026')
 
@@ -28,6 +30,9 @@
   # Fix crasher
   patch -Np1 -i ../keyboard.patch
 
+  # Add systemd support for power and media-keys plugins
+  patch -Np1 -i ../systemd-support.patch
+
   # Turn automount helper into a plugin
   patch -Np1 -i ../automount-plugin.patch
 

Added: systemd-support.patch
===================================================================
--- systemd-support.patch	                        (rev 0)
+++ systemd-support.patch	2014-03-19 00:56:38 UTC (rev 107734)
@@ -0,0 +1,535 @@
+diff --git a/plugins/media-keys/csd-media-keys-manager.c b/plugins/media-keys/csd-media-keys-manager.c
+index 02930a3..7c1c519 100644
+--- a/plugins/media-keys/csd-media-keys-manager.c
++++ b/plugins/media-keys/csd-media-keys-manager.c
+@@ -39,6 +39,7 @@
+ #include <gdk/gdkx.h>
+ #include <gtk/gtk.h>
+ #include <gio/gdesktopappinfo.h>
++#include <gio/gunixfdlist.h>
+ 
+ #ifdef HAVE_GUDEV
+ #include <gudev/gudev.h>
+@@ -121,6 +122,10 @@ static const gchar kb_introspection_xml[] =
+ #define VOLUME_STEP 5           /* percents for one volume button press */
+ #define MAX_VOLUME 65536.0
+ 
++#define SYSTEMD_DBUS_NAME                       "org.freedesktop.login1"
++#define SYSTEMD_DBUS_PATH                       "/org/freedesktop/login1"
++#define SYSTEMD_DBUS_INTERFACE                  "org.freedesktop.login1.Manager"
++
+ #define CSD_MEDIA_KEYS_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CSD_TYPE_MEDIA_KEYS_MANAGER, CsdMediaKeysManagerPrivate))
+ 
+ typedef struct {
+@@ -167,6 +172,10 @@ struct CsdMediaKeysManagerPrivate
+         GDBusProxy      *power_screen_proxy;
+         GDBusProxy      *power_keyboard_proxy;
+ 
++        /* systemd stuff */
++        GDBusProxy      *logind_proxy;
++        gint             inhibit_keys_fd;
++
+         /* Multihead stuff */
+         GdkScreen       *current_screen;
+         GSList          *screens;
+@@ -2213,6 +2222,11 @@ csd_media_keys_manager_stop (CsdMediaKeysManager *manager)
+         }
+ #endif /* HAVE_GUDEV */
+ 
++        if (priv->logind_proxy) {
++                g_object_unref (priv->logind_proxy);
++                priv->logind_proxy = NULL;
++        }
++
+         if (priv->settings) {
+                 g_object_unref (priv->settings);
+                 priv->settings = NULL;
+@@ -2356,9 +2370,85 @@ csd_media_keys_manager_class_init (CsdMediaKeysManagerClass *klass)
+ }
+ 
+ static void
++inhibit_done (GObject      *source,
++              GAsyncResult *result,
++              gpointer      user_data)
++{
++        GDBusProxy *proxy = G_DBUS_PROXY (source);
++        CsdMediaKeysManager *manager = CSD_MEDIA_KEYS_MANAGER (user_data);
++        GError *error = NULL;
++        GVariant *res;
++        GUnixFDList *fd_list = NULL;
++        gint idx;
++
++        res = g_dbus_proxy_call_with_unix_fd_list_finish (proxy, &fd_list, result, &error);
++        if (res == NULL) {
++                g_warning ("Unable to inhibit keypresses: %s", error->message);
++                g_error_free (error);
++        } else {
++                g_variant_get (res, "(h)", &idx);
++                manager->priv->inhibit_keys_fd = g_unix_fd_list_get (fd_list, idx, &error);
++                if (manager->priv->inhibit_keys_fd == -1) {
++                        g_warning ("Failed to receive system inhibitor fd: %s", error->message);
++                        g_error_free (error);
++                }
++                g_debug ("System inhibitor fd is %d", manager->priv->inhibit_keys_fd);
++                g_object_unref (fd_list);
++                g_variant_unref (res);
++        }
++}
++
++static void
+ csd_media_keys_manager_init (CsdMediaKeysManager *manager)
+ {
++        GError *error;
++        GDBusConnection *bus;
++
++        error = NULL;
+         manager->priv = CSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager);
++
++        bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
++        if (bus == NULL) {
++                g_warning ("Failed to connect to system bus: %s",
++                           error->message);
++                g_error_free (error);
++                return;
++        }
++
++        manager->priv->logind_proxy =
++                g_dbus_proxy_new_sync (bus,
++                                       0,
++                                       NULL,
++                                       SYSTEMD_DBUS_NAME,
++                                       SYSTEMD_DBUS_PATH,
++                                       SYSTEMD_DBUS_INTERFACE,
++                                       NULL,
++                                       &error);
++
++        if (manager->priv->logind_proxy == NULL) {
++                g_warning ("Failed to connect to systemd: %s",
++                           error->message);
++                g_error_free (error);
++        }
++
++        g_object_unref (bus);
++
++        g_debug ("Adding system inhibitors for power keys");
++        manager->priv->inhibit_keys_fd = -1;
++        g_dbus_proxy_call_with_unix_fd_list (manager->priv->logind_proxy,
++                                             "Inhibit",
++                                             g_variant_new ("(ssss)",
++                                                            "handle-power-key:handle-suspend-key:handle-hibernate-key",
++                                                            g_get_user_name (),
++                                                            "Cinnamon handling keypresses",
++                                                            "block"),
++                                             0,
++                                             G_MAXINT,
++                                             NULL,
++                                             NULL,
++                                             inhibit_done,
++                                             manager);
++
+ }
+ 
+ static void
+@@ -2375,6 +2465,8 @@ csd_media_keys_manager_finalize (GObject *object)
+ 
+         if (media_keys_manager->priv->start_idle_id != 0)
+                 g_source_remove (media_keys_manager->priv->start_idle_id);
++        if (media_keys_manager->priv->inhibit_keys_fd != -1)
++                close (media_keys_manager->priv->inhibit_keys_fd);
+ 
+         G_OBJECT_CLASS (csd_media_keys_manager_parent_class)->finalize (object);
+ }
+diff --git a/plugins/power/csd-power-manager.c b/plugins/power/csd-power-manager.c
+index b54cb5b..b9c5429 100644
+--- a/plugins/power/csd-power-manager.c
++++ b/plugins/power/csd-power-manager.c
+@@ -32,6 +32,7 @@
+ #include <libupower-glib/upower.h>
+ #include <libnotify/notify.h>
+ #include <canberra-gtk.h>
++#include <gio/gunixfdlist.h>
+ 
+ #include <X11/extensions/dpms.h>
+ 
+@@ -79,6 +80,10 @@
+ #define CSD_POWER_MANAGER_CRITICAL_ALERT_TIMEOUT        5 /* seconds */
+ #define CSD_POWER_MANAGER_LID_CLOSE_SAFETY_TIMEOUT      30 /* seconds */
+ 
++#define SYSTEMD_DBUS_NAME                       "org.freedesktop.login1"
++#define SYSTEMD_DBUS_PATH                       "/org/freedesktop/login1"
++#define SYSTEMD_DBUS_INTERFACE                  "org.freedesktop.login1.Manager"
++
+ /* Keep this in sync with gnome-shell */
+ #define SCREENSAVER_FADE_TIME                           10 /* seconds */
+ 
+@@ -203,6 +208,13 @@ struct CsdPowerManagerPrivate
+         GtkStatusIcon           *status_icon;
+         guint                    xscreensaver_watchdog_timer_id;
+         gboolean                 is_virtual_machine;
++
++        /* systemd stuff */
++        GDBusProxy              *logind_proxy;
++        gint                     inhibit_lid_switch_fd;
++        gboolean                 inhibit_lid_switch_taken;
++        gint                     inhibit_suspend_fd;
++        gboolean                 inhibit_suspend_taken;
+ };
+ 
+ enum {
+@@ -3350,30 +3362,6 @@ lock_screensaver (CsdPowerManager *manager)
+         if (!do_lock)
+                 return;
+ 
+-            /* connect to the screensaver first */
+-            g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+-                                      G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+-                                      NULL,
+-                                      GS_DBUS_NAME,
+-                                      GS_DBUS_PATH,
+-                                      GS_DBUS_INTERFACE,
+-                                      NULL,
+-                                      sleep_cb_screensaver_proxy_ready_cb,
+-                                      manager);
+-}
+-
+-static void
+-upower_notify_sleep_cb (UpClient *client,
+-                        UpSleepKind sleep_kind,
+-                        CsdPowerManager *manager)
+-{
+-        gboolean do_lock;
+-
+-        do_lock = g_settings_get_boolean (manager->priv->settings,
+-                                          "lock-on-suspend");
+-        if (!do_lock)
+-                return;
+-
+         /* connect to the screensaver first */
+         g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+                                   G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+@@ -3384,46 +3372,6 @@ upower_notify_sleep_cb (UpClient *client,
+                                   NULL,
+                                   sleep_cb_screensaver_proxy_ready_cb,
+                                   manager);
+-
+-}
+-
+-static void
+-upower_notify_resume_cb (UpClient *client,
+-                         UpSleepKind sleep_kind,
+-                         CsdPowerManager *manager)
+-{
+-        gboolean ret;
+-        GError *error = NULL;
+-
+-        /* this displays the unlock dialogue so the user doesn't have
+-         * to move the mouse or press any key before the window comes up */
+-        if (manager->priv->screensaver_proxy != NULL) {
+-                g_dbus_proxy_call (manager->priv->screensaver_proxy,
+-                                   "SimulateUserActivity",
+-                                   NULL,
+-                                   G_DBUS_CALL_FLAGS_NONE,
+-                                   -1, NULL, NULL, NULL);
+-        }
+-
+-        if (manager->priv->screensaver_proxy != NULL) {
+-            g_object_unref (manager->priv->screensaver_proxy);
+-            manager->priv->screensaver_proxy = NULL;
+-        }
+-
+-        /* close existing notifications on resume, the system power
+-         * state is probably different now */
+-        notify_close_if_showing (manager->priv->notification_low);
+-        notify_close_if_showing (manager->priv->notification_discharging);
+-
+-        /* ensure we turn the panel back on after resume */
+-        ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
+-                                             GNOME_RR_DPMS_ON,
+-                                             &error);
+-        if (!ret) {
+-                g_warning ("failed to turn the panel on after resume: %s",
+-                           error->message);
+-                g_error_free (error);
+-        }
+ }
+ 
+ static void
+@@ -3582,6 +3530,219 @@ disable_builtin_screensaver (gpointer unused)
+         return TRUE;
+ }
+ 
++static void
++inhibit_lid_switch_done (GObject      *source,
++                         GAsyncResult *result,
++                         gpointer      user_data)
++{
++        GDBusProxy *proxy = G_DBUS_PROXY (source);
++        CsdPowerManager *manager = CSD_POWER_MANAGER (user_data);
++        GError *error = NULL;
++        GVariant *res;
++        GUnixFDList *fd_list = NULL;
++        gint idx;
++
++        res = g_dbus_proxy_call_with_unix_fd_list_finish (proxy, &fd_list, result, &error);
++        if (res == NULL) {
++                g_warning ("Unable to inhibit lid switch: %s", error->message);
++                g_error_free (error);
++        } else {
++                g_variant_get (res, "(h)", &idx);
++                manager->priv->inhibit_lid_switch_fd = g_unix_fd_list_get (fd_list, idx, &error);
++                if (manager->priv->inhibit_lid_switch_fd == -1) {
++                        g_warning ("Failed to receive system inhibitor fd: %s", error->message);
++                        g_error_free (error);
++                }
++                g_debug ("System inhibitor fd is %d", manager->priv->inhibit_lid_switch_fd);
++                g_object_unref (fd_list);
++                g_variant_unref (res);
++        }
++}
++
++static void
++inhibit_lid_switch (CsdPowerManager *manager)
++{
++        GVariant *params;
++
++        if (manager->priv->inhibit_lid_switch_taken) {
++                g_debug ("already inhibited lid-switch");
++                return;
++        }
++        g_debug ("Adding lid switch system inhibitor");
++        manager->priv->inhibit_lid_switch_taken = TRUE;
++
++        params = g_variant_new ("(ssss)",
++                                "handle-lid-switch",
++                                g_get_user_name (),
++                                "Multiple displays attached",
++                                "block");
++        g_dbus_proxy_call_with_unix_fd_list (manager->priv->logind_proxy,
++                                             "Inhibit",
++                                             params,
++                                             0,
++                                             G_MAXINT,
++                                             NULL,
++                                             NULL,
++                                             inhibit_lid_switch_done,
++                                             manager);
++}
++
++static void
++inhibit_suspend_done (GObject      *source,
++                      GAsyncResult *result,
++                      gpointer      user_data)
++{
++        GDBusProxy *proxy = G_DBUS_PROXY (source);
++        CsdPowerManager *manager = CSD_POWER_MANAGER (user_data);
++        GError *error = NULL;
++        GVariant *res;
++        GUnixFDList *fd_list = NULL;
++        gint idx;
++
++        res = g_dbus_proxy_call_with_unix_fd_list_finish (proxy, &fd_list, result, &error);
++        if (res == NULL) {
++                g_warning ("Unable to inhibit suspend: %s", error->message);
++                g_error_free (error);
++        } else {
++                g_variant_get (res, "(h)", &idx);
++                manager->priv->inhibit_suspend_fd = g_unix_fd_list_get (fd_list, idx, &error);
++                if (manager->priv->inhibit_suspend_fd == -1) {
++                        g_warning ("Failed to receive system inhibitor fd: %s", error->message);
++                        g_error_free (error);
++                }
++                g_debug ("System inhibitor fd is %d", manager->priv->inhibit_suspend_fd);
++                g_object_unref (fd_list);
++                g_variant_unref (res);
++        }
++}
++
++/* We take a delay inhibitor here, which causes logind to send a
++ * PrepareToSleep signal, which gives us a chance to lock the screen
++ * and do some other preparations.
++ */
++static void
++inhibit_suspend (CsdPowerManager *manager)
++{
++        if (manager->priv->inhibit_suspend_taken) {
++                g_debug ("already inhibited lid-switch");
++                return;
++        }
++        g_debug ("Adding suspend delay inhibitor");
++        manager->priv->inhibit_suspend_taken = TRUE;
++        g_dbus_proxy_call_with_unix_fd_list (manager->priv->logind_proxy,
++                                             "Inhibit",
++                                             g_variant_new ("(ssss)",
++                                                            "sleep",
++                                                            g_get_user_name (),
++                                                            "Cinnamon needs to lock the screen",
++                                                            "delay"),
++                                             0,
++                                             G_MAXINT,
++                                             NULL,
++                                             NULL,
++                                             inhibit_suspend_done,
++                                             manager);
++}
++
++static void
++uninhibit_suspend (CsdPowerManager *manager)
++{
++        if (manager->priv->inhibit_suspend_fd == -1) {
++                g_debug ("no suspend delay inhibitor");
++                return;
++        }
++        g_debug ("Removing suspend delay inhibitor");
++        close (manager->priv->inhibit_suspend_fd);
++        manager->priv->inhibit_suspend_fd = -1;
++        manager->priv->inhibit_suspend_taken = FALSE;
++}
++
++static void
++handle_suspend_actions (CsdPowerManager *manager)
++{
++        gboolean do_lock;
++
++        do_lock = g_settings_get_boolean (manager->priv->settings,
++                                          "lock-on-suspend");
++        if (do_lock)
++                lock_screensaver (manager);
++
++        /* lift the delay inhibit, so logind can proceed */
++        uninhibit_suspend (manager);
++}
++
++static void
++handle_resume_actions (CsdPowerManager *manager)
++{
++        gboolean ret;
++        GError *error = NULL;
++
++        /* this displays the unlock dialogue so the user doesn't have
++         * to move the mouse or press any key before the window comes up */
++        g_dbus_connection_call (manager->priv->connection,
++                                GS_DBUS_NAME,
++                                GS_DBUS_PATH,
++                                GS_DBUS_INTERFACE,
++                                "SimulateUserActivity",
++                                NULL, NULL,
++                                G_DBUS_CALL_FLAGS_NONE, -1,
++                                NULL, NULL, NULL);
++
++        /* close existing notifications on resume, the system power
++         * state is probably different now */
++        notify_close_if_showing (manager->priv->notification_low);
++        notify_close_if_showing (manager->priv->notification_discharging);
++
++        /* ensure we turn the panel back on after resume */
++        ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
++                                             GNOME_RR_DPMS_ON,
++                                             &error);
++        if (!ret) {
++                g_warning ("failed to turn the panel on after resume: %s",
++                           error->message);
++                g_error_free (error);
++        }
++
++        /* set up the delay again */
++        inhibit_suspend (manager);
++}
++
++static void
++upower_notify_sleep_cb (UpClient *client,
++                        UpSleepKind sleep_kind,
++                        CsdPowerManager *manager)
++{
++        handle_suspend_actions (manager);
++}
++
++static void
++upower_notify_resume_cb (UpClient *client,
++                         UpSleepKind sleep_kind,
++                         CsdPowerManager *manager)
++{
++        handle_resume_actions (manager);
++}
++
++static void
++logind_proxy_signal_cb (GDBusProxy  *proxy,
++                        const gchar *sender_name,
++                        const gchar *signal_name,
++                        GVariant    *parameters,
++                        gpointer     user_data)
++{
++        CsdPowerManager *manager = CSD_POWER_MANAGER (user_data);
++        gboolean is_about_to_suspend;
++
++        if (g_strcmp0 (signal_name, "PrepareForSleep") != 0)
++                return;
++        g_variant_get (parameters, "(b)", &is_about_to_suspend);
++        if (is_about_to_suspend) {
++                handle_suspend_actions (manager);
++        } else {
++                handle_resume_actions (manager);
++        }
++}
++
+ static gboolean
+ is_hardware_a_virtual_machine (void)
+ {
+@@ -3647,6 +3808,26 @@ csd_power_manager_start (CsdPowerManager *manager,
+         if (manager->priv->x11_screen == NULL)
+                 return FALSE;
+ 
++        /* Set up the logind proxy */
++        manager->priv->logind_proxy =
++                g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
++                                               0,
++                                               NULL,
++                                               SYSTEMD_DBUS_NAME,
++                                               SYSTEMD_DBUS_PATH,
++                                               SYSTEMD_DBUS_INTERFACE,
++                                               NULL,
++                                               error);
++        g_signal_connect (manager->priv->logind_proxy, "g-signal",
++                          G_CALLBACK (logind_proxy_signal_cb),
++                          manager);
++
++        /* Set up a delay inhibitor to be informed about suspend attempts */
++        inhibit_suspend (manager);
++
++        /* Disable logind's lid handling while g-s-d is active */
++        inhibit_lid_switch (manager);
++
+         /* track the active session */
+         manager->priv->session = cinnamon_settings_session_new ();
+         g_signal_connect (manager->priv->session, "notify::state",
+@@ -3856,6 +4037,22 @@ csd_power_manager_stop (CsdPowerManager *manager)
+                 manager->priv->up_client = NULL;
+         }
+ 
++        if (manager->priv->inhibit_lid_switch_fd != -1) {
++                close (manager->priv->inhibit_lid_switch_fd);
++                manager->priv->inhibit_lid_switch_fd = -1;
++                manager->priv->inhibit_lid_switch_taken = FALSE;
++        }
++        if (manager->priv->inhibit_suspend_fd != -1) {
++                close (manager->priv->inhibit_suspend_fd);
++                manager->priv->inhibit_suspend_fd = -1;
++                manager->priv->inhibit_suspend_taken = FALSE;
++        }
++
++        if (manager->priv->logind_proxy != NULL) {
++                g_object_unref (manager->priv->logind_proxy);
++                manager->priv->logind_proxy = NULL;
++        }
++
+         if (manager->priv->x11_screen != NULL) {
+                 g_object_unref (manager->priv->x11_screen);
+                 manager->priv->x11_screen = NULL;
+@@ -3928,6 +4125,8 @@ static void
+ csd_power_manager_init (CsdPowerManager *manager)
+ {
+         manager->priv = CSD_POWER_MANAGER_GET_PRIVATE (manager);
++        manager->priv->inhibit_lid_switch_fd = -1;
++        manager->priv->inhibit_suspend_fd = -1;
+ }
+ 
+ static void




More information about the arch-commits mailing list