raster pushed a commit to branch master.

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

commit d0c5fb465b699ebe7556c61e14f12c9882620175
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Mon Jul 10 09:08:25 2017 +0900

    support connected standby (non-s3 sleep/freeze) that new lpatops sport
    
    this requires we have to force dpms on to reduce power. to avoid
    glitches with the pointer staying around in x we need to support
    suspending it too so it hides cleanly like the screen dims or undims.
    also use the new powersave freeze mode to do this.
    
    note that i've tested this on s3 supporting laptops and non-s3 and it
    "works for me". it may require more testing and work. there is more to
    power saving than just this as well but for now that's out of scope as
    you have to mess with linux device autosuspend timeouts and a bunch
    more (wowlan ... blahblah).
    
    i need to find the source of the intermittent wakeups too in e. there
    is a long lived timeout (8-ish seconds?) but more specifically e keeps
    waking up from fd's and then reading /sys stuff about battery - some
    event is causing us to do this... maybe to suspend this or make
    battery checking very rare when in freeze mode (or screen off) etc.
    
    so this fixes some glitches as well as supports a new way of sleeping
    "alive" when hardware literally doesnt support normal s3 sleep... so
    kind of a fix with a feature.
---
 src/bin/e_comp.c                                   |  99 ++++++++++++++
 src/bin/e_comp.h                                   |   3 +
 src/bin/e_comp_x.c                                 |   1 +
 src/bin/e_config.c                                 |   2 +
 src/bin/e_config.h                                 |   2 +
 src/bin/e_screensaver.c                            |  49 +++++--
 src/bin/e_screensaver.h                            |   4 +
 src/bin/e_sys.c                                    | 150 +++++++++++++++++++--
 .../e_int_config_powermanagement.c                 |  16 ++-
 9 files changed, 301 insertions(+), 25 deletions(-)

diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c
index 0e1e56c1b..01e8d4d51 100644
--- a/src/bin/e_comp.c
+++ b/src/bin/e_comp.c
@@ -893,6 +893,7 @@ _e_comp_screensaver_on(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *event
         edje_object_signal_emit(zone->base, "e,state,screensaver,on", "e");
         edje_object_signal_emit(zone->over, "e,state,screensaver,on", "e");
      }
+   e_comp_screen_suspend();
 
    return ECORE_CALLBACK_PASS_ON;
 }
@@ -906,6 +907,7 @@ _e_comp_screensaver_off(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *even
 
    ecore_animator_frametime_set(ecore_frametime);
    if (!e_comp->saver) return ECORE_CALLBACK_RENEW;
+   e_comp_screen_resume();
    e_comp_override_del();
    e_comp->saver = EINA_FALSE;
    if (!e_comp->nocomp)
@@ -1800,3 +1802,100 @@ e_comp_util_object_is_above_nocomp(Evas_Object *obj)
      return EINA_TRUE;
    return EINA_FALSE;
 }
