summaryrefslogtreecommitdiff
path: root/extra/gnome-settings-daemon
diff options
context:
space:
mode:
authorroot <root@rshg054.dnsready.net>2013-04-23 01:16:16 -0700
committerroot <root@rshg054.dnsready.net>2013-04-23 01:16:16 -0700
commitd1d93fafb9ef98fdd0c9a5a486c179c03cbbfb33 (patch)
treeda594e49962aa1b32a81dd8066423c4fd5fdcec6 /extra/gnome-settings-daemon
parenta5f6ca5d4e1aa12dfec53c3061df6e0198126fb4 (diff)
Tue Apr 23 01:16:16 PDT 2013
Diffstat (limited to 'extra/gnome-settings-daemon')
-rw-r--r--extra/gnome-settings-daemon/0001-power-and-media-keys-Use-logind-for-suspending-and-r.patch1476
-rw-r--r--extra/gnome-settings-daemon/PKGBUILD30
2 files changed, 7 insertions, 1499 deletions
diff --git a/extra/gnome-settings-daemon/0001-power-and-media-keys-Use-logind-for-suspending-and-r.patch b/extra/gnome-settings-daemon/0001-power-and-media-keys-Use-logind-for-suspending-and-r.patch
deleted file mode 100644
index eb77bada2..000000000
--- a/extra/gnome-settings-daemon/0001-power-and-media-keys-Use-logind-for-suspending-and-r.patch
+++ /dev/null
@@ -1,1476 +0,0 @@
-From f418ff2cd04b233dbffc1129e856630d8c96cd07 Mon Sep 17 00:00:00 2001
-From: Richard Hughes <richard@hughsie.com>
-Date: Fri, 21 Sep 2012 11:56:53 +0100
-Subject: [PATCH] power and media-keys: Use logind for suspending and
- rebooting the system
-
-Use the new logind features to suspend and resume but making sure we opt out
-of logind handling the sleep and power keys, and also inhibiting for lid close
-auto-suspend if there is an external monitor connected.
-
-Also use a delay inihibit for logind so that we can do actions on suspend like
-blanking the screen using the screensaver and also poking the screensaver on
-resume.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=680689
-
-Conflicts:
- plugins/power/gsd-power-manager.c
----
- plugins/common/Makefile.am | 4 +-
- plugins/common/gsd-power-helper.c | 203 --------
- plugins/common/gsd-power-helper.h | 35 --
- plugins/media-keys/gsd-media-keys-manager.c | 156 +++++--
- plugins/power/gsd-power-manager.c | 697 +++++++++++++++++++---------
- 5 files changed, 594 insertions(+), 501 deletions(-)
- delete mode 100644 plugins/common/gsd-power-helper.c
- delete mode 100644 plugins/common/gsd-power-helper.h
-
-diff --git a/plugins/common/Makefile.am b/plugins/common/Makefile.am
-index 7e50db4..b0e907c 100644
---- a/plugins/common/Makefile.am
-+++ b/plugins/common/Makefile.am
-@@ -6,9 +6,7 @@ libcommon_la_SOURCES = \
- gsd-keygrab.c \
- gsd-keygrab.h \
- gsd-input-helper.c \
-- gsd-input-helper.h \
-- gsd-power-helper.c \
-- gsd-power-helper.h
-+ gsd-input-helper.h
-
- libcommon_la_CPPFLAGS = \
- $(AM_CPPFLAGS)
-diff --git a/plugins/common/gsd-power-helper.c b/plugins/common/gsd-power-helper.c
-deleted file mode 100644
-index 27d0eda..0000000
---- a/plugins/common/gsd-power-helper.c
-+++ /dev/null
-@@ -1,203 +0,0 @@
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2012 Bastien Nocera <hadess@hadess.net>
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- *
-- */
--
--#include "config.h"
--
--#include "gsd-power-helper.h"
--
--#define SYSTEMD_DBUS_NAME "org.freedesktop.login1"
--#define SYSTEMD_DBUS_PATH "/org/freedesktop/login1"
--#define SYSTEMD_DBUS_INTERFACE "org.freedesktop.login1.Manager"
--
--#define CONSOLEKIT_DBUS_NAME "org.freedesktop.ConsoleKit"
--#define CONSOLEKIT_DBUS_PATH_MANAGER "/org/freedesktop/ConsoleKit/Manager"
--#define CONSOLEKIT_DBUS_INTERFACE_MANAGER "org.freedesktop.ConsoleKit.Manager"
--
--#ifdef HAVE_SYSTEMD
--static void
--systemd_stop (void)
--{
-- GDBusConnection *bus;
--
-- bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
-- g_dbus_connection_call (bus,
-- SYSTEMD_DBUS_NAME,
-- SYSTEMD_DBUS_PATH,
-- SYSTEMD_DBUS_INTERFACE,
-- "PowerOff",
-- g_variant_new ("(b)", FALSE),
-- NULL, 0, G_MAXINT, NULL, NULL, NULL);
-- g_object_unref (bus);
--}
--
--static void
--systemd_suspend (void)
--{
-- GDBusConnection *bus;
--
-- bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
-- g_dbus_connection_call (bus,
-- SYSTEMD_DBUS_NAME,
-- SYSTEMD_DBUS_PATH,
-- SYSTEMD_DBUS_INTERFACE,
-- "Suspend",
-- g_variant_new ("(b)", TRUE),
-- NULL, 0, G_MAXINT, NULL, NULL, NULL);
-- g_object_unref (bus);
--}
--
--static void
--systemd_hibernate (void)
--{
-- GDBusConnection *bus;
--
-- bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
-- g_dbus_connection_call (bus,
-- SYSTEMD_DBUS_NAME,
-- SYSTEMD_DBUS_PATH,
-- SYSTEMD_DBUS_INTERFACE,
-- "Hibernate",
-- g_variant_new ("(b)", TRUE),
-- NULL, 0, G_MAXINT, NULL, NULL, NULL);
-- g_object_unref (bus);
--}
--
--#else /* HAVE_SYSTEMD */
--
--static void
--consolekit_stop_cb (GObject *source_object,
-- GAsyncResult *res,
-- gpointer user_data)
--{
-- GVariant *result;
-- GError *error = NULL;
--
-- result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object),
-- res,
-- &error);
-- if (result == NULL) {
-- g_warning ("couldn't stop using ConsoleKit: %s",
-- error->message);
-- g_error_free (error);
-- } else {
-- g_variant_unref (result);
-- }
--}
--
--static void
--consolekit_stop (void)
--{
-- GError *error = NULL;
-- GDBusProxy *proxy;
--
-- /* power down the machine in a safe way */
-- proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
-- NULL,
-- CONSOLEKIT_DBUS_NAME,
-- CONSOLEKIT_DBUS_PATH_MANAGER,
-- CONSOLEKIT_DBUS_INTERFACE_MANAGER,
-- NULL, &error);
-- if (proxy == NULL) {
-- g_warning ("cannot connect to ConsoleKit: %s",
-- error->message);
-- g_error_free (error);
-- return;
-- }
-- g_dbus_proxy_call (proxy,
-- "Stop",
-- NULL,
-- G_DBUS_CALL_FLAGS_NONE,
-- -1, NULL,
-- consolekit_stop_cb, NULL);
-- g_object_unref (proxy);
--}
--static void
--upower_sleep_cb (GObject *source_object,
-- GAsyncResult *res,
-- gpointer user_data)
--{
-- GVariant *result;
-- GError *error = NULL;
--
-- result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object),
-- res,
-- &error);
-- if (result == NULL) {
-- g_warning ("couldn't sleep using UPower: %s",
-- error->message);
-- g_error_free (error);
-- } else {
-- g_variant_unref (result);
-- }
--}
--
--static void
--upower_suspend (GDBusProxy *upower_proxy)
--{
-- g_dbus_proxy_call (upower_proxy,
-- "Suspend",
-- NULL,
-- G_DBUS_CALL_FLAGS_NONE,
-- -1, NULL,
-- upower_sleep_cb, NULL);
--}
--
--static void
--upower_hibernate (GDBusProxy *upower_proxy)
--{
-- g_dbus_proxy_call (upower_proxy,
-- "Hibernate",
-- NULL,
-- G_DBUS_CALL_FLAGS_NONE,
-- -1, NULL,
-- upower_sleep_cb, NULL);
--}
--#endif /* HAVE_SYSTEMD */
--
--void
--gsd_power_suspend (GDBusProxy *upower_proxy)
--{
--#ifdef HAVE_SYSTEMD
-- systemd_suspend ();
--#else
-- upower_suspend (upower_proxy);
--#endif
--}
--
--void
--gsd_power_poweroff (void)
--{
--#ifdef HAVE_SYSTEMD
-- systemd_stop ();
--#else
-- consolekit_stop ();
--#endif
--}
--
--void
--gsd_power_hibernate (GDBusProxy *upower_proxy)
--{
--#ifdef HAVE_SYSTEMD
-- systemd_hibernate ();
--#else
-- upower_hibernate (upower_proxy);
--#endif
--}
-diff --git a/plugins/common/gsd-power-helper.h b/plugins/common/gsd-power-helper.h
-deleted file mode 100644
-index e3be14f..0000000
---- a/plugins/common/gsd-power-helper.h
-+++ /dev/null
-@@ -1,35 +0,0 @@
--/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-- *
-- * Copyright (C) 2012 Bastien Nocera <hadess@hadess.net>
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-- */
--
--#ifndef __GSD_POWER_HELPER_H
--#define __GSD_POWER_HELPER_H
--
--#include <glib.h>
--
--G_BEGIN_DECLS
--
--#include <gio/gio.h>
--
--void gsd_power_suspend (GDBusProxy *upower_proxy);
--void gsd_power_hibernate (GDBusProxy *upower_proxy);
--void gsd_power_poweroff (void);
--
--G_END_DECLS
--
--#endif /* __GSD_POWER_HELPER_H */
-diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
-index 9c84d7f..a2f277e 100644
---- a/plugins/media-keys/gsd-media-keys-manager.c
-+++ b/plugins/media-keys/gsd-media-keys-manager.c
-@@ -39,6 +39,7 @@
- #include <gdk/gdkx.h>
- #include <gtk/gtk.h>
- #include <gio/gdesktopappinfo.h>
-+#include <gio/gunixfdlist.h>
-
- #ifdef HAVE_GUDEV
- #include <gudev/gudev.h>
-@@ -51,7 +52,6 @@
- #include "shortcuts-list.h"
- #include "gsd-osd-window.h"
- #include "gsd-input-helper.h"
--#include "gsd-power-helper.h"
- #include "gsd-enums.h"
-
- #include <canberra.h>
-@@ -105,6 +105,10 @@ static const gchar introspection_xml[] =
- #define KEY_CURRENT_INPUT_SOURCE "current"
- #define KEY_INPUT_SOURCES "sources"
-
-+#define SYSTEMD_DBUS_NAME "org.freedesktop.login1"
-+#define SYSTEMD_DBUS_PATH "/org/freedesktop/login1"
-+#define SYSTEMD_DBUS_INTERFACE "org.freedesktop.login1.Manager"
-+
- #define GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_MEDIA_KEYS_MANAGER, GsdMediaKeysManagerPrivate))
-
- typedef struct {
-@@ -148,10 +152,13 @@ struct GsdMediaKeysManagerPrivate
-
- /* Power stuff */
- GSettings *power_settings;
-- GDBusProxy *upower_proxy;
- GDBusProxy *power_screen_proxy;
- GDBusProxy *power_keyboard_proxy;
-
-+ /* systemd stuff */
-+ GDBusProxy *logind_proxy;
-+ gint inhibit_keys_fd;
-+
- /* Multihead stuff */
- GdkScreen *current_screen;
- GSList *screens;
-@@ -1618,6 +1625,38 @@ do_toggle_contrast_action (GsdMediaKeysManager *manager)
- }
-
- static void
-+power_action_suspend (GsdMediaKeysManager *manager)
-+{
-+#ifndef HAVE_SYSTEMD
-+ g_warning ("no systemd support");
-+ return;
-+#endif
-+ g_dbus_proxy_call (manager->priv->logind_proxy,
-+ "Suspend",
-+ g_variant_new ("(b)", TRUE),
-+ G_DBUS_CALL_FLAGS_NONE,
-+ G_MAXINT,
-+ manager->priv->bus_cancellable,
-+ NULL, NULL);
-+}
-+
-+static void
-+power_action_hibernate (GsdMediaKeysManager *manager)
-+{
-+#ifndef HAVE_SYSTEMD
-+ g_warning ("no systemd support");
-+ return;
-+#endif
-+ g_dbus_proxy_call (manager->priv->logind_proxy,
-+ "Hibernate",
-+ g_variant_new ("(b)", TRUE),
-+ G_DBUS_CALL_FLAGS_NONE,
-+ G_MAXINT,
-+ manager->priv->bus_cancellable,
-+ NULL, NULL);
-+}
-+
-+static void
- do_config_power_action (GsdMediaKeysManager *manager,
- const gchar *config_key)
- {
-@@ -1627,14 +1666,14 @@ do_config_power_action (GsdMediaKeysManager *manager,
- config_key);
- switch (action_type) {
- case GSD_POWER_ACTION_SUSPEND:
-- gsd_power_suspend (manager->priv->upower_proxy);
-+ power_action_suspend (manager);
- break;
- case GSD_POWER_ACTION_INTERACTIVE:
- case GSD_POWER_ACTION_SHUTDOWN:
- gnome_session_shutdown (manager);
- break;
- case GSD_POWER_ACTION_HIBERNATE:
-- gsd_power_hibernate (manager->priv->upower_proxy);
-+ power_action_hibernate (manager);
- break;
- case GSD_POWER_ACTION_BLANK:
- case GSD_POWER_ACTION_NOTHING:
-@@ -2248,6 +2287,7 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
- }
- #endif /* HAVE_GUDEV */
-
-+ g_clear_object (&priv->logind_proxy);
- if (priv->settings) {
- g_object_unref (priv->settings);
- priv->settings = NULL;
-@@ -2268,11 +2308,6 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
- priv->power_keyboard_proxy = NULL;
- }
-
-- if (priv->upower_proxy) {
-- g_object_unref (priv->upower_proxy);
-- priv->upower_proxy = NULL;
-- }
--
- if (priv->cancellable != NULL) {
- g_cancellable_cancel (priv->cancellable);
- g_object_unref (priv->cancellable);
-@@ -2363,9 +2398,85 @@ gsd_media_keys_manager_class_init (GsdMediaKeysManagerClass *klass)
- }
-
- static void
-+inhibit_done (GObject *source,
-+ GAsyncResult *result,
-+ gpointer user_data)
-+{
-+ GDBusProxy *proxy = G_DBUS_PROXY (source);
-+ GsdMediaKeysManager *manager = GSD_MEDIA_KEYS_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 keypresses: %s", error->message);
-+ g_error_free (error);
-+ } else {
-+ g_variant_get (res, "(h)", &idx);
-+ manager->priv->inhibit_keys_fd = g_unix_fd_list_get (fd_list, idx, &error);
-+ if (manager->priv->inhibit_keys_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_keys_fd);
-+ g_object_unref (fd_list);
-+ g_variant_unref (res);
-+ }
-+}
-+
-+static void
- gsd_media_keys_manager_init (GsdMediaKeysManager *manager)
- {
-+ GError *error;
-+ GDBusConnection *bus;
-+
-+ error = NULL;
- manager->priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager);
-+
-+ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
-+ if (bus == NULL) {
-+ g_warning ("Failed to connect to system bus: %s",
-+ error->message);
-+ g_error_free (error);
-+ return;
-+ }
-+
-+ manager->priv->logind_proxy =
-+ g_dbus_proxy_new_sync (bus,
-+ 0,
-+ NULL,
-+ SYSTEMD_DBUS_NAME,
-+ SYSTEMD_DBUS_PATH,
-+ SYSTEMD_DBUS_INTERFACE,
-+ NULL,
-+ &error);
-+
-+ if (manager->priv->logind_proxy == NULL) {
-+ g_warning ("Failed to connect to systemd: %s",
-+ error->message);
-+ g_error_free (error);
-+ }
-+
-+ g_object_unref (bus);
-+
-+ g_debug ("Adding system inhibitors for power keys");
-+ manager->priv->inhibit_keys_fd = -1;
-+ g_dbus_proxy_call_with_unix_fd_list (manager->priv->logind_proxy,
-+ "Inhibit",
-+ g_variant_new ("(ssss)",
-+ "handle-power-key:handle-suspend-key:handle-hibernate-key",
-+ g_get_user_name (),
-+ "GNOME handling keypresses",
-+ "block"),
-+ 0,
-+ G_MAXINT,
-+ NULL,
-+ NULL,
-+ inhibit_done,
-+ manager);
-+
- }
-
- static void
-@@ -2382,6 +2493,8 @@ gsd_media_keys_manager_finalize (GObject *object)
-
- if (media_keys_manager->priv->start_idle_id != 0)
- g_source_remove (media_keys_manager->priv->start_idle_id);
-+ if (media_keys_manager->priv->inhibit_keys_fd != -1)
-+ close (media_keys_manager->priv->inhibit_keys_fd);
-
- G_OBJECT_CLASS (gsd_media_keys_manager_parent_class)->finalize (object);
- }
-@@ -2401,21 +2514,6 @@ xrandr_ready_cb (GObject *source_object,
- }
-
- static void
--upower_ready_cb (GObject *source_object,
-- GAsyncResult *res,
-- GsdMediaKeysManager *manager)
--{
-- GError *error = NULL;
--
-- manager->priv->upower_proxy = g_dbus_proxy_new_finish (res, &error);
-- if (manager->priv->upower_proxy == NULL) {
-- g_warning ("Failed to get proxy for upower: %s",
-- error->message);
-- g_error_free (error);
-- }
--}
--
--static void
- power_screen_ready_cb (GObject *source_object,
- GAsyncResult *res,
- GsdMediaKeysManager *manager)
-@@ -2517,16 +2615,6 @@ register_manager (GsdMediaKeysManager *manager)
- manager->priv->bus_cancellable,
- (GAsyncReadyCallback) on_bus_gotten,
- manager);
--
-- g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
-- G_DBUS_PROXY_FLAGS_NONE,
-- NULL,
-- "org.freedesktop.UPower",
-- "/org/freedesktop/UPower",
-- "org.freedesktop.UPower",
-- NULL,
-- (GAsyncReadyCallback) upower_ready_cb,
-- manager);
- }
-
- GsdMediaKeysManager *
-diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
-index 1c594d8..bb7224c 100644
---- a/plugins/power/gsd-power-manager.c
-+++ b/plugins/power/gsd-power-manager.c
-@@ -1,7 +1,7 @@
- /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
-- * Copyright (C) 2011 Richard Hughes <richard@hughsie.com>
-+ * Copyright (C) 2011-2012 Richard Hughes <richard@hughsie.com>
- * Copyright (C) 2011 Ritesh Khadgaray <khadgaray@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
-@@ -32,6 +32,7 @@
- #include <libupower-glib/upower.h>
- #include <libnotify/notify.h>
- #include <canberra-gtk.h>
-+#include <gio/gunixfdlist.h>
-
- #define GNOME_DESKTOP_USE_UNSTABLE_API
- #include <libgnome-desktop/gnome-rr.h>
-@@ -43,7 +44,6 @@
- #include "gnome-settings-session.h"
- #include "gsd-enums.h"
- #include "gsd-power-manager.h"
--#include "gsd-power-helper.h"
-
- #define GNOME_SESSION_DBUS_NAME "org.gnome.SessionManager"
- #define GNOME_SESSION_DBUS_PATH "/org/gnome/SessionManager"
-@@ -78,6 +78,10 @@
- #define GSD_POWER_MANAGER_RECALL_DELAY 30 /* seconds */
- #define GSD_POWER_MANAGER_LID_CLOSE_SAFETY_TIMEOUT 30 /* seconds */
-
-+#define SYSTEMD_DBUS_NAME "org.freedesktop.login1"
-+#define SYSTEMD_DBUS_PATH "/org/freedesktop/login1"
-+#define SYSTEMD_DBUS_INTERFACE "org.freedesktop.login1.Manager"
-+
- /* Keep this in sync with gnome-shell */
- #define SCREENSAVER_FADE_TIME 10 /* seconds */
-
-@@ -193,15 +197,21 @@ struct GsdPowerManagerPrivate
- ca_context *canberra_context;
- ca_proplist *critical_alert_loop_props;
- guint32 critical_alert_timeout_id;
-- GDBusProxy *screensaver_proxy;
- GDBusProxy *session_proxy;
- GDBusProxy *session_presence_proxy;
- GpmIdletime *idletime;
- GsdPowerIdleMode current_idle_mode;
-- guint lid_close_safety_timer_id;
- 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;
-+ gint inhibit_suspend_fd;
-+ gboolean inhibit_suspend_taken;
-+ guint inhibit_lid_switch_timer_id;
- };
-
- enum {
-@@ -218,8 +228,8 @@ static GIcon *engine_get_icon (GsdPowerManager *manager);
- static gchar *engine_get_summary (GsdPowerManager *manager);
- static void do_power_action_type (GsdPowerManager *manager, GsdPowerActionType action_type);
- static void do_lid_closed_action (GsdPowerManager *manager);
--static void lock_screensaver (GsdPowerManager *manager);
--static void kill_lid_close_safety_timer (GsdPowerManager *manager);
-+static void uninhibit_lid_switch (GsdPowerManager *manager);
-+static gboolean external_monitor_is_connected (GnomeRRScreen *screen);
-
- G_DEFINE_TYPE (GsdPowerManager, gsd_power_manager, G_TYPE_OBJECT)
-
-@@ -2049,6 +2059,57 @@ gnome_session_shutdown (void)
- }
-
- static void
-+action_poweroff (GsdPowerManager *manager)
-+{
-+ if (manager->priv->logind_proxy == NULL) {
-+ g_warning ("no systemd support");
-+ return;
-+ }
-+ g_dbus_proxy_call (manager->priv->logind_proxy,
-+ "PowerOff",
-+ g_variant_new ("(b)", FALSE),
-+ G_DBUS_CALL_FLAGS_NONE,
-+ G_MAXINT,
-+ NULL,
-+ NULL,
-+ NULL);
-+}
-+
-+static void
-+action_suspend (GsdPowerManager *manager)
-+{
-+ if (manager->priv->logind_proxy == NULL) {
-+ g_warning ("no systemd support");
-+ return;
-+ }
-+ g_dbus_proxy_call (manager->priv->logind_proxy,
-+ "Suspend",
-+ g_variant_new ("(b)", FALSE),
-+ G_DBUS_CALL_FLAGS_NONE,
-+ G_MAXINT,
-+ NULL,
-+ NULL,
-+ NULL);
-+}
-+
-+static void
-+action_hibernate (GsdPowerManager *manager)
-+{
-+ if (manager->priv->logind_proxy == NULL) {
-+ g_warning ("no systemd support");
-+ return;
-+ }
-+ g_dbus_proxy_call (manager->priv->logind_proxy,
-+ "Hibernate",
-+ g_variant_new ("(b)", FALSE),
-+ G_DBUS_CALL_FLAGS_NONE,
-+ G_MAXINT,
-+ NULL,
-+ NULL,
-+ NULL);
-+}
-+
-+static void
- do_power_action_type (GsdPowerManager *manager,
- GsdPowerActionType action_type)
- {
-@@ -2057,19 +2118,19 @@ do_power_action_type (GsdPowerManager *manager,
-
- switch (action_type) {
- case GSD_POWER_ACTION_SUSPEND:
-- gsd_power_suspend (manager->priv->upower_proxy);
-+ action_suspend (manager);
- break;
- case GSD_POWER_ACTION_INTERACTIVE:
- gnome_session_shutdown ();
- break;
- case GSD_POWER_ACTION_HIBERNATE:
-- gsd_power_hibernate (manager->priv->upower_proxy);
-+ action_hibernate (manager);
- break;
- case GSD_POWER_ACTION_SHUTDOWN:
- /* this is only used on critically low battery where
- * hibernate is not available and is marginally better
- * than just powering down the computer mid-write */
-- gsd_power_poweroff ();
-+ action_poweroff (manager);
- break;
- case GSD_POWER_ACTION_BLANK:
- ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
-@@ -2141,85 +2202,20 @@ upower_kbd_toggle (GsdPowerManager *manager,
- return ret;
- }
-
--static void
--do_lid_open_action (GsdPowerManager *manager)
--{
-- gboolean ret;
-- GError *error = NULL;
--
-- /* play a sound, using sounds from the naming spec */
-- ca_context_play (manager->priv->canberra_context, 0,
-- CA_PROP_EVENT_ID, "lid-open",
-- /* TRANSLATORS: this is the sound description */
-- CA_PROP_EVENT_DESCRIPTION, _("Lid has been opened"),
-- NULL);
--
-- /* ensure we turn the panel back on after lid open */
-- ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
-- GNOME_RR_DPMS_ON,
-- &error);
-- if (!ret) {
-- g_warning ("failed to turn the panel on after lid open: %s",
-- error->message);
-- g_clear_error (&error);
-- }
--
-- /* only toggle keyboard if present and already toggled off */
-- if (manager->priv->upower_kdb_proxy != NULL &&
-- manager->priv->kbd_brightness_old != -1) {
-- ret = upower_kbd_toggle (manager, &error);
-- if (!ret) {
-- g_warning ("failed to turn the kbd backlight on: %s",
-- error->message);
-- g_error_free (error);
-- }
-- }
--
-- kill_lid_close_safety_timer (manager);
--}
--
- static gboolean
--is_on (GnomeRROutput *output)
-+inhibit_lid_switch_timer_cb (GsdPowerManager *manager)
- {
-- GnomeRRCrtc *crtc;
--
-- crtc = gnome_rr_output_get_crtc (output);
-- if (!crtc)
-- return FALSE;
-- return gnome_rr_crtc_get_current_mode (crtc) != NULL;
--}
--
--static gboolean
--non_laptop_outputs_are_all_off (GnomeRRScreen *screen)
--{
-- GnomeRROutput **outputs;
-- int i;
--
-- outputs = gnome_rr_screen_list_outputs (screen);
-- for (i = 0; outputs[i] != NULL; i++) {
-- if (gnome_rr_output_is_laptop (outputs[i]))
-- continue;
--
-- if (is_on (outputs[i]))
-- return FALSE;
-+ if (!external_monitor_is_connected (manager->priv->x11_screen) ||
-+ g_settings_get_boolean (manager->priv->settings,
-+ "lid-close-suspend-with-external-monitor")) {
-+ g_debug ("no external monitors for a while; uninhibiting lid close");
-+ uninhibit_lid_switch (manager);
-+ manager->priv->inhibit_lid_switch_timer_id = 0;
-+ return G_SOURCE_REMOVE;
- }
-
-- return TRUE;
--}
--
--/* Timeout callback used to check conditions when the laptop's lid is closed but
-- * the machine is not suspended yet. We try to suspend again, so that the laptop
-- * won't overheat if placed in a backpack.
-- */
--static gboolean
--lid_close_safety_timer_cb (GsdPowerManager *manager)
--{
-- manager->priv->lid_close_safety_timer_id = 0;
--
-- g_debug ("lid has been closed for a while; trying to suspend again");
-- do_lid_closed_action (manager);
--
-- return FALSE;
-+ g_debug ("external monitor still there; trying again later");
-+ return G_SOURCE_CONTINUE;
- }
-
- /* Sets up a timer to be triggered some seconds after closing the laptop lid
-@@ -2227,82 +2223,73 @@ lid_close_safety_timer_cb (GsdPowerManager *manager)
- * again in the timeout handler to see if we can suspend then.
- */
- static void
--setup_lid_close_safety_timer (GsdPowerManager *manager)
-+setup_inhibit_lid_switch_timer (GsdPowerManager *manager)
- {
-- if (manager->priv->lid_close_safety_timer_id != 0)
-+ if (manager->priv->inhibit_lid_switch_timer_id != 0) {
-+ g_debug ("lid close safety timer already set up");
- return;
-+ }
-+
-+ g_debug ("setting up lid close safety timer");
-
-- manager->priv->lid_close_safety_timer_id = g_timeout_add_seconds (GSD_POWER_MANAGER_LID_CLOSE_SAFETY_TIMEOUT,
-- (GSourceFunc) lid_close_safety_timer_cb,
-+ manager->priv->inhibit_lid_switch_timer_id = g_timeout_add_seconds (GSD_POWER_MANAGER_LID_CLOSE_SAFETY_TIMEOUT,
-+ (GSourceFunc) inhibit_lid_switch_timer_cb,
- manager);
-- g_source_set_name_by_id (manager->priv->lid_close_safety_timer_id, "[GsdPowerManager] lid close safety timer");
-+ g_source_set_name_by_id (manager->priv->inhibit_lid_switch_timer_id, "[GsdPowerManager] lid close safety timer");
- }
-
- static void
--kill_lid_close_safety_timer (GsdPowerManager *manager)
-+restart_inhibit_lid_switch_timer (GsdPowerManager *manager)
- {
-- if (manager->priv->lid_close_safety_timer_id != 0) {
-- g_source_remove (manager->priv->lid_close_safety_timer_id);
-- manager->priv->lid_close_safety_timer_id = 0;
-+ if (manager->priv->inhibit_lid_switch_timer_id != 0) {
-+ g_debug ("restarting lid close safety timer");
-+ g_source_remove (manager->priv->inhibit_lid_switch_timer_id);
-+ manager->priv->inhibit_lid_switch_timer_id = 0;
-+ setup_inhibit_lid_switch_timer (manager);
- }
- }
-
- static void
--suspend_with_lid_closed (GsdPowerManager *manager)
-+do_lid_open_action (GsdPowerManager *manager)
- {
- gboolean ret;
- GError *error = NULL;
-- GsdPowerActionType action_type;
-
-- /* maybe lock the screen if the lid is closed */
-- lock_screensaver (manager);
--
-- /* we have different settings depending on AC state */
-- if (up_client_get_on_battery (manager->priv->up_client)) {
-- action_type = g_settings_get_enum (manager->priv->settings,
-- "lid-close-battery-action");
-- } else {
-- action_type = g_settings_get_enum (manager->priv->settings,
-- "lid-close-ac-action");
-- }
--
-- /* check we won't melt when the lid is closed */
-- if (action_type != GSD_POWER_ACTION_SUSPEND &&
-- action_type != GSD_POWER_ACTION_HIBERNATE) {
-- if (up_client_get_lid_force_sleep (manager->priv->up_client)) {
-- g_warning ("to prevent damage, now forcing suspend");
-- do_power_action_type (manager, GSD_POWER_ACTION_SUSPEND);
-- return;
-- }
-- }
-+ /* play a sound, using sounds from the naming spec */
-+ ca_context_play (manager->priv->canberra_context, 0,
-+ CA_PROP_EVENT_ID, "lid-open",
-+ /* TRANSLATORS: this is the sound description */
-+ CA_PROP_EVENT_DESCRIPTION, _("Lid has been opened"),
-+ NULL);
-
-- /* ensure we turn the panel back on after resume */
-+ /* ensure we turn the panel back on after lid open */
- ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
-- GNOME_RR_DPMS_OFF,
-+ GNOME_RR_DPMS_ON,
- &error);
- if (!ret) {
-- g_warning ("failed to turn the panel off after lid close: %s",
-+ g_warning ("failed to turn the panel on after lid open: %s",
- error->message);
- g_clear_error (&error);
- }
-
-- /* only toggle keyboard if present and not already toggled */
-- if (manager->priv->upower_kdb_proxy &&
-- manager->priv->kbd_brightness_old == -1) {
-+ /* only toggle keyboard if present and already toggled off */
-+ if (manager->priv->upower_kdb_proxy != NULL &&
-+ manager->priv->kbd_brightness_old != -1) {
- ret = upower_kbd_toggle (manager, &error);
- if (!ret) {
-- g_warning ("failed to turn the kbd backlight off: %s",
-+ g_warning ("failed to turn the kbd backlight on: %s",
- error->message);
- g_error_free (error);
- }
- }
--
-- do_power_action_type (manager, action_type);
- }
-
- static void
- do_lid_closed_action (GsdPowerManager *manager)
- {
-+ gboolean ret;
-+ GError *error = NULL;
-+
- /* play a sound, using sounds from the naming spec */
- ca_context_play (manager->priv->canberra_context, 0,
- CA_PROP_EVENT_ID, "lid-close",
-@@ -2310,21 +2297,22 @@ do_lid_closed_action (GsdPowerManager *manager)
- CA_PROP_EVENT_DESCRIPTION, _("Lid has been closed"),
- NULL);
-
-+ /* turn the panel off if the lid is closed (mainly for Dells...) */
-+ ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
-+ GNOME_RR_DPMS_OFF,
-+ &error);
-+ if (!ret) {
-+ g_warning ("failed to turn the panel off after lid close: %s",
-+ error->message);
-+ g_error_free (error);
-+ }
-+
- /* refresh RANDR so we get an accurate view of what monitors are plugged in when the lid is closed */
- gnome_rr_screen_refresh (manager->priv->x11_screen, NULL); /* NULL-GError */
-
-- /* perform policy action */
-- if (g_settings_get_boolean (manager->priv->settings, "lid-close-suspend-with-external-monitor")
-- || non_laptop_outputs_are_all_off (manager->priv->x11_screen)) {
-- g_debug ("lid is closed; suspending or hibernating");
-- suspend_with_lid_closed (manager);
-- } else {
-- g_debug ("lid is closed; not suspending nor hibernating since some external monitor outputs are still active");
-- setup_lid_close_safety_timer (manager);
-- }
-+ restart_inhibit_lid_switch_timer (manager);
- }
-
--
- static void
- up_client_changed_cb (UpClient *client, GsdPowerManager *manager)
- {
-@@ -2344,6 +2332,7 @@ up_client_changed_cb (UpClient *client, GsdPowerManager *manager)
- if (manager->priv->lid_is_closed == tmp)
- return;
- manager->priv->lid_is_closed = tmp;
-+ g_debug ("up changed: lid is now %s", tmp ? "closed" : "open");
-
- /* fake a keypress */
- if (tmp)
-@@ -3302,30 +3291,6 @@ gsd_power_manager_class_init (GsdPowerManagerClass *klass)
- }
-
- static void
--sleep_cb_screensaver_proxy_ready_cb (GObject *source_object,
-- GAsyncResult *res,
-- gpointer user_data)
--{
-- GError *error = NULL;
-- GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
--
-- manager->priv->screensaver_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
-- if (manager->priv->screensaver_proxy == NULL) {
-- g_warning ("Could not connect to gnome-screensaver: %s",
-- error->message);
-- g_error_free (error);
-- return;
-- }
--
-- /* Finish the upower_notify_sleep_cb() call by locking the screen */
-- g_debug ("gnome-screensaver activated, doing gnome-screensaver lock");
-- g_dbus_proxy_call (manager->priv->screensaver_proxy,
-- "Lock",
-- NULL, G_DBUS_CALL_FLAGS_NONE, -1,
-- NULL, NULL, NULL);
--}
--
--static void
- idle_dbus_signal_cb (GDBusProxy *proxy,
- const gchar *sender_name,
- const gchar *signal_name,
-@@ -3477,75 +3442,38 @@ out:
- }
-
- static void
--lock_screensaver (GsdPowerManager *manager)
-+lock_screensaver (GsdPowerManager *manager,
-+ GSourceFunc done_cb)
- {
- gboolean do_lock;
-
- do_lock = g_settings_get_boolean (manager->priv->settings_screensaver,
- "lock-enabled");
-- if (!do_lock)
-+ if (!do_lock && done_cb) {
-+ done_cb (manager);
- return;
--
-- if (manager->priv->screensaver_proxy != NULL) {
-- g_debug ("doing gnome-screensaver lock");
-- g_dbus_proxy_call (manager->priv->screensaver_proxy,
-- "Lock",
-- NULL, G_DBUS_CALL_FLAGS_NONE, -1,
-- NULL, NULL, NULL);
-- } else {
-- /* connect to the screensaver first */
-- g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
-- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
-- NULL,
-- GS_DBUS_NAME,
-- GS_DBUS_PATH,
-- GS_DBUS_INTERFACE,
-- NULL,
-- sleep_cb_screensaver_proxy_ready_cb,
-- manager);
-- }
--}
--
--static void
--upower_notify_sleep_cb (UpClient *client,
-- UpSleepKind sleep_kind,
-- GsdPowerManager *manager)
--{
-- lock_screensaver (manager);
--}
--
--static void
--upower_notify_resume_cb (UpClient *client,
-- UpSleepKind sleep_kind,
-- GsdPowerManager *manager)
--{
-- gboolean ret;
-- GError *error = NULL;
--
-- /* this displays the unlock dialogue so the user doesn't have
-- * to move the mouse or press any key before the window comes up */
-- if (manager->priv->screensaver_proxy != NULL) {
-- g_dbus_proxy_call (manager->priv->screensaver_proxy,
-- "SimulateUserActivity",
-- NULL,
-- G_DBUS_CALL_FLAGS_NONE,
-- -1, NULL, NULL, NULL);
- }
-
-- /* close existing notifications on resume, the system power
-- * state is probably different now */
-- notify_close_if_showing (manager->priv->notification_low);
-- notify_close_if_showing (manager->priv->notification_discharging);
--
-- /* ensure we turn the panel back on after resume */
-- ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
-- GNOME_RR_DPMS_ON,
-- &error);
-- if (!ret) {
-- g_warning ("failed to turn the panel on after resume: %s",
-- error->message);
-- g_error_free (error);
-- }
-+ g_dbus_connection_call (manager->priv->connection,
-+ GS_DBUS_NAME,
-+ GS_DBUS_PATH,
-+ GS_DBUS_INTERFACE,
-+ "Lock",
-+ NULL, NULL,
-+ G_DBUS_CALL_FLAGS_NONE, -1,
-+ NULL, NULL, NULL);
-+
-+ /* Wait until gnome-shell shield animation is done
-+ *
-+ * FIXME: the shell should mark the lock as active
-+ * when the shield is down, then we could wait for
-+ * that. This would also fix the problem that we wait
-+ * needlessly when the shell has already locked the
-+ * screen because it is initiating the suspend.
-+ *
-+ * https://bugzilla.gnome.org/show_bug.cgi?id=685053
-+ */
-+ g_timeout_add (500, done_cb, manager);
- }
-
- static void
-@@ -3755,6 +3683,287 @@ out:
- return ret;
- }
-
-+static void
-+inhibit_lid_switch_done (GObject *source,
-+ GAsyncResult *result,
-+ gpointer user_data)
-+{
-+ GDBusProxy *proxy = G_DBUS_PROXY (source);
-+ GsdPowerManager *manager = GSD_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 (GsdPowerManager *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 (),
-+ "Multiple displays attached",
-+ "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 (GsdPowerManager *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;
-+}
-+
-+static void
-+inhibit_suspend_done (GObject *source,
-+ GAsyncResult *result,
-+ gpointer user_data)
-+{
-+ GDBusProxy *proxy = G_DBUS_PROXY (source);
-+ GsdPowerManager *manager = GSD_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 suspend: %s", error->message);
-+ g_error_free (error);
-+ } else {
-+ g_variant_get (res, "(h)", &idx);
-+ manager->priv->inhibit_suspend_fd = g_unix_fd_list_get (fd_list, idx, &error);
-+ if (manager->priv->inhibit_suspend_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_suspend_fd);
-+ g_object_unref (fd_list);
-+ g_variant_unref (res);
-+ }
-+}
-+
-+/* We take a delay inhibitor here, which causes logind to send a
-+ * PrepareToSleep signal, which gives us a chance to lock the screen
-+ * and do some other preparations.
-+ */
-+static void
-+inhibit_suspend (GsdPowerManager *manager)
-+{
-+ if (manager->priv->inhibit_suspend_taken) {
-+ g_debug ("already inhibited lid-switch");
-+ return;
-+ }
-+ g_debug ("Adding suspend delay inhibitor");
-+ manager->priv->inhibit_suspend_taken = TRUE;
-+ g_dbus_proxy_call_with_unix_fd_list (manager->priv->logind_proxy,
-+ "Inhibit",
-+ g_variant_new ("(ssss)",
-+ "sleep",
-+ g_get_user_name (),
-+ "GNOME needs to lock the screen",
-+ "delay"),
-+ 0,
-+ G_MAXINT,
-+ NULL,
-+ NULL,
-+ inhibit_suspend_done,
-+ manager);
-+}
-+
-+static void
-+uninhibit_suspend (GsdPowerManager *manager)
-+{
-+ if (manager->priv->inhibit_suspend_fd == -1) {
-+ g_debug ("no suspend delay inhibitor");
-+ return;
-+ }
-+ g_debug ("Removing suspend delay inhibitor");
-+ close (manager->priv->inhibit_suspend_fd);
-+ manager->priv->inhibit_suspend_fd = -1;
-+ manager->priv->inhibit_suspend_taken = FALSE;
-+}
-+
-+static gboolean
-+randr_output_is_on (GnomeRROutput *output)
-+{
-+ GnomeRRCrtc *crtc;
-+
-+ crtc = gnome_rr_output_get_crtc (output);
-+ if (!crtc)
-+ return FALSE;
-+ return gnome_rr_crtc_get_current_mode (crtc) != NULL;
-+}
-+
-+static gboolean
-+external_monitor_is_connected (GnomeRRScreen *screen)
-+{
-+ GnomeRROutput **outputs;
-+ guint i;
-+
-+ if (g_file_test ("/tmp/external_connected", G_FILE_TEST_EXISTS))
-+ return TRUE;
-+
-+ /* see if we have more than one screen plugged in */
-+ outputs = gnome_rr_screen_list_outputs (screen);
-+ for (i = 0; outputs[i] != NULL; i++) {
-+ if (randr_output_is_on (outputs[i]) &&
-+ !gnome_rr_output_is_laptop (outputs[i]))
-+ return TRUE;
-+ }
-+
-+ return FALSE;
-+}
-+
-+static void
-+on_randr_event (GnomeRRScreen *screen, gpointer user_data)
-+{
-+ GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
-+
-+ /* when a second monitor is plugged in, we take the
-+ * handle-lid-switch inhibitor lock of logind to prevent
-+ * it from suspending.
-+ *
-+ * Uninhibiting is done in the inhibit_lid_switch_timer,
-+ * since we want to give users a few seconds when unplugging
-+ * and replugging an external monitor, not suspend right away.
-+ */
-+ if (external_monitor_is_connected (screen) &&
-+ !g_settings_get_boolean (manager->priv->settings,
-+ "lid-close-suspend-with-external-monitor")) {
-+ inhibit_lid_switch (manager);
-+ setup_inhibit_lid_switch_timer (manager);
-+ }
-+ else {
-+ restart_inhibit_lid_switch_timer (manager);
-+ }
-+}
-+
-+static gboolean
-+screen_lock_done_cb (gpointer data)
-+{
-+ GsdPowerManager *manager = data;
-+
-+ /* lift the delay inhibit, so logind can proceed */
-+ uninhibit_suspend (manager);
-+
-+ return FALSE;
-+}
-+
-+static void
-+handle_suspend_actions (GsdPowerManager *manager)
-+{
-+ gboolean ret;
-+ GError *error = NULL;
-+
-+ /* ensure we turn the panel back on after resume */
-+ ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
-+ GNOME_RR_DPMS_ON,
-+ &error);
-+ if (!ret) {
-+ g_warning ("failed to turn the panel on after resume: %s",
-+ error->message);
-+ g_error_free (error);
-+ }
-+
-+ lock_screensaver (manager, screen_lock_done_cb);
-+}
-+
-+static void
-+handle_resume_actions (GsdPowerManager *manager)
-+{
-+ gboolean ret;
-+ GError *error = NULL;
-+
-+ /* this displays the unlock dialogue so the user doesn't have
-+ * to move the mouse or press any key before the window comes up */
-+ g_dbus_connection_call (manager->priv->connection,
-+ GS_DBUS_NAME,
-+ GS_DBUS_PATH,
-+ GS_DBUS_INTERFACE,
-+ "SimulateUserActivity",
-+ NULL, NULL,
-+ G_DBUS_CALL_FLAGS_NONE, -1,
-+ NULL, NULL, NULL);
-+
-+ /* close existing notifications on resume, the system power
-+ * state is probably different now */
-+ notify_close_if_showing (manager->priv->notification_low);
-+ notify_close_if_showing (manager->priv->notification_discharging);
-+
-+ /* ensure we turn the panel back on after resume */
-+ ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
-+ GNOME_RR_DPMS_ON,
-+ &error);
-+ if (!ret) {
-+ g_warning ("failed to turn the panel on after resume: %s",
-+ error->message);
-+ g_error_free (error);
-+ }
-+
-+ /* set up the delay again */
-+ inhibit_suspend (manager);
-+}
-+
-+static void
-+logind_proxy_signal_cb (GDBusProxy *proxy,
-+ const gchar *sender_name,
-+ const gchar *signal_name,
-+ GVariant *parameters,
-+ gpointer user_data)
-+{
-+ GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
-+ gboolean is_about_to_suspend;
-+
-+ if (g_strcmp0 (signal_name, "PrepareForSleep") != 0)
-+ return;
-+ g_variant_get (parameters, "(b)", &is_about_to_suspend);
-+ if (is_about_to_suspend) {
-+ handle_suspend_actions (manager);
-+ } else {
-+ handle_resume_actions (manager);
-+ }
-+}
-+
- gboolean
- gsd_power_manager_start (GsdPowerManager *manager,
- GError **error)
-@@ -3764,6 +3973,25 @@ gsd_power_manager_start (GsdPowerManager *manager,
- g_debug ("Starting power manager");
- gnome_settings_profile_start (NULL);
-
-+ 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_warning ("no systemd support");
-+ return FALSE;
-+ }
-+ g_signal_connect (manager->priv->logind_proxy, "g-signal",
-+ G_CALLBACK (logind_proxy_signal_cb),
-+ manager);
-+ /* Set up a delay inhibitor to be informed about suspend attempts */
-+ inhibit_suspend (manager);
-+
- /* track the active session */
- manager->priv->session = gnome_settings_session_new ();
- g_signal_connect (manager->priv->session, "notify::state",
-@@ -3778,10 +4006,6 @@ gsd_power_manager_start (GsdPowerManager *manager,
- G_CALLBACK (engine_settings_key_changed_cb), manager);
- manager->priv->settings_screensaver = g_settings_new ("org.gnome.desktop.screensaver");
- manager->priv->up_client = up_client_new ();
-- g_signal_connect (manager->priv->up_client, "notify-sleep",
-- G_CALLBACK (upower_notify_sleep_cb), manager);
-- g_signal_connect (manager->priv->up_client, "notify-resume",
-- G_CALLBACK (upower_notify_resume_cb), manager);
- manager->priv->lid_is_closed = up_client_get_lid_is_closed (manager->priv->up_client);
- g_signal_connect (manager->priv->up_client, "device-added",
- G_CALLBACK (engine_device_added_cb), manager);
-@@ -3895,6 +4119,9 @@ gsd_power_manager_start (GsdPowerManager *manager,
- G_CALLBACK (idle_idletime_reset_cb), manager);
- g_signal_connect (manager->priv->idletime, "alarm-expired",
- G_CALLBACK (idle_idletime_alarm_expired_cb), manager);
-+ g_signal_connect (manager->priv->x11_screen, "changed", G_CALLBACK (on_randr_event), manager);
-+ /* set up initial state */
-+ on_randr_event (manager->priv->x11_screen, manager);
-
- /* ensure the default dpms timeouts are cleared */
- ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
-@@ -3927,6 +4154,11 @@ gsd_power_manager_stop (GsdPowerManager *manager)
- {
- g_debug ("Stopping power manager");
-
-+ if (manager->priv->inhibit_lid_switch_timer_id != 0) {
-+ g_source_remove (manager->priv->inhibit_lid_switch_timer_id);
-+ manager->priv->inhibit_lid_switch_timer_id = 0;
-+ }
-+
- if (manager->priv->bus_cancellable != NULL) {
- g_cancellable_cancel (manager->priv->bus_cancellable);
- g_object_unref (manager->priv->bus_cancellable);
-@@ -3938,8 +4170,6 @@ gsd_power_manager_stop (GsdPowerManager *manager)
- manager->priv->introspection_data = NULL;
- }
-
-- kill_lid_close_safety_timer (manager);
--
- g_signal_handlers_disconnect_by_data (manager->priv->up_client, manager);
-
- g_clear_object (&manager->priv->connection);
-@@ -3947,6 +4177,19 @@ gsd_power_manager_stop (GsdPowerManager *manager)
- g_clear_object (&manager->priv->settings);
- g_clear_object (&manager->priv->settings_screensaver);
- g_clear_object (&manager->priv->up_client);
-+
-+ if (manager->priv->inhibit_lid_switch_fd != -1) {
-+ close (manager->priv->inhibit_lid_switch_fd);
-+ manager->priv->inhibit_lid_switch_fd = -1;
-+ manager->priv->inhibit_lid_switch_taken = FALSE;
-+ }
-+ if (manager->priv->inhibit_suspend_fd != -1) {
-+ close (manager->priv->inhibit_suspend_fd);
-+ manager->priv->inhibit_suspend_fd = -1;
-+ manager->priv->inhibit_suspend_taken = FALSE;
-+ }
-+
-+ g_clear_object (&manager->priv->logind_proxy);
- g_clear_object (&manager->priv->x11_screen);
-
- g_ptr_array_unref (manager->priv->devices_array);
-@@ -3980,6 +4223,8 @@ static void
- gsd_power_manager_init (GsdPowerManager *manager)
- {
- manager->priv = GSD_POWER_MANAGER_GET_PRIVATE (manager);
-+ manager->priv->inhibit_lid_switch_fd = -1;
-+ manager->priv->inhibit_suspend_fd = -1;
- }
-
- static void
---
-1.8.0
-
diff --git a/extra/gnome-settings-daemon/PKGBUILD b/extra/gnome-settings-daemon/PKGBUILD
index 4a051cd96..e964279f9 100644
--- a/extra/gnome-settings-daemon/PKGBUILD
+++ b/extra/gnome-settings-daemon/PKGBUILD
@@ -1,38 +1,27 @@
-# $Id: PKGBUILD 178088 2013-02-15 23:32:26Z heftig $
+# $Id: PKGBUILD 183398 2013-04-21 22:10:23Z heftig $
# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
pkgname=gnome-settings-daemon
-pkgver=3.6.4
-pkgrel=2
+pkgver=3.8.1
+pkgrel=1
pkgdesc="The GNOME Settings daemon"
arch=('i686' 'x86_64')
license=('GPL')
depends=('dconf' 'gnome-desktop' 'gsettings-desktop-schemas' 'hicolor-icon-theme' 'libcanberra-pulse' 'libnotify'
- 'libsystemd' 'libwacom' 'nss' 'pulseaudio' 'pulseaudio-alsa' 'upower' 'ibus')
+ 'libsystemd' 'libwacom' 'pulseaudio' 'pulseaudio-alsa' 'upower' 'ibus' 'librsvg')
makedepends=('intltool' 'xf86-input-wacom' 'libxslt' 'docbook-xsl')
options=('!emptydirs' '!libtool')
install=gnome-settings-daemon.install
url="http://www.gnome.org"
groups=('gnome')
-source=(http://ftp.gnome.org/pub/gnome/sources/$pkgname/${pkgver%.*}/$pkgname-$pkgver.tar.xz
- 0001-power-and-media-keys-Use-logind-for-suspending-and-r.patch)
-sha256sums=('3db993f2dbabc0c9d06a309bb12c9a7104b9cdda414ac4b1c301f5114a441c15'
- '5572b5b3f554ce361353a8db42c26a8f789606f65acc5943a286271603fcb8eb')
+source=(http://ftp.gnome.org/pub/gnome/sources/$pkgname/${pkgver%.*}/$pkgname-$pkgver.tar.xz)
+sha256sums=('367a770ec7affff3c85a43bc39ced5a02a1b1761780d954329f6b21c0f2efcee')
build() {
cd $pkgname-$pkgver
- # logind key handling FS#31801, patch from Fedora
- # rebased onto screensaver.patch
- patch -Np1 -i ../0001-power-and-media-keys-Use-logind-for-suspending-and-r.patch
-
- aclocal
- autoconf
- automake --add-missing
-
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
- --libexecdir=/usr/lib/gnome-settings-daemon --disable-static \
- --enable-systemd
+ --libexecdir=/usr/lib/gnome-settings-daemon --disable-static
#https://bugzilla.gnome.org/show_bug.cgi?id=656231
sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool
@@ -43,9 +32,4 @@ build() {
package() {
cd $pkgname-$pkgver
make DESTDIR="$pkgdir" install
-
- # Plugins that aren't installed still have schema references
- # and cause gsettings errors - remove the references we're not using
- sed -i '/org\.gnome\.settings-daemon\.plugins\.updates/d' \
- "$pkgdir/usr/share/glib-2.0/schemas/org.gnome.settings-daemon.plugins.gschema.xml"
}