[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