+
+#ifndef HAVE_WAYLAND_ONLY
+static void
+_e_comp_pointer_grab(void)
+{
+   if (e_comp->suspend_grabbed) ecore_x_window_free(e_comp->suspend_grabbed);
+   e_comp->suspend_grabbed = ecore_x_window_input_new(e_comp->root, 0, 0, 1, 
1);
+   ecore_x_window_show(e_comp->suspend_grabbed);
+   if (!e_grabinput_get(e_comp->suspend_grabbed, 0, e_comp->suspend_grabbed))
+     {
+        ecore_x_window_free(e_comp->suspend_grabbed);
+        e_comp->suspend_grabbed = 0;
+     }
+}
+
+static void
+_e_comp_pointer_ungrab(void)
+{
+   if (e_comp->comp_type == E_PIXMAP_TYPE_X)
+     {
+        e_grabinput_release(e_comp->suspend_grabbed, e_comp->suspend_grabbed);
+        ecore_x_window_free(e_comp->suspend_grabbed);
+     }
+}
+
+static void
+_e_comp_cb_pointer_suspend_resume_done(void *data, Evas_Object *obj, const 
char *emission, const char *source)
+{
+   edje_object_signal_callback_del(obj, emission, source,
+                                   _e_comp_cb_pointer_suspend_resume_done);
+   if (!data) _e_comp_pointer_ungrab();
+}
+#endif
+
+E_API void
+e_comp_screen_suspend(void)
+{
+#ifndef HAVE_WAYLAND_ONLY
+   if (e_comp->comp_type != E_PIXMAP_TYPE_X) return;
+   _e_comp_pointer_ungrab();
+   _e_comp_pointer_grab();
+   if (!e_comp->suspend_grabbed) return;
+   if ((e_comp->pointer) && (e_comp->pointer->o_ptr))
+     {
+        const char *s = edje_object_data_get(e_comp->pointer->o_ptr,
+                                             "can_suspend");
+        if ((s) && (atoi(s) == 1))
+          {
+             edje_object_signal_callback_del(e_comp->pointer->o_ptr,
+                                             "e,state,mouse,suspend,done", "e",
+                                             
_e_comp_cb_pointer_suspend_resume_done);
+             edje_object_signal_callback_del(e_comp->pointer->o_ptr,
+                                             "e,state,mouse,resume,done", "e",
+                                             
_e_comp_cb_pointer_suspend_resume_done);
+             edje_object_signal_callback_add(e_comp->pointer->o_ptr,
+                                             "e,state,mouse,suspend,done",
+                                             "e",
+                                             
_e_comp_cb_pointer_suspend_resume_done,
+                                             e_comp);
+             edje_object_signal_emit(e_comp->pointer->o_ptr,
+                                     "e,state,mouse,suspend", "e");
+          }
+     }
+#endif
+}
+
+E_API void
+e_comp_screen_resume(void)
+{
+#ifndef HAVE_WAYLAND_ONLY
+   if (e_comp->comp_type != E_PIXMAP_TYPE_X) return;
+   _e_comp_pointer_ungrab();
+   _e_comp_pointer_grab();
+   if (!e_comp->suspend_grabbed) return;
+   if ((e_comp->pointer) && (e_comp->pointer->o_ptr))
+     {
+        const char *s = edje_object_data_get(e_comp->pointer->o_ptr,
+                                             "can_suspend");
+        if ((s) && (atoi(s) == 1))
+          {
+             edje_object_signal_callback_del(e_comp->pointer->o_ptr,
+                                             "e,state,mouse,suspend,done", "e",
+                                             
_e_comp_cb_pointer_suspend_resume_done);
+             edje_object_signal_callback_del(e_comp->pointer->o_ptr,
+                                             "e,state,mouse,resume,done", "e",
+                                             
_e_comp_cb_pointer_suspend_resume_done);
+             edje_object_signal_callback_add(e_comp->pointer->o_ptr,
+                                             "e,state,mouse,resume,done",
+                                             "e",
+                                             
_e_comp_cb_pointer_suspend_resume_done,
+                                             NULL);
+             edje_object_signal_emit(e_comp->pointer->o_ptr,
+                                     "e,state,mouse,resume", "e");
+          }
+     }
+#endif
+}
diff --git a/src/bin/e_comp.h b/src/bin/e_comp.h
index 745550d22..c991088ea 100644
--- a/src/bin/e_comp.h
+++ b/src/bin/e_comp.h
@@ -97,6 +97,7 @@ struct _E_Comp
 
    Ecore_Window  win; // input overlay
    Ecore_Window  root; //x11 root window
+   Ecore_Window  suspend_grabbed; // window grabber for suspending pointer
    Ecore_Evas     *ee; //canvas
    Ecore_Window  ee_win; //canvas window
    E_Comp_Canvas *canvas;
