[Xfce4-commits] [xfce/xfce4-power-manager] 01/02: Allow individual inhibition of systemd events

noreply at xfce.org noreply at xfce.org
Fri May 23 14:05:26 CEST 2014


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository xfce/xfce4-power-manager.

commit d2b0d617766f90b5aba2a4694abca99d32991ab6
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Thu May 22 21:41:28 2014 -0400

    Allow individual inhibition of systemd events
---
 src/xfpm-config.h  |    5 ++
 src/xfpm-main.c    |   86 +--------------------------
 src/xfpm-manager.c |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/xfpm-xfconf.c  |   44 ++++++++++++++
 4 files changed, 216 insertions(+), 84 deletions(-)

diff --git a/src/xfpm-config.h b/src/xfpm-config.h
index 7696826..1965384 100644
--- a/src/xfpm-config.h
+++ b/src/xfpm-config.h
@@ -83,6 +83,11 @@ G_BEGIN_DECLS
 #define         SPIN_DOWN_ON_BATTERY_TIMEOUT	"spin-down-on-battery-timeout"
 
 #define         NETWORK_MANAGER_SLEEP           "network-manager-sleep"
+
+#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 */
diff --git a/src/xfpm-main.c b/src/xfpm-main.c
index 24dacae..b9e6dc4 100644
--- a/src/xfpm-main.c
+++ b/src/xfpm-main.c
@@ -40,9 +40,12 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
+#include <xfconf/xfconf.h>
+
 #include "xfpm-dbus.h"
 #include "xfpm-debug.h"
 #include "xfpm-common.h"
+#include "xfpm-config.h"
 
 #include "xfce-power-manager-dbus-client.h"
 #include "xfpm-manager.h"
@@ -194,96 +197,16 @@ xfpm_dump_remote (DBusGConnection *bus)
     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,
@@ -319,9 +242,6 @@ xfpm_start (DBusGConnection *bus, const gchar *client_id, gboolean dump)
     
     g_object_unref (manager);
 
-    if (inhibit_fd >= 0)
-        close (inhibit_fd);
-
     exit (EXIT_SUCCESS);
 }
 
diff --git a/src/xfpm-manager.c b/src/xfpm-manager.c
index dd8e0c4..0a6e42f 100644
--- a/src/xfpm-manager.c
+++ b/src/xfpm-manager.c
@@ -76,6 +76,7 @@ static gboolean xfpm_manager_quit (XfpmManager *manager);
 struct XfpmManagerPrivate
 {
     DBusGConnection    *session_bus;
+    DBusGConnection    *system_bus;
 
     XfceSMClient       *client;
 
@@ -98,6 +99,8 @@ struct XfpmManagerPrivate
 
     gboolean	        inhibited;
     gboolean	        session_managed;
+
+    gint                inhibit_fd;
 };
 
 G_DEFINE_TYPE (XfpmManager, xfpm_manager, G_TYPE_OBJECT)
@@ -132,6 +135,9 @@ xfpm_manager_finalize (GObject *object)
     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);
@@ -174,6 +180,10 @@ xfpm_manager_quit (XfpmManager *manager)
     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 @@ static void
 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,
@@ -487,6 +507,124 @@ xfpm_manager_set_idle_alarm (XfpmManager *manager)
 
 }
 
+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)
 {
@@ -536,6 +674,8 @@ xfpm_manager_new (DBusGConnection *bus, const gchar *client_id)
 
 void xfpm_manager_start (XfpmManager *manager)
 {
+    GError *error = NULL;
+
     if ( !xfpm_manager_reserve_names (manager) )
 	goto out;
 
@@ -559,6 +699,17 @@ void xfpm_manager_start (XfpmManager *manager)
     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);
 
@@ -568,6 +719,18 @@ void xfpm_manager_start (XfpmManager *manager)
     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",
diff --git a/src/xfpm-xfconf.c b/src/xfpm-xfconf.c
index e7b1877..5558e30 100644
--- a/src/xfpm-xfconf.c
+++ b/src/xfpm-xfconf.c
@@ -87,6 +87,10 @@ enum
 #ifdef WITH_NETWORK_MANAGER
     PROP_NETWORK_MANAGER_SLEEP,
 #endif
+    PROP_LOGIND_HANDLE_POWER_KEY,
+    PROP_LOGIND_HANDLE_SUSPEND_KEY,
+    PROP_LOGIND_HANDLE_HIBERNATE_KEY,
+    PROP_LOGIND_HANDLE_LID_SWITCH,
     N_PROPERTIES
 };
 
@@ -576,6 +580,46 @@ xfpm_xfconf_class_init (XfpmXfconfClass *klass)
                                                            G_PARAM_READWRITE));
 #endif
 
+    /**
+     * 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));
 }
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list