diff -Nru xfce4-power-manager-1.2.0/debian/changelog xfce4-power-manager-1.2.0/debian/changelog --- xfce4-power-manager-1.2.0/debian/changelog 2014-04-07 11:09:14.000000000 -0400 +++ xfce4-power-manager-1.2.0/debian/changelog 2014-05-26 13:07:48.000000000 -0400 @@ -1,3 +1,9 @@ +xfce4-power-manager (1.2.0-3ubuntu5) utopic; urgency=medium + + * Add 10_inhibit_logind.patch (Fixes LP: #1303736, Closes LP: #1323367) + + -- Sean Davis Mon, 26 May 2014 12:59:50 -0400 + xfce4-power-manager (1.2.0-3ubuntu4) trusty; urgency=medium * Add 09_sync_session_xfpm_lock_setting.patch (LP: #1101982) diff -Nru xfce4-power-manager-1.2.0/debian/patches/10_inhibit_logind.patch xfce4-power-manager-1.2.0/debian/patches/10_inhibit_logind.patch --- xfce4-power-manager-1.2.0/debian/patches/10_inhibit_logind.patch 1969-12-31 19:00:00.000000000 -0500 +++ xfce4-power-manager-1.2.0/debian/patches/10_inhibit_logind.patch 2014-05-22 22:15:20.000000000 -0400 @@ -0,0 +1,431 @@ +Description: Selectively inhibit logind events + Logind conflicts with lock-on-suspend with light-locker (and potentially + other locking solutions). This patch makes logind events optionally + inhibited via xfconf to allow easier workarounds. +Author: Sean Davis, smd.seandavis@gmail.com +Origin: vendor, https://github.com/bluesabre/xfce4-power-manager/commit/2f51d54f2efc7b9c87e39fb114adb06a974dcb67 +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/xfce4-power-manager/+bug/1303736 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- a/src/xfpm-config.h ++++ b/src/xfpm-config.h +@@ -82,6 +82,11 @@ + #define SPIN_DOWN_ON_AC_TIMEOUT "spin-down-on-ac-timeout" + #define SPIN_DOWN_ON_BATTERY_TIMEOUT "spin-down-on-battery-timeout" + ++#define LOGIND_HANDLE_POWER_KEY "logind-handle-power-key" ++#define LOGIND_HANDLE_SUSPEND_KEY "logind-handle-suspend-key" ++#define LOGIND_HANDLE_HIBERNATE_KEY "logind-handle-hibernate-key" ++#define LOGIND_HANDLE_LID_SWITCH "logind-handle-lid-switch" ++ + G_END_DECLS + + #endif /* __XFPM_CONFIG_H */ +--- a/src/xfpm-main.c ++++ b/src/xfpm-main.c +@@ -194,96 +194,16 @@ + g_hash_table_destroy (hash); + } + +-static gint +-xfpm_inhibit_sleep_systemd (DBusGConnection *bus) +-{ +- DBusConnection *bus_connection; +- DBusMessage *message = NULL, *reply = NULL; +- DBusError error; +- gint fd = -1; +- const char *what = "handle-power-key:handle-suspend-key:handle-hibernate-key:handle-lid-switch"; +- const char *who = "xfce4-power-manager"; +- const char *why = "xfce4-power-manager handles these events"; +- const char *mode = "block"; +- +- bus_connection = dbus_g_connection_get_connection (bus); +- if (!xfpm_dbus_name_has_owner (bus_connection, "org.freedesktop.login1")) +- return -1; +- +- dbus_error_init (&error); +- +- message = dbus_message_new_method_call ("org.freedesktop.login1", +- "/org/freedesktop/login1", +- "org.freedesktop.login1.Manager", +- "Inhibit"); +- +- if (!message) +- { +- g_warning ("Unable to call Inhibit()"); +- goto done; +- } +- +- +- if (!dbus_message_append_args (message, +- DBUS_TYPE_STRING, &what, +- DBUS_TYPE_STRING, &who, +- DBUS_TYPE_STRING, &why, +- DBUS_TYPE_STRING, &mode, +- DBUS_TYPE_INVALID)) +- { +- g_warning ("Unable to call Inhibit()"); +- goto done; +- } +- +- +- reply = dbus_connection_send_with_reply_and_block (bus_connection, message, -1, &error); +- if (!reply) +- { +- g_warning ("Unable to inhibit systemd sleep: %s", error.message); +- goto done; +- } +- +- if (!dbus_message_get_args (reply, &error, +- DBUS_TYPE_UNIX_FD, &fd, +- DBUS_TYPE_INVALID)) +- { +- g_warning ("Inhibit() reply parsing failed: %s", error.message); +- } +- +-done: +- +- if (message) +- dbus_message_unref (message); +- if (reply) +- dbus_message_unref (reply); +- dbus_error_free (&error); +- +- return fd; +-} +- + static void G_GNUC_NORETURN + xfpm_start (DBusGConnection *bus, const gchar *client_id, gboolean dump) + { +- DBusGConnection *system_bus; + XfpmManager *manager; + GError *error = NULL; +- gint inhibit_fd = -1; + + XFPM_DEBUG ("Starting the power manager"); + + manager = xfpm_manager_new (bus, client_id); + +- /* Don't allow systemd to handle power/suspend/hibernate buttons +- * and lid-switch */ +- system_bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); +- if (system_bus) +- inhibit_fd = xfpm_inhibit_sleep_systemd (system_bus); +- else +- { +- g_warning ("Unable connect to system bus: %s", error->message); +- g_clear_error (&error); +- } +- + if ( xfce_posix_signal_handler_init (&error)) + { + xfce_posix_signal_handler_set_handler (SIGHUP, +@@ -314,14 +234,10 @@ + g_hash_table_destroy (hash); + } + +- + gtk_main (); + + g_object_unref (manager); + +- if (inhibit_fd >= 0) +- close (inhibit_fd); +- + exit (EXIT_SUCCESS); + } + +--- a/src/xfpm-manager.c ++++ b/src/xfpm-manager.c +@@ -77,6 +77,7 @@ + struct XfpmManagerPrivate + { + DBusGConnection *session_bus; ++ DBusGConnection *system_bus; + + XfceSMClient *client; + +@@ -100,6 +101,8 @@ + + gboolean inhibited; + gboolean session_managed; ++ ++ gint inhibit_fd; + }; + + G_DEFINE_TYPE (XfpmManager, xfpm_manager, G_TYPE_OBJECT) +@@ -133,7 +136,10 @@ + + if ( manager->priv->session_bus ) + dbus_g_connection_unref (manager->priv->session_bus); +- ++ ++ if ( manager->priv->system_bus ) ++ dbus_g_connection_unref (manager->priv->system_bus); ++ + g_object_unref (manager->priv->power); + g_object_unref (manager->priv->button); + g_object_unref (manager->priv->conf); +@@ -176,6 +182,10 @@ + XFPM_DEBUG ("Exiting"); + + xfpm_manager_release_names (manager); ++ ++ if (manager->priv->inhibit_fd >= 0) ++ close (manager->priv->inhibit_fd); ++ + gtk_main_quit (); + return TRUE; + } +@@ -319,7 +329,17 @@ + xfpm_manager_lid_changed_cb (XfpmPower *power, gboolean lid_is_closed, XfpmManager *manager) + { + XfpmLidTriggerAction action; +- gboolean on_battery; ++ gboolean on_battery, logind_handle_lid_switch; ++ ++ if ( LOGIND_RUNNING() ) ++ { ++ g_object_get (G_OBJECT (manager->priv->conf), ++ LOGIND_HANDLE_LID_SWITCH, &logind_handle_lid_switch, ++ NULL); ++ ++ if (!logind_handle_lid_switch) ++ return; ++ } + + g_object_get (G_OBJECT (power), + "on-battery", &on_battery, +@@ -479,6 +499,124 @@ + + } + ++static gchar* ++xfpm_manager_get_systemd_events(XfpmManager *manager) ++{ ++ GSList *events = NULL; ++ gchar *what = ""; ++ gboolean handle_power_key, handle_suspend_key, handle_hibernate_key, handle_lid_switch; ++ ++ g_object_get (G_OBJECT (manager->priv->conf), ++ LOGIND_HANDLE_POWER_KEY, &handle_power_key, ++ LOGIND_HANDLE_SUSPEND_KEY, &handle_suspend_key, ++ LOGIND_HANDLE_HIBERNATE_KEY, &handle_hibernate_key, ++ LOGIND_HANDLE_LID_SWITCH, &handle_lid_switch, ++ NULL); ++ ++ if (handle_power_key) ++ events = g_slist_append(events, "handle-power-key"); ++ if (handle_suspend_key) ++ events = g_slist_append(events, "handle-suspend-key"); ++ if (handle_hibernate_key) ++ events = g_slist_append(events, "handle-hibernate-key"); ++ if (handle_lid_switch) ++ events = g_slist_append(events, "handle-lid-switch"); ++ ++ while (events != NULL) ++ { ++ if ( g_strcmp0(what, "") == 0 ) ++ what = g_strdup( (gchar *) events->data ); ++ else ++ what = g_strconcat(what, ":", (gchar *) events->data, NULL); ++ events = g_slist_next(events); ++ } ++ g_slist_free(events); ++ ++ return what; ++} ++ ++static gint ++xfpm_manager_inhibit_sleep_systemd (XfpmManager *manager) ++{ ++ DBusConnection *bus_connection; ++ DBusMessage *message = NULL, *reply = NULL; ++ DBusError error; ++ gint fd = -1; ++ const char *what = g_strdup(xfpm_manager_get_systemd_events(manager)); ++ const char *who = "xfce4-power-manager"; ++ const char *why = "xfce4-power-manager handles these events"; ++ const char *mode = "block"; ++ ++ if (g_strcmp0(what, "") == 0) ++ return -1; ++ ++ XFPM_DEBUG ("Inhibiting systemd sleep: %s", what); ++ ++ bus_connection = dbus_g_connection_get_connection (manager->priv->system_bus); ++ if (!xfpm_dbus_name_has_owner (bus_connection, "org.freedesktop.login1")) ++ return -1; ++ ++ dbus_error_init (&error); ++ ++ message = dbus_message_new_method_call ("org.freedesktop.login1", ++ "/org/freedesktop/login1", ++ "org.freedesktop.login1.Manager", ++ "Inhibit"); ++ ++ if (!message) ++ { ++ g_warning ("Unable to call Inhibit()"); ++ goto done; ++ } ++ ++ ++ if (!dbus_message_append_args (message, ++ DBUS_TYPE_STRING, &what, ++ DBUS_TYPE_STRING, &who, ++ DBUS_TYPE_STRING, &why, ++ DBUS_TYPE_STRING, &mode, ++ DBUS_TYPE_INVALID)) ++ { ++ g_warning ("Unable to call Inhibit()"); ++ goto done; ++ } ++ ++ ++ reply = dbus_connection_send_with_reply_and_block (bus_connection, message, -1, &error); ++ if (!reply) ++ { ++ g_warning ("Unable to inhibit systemd sleep: %s", error.message); ++ goto done; ++ } ++ ++ if (!dbus_message_get_args (reply, &error, ++ DBUS_TYPE_UNIX_FD, &fd, ++ DBUS_TYPE_INVALID)) ++ { ++ g_warning ("Inhibit() reply parsing failed: %s", error.message); ++ } ++ ++done: ++ ++ if (message) ++ dbus_message_unref (message); ++ if (reply) ++ dbus_message_unref (reply); ++ dbus_error_free (&error); ++ ++ return fd; ++} ++ ++static void ++xfpm_manager_systemd_events_changed (XfpmManager *manager) ++{ ++ if (manager->priv->inhibit_fd >= 0) ++ close (manager->priv->inhibit_fd); ++ ++ if (manager->priv->system_bus) ++ manager->priv->inhibit_fd = xfpm_manager_inhibit_sleep_systemd (manager); ++} ++ + XfpmManager * + xfpm_manager_new (DBusGConnection *bus, const gchar *client_id) + { +@@ -528,6 +666,8 @@ + + void xfpm_manager_start (XfpmManager *manager) + { ++ GError *error = NULL; ++ + if ( !xfpm_manager_reserve_names (manager) ) + goto out; + +@@ -550,6 +690,17 @@ + manager->priv->disks = xfpm_disks_new (); + manager->priv->inhibit = xfpm_inhibit_new (); + manager->priv->idle = egg_idletime_new (); ++ ++ /* Don't allow systemd to handle power/suspend/hibernate buttons ++ * and lid-switch */ ++ manager->priv->system_bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); ++ if (manager->priv->system_bus) ++ manager->priv->inhibit_fd = xfpm_manager_inhibit_sleep_systemd (manager); ++ else ++ { ++ g_warning ("Unable connect to system bus: %s", error->message); ++ g_clear_error (&error); ++ } + + g_signal_connect (manager->priv->idle, "alarm-expired", + G_CALLBACK (xfpm_manager_alarm_timeout_cb), manager); +@@ -559,7 +710,19 @@ + + g_signal_connect_swapped (manager->priv->conf, "notify::" ON_BATTERY_INACTIVITY_TIMEOUT, + G_CALLBACK (xfpm_manager_set_idle_alarm_on_battery), manager); +- ++ ++ g_signal_connect_swapped (manager->priv->conf, "notify::" LOGIND_HANDLE_POWER_KEY, ++ G_CALLBACK (xfpm_manager_systemd_events_changed), manager); ++ ++ g_signal_connect_swapped (manager->priv->conf, "notify::" LOGIND_HANDLE_SUSPEND_KEY, ++ G_CALLBACK (xfpm_manager_systemd_events_changed), manager); ++ ++ g_signal_connect_swapped (manager->priv->conf, "notify::" LOGIND_HANDLE_HIBERNATE_KEY, ++ G_CALLBACK (xfpm_manager_systemd_events_changed), manager); ++ ++ g_signal_connect_swapped (manager->priv->conf, "notify::" LOGIND_HANDLE_LID_SWITCH, ++ G_CALLBACK (xfpm_manager_systemd_events_changed), manager); ++ + xfpm_manager_set_idle_alarm (manager); + + g_signal_connect (manager->priv->inhibit, "has-inhibit-changed", +--- a/src/xfpm-xfconf.c ++++ b/src/xfpm-xfconf.c +@@ -84,6 +84,10 @@ + PROP_SPIN_DOWN_DISK_ON_BATTERY, + PROP_SPIN_DOWN_DISK_ON_AC_TIMEOUT, + PROP_SPIN_DOWN_DISK_ON_BATTERY_TIMEOUT, ++ PROP_LOGIND_HANDLE_POWER_KEY, ++ PROP_LOGIND_HANDLE_SUSPEND_KEY, ++ PROP_LOGIND_HANDLE_HIBERNATE_KEY, ++ PROP_LOGIND_HANDLE_LID_SWITCH, + N_PROPERTIES + }; + +@@ -561,6 +565,46 @@ + 120, + G_PARAM_READWRITE)); + ++ /** ++ * XfpmXfconf::logind-handle-power-key ++ **/ ++ g_object_class_install_property (object_class, ++ PROP_LOGIND_HANDLE_POWER_KEY, ++ g_param_spec_boolean (LOGIND_HANDLE_POWER_KEY, ++ NULL, NULL, ++ TRUE, ++ G_PARAM_READWRITE)); ++ ++ /** ++ * XfpmXfconf::logind-handle-suspend-key ++ **/ ++ g_object_class_install_property (object_class, ++ PROP_LOGIND_HANDLE_SUSPEND_KEY, ++ g_param_spec_boolean (LOGIND_HANDLE_SUSPEND_KEY, ++ NULL, NULL, ++ TRUE, ++ G_PARAM_READWRITE)); ++ ++ /** ++ * XfpmXfconf::logind-handle-hibernate-key ++ **/ ++ g_object_class_install_property (object_class, ++ PROP_LOGIND_HANDLE_HIBERNATE_KEY, ++ g_param_spec_boolean (LOGIND_HANDLE_HIBERNATE_KEY, ++ NULL, NULL, ++ TRUE, ++ G_PARAM_READWRITE)); ++ ++ /** ++ * XfpmXfconf::logind-handle-lid-switch ++ **/ ++ g_object_class_install_property (object_class, ++ PROP_LOGIND_HANDLE_LID_SWITCH, ++ g_param_spec_boolean (LOGIND_HANDLE_LID_SWITCH, ++ NULL, NULL, ++ TRUE, ++ G_PARAM_READWRITE)); ++ + g_type_class_add_private (klass, sizeof (XfpmXfconfPrivate)); + } +