@@ -232,6 +233,8 @@ EINTERN Evas_Object *e_comp_style_selector_create(Evas 
*evas, const char **sourc
 E_API E_Config_Dialog *e_int_config_comp(Evas_Object *parent, const char 
*params);
 E_API E_Config_Dialog *e_int_config_comp_match(Evas_Object *parent, const char 
*params);
 
+E_API void e_comp_screen_suspend(void);
+E_API void e_comp_screen_resume(void);
 
 E_API Eina_Bool e_comp_util_kbd_grabbed(void);
 E_API Eina_Bool e_comp_util_mouse_grabbed(void);
diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c
index e097a4d9f..a039862d1 100644
--- a/src/bin/e_comp_x.c
+++ b/src/bin/e_comp_x.c
@@ -4939,6 +4939,7 @@ _e_comp_x_screensaver_eval_cb(void *d EINA_UNUSED)
 static Eina_Bool
 _e_comp_x_screensaver_notify_cb(void *data EINA_UNUSED, int type EINA_UNUSED, 
Ecore_X_Event_Screensaver_Notify *ev)
 {
+   if (e_screensaver_ignore_get()) return ECORE_CALLBACK_PASS_ON;
    if ((ev->on) && (!saver_on))
      {
         saver_on = EINA_TRUE;
diff --git a/src/bin/e_config.c b/src/bin/e_config.c
index 7e4350c38..293dd83fe 100644
--- a/src/bin/e_config.c
+++ b/src/bin/e_config.c
@@ -627,6 +627,8 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, screensaver_wake_on_notify, INT);
    E_CONFIG_VAL(D, T, screensaver_wake_on_urgent, INT);
 
+   E_CONFIG_VAL(D, T, suspend_connected_standby, UCHAR);
+
    E_CONFIG_VAL(D, T, screensaver_suspend, UCHAR);
    E_CONFIG_VAL(D, T, screensaver_suspend_on_ac, UCHAR);
    E_CONFIG_VAL(D, T, screensaver_suspend_delay, DOUBLE);
diff --git a/src/bin/e_config.h b/src/bin/e_config.h
index 00eb90d62..275283977 100644
--- a/src/bin/e_config.h
+++ b/src/bin/e_config.h
@@ -225,6 +225,8 @@ struct _E_Config
    int                       screensaver_wake_on_notify; // GUI
    int                       screensaver_wake_on_urgent; // GUI
 
+   unsigned char             suspend_connected_standby; // GUI
+
    unsigned char             screensaver_suspend; // GUI
    unsigned char             screensaver_suspend_on_ac; // GUI
    double                    screensaver_suspend_delay; // GUI
diff --git a/src/bin/e_screensaver.c b/src/bin/e_screensaver.c
index 2db7b947a..506e13284 100644
--- a/src/bin/e_screensaver.c
+++ b/src/bin/e_screensaver.c
@@ -30,6 +30,8 @@ static Ecore_Timer *_e_screensaver_timer;
 static Eina_Bool _e_screensaver_inhibited = EINA_FALSE;
 #endif
 
+static Eina_Bool _screensaver_ignore = EINA_FALSE;
+
 E_API int E_EVENT_SCREENSAVER_ON = -1;
 E_API int E_EVENT_SCREENSAVER_OFF = -1;
 E_API int E_EVENT_SCREENSAVER_OFF_PRE = -1;
@@ -69,6 +71,24 @@ e_screensaver_timeout_get(Eina_Bool use_idle)
 }
 
 E_API void
+e_screensaver_ignore(void)
+{
+   _screensaver_ignore = EINA_TRUE;
+}
+
+E_API void
+e_screensaver_unignore(void)
+{
+   _screensaver_ignore = EINA_FALSE;
+}
+
+E_API Eina_Bool
+e_screensaver_ignore_get(void)
+{
+   return _screensaver_ignore;
+}
+
+E_API void
 e_screensaver_update(void)
 {
    int timeout;
@@ -504,19 +524,25 @@ e_screensaver_eval(Eina_Bool saver_on)
 
              if (t < 1.0) t = 1.0;
              E_FREE_FUNC(screensaver_idle_timer, ecore_timer_del);
-             if (e_config->screensaver_enable)
-               screensaver_idle_timer = ecore_timer_loop_add
-                   (t, _e_screensaver_idle_timer_cb, NULL);
-             if (e_backlight_mode_get(NULL) != E_BACKLIGHT_MODE_DIM)
+             if (!_screensaver_ignore)
                {
-                  e_backlight_mode_set(NULL, E_BACKLIGHT_MODE_DIM);
-                  screensaver_dimmed = EINA_TRUE;
+                  if (e_config->screensaver_enable)
+                    screensaver_idle_timer = ecore_timer_loop_add
+                      (t, _e_screensaver_idle_timer_cb, NULL);
+                  if (e_backlight_mode_get(NULL) != E_BACKLIGHT_MODE_DIM)
+                    {
+                       e_backlight_mode_set(NULL, E_BACKLIGHT_MODE_DIM);
+                       screensaver_dimmed = EINA_TRUE;
+                    }
                }
           }
         else
           {
-             if (!e_screensaver_on_get())
-               ecore_event_add(E_EVENT_SCREENSAVER_ON, NULL, NULL, NULL);
+             if (!_screensaver_ignore)
+               {
+                  if (!e_screensaver_on_get())
+                    ecore_event_add(E_EVENT_SCREENSAVER_ON, NULL, NULL, NULL);
+               }
           }
         return;
      }
@@ -536,8 +562,11 @@ e_screensaver_eval(Eina_Bool saver_on)
           e_backlight_mode_set(NULL, E_BACKLIGHT_MODE_NORMAL);
         screensaver_dimmed = EINA_FALSE;
      }
