[cinnamon-settings-daemon] more logind changes

leigh123linux leigh123linux at fedoraproject.org
Sat Feb 15 13:16:13 UTC 2014


commit 49bebdb7b08b25971d377367a6e3f81674e2016e
Author: leigh123linux <leigh123linux at googlemail.com>
Date:   Sat Feb 15 13:16:42 2014 +0000

    more logind changes

 ...n-settings-daemon-2.0.6-upower_deprecated.patch |   20 --
 cinnamon-settings-daemon.spec                      |   19 ++-
 logind_support.patch                               |  183 ++++++++++++++++++++
 3 files changed, 194 insertions(+), 28 deletions(-)
---
diff --git a/cinnamon-settings-daemon-2.0.6-upower_deprecated.patch b/cinnamon-settings-daemon-2.0.6-upower_deprecated.patch
index d9def19..9afc45a 100644
--- a/cinnamon-settings-daemon-2.0.6-upower_deprecated.patch
+++ b/cinnamon-settings-daemon-2.0.6-upower_deprecated.patch
@@ -17,26 +17,6 @@ diff -up cinnamon-settings-daemon-2.0.6/plugins/power/csd-power-manager.c.upower
  
          /* connected mobile phones */
          gpm_phone_coldplug (manager->priv->phone);
-@@ -1306,12 +1308,17 @@ manager_critical_action_get (CsdPowerMan
- 
-         policy = g_settings_get_enum (manager->priv->settings, "critical-battery-action");
-         if (policy == CSD_POWER_ACTION_SUSPEND) {
--                if (is_ups == FALSE &&
--                    up_client_get_can_suspend (manager->priv->up_client))
-+                if (is_ups == FALSE
-+#if ! UP_CHECK_VERSION(0,99,0)
-+                    && up_client_get_can_suspend (manager->priv->up_client)
-+#endif
-+                )
-                         return policy;
-                 return CSD_POWER_ACTION_SHUTDOWN;
-         } else if (policy == CSD_POWER_ACTION_HIBERNATE) {
-+#if ! UP_CHECK_VERSION(0,99,0)
-                 if (up_client_get_can_hibernate (manager->priv->up_client))
-+#endif
-                         return policy;
-                 return CSD_POWER_ACTION_SHUTDOWN;
-         }
 @@ -2300,6 +2307,7 @@ suspend_with_lid_closed (CsdPowerManager
                                                     "lid-close-ac-action");
          }
diff --git a/cinnamon-settings-daemon.spec b/cinnamon-settings-daemon.spec
index dc81dca..53fa103 100644
--- a/cinnamon-settings-daemon.spec
+++ b/cinnamon-settings-daemon.spec
@@ -2,7 +2,7 @@
 
 Name:           cinnamon-settings-daemon
 Version:        2.0.8
-Release:        3%{?dist}
+Release:        4%{?dist}
 Summary:        The daemon sharing settings from CINNAMON to GTK+/KDE applications
 
 Group:          System Environment/Daemons
@@ -12,9 +12,14 @@ URL:            http://cinnamon.linuxmint.com
 # wget https://github.com/linuxmint/cinnamon-settings-daemon/tarball/%%{_internal_version} -O cinnamon-settings-daemon-%%{version}.git%%{_internal_version}.tar.gz
 Source0:        http://leigh123linux.fedorapeople.org/pub/cinnamon-settings-daemon/source/cinnamon-settings-daemon-%{version}.tar.gz
 Patch0:         keyboard.patch
+%if 0%{?fedora} > 19
 Patch1:         add_mpris_support.patch
+%endif
 Patch2:         cinnamon-settings-daemon-2.0.6-upower_deprecated.patch
 Patch3:         remove_obsolete_battery_recall_code.patch
+%if 0%{?fedora} > 19
+Patch4:         logind_support.patch
+%endif
 
 Requires:       cinnamon-control-center-filesystem
 Obsoletes:      cinnamon-settings-daemon-updates
@@ -60,15 +65,10 @@ This package contains libraries and header files for
 developing applications that use %{name}.
 
 %prep
-%setup -q
+%autosetup -p1
+
 sed -i -e 's@{ACLOCAL_FLAGS}@{ACLOCAL_FLAGS} -I m4 at g' Makefile.am
 echo "AC_CONFIG_MACRO_DIR([m4])" >> configure.ac
-%patch0 -p1
-%if 0%{?fedora} > 19
-%patch1 -p1
-%endif
-%patch2 -p1 -b .upower_deprecated
-%patch3 -p1
 NOCONFIGURE=1 ./autogen.sh
 
 %build
@@ -133,6 +133,9 @@ fi
 
 
 %changelog
