summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2020-05-30 17:41:03 +0100
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2020-05-30 21:56:29 +0100
commiteb61b825e43d7ad719925607d1812a507dab42fe (patch)
tree347096248a182b7eb860d60f9c2aa55b7563a128
parenta5fa9b6fe7130782395c8288c6524a95b6740fd5 (diff)
downloadenlightenment-eb61b825e43d7ad719925607d1812a507dab42fe.tar.gz
suspend/hibernate - add a small delay before doing the deed
allow any pending frames to pop out of the pipeline before we sleep
-rw-r--r--src/bin/e_sys.c94
1 files changed, 58 insertions, 36 deletions
diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c
index b6066d38f9..9664a3677f 100644
--- a/src/bin/e_sys.c
+++ b/src/bin/e_sys.c
@@ -988,6 +988,53 @@ _e_sys_cb_acpi_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
return ECORE_CALLBACK_PASS_ON;
}
+static Ecore_Timer *_e_sys_suspend_delay_timer = NULL;
+static Eina_Bool
+_e_sys_suspend_delay(void *data EINA_UNUSED)
+{
+ _e_sys_suspend_delay_timer = NULL;
+ _e_sys_begin_time = ecore_time_get();
+ if (e_config->suspend_connected_standby == 0)
+ {
+ if (systemd_works) _e_sys_systemd_suspend();
+ else
+ {
+ _e_sys_susp_hib_check();
+ e_system_send("power-suspend", NULL);
+ }
+ }
+ else
+ {
+ if (_e_sys_acpi_handler)
+ ecore_event_handler_del(_e_sys_acpi_handler);
+ _e_sys_acpi_handler =
+ ecore_event_handler_add(E_EVENT_ACPI,
+ _e_sys_cb_acpi_event,
+ NULL);
+ e_powersave_mode_force(E_POWERSAVE_MODE_FREEZE);
+ // XXX: need some system way of forcing the system into a very low
+ // power level with as many devices suspended as possible. below is
+ // a simple "freeze the cpu/kernel" which is not what we want actually
+ // sleep 2 && echo freeze | sudo tee /sys/power/state
+ }
+ return EINA_FALSE;
+}
+
+static Ecore_Timer *_e_sys_hibernate_delay_timer = NULL;
+static Eina_Bool
+_e_sys_hibernate_delay(void *data EINA_UNUSED)
+{
+ _e_sys_hibernate_delay_timer = NULL;
+ _e_sys_begin_time = ecore_time_get();
+ if (systemd_works) _e_sys_systemd_hibernate();
+ else
+ {
+ _e_sys_susp_hib_check();
+ e_system_send("power-hibernate", NULL);
+ }
+ return EINA_FALSE;
+}
+
static int
_e_sys_action_do(E_Sys_Action a, char *param EINA_UNUSED, Eina_Bool raw)
{
@@ -1107,34 +1154,12 @@ _e_sys_action_do(E_Sys_Action a, char *param EINA_UNUSED, Eina_Bool raw)
if (e_config->desklock_on_suspend)
// XXX: this desklock - ensure its instant
e_desklock_show(EINA_TRUE);
- _e_sys_begin_time = ecore_time_get();
- if (e_config->suspend_connected_standby == 0)
- {
- if (systemd_works)
- _e_sys_systemd_suspend();
- else
- {
- _e_sys_susp_hib_check();
- e_system_send("power-suspend", NULL);
- }
- ret = 1;
- }
- else
- {
- if (_e_sys_acpi_handler)
- ecore_event_handler_del(_e_sys_acpi_handler);
- _e_sys_acpi_handler =
- ecore_event_handler_add(E_EVENT_ACPI,
- _e_sys_cb_acpi_event,
- NULL);
- e_powersave_mode_force(E_POWERSAVE_MODE_FREEZE);
- // XXX: need some system way of forcing the system
- // into a very lowe power level with as many
- // devices suspended as possible. below is a simple
- // "freeze the cpu/kernel" which is not what we
- // want actually
- // sleep 2 && echo freeze | sudo tee /sys/power/state
- }
+ if (_e_sys_suspend_delay_timer)
+ ecore_timer_del(_e_sys_suspend_delay_timer);
+ if (e_config->suspend_connected_standby == 0) ret = 1;
+ // XXX: make timer shorter if desklock is instant
+ _e_sys_suspend_delay_timer =
+ ecore_timer_add(0.5, _e_sys_suspend_delay, NULL);
}
else
{
@@ -1159,15 +1184,12 @@ _e_sys_action_do(E_Sys_Action a, char *param EINA_UNUSED, Eina_Bool raw)
if (e_config->desklock_on_suspend)
// XXX: this desklock - ensure its instant
e_desklock_show(EINA_TRUE);
- _e_sys_begin_time = ecore_time_get();
- if (systemd_works)
- _e_sys_systemd_hibernate();
- else
- {
- _e_sys_susp_hib_check();
- e_system_send("power-hibernate", NULL);
- }
+ if (_e_sys_hibernate_delay_timer)
+ ecore_timer_del(_e_sys_hibernate_delay_timer);
ret = 1;
+ // XXX: make timer shorter if desklock is instant
+ _e_sys_hibernate_delay_timer =
+ ecore_timer_add(0.5, _e_sys_hibernate_delay, NULL);
}
else
{