-   if (e_screensaver_on_get())
-     ecore_event_add(E_EVENT_SCREENSAVER_OFF, NULL, NULL, NULL);
+   if (!_screensaver_ignore)
+     {
+        if (e_screensaver_on_get())
+          ecore_event_add(E_EVENT_SCREENSAVER_OFF, NULL, NULL, NULL);
+     }
 }
 
 E_API void
diff --git a/src/bin/e_screensaver.h b/src/bin/e_screensaver.h
index 35e94cbfb..9c26afc98 100644
--- a/src/bin/e_screensaver.h
+++ b/src/bin/e_screensaver.h
@@ -7,6 +7,10 @@ EINTERN void e_screensaver_preinit(void);
 EINTERN int e_screensaver_init(void);
 EINTERN int e_screensaver_shutdown(void);
 
+E_API void e_screensaver_ignore(void);
+E_API void e_screensaver_unignore(void);
+E_API Eina_Bool e_screensaver_ignore_get(void);
+
 E_API void e_screensaver_update(void);
 
 E_API int e_screensaver_timeout_get(Eina_Bool use_idle);
diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c
index c75ce1653..d323ea60b 100644
--- a/src/bin/e_sys.c
+++ b/src/bin/e_sys.c
@@ -36,6 +36,8 @@ static E_Dialog *_e_sys_logout_confirm_dialog = NULL;
 static Ecore_Timer *_e_sys_susp_hib_check_timer = NULL;
 static double _e_sys_susp_hib_check_last_tick = 0.0;
 
+static Ecore_Event_Handler *_e_sys_acpi_handler = NULL;
+
 static void _e_sys_systemd_handle_inhibit(void);
 static void _e_sys_systemd_poweroff(void);
 static void _e_sys_systemd_reboot(void);
@@ -55,16 +57,46 @@ static Eldbus_Proxy *login1_manger_proxy = NULL;
 
 static int _e_sys_comp_waiting = 0;
 
+static Ecore_Timer *_e_sys_screensaver_unignore_timer = NULL;
+
 E_API int E_EVENT_SYS_SUSPEND = -1;
 E_API int E_EVENT_SYS_HIBERNATE = -1;
 E_API int E_EVENT_SYS_RESUME = -1;
 
+static Eina_Bool
+_e_sys_comp_done2_cb(void *data)
+{
+   e_sys_action_raw_do((E_Sys_Action)(long)data, NULL);
+   return EINA_FALSE;
+}
+
 static void
 _e_sys_comp_done_cb(void *data, Evas_Object *obj, const char *sig, const char 
*src)
 {
    if (_e_sys_comp_waiting == 1) _e_sys_comp_waiting--;
    edje_object_signal_callback_del(obj, sig, src, _e_sys_comp_done_cb);
-   e_sys_action_raw_do((E_Sys_Action)(long)data, NULL);
+   if (_e_sys_screensaver_unignore_timer)
+     {
+        ecore_timer_del(_e_sys_screensaver_unignore_timer);
+        _e_sys_screensaver_unignore_timer = NULL;
+     }
+   e_screensaver_ignore();
+   ecore_evas_manual_render_set(e_comp->ee, EINA_TRUE);
+#ifndef HAVE_WAYLAND_ONLY
+   if (e_comp->comp_type == E_PIXMAP_TYPE_X)
+     {
+        ecore_x_screensaver_suspend();
+        ecore_x_dpms_force(EINA_TRUE);
+     }
+#endif
+#ifdef HAVE_WAYLAND
+   if (e_comp->comp_type != E_PIXMAP_TYPE_X)
+     {
+        if (e_comp->screen && e_comp->screen->dpms)
+          e_comp->screen->dpms(3);
+     }
+#endif
+   ecore_timer_add(0.5, _e_sys_comp_done2_cb, data);
    E_FREE_FUNC(action_timeout, ecore_timer_del);
 }
 