+* Sat Feb 15 2014 Leigh Scott <leigh123linux at googlemail.com> - 2.0.8-4
+- more logind changes
+
 * Mon Jan 13 2014 Leigh Scott <leigh123linux at googlemail.com> - 2.0.8-3
 - rebuilt
 
diff --git a/logind_support.patch b/logind_support.patch
new file mode 100644
index 0000000..b3cead0
--- /dev/null
+++ b/logind_support.patch
@@ -0,0 +1,183 @@
+--- a/plugins/power/csd-power-manager.c
++++ b/plugins/power/csd-power-manager.c
+@@ -83,6 +83,10 @@
+ 
+ #define XSCREENSAVER_WATCHDOG_TIMEOUT                   120 /* seconds */
+ 
++#define SYSTEMD_DBUS_NAME                       "org.freedesktop.login1"
++#define SYSTEMD_DBUS_PATH                       "/org/freedesktop/login1"
++#define SYSTEMD_DBUS_INTERFACE                  "org.freedesktop.login1.Manager"
++
+ enum {
+         CSD_POWER_IDLETIME_NULL_ID,
+         CSD_POWER_IDLETIME_DIM_ID,
+@@ -202,6 +206,11 @@ 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;
+ };
+ 
+ enum {
+@@ -1302,18 +1311,37 @@ static CsdPowerActionType
+ manager_critical_action_get (CsdPowerManager *manager,
+                              gboolean         is_ups)
+ {
+-        CsdPowerActionType policy;
++        CsdPowerActionType policy = CSD_POWER_ACTION_SHUTDOWN;
++        GVariant *result = NULL;
+ 
+         policy = g_settings_get_enum (manager->priv->settings, "critical-battery-action");
++
+         if (policy == CSD_POWER_ACTION_SUSPEND) {
+-                if (is_ups == FALSE &&
+-                    up_client_get_can_suspend (manager->priv->up_client))
+-                        return policy;
+-                return CSD_POWER_ACTION_SHUTDOWN;
++                if (is_ups == FALSE) {
++                        result = g_dbus_proxy_call_sync (manager->priv->logind_proxy,
++                                                         "CanSuspend",
++                                                         NULL,
++                                                         G_DBUS_CALL_FLAGS_NONE,
++                                                         -1, NULL, NULL);
++                }
+         } else if (policy == CSD_POWER_ACTION_HIBERNATE) {
+-                if (up_client_get_can_hibernate (manager->priv->up_client))
+-                        return policy;
+-                return CSD_POWER_ACTION_SHUTDOWN;
++                result = g_dbus_proxy_call_sync (manager->priv->logind_proxy,
++                                                 "CanHibernate",
++                                                 NULL,
++                                                 G_DBUS_CALL_FLAGS_NONE,
++                                                 -1, NULL, NULL);
++        } else {
++                /* Other actions need no check */
++                return policy;
++        }
++
++        if (result) {
++                const char *s;
++
++                g_variant_get (result, "(s)", &s);
++                if (g_strcmp0 (s, "yes") != 0)
++                        policy = CSD_POWER_ACTION_SHUTDOWN;
++                g_variant_unref (result);
+         }
+ 
+         return policy;
+@@ -3810,6 +3838,77 @@ out:
+         return ret;
+ }
+ 
++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 (),
++                                "Lid is handled by cinnamon-settings-daemon power",
++                                "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
++uninhibit_lid_switch (CsdPowerManager *manager)
++{
++        if (manager->priv->inhibit_lid_switch_fd == -1) {
++                g_debug ("no lid-switch inhibitor");
++                return;
++        }
++        g_debug ("Removing lid switch system inhibitor");
++        close (manager->priv->inhibit_lid_switch_fd);
++        manager->priv->inhibit_lid_switch_fd = -1;
++        manager->priv->inhibit_lid_switch_taken = FALSE;
++}
++
++
+ gboolean
+ csd_power_manager_start (CsdPowerManager *manager,
+                          GError **error)
+@@ -3824,6 +3923,25 @@ csd_power_manager_start (CsdPowerManager
+         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);
++        if (manager->priv->logind_proxy == NULL) {
++                g_debug ("No systemd (logind) support, disabling plugin");
++                return FALSE;
++        }
++
++        /* proper logind lid handling is done in 3.8; for now, just disable
++         * logind's lid handling while c-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",
+@@ -3993,6 +4111,7 @@ csd_power_manager_stop (CsdPowerManager
+                 manager->priv->introspection_data = NULL;
+         }
+ 
++        uninhibit_lid_switch (manager);
+         kill_lid_close_safety_timer (manager);
+ 
+         g_signal_handlers_disconnect_by_data (manager->priv->up_client, manager);


More information about the scm-commits mailing list