From b1b2a1d0cc08449fb7cf3acf7c7c660fa54d819d Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Mon, 22 Jun 2015 07:43:28 +0300 Subject: [PATCH] Add a System handled option for the buttons (Bug #11992) The "System handled" option is added as an action for the power, sleep, and hibernate buttons. This is the same as do nothing for xfpm, but it also gives up any inhibits xfpm is holding so other programs may handle those button actions. --- common/xfpm-enum-glib.h | 12 ++------- common/xfpm-enum.h | 8 ------ settings/xfpm-settings.c | 20 ++++++++++++--- src/xfpm-manager.c | 65 +++++++++++++++++++++++++++++++++++++----------- src/xfpm-xfconf.c | 6 ++--- 5 files changed, 71 insertions(+), 40 deletions(-) diff --git a/common/xfpm-enum-glib.h b/common/xfpm-enum-glib.h index c7cfe3f..4f6937a 100644 --- a/common/xfpm-enum-glib.h +++ b/common/xfpm-enum-glib.h @@ -45,7 +45,8 @@ typedef enum XFPM_DO_SUSPEND, XFPM_DO_HIBERNATE, XFPM_ASK, - XFPM_DO_SHUTDOWN + XFPM_DO_SHUTDOWN, + XFPM_DO_SYSTEM_HANDLE } XfpmShutdownRequest; @@ -75,15 +76,6 @@ typedef enum } XfpmButtonKey; typedef enum - { - SPIN_DOWN_HDD_NEVER, - SPIN_DOWN_HDD_ON_BATTERY, - SPIN_DOWN_HDD_PLUGGED_IN, - SPIN_DOWN_HDD_ALWAYS - -} XfpmSpindownRequest; - -typedef enum { SHOW_ICON_ALWAYS, SHOW_ICON_WHEN_BATTERY_PRESENT, diff --git a/common/xfpm-enum.h b/common/xfpm-enum.h index 0146f6e..03ceb45 100644 --- a/common/xfpm-enum.h +++ b/common/xfpm-enum.h @@ -51,14 +51,6 @@ typedef enum } XfpmKeys; -typedef enum -{ - CPU_UNKNOWN = (1 << 0), - CPU_POWERSAVE = (1 << 1), - CPU_ONDEMAND = (1 << 2), - CPU_PERFORMANCE = (1 << 3) - -} XfpmCpuGovernor; G_END_DECLS diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c index a154775..7c4b448 100644 --- a/settings/xfpm-settings.c +++ b/settings/xfpm-settings.c @@ -938,7 +938,10 @@ xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_suspend, gtk_list_store_append(list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, XFPM_ASK, -1); - + + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("System handled"), 1, XFPM_DO_SYSTEM_HANDLE, -1); + val = xfconf_channel_get_uint (channel, PROPERTIES_PREFIX CRITICAL_BATT_ACTION_CFG, XFPM_DO_NOTHING); for ( valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter); @@ -1284,7 +1287,10 @@ xfpm_settings_general (XfconfChannel *channel, gboolean auth_suspend, gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, XFPM_ASK, -1); - + + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("System handled"), 1, XFPM_DO_SYSTEM_HANDLE, -1); + gtk_combo_box_set_active (GTK_COMBO_BOX (power), 0); value = xfconf_channel_get_uint (channel, PROPERTIES_PREFIX POWER_SWITCH_CFG, XFPM_DO_NOTHING); @@ -1335,7 +1341,10 @@ xfpm_settings_general (XfconfChannel *channel, gboolean auth_suspend, gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, XFPM_ASK, -1); - + + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("System handled"), 1, XFPM_DO_SYSTEM_HANDLE, -1); + value = xfconf_channel_get_uint (channel, PROPERTIES_PREFIX HIBERNATE_SWITCH_CFG, XFPM_DO_NOTHING); gtk_combo_box_set_active (GTK_COMBO_BOX (hibernate), 0); @@ -1387,7 +1396,10 @@ xfpm_settings_general (XfconfChannel *channel, gboolean auth_suspend, gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, XFPM_ASK, -1); - + + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("System handled"), 1, XFPM_DO_SYSTEM_HANDLE, -1); + gtk_combo_box_set_active (GTK_COMBO_BOX (sleep_w), 0); value = xfconf_channel_get_uint (channel, PROPERTIES_PREFIX SLEEP_SWITCH_CFG, XFPM_DO_NOTHING); diff --git a/src/xfpm-manager.c b/src/xfpm-manager.c index 5329392..2774468 100644 --- a/src/xfpm-manager.c +++ b/src/xfpm-manager.c @@ -335,6 +335,8 @@ xfpm_manager_sleep_request (XfpmManager *manager, XfpmShutdownRequest req, gbool { case XFPM_DO_NOTHING: break; + case XFPM_DO_SYSTEM_HANDLE: + break; case XFPM_DO_SUSPEND: xfpm_power_suspend (manager->priv->power, force); break; @@ -591,19 +593,26 @@ xfpm_manager_get_systemd_events(XfpmManager *manager) GSList *events = NULL; gchar *what = ""; gboolean logind_handle_power_key, logind_handle_suspend_key, logind_handle_hibernate_key, logind_handle_lid_switch; + XfpmShutdownRequest power_request, suspend_request, hibernate_request; g_object_get (G_OBJECT (manager->priv->conf), LOGIND_HANDLE_POWER_KEY, &logind_handle_power_key, LOGIND_HANDLE_SUSPEND_KEY, &logind_handle_suspend_key, LOGIND_HANDLE_HIBERNATE_KEY, &logind_handle_hibernate_key, LOGIND_HANDLE_LID_SWITCH, &logind_handle_lid_switch, + POWER_SWITCH_CFG, &power_request, + SLEEP_SWITCH_CFG, &suspend_request, + HIBERNATE_SWITCH_CFG, &hibernate_request, NULL); - if (!logind_handle_power_key) + XFPM_DEBUG ("Requests: power %d, suspend %d, hibernate %d", + power_request, suspend_request, hibernate_request); + + if (!logind_handle_power_key && power_request != XFPM_DO_SYSTEM_HANDLE) events = g_slist_append(events, "handle-power-key"); - if (!logind_handle_suspend_key) + if (!logind_handle_suspend_key && suspend_request != XFPM_DO_SYSTEM_HANDLE) events = g_slist_append(events, "handle-suspend-key"); - if (!logind_handle_hibernate_key) + if (!logind_handle_hibernate_key && hibernate_request != XFPM_DO_SYSTEM_HANDLE) events = g_slist_append(events, "handle-hibernate-key"); if (!logind_handle_lid_switch) events = g_slist_append(events, "handle-lid-switch"); @@ -633,23 +642,40 @@ xfpm_manager_inhibit_sleep_systemd (XfpmManager *manager) const char *who = "xfce4-power-manager"; const char *why = "xfce4-power-manager handles these events"; const char *mode = "block"; + const char *bus_name = NULL; + const char *object_path = NULL; + const char *interface_name = NULL; if (g_strcmp0(what, "") == 0) return -1; - if (!(LOGIND_RUNNING())) - return -1; - - XFPM_DEBUG ("Inhibiting systemd sleep: %s", what); + XFPM_DEBUG ("Inhibiting: %s", what); bus_connection = manager->priv->system_bus; - if (!xfpm_dbus_name_has_owner (bus_connection, "org.freedesktop.login1")) - return -1; + + if (LOGIND_RUNNING()) + { + if (!xfpm_dbus_name_has_owner (bus_connection, "org.freedesktop.login1")) + return -1; + + bus_name = "org.freedesktop.login1"; + object_path = "/org/freedesktop/login1"; + interface_name = "org.freedesktop.login1.Manager"; + } + else + { + if (!xfpm_dbus_name_has_owner (bus_connection, "org.freedesktop.ConsoleKit")) + return -1; + + bus_name = "org.freedesktop.ConsoleKit"; + object_path = "/org/freedesktop/ConsoleKit/Manager"; + interface_name = "org.freedesktop.ConsoleKit.Manager"; + } reply = g_dbus_connection_call_with_unix_fd_list_sync (bus_connection, - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", + bus_name, + object_path, + interface_name, "Inhibit", g_variant_new ("(ssss)", what, who, why, mode), @@ -663,8 +689,8 @@ xfpm_manager_inhibit_sleep_systemd (XfpmManager *manager) if (!reply) { - g_warning ("Unable to inhibit systemd sleep: %s", error->message); - g_error_free (error); + XFPM_DEBUG ("Unable to inhibit: %s", error->message); + g_clear_error (&error); return -1; } @@ -678,7 +704,7 @@ xfpm_manager_inhibit_sleep_systemd (XfpmManager *manager) g_object_unref (fd_list); - g_error_free (error); + g_clear_error (&error); g_free (what); @@ -887,6 +913,15 @@ void xfpm_manager_start (XfpmManager *manager) g_signal_connect_swapped (manager->priv->conf, "notify::" LOGIND_HANDLE_LID_SWITCH, G_CALLBACK (xfpm_manager_systemd_events_changed), manager); + g_signal_connect_swapped (manager->priv->conf, "notify::" POWER_SWITCH_CFG, + G_CALLBACK (xfpm_manager_systemd_events_changed), manager); + + g_signal_connect_swapped (manager->priv->conf, "notify::" HIBERNATE_SWITCH_CFG, + G_CALLBACK (xfpm_manager_systemd_events_changed), manager); + + g_signal_connect_swapped (manager->priv->conf, "notify::" SLEEP_SWITCH_CFG, + 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 721d977..05b6165 100644 --- a/src/xfpm-xfconf.c +++ b/src/xfpm-xfconf.c @@ -320,7 +320,7 @@ xfpm_xfconf_class_init (XfpmXfconfClass *klass) g_param_spec_uint (POWER_SWITCH_CFG, NULL, NULL, XFPM_DO_NOTHING, - XFPM_DO_SHUTDOWN, + XFPM_DO_SYSTEM_HANDLE, XFPM_DO_NOTHING, G_PARAM_READWRITE)); @@ -332,7 +332,7 @@ xfpm_xfconf_class_init (XfpmXfconfClass *klass) g_param_spec_uint (SLEEP_SWITCH_CFG, NULL, NULL, XFPM_DO_NOTHING, - XFPM_DO_SHUTDOWN, + XFPM_DO_SYSTEM_HANDLE, XFPM_DO_NOTHING, G_PARAM_READWRITE)); @@ -344,7 +344,7 @@ xfpm_xfconf_class_init (XfpmXfconfClass *klass) g_param_spec_uint (HIBERNATE_SWITCH_CFG, NULL, NULL, XFPM_DO_NOTHING, - XFPM_DO_SHUTDOWN, + XFPM_DO_SYSTEM_HANDLE, XFPM_DO_NOTHING, G_PARAM_READWRITE)); -- 2.4.4