[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