e_screensaver: add support for enabling and disabling screensaver.
authorGwanglim Lee <gl77.lee@samsung.com>
Thu, 21 Jul 2016 10:54:44 +0000 (19:54 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Mon, 25 Jul 2016 13:34:25 +0000 (22:34 +0900)
Change-Id: I0ed2f522071022c84131fe7ed4359d09701f333a

src/bin/e_screensaver.c
src/bin/e_screensaver.h

index 3df0024f0d4b7316e542917471ccdd1861c819c0..c6f541f7a01d97bf46bfc6d50ad0143e8e6c9233 100644 (file)
@@ -1,39 +1,54 @@
 #include "e.h"
 
+typedef struct _E_Screensaver
+{
+   Eina_List          *handlers;
+   Ecore_Idle_Enterer *idle_before;
+
+   double              idletime;
+   Ecore_Timer        *idletimer;
+
+   Eina_Bool           ev_update;
+   Eina_Bool           active; /* indicates that screensaver window is showing */
+   Eina_Bool           enable; /* indicates that screensaver feature is enabled */
+} E_Screensaver;
+
+static E_Screensaver *_saver = NULL;
+
 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;
 
-static Eina_List          *handlers = NULL;
-static double              _idle_time = 0.0;
-static Ecore_Idle_Enterer *_idle_before = NULL;
-static Eina_Bool           _ev_update = EINA_FALSE;
-static Ecore_Timer        *_event_idle_timer = NULL;
-static Eina_Bool           _scrsaver_active = EINA_FALSE;
+static Eina_Bool _e_scrsaver_cb_idletimeout(void *data EINA_UNUSED);
+static void      _e_scrsaver_idletimeout_reset(void);
+static Eina_Bool _e_scrsaver_cb_idle_before(void *data EINA_UNUSED);
+static Eina_Bool _e_scrsaver_cb_input(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED);
+static void      _e_scrsaver_active_set(Eina_Bool set);
 
 static Eina_Bool
-_e_scrsaver_idle_timeout_cb(void *data EINA_UNUSED)
+_e_scrsaver_cb_idletimeout(void *data EINA_UNUSED)
 {
-   _scrsaver_active = EINA_TRUE;
-   _event_idle_timer = NULL;
-   ecore_event_add(E_EVENT_SCREENSAVER_ON, NULL, NULL, NULL);
+   _e_scrsaver_active_set(EINA_TRUE);
+   _saver->idletimer = NULL;
    return EINA_FALSE;
 }
 
 static void
-_e_scrsaver_reset(void)
+_e_scrsaver_idletimeout_reset(void)
 {
-   if (_event_idle_timer)
+   if (_saver->idletimer)
      {
-        ecore_timer_del(_event_idle_timer);
-        _event_idle_timer = NULL;
+        ecore_timer_del(_saver->idletimer);
+        _saver->idletimer = NULL;
      }
 
-   if (_idle_time != 0.0)
+   if (!_saver->enable) return;
+
+   if (_saver->idletime != 0.0)
      {
-        _event_idle_timer =
-           ecore_timer_add(_idle_time,
-                           _e_scrsaver_idle_timeout_cb,
+        _saver->idletimer =
+           ecore_timer_add(_saver->idletime,
+                           _e_scrsaver_cb_idletimeout,
                            NULL);
      }
 }
@@ -41,17 +56,12 @@ _e_scrsaver_reset(void)
 static Eina_Bool
 _e_scrsaver_cb_idle_before(void *data EINA_UNUSED)
 {
-   if (!_ev_update) return ECORE_CALLBACK_RENEW;
+   if (!_saver) return ECORE_CALLBACK_RENEW;
+   if (!_saver->ev_update) return ECORE_CALLBACK_RENEW;
 
-   _e_scrsaver_reset();
-
-   if (_scrsaver_active)
-     {
-        ecore_event_add(E_EVENT_SCREENSAVER_OFF, NULL, NULL, NULL);
-        _scrsaver_active = EINA_FALSE;
-     }
-
-   _ev_update = EINA_FALSE;
+   _e_scrsaver_idletimeout_reset();
+   _e_scrsaver_active_set(EINA_FALSE);
+   _saver->ev_update = EINA_FALSE;
 
    return ECORE_CALLBACK_RENEW;
 }
@@ -59,10 +69,27 @@ _e_scrsaver_cb_idle_before(void *data EINA_UNUSED)
 static Eina_Bool
 _e_scrsaver_cb_input(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
 {
-   _ev_update = EINA_TRUE;
+   if (!_saver) return ECORE_CALLBACK_PASS_ON;
+   _saver->ev_update = EINA_TRUE;
    return ECORE_CALLBACK_PASS_ON;
 }
 
+static void
+_e_scrsaver_active_set(Eina_Bool set)
+{
+   int ev = -1;
+   if (set == _saver->active) return;
+
+   if (set)
+     ev = E_EVENT_SCREENSAVER_ON;
+   else
+     ev = E_EVENT_SCREENSAVER_OFF;
+
+   ecore_event_add(ev, NULL, NULL, NULL);
+
+   _saver->active = set;
+}
+
 EINTERN void
 e_screensaver_preinit(void)
 {
@@ -74,47 +101,82 @@ e_screensaver_preinit(void)
 EINTERN int
 e_screensaver_init(void)
 {
-   E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_MOVE,        _e_scrsaver_cb_input, NULL);
-   E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN, _e_scrsaver_cb_input, NULL);
-   E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_BUTTON_UP,   _e_scrsaver_cb_input, NULL);
-   E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_WHEEL,       _e_scrsaver_cb_input, NULL);
-
-   _idle_before = ecore_idle_enterer_before_add(_e_scrsaver_cb_idle_before, NULL);
-
+   if (!_saver)
+     {
+        _saver = E_NEW(E_Screensaver, 1);
+        _saver->idletime = 0.0;
+     }
    return 1;
 }
 
 EINTERN int
 e_screensaver_shutdown(void)
 {
-   E_FREE_LIST(handlers, ecore_event_handler_del);
-
-   if (_event_idle_timer) ecore_timer_del(_event_idle_timer);
-   _event_idle_timer = NULL;
-
-   if (_idle_before) ecore_idle_enterer_del(_idle_before);
-   _idle_before = NULL;
-
-   handlers = NULL;
-
+   e_screensaver_disable();
+   E_FREE(_saver);
    return 1;
 }
 
 E_API void
 e_screensaver_timeout_set(double time)
 {
-   _idle_time = time;
-   if (!_scrsaver_active) _e_scrsaver_reset();
+   if (!_saver) return;
+
+   _saver->idletime = time;
+   _e_scrsaver_idletimeout_reset();
 }
 
 E_API double
 e_screensaver_timeout_get(void)
 {
-   return _idle_time;
+   if (!_saver) return 0.0;
+   return _saver->idletime;
 }
 
 E_API void
 e_screensaver_notidle(void)
 {
-   _ev_update = EINA_TRUE;
+   _e_scrsaver_cb_input(NULL, 0, NULL);
+}
+
+E_API void
+e_screensaver_enable(void)
+{
+   if (!_saver) return;
+   if (_saver->enable) return;
+
+   _saver->enable = EINA_TRUE;
+   _saver->idle_before = ecore_idle_enterer_before_add(_e_scrsaver_cb_idle_before, NULL);
+
+   E_LIST_HANDLER_APPEND(_saver->handlers, ECORE_EVENT_MOUSE_MOVE,        _e_scrsaver_cb_input, NULL);
+   E_LIST_HANDLER_APPEND(_saver->handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN, _e_scrsaver_cb_input, NULL);
+   E_LIST_HANDLER_APPEND(_saver->handlers, ECORE_EVENT_MOUSE_BUTTON_UP,   _e_scrsaver_cb_input, NULL);
+   E_LIST_HANDLER_APPEND(_saver->handlers, ECORE_EVENT_MOUSE_WHEEL,       _e_scrsaver_cb_input, NULL);
+
+   _e_scrsaver_idletimeout_reset();
+}
+
+E_API void
+e_screensaver_disable(void)
+{
+   if (!_saver) return;
+   if (!_saver->enable) return;
+
+   _saver->enable = EINA_FALSE;
+   _e_scrsaver_active_set(EINA_FALSE);
+
+   E_FREE_LIST(_saver->handlers, ecore_event_handler_del);
+   _saver->handlers = NULL;
+
+   if (_saver->idletimer)
+     {
+        ecore_timer_del(_saver->idletimer);
+        _saver->idletimer = NULL;
+     }
+
+   if (_saver->idle_before)
+     {
+        ecore_idle_enterer_del(_saver->idle_before);
+        _saver->idle_before = NULL;
+     }
 }
index d736351dae9b2cb7d38c53942455f5657a24ef21..15553fb646da707287d8a532a47896208c79433c 100644 (file)
@@ -10,6 +10,8 @@ EINTERN int    e_screensaver_shutdown(void);
 E_API   void   e_screensaver_timeout_set(double time);
 E_API   double e_screensaver_timeout_get(void);
 E_API   void   e_screensaver_notidle(void);
+E_API   void   e_screensaver_enable(void);
+E_API   void   e_screensaver_disable(void);
 
 E_API extern int E_EVENT_SCREENSAVER_ON;
 E_API extern int E_EVENT_SCREENSAVER_OFF_PRE;