raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=eb61b825e43d7ad719925607d1812a507dab42fe

commit eb61b825e43d7ad719925607d1812a507dab42fe
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Sat May 30 17:41:03 2020 +0100

    suspend/hibernate - add a small delay before doing the deed
    
    allow any pending frames to pop out of the pipeline before we
    sleep
---
 src/bin/e_sys.c | 94 +++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 58 insertions(+), 36 deletions(-)

diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c
index b6066d38f..9664a3677 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
                {

-- 


Reply via email to