diff options
author | Federico Mena Quintero <federico@gnome.org> | 2012-06-05 06:52:23 -0500 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2012-06-05 06:52:23 -0500 |
commit | 10a7652acae666d2a3fa546e100024842fee63da (patch) | |
tree | e2f2284b89568c6867e5f59f915a41841d105a74 | |
parent | 5f7643800a8bc26bd2835dc9a3df085bf0fab422 (diff) | |
parent | 76043da88ee7fd6332b4280503409be51a00833e (diff) | |
download | gnome-settings-daemon-docking-stations.tar.gz |
Merge branch 'docking-stations'docking-stations
-rw-r--r-- | plugins/power/gsd-power-manager.c | 56 |
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); |