@@ -128,9 +160,9 @@ _e_sys_comp_emit_cb_wait(E_Sys_Action a, const char *sig, 
const char *rep, Eina_
    if (_e_sys_comp_waiting == 0) _e_sys_comp_waiting++;
    if (nocomp_push) e_comp_override_add();
    else e_comp_override_timed_pop();
-   printf("_e_sys_comp_emit_cb_wait - [%x] %s %s\n", a, sig, rep);
 
    _e_sys_comp_zones_fade(sig, nocomp_push);
+   e_comp_screen_suspend();
 
    if (rep)
      {
@@ -171,16 +203,53 @@ _e_sys_comp_logout(void)
    _e_sys_comp_emit_cb_wait(E_SYS_LOGOUT, "e,state,sys,logout", 
"e,state,sys,logout,done", EINA_TRUE);
 }
 
-static void
-_e_sys_comp_resume(void)
+static Eina_Bool
+_e_sys_screensaver_unignore_delay(void *data EINA_UNUSED)
+{
+   _e_sys_screensaver_unignore_timer = NULL;
+   e_screensaver_unignore();
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_e_sys_comp_resume2(void *data EINA_UNUSED)
 {
    Eina_List *l;
    E_Zone *zone;
-   evas_damage_rectangle_add(e_comp->evas, 0, 0, e_comp->w, e_comp->h);
+
+   e_comp_screen_resume();
    EINA_LIST_FOREACH(e_comp->zones, l, zone)
      e_backlight_level_set(zone, e_config->backlight.normal, -1.0);
    _e_sys_comp_zones_fade("e,state,sys,resume", EINA_FALSE);
+   return EINA_FALSE;
+}
+
+static void
+_e_sys_comp_resume(void)
+{
+   ecore_evas_manual_render_set(e_comp->ee, EINA_FALSE);
+   evas_damage_rectangle_add(e_comp->evas, 0, 0, e_comp->w, e_comp->h);
+#ifndef HAVE_WAYLAND_ONLY
+   if (e_comp->comp_type == E_PIXMAP_TYPE_X)
+     {
+        ecore_x_dpms_force(EINA_FALSE);
+        ecore_x_screensaver_resume();
+        ecore_x_screensaver_reset();
+     }
+#endif
+#ifdef HAVE_WAYLAND
+   if (e_comp->comp_type != E_PIXMAP_TYPE_X)
+     {
+        if (e_comp->screen && e_comp->screen->dpms)
+          e_comp->screen->dpms(0);
+     }
+#endif
    e_screensaver_deactivate();
+   if (_e_sys_screensaver_unignore_timer)
+     ecore_timer_del(_e_sys_screensaver_unignore_timer);
+   _e_sys_screensaver_unignore_timer =
+     ecore_timer_add(0.5, _e_sys_screensaver_unignore_delay, NULL);
+   ecore_timer_add(1.5, _e_sys_comp_resume2, NULL);
 }
 
 /* externally accessible functions */
@@ -211,8 +280,14 @@ e_sys_init(void)
 EINTERN int
 e_sys_shutdown(void)
 {
+   if (_e_sys_screensaver_unignore_timer)
+     ecore_timer_del(_e_sys_screensaver_unignore_timer);
+   if (_e_sys_acpi_handler)
+     ecore_event_handler_del(_e_sys_acpi_handler);
    if (_e_sys_exe_exit_handler)
      ecore_event_handler_del(_e_sys_exe_exit_handler);
+   _e_sys_screensaver_unignore_timer = NULL;
+   _e_sys_acpi_handler = NULL;
    _e_sys_exe_exit_handler = NULL;
    _e_sys_halt_check_exe = NULL;
    _e_sys_reboot_check_exe = NULL;
@@ -467,11 +542,12 @@ _e_sys_systemd_hibernate(void)
    eldbus_proxy_call(login1_manger_proxy, "Hibernate", NULL, NULL, -1, "b", 0);
 }
 
-static void
-_e_sys_resume_job(void *d EINA_UNUSED)
+static Eina_Bool
+_e_sys_resume_delay(void *d EINA_UNUSED)
 {
    ecore_event_add(E_EVENT_SYS_RESUME, NULL, NULL, NULL);
    _e_sys_comp_resume();
+   return EINA_FALSE;
 }
 
 static Eina_Bool
@@ -479,10 +555,10 @@ _e_sys_susp_hib_check_timer_cb(void *data EINA_UNUSED)
 {
    double t = ecore_time_unix_get();
 
-   if ((t - _e_sys_susp_hib_check_last_tick) > 0.2)
+   if ((t - _e_sys_susp_hib_check_last_tick) > 0.5)
      {
         _e_sys_susp_hib_check_timer = NULL;
-        ecore_job_add(_e_sys_resume_job, NULL);
+        ecore_timer_add(0.2, _e_sys_resume_delay, NULL);
         return EINA_FALSE;
      }
    _e_sys_susp_hib_check_last_tick = t;
@@ -860,6 +936,32 @@ _e_sys_action_failed(void)
    e_dialog_show(dia);
 }
 
+static Eina_Bool
+_e_sys_cb_acpi_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+{
+   E_Event_Acpi *ev = event;
+
+   if (e_powersave_mode_get() == E_POWERSAVE_MODE_FREEZE)
+     {
+        if (((ev->type == E_ACPI_TYPE_LID) &&
+             (ev->status == E_ACPI_LID_OPEN)) ||
+            (ev->type == E_ACPI_TYPE_POWER) ||
+            (ev->type == E_ACPI_TYPE_SLEEP))
+          {
+             if (_e_sys_acpi_handler)
+               {
+                  ecore_event_handler_del(_e_sys_acpi_handler);
+                  _e_sys_acpi_handler = NULL;
+               }
+             e_powersave_mode_unforce();
+             ecore_timer_add(1.0, _e_sys_resume_delay, NULL);
+             // XXX: need some way of, at the system level, restoring
+             // system and devices back to running normally
+          }
+     }
+   return ECORE_CALLBACK_PASS_ON;
+}
+
 static int
 _e_sys_action_do(E_Sys_Action a, char *param EINA_UNUSED, Eina_Bool raw)
 {
@@ -990,16 +1092,36 @@ _e_sys_action_do(E_Sys_Action a, char *param 
EINA_UNUSED, Eina_Bool raw)
           {
              if (raw)
                {
-                  _e_sys_susp_hib_check();
                   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_suspend();
+                  if (e_config->suspend_connected_standby == 0)
+                    {
+                       _e_sys_susp_hib_check();
+                       if (systemd_works)
+                         _e_sys_systemd_suspend();
+                       else
+                         {
+                            _e_sys_exe = ecore_exe_run(buf, NULL);
+                            ret = 1;
+                         }
+                    }
                   else
                     {
-                       _e_sys_exe = ecore_exe_run(buf, NULL);
-                       ret = 1;
+                       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
+                       // ecore_exe_run("sleep 2 && echo freeze | sudo tee 
/sys/power/state", NULL);
                     }
                }
              else
diff --git a/src/modules/conf_performance/e_int_config_powermanagement.c 
b/src/modules/conf_performance/e_int_config_powermanagement.c
index 01e3bf816..8b3e14d13 100644
--- a/src/modules/conf_performance/e_int_config_powermanagement.c
+++ b/src/modules/conf_performance/e_int_config_powermanagement.c
@@ -21,6 +21,7 @@ struct _E_Config_Dialog_Data
    double powersave_extreme;
    E_Powersave_Mode powersave_min;
    E_Powersave_Mode powersave_max;
+   int suspend_connected_standby;
 };
 
 E_Config_Dialog *
@@ -56,6 +57,7 @@ _create_data(E_Config_Dialog *cfd EINA_UNUSED)
    cfdata->powersave_medium = e_config->powersave.medium;
    cfdata->powersave_high = e_config->powersave.high;
    cfdata->powersave_extreme = e_config->powersave.extreme;
+   cfdata->suspend_connected_standby = e_config->suspend_connected_standby;
    return cfdata;
 }
 
@@ -70,6 +72,7 @@ _free_data(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
 static int
 _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
 {
+   e_config->suspend_connected_standby = cfdata->suspend_connected_standby;
    e_config->powersave.none = cfdata->powersave_none;
    e_config->powersave.low = cfdata->powersave_low;
    e_config->powersave.medium = cfdata->powersave_medium;
@@ -92,7 +95,8 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
 static int
 _basic_check_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data 
*cfdata)
 {
-   return ((e_config->powersave.min != cfdata->powersave_min) ||
+   return ((e_config->suspend_connected_standby != 
cfdata->suspend_connected_standby) ||
+           (e_config->powersave.min != cfdata->powersave_min) ||
            (e_config->powersave.max != cfdata->powersave_max) ||
            (!EINA_DBL_EQ(e_config->powersave.none, cfdata->powersave_none)) ||
            (!EINA_DBL_EQ(e_config->powersave.low, cfdata->powersave_low)) ||
@@ -367,6 +371,16 @@ _basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas 
*evas, E_Config_Dialog_Data
                                       0.0, 0.5 //align
                                       );
 
+   y++;
+   ob = e_widget_check_add(evas, _("Connected standby instead of suspend"),
+                           &(cfdata->suspend_connected_standby));
+   e_widget_table_object_align_append(ol, ob,
+                                      0, y,    //place
+                                      4, 1,    //span
+                                      1, 1,    //fill
+                                      1, 0,    //expand
+                                      0.0, 0.5 //align
+                                      );
    return ol;
 }
 

-- 


Reply via email to