summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2012-06-05 06:52:23 -0500
committerFederico Mena Quintero <federico@gnome.org>2012-06-05 06:52:23 -0500
commit10a7652acae666d2a3fa546e100024842fee63da (patch)
treee2f2284b89568c6867e5f59f915a41841d105a74
parent5f7643800a8bc26bd2835dc9a3df085bf0fab422 (diff)
parent76043da88ee7fd6332b4280503409be51a00833e (diff)
downloadgnome-settings-daemon-docking-stations.tar.gz
Merge branch 'docking-stations'docking-stations
-rw-r--r--plugins/power/gsd-power-manager.c56
1 files changed, 55 insertions, 1 deletions
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index f9daeb54..7c0d75e8 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -82,6 +82,7 @@
#define GSD_POWER_MANAGER_CRITICAL_ALERT_TIMEOUT 5 /* seconds */
#define GSD_POWER_MANAGER_RECALL_DELAY 30 /* seconds */
+#define GSD_POWER_MANAGER_LID_CLOSE_SAFETY_TIMEOUT 30 /* seconds */
#define GSD_POWER_IDLETIME_ID 1 /* counter id */
@@ -196,6 +197,7 @@ struct GsdPowerManagerPrivate
GsdPowerIdleMode current_idle_mode;
guint timeout_blank_id;
guint timeout_sleep_id;
+ guint lid_close_safety_timer_id;
GtkStatusIcon *status_icon;
};
@@ -212,7 +214,9 @@ static UpDevice *engine_update_composite_device (GsdPowerManager *manager, UpDev
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);
G_DEFINE_TYPE (GsdPowerManager, gsd_power_manager, G_TYPE_OBJECT)
@@ -2245,6 +2249,7 @@ do_lid_open_action (GsdPowerManager *manager)
}
}
+ kill_lid_close_safety_timer (manager);
}
static gboolean
@@ -2276,6 +2281,48 @@ non_laptop_outputs_are_all_off (GnomeRRScreen *screen)
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)
+{
+ GsdPowerActionType action_type;
+
+ 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;
+}
+
+/* Sets up a timer to be triggered some seconds after closing the laptop lid
+ * when the laptop is *not* suspended for some reason. We'll check conditions
+ * again in the timeout handler to see if we can suspend then.
+ */
+static void
+setup_lid_close_safety_timer (GsdPowerManager *manager)
+{
+ if (manager->priv->lid_close_safety_timer_id != 0)
+ return;
+
+ 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);
+ g_source_set_name_by_id (manager->priv->lid_close_safety_timer_id, "[GsdPowerManager] lid close safety timer");
+}
+
+static void
+kill_lid_close_safety_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;
+ }
+}
+
static void
do_lid_closed_action (GsdPowerManager *manager)
{
@@ -2290,6 +2337,9 @@ do_lid_closed_action (GsdPowerManager *manager)
CA_PROP_EVENT_DESCRIPTION, _("Lid has been closed"),
NULL);
+ /* 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 */
+
/* maybe lock the screen if the lid is closed */
lock_screensaver (manager);
@@ -2338,8 +2388,10 @@ do_lid_closed_action (GsdPowerManager *manager)
|| non_laptop_outputs_are_all_off (manager->priv->x11_screen)) {
g_debug ("lid is closed; suspending or hibernating");
do_power_action_type (manager, action_type);
- } else
+ } else {
g_debug ("lid is closed; not suspending nor hibernating since some external monitor outputs are still active");
+ setup_lid_close_safety_timer (manager);
+ }
}
@@ -3827,6 +3879,8 @@ gsd_power_manager_stop (GsdPowerManager *manager)
manager->priv->timeout_sleep_id = 0;
}
+ kill_lid_close_safety_timer (manager);
+
g_signal_handlers_disconnect_by_data (manager->priv->up_client, manager);
g_object_unref (manager->priv->session);