e_output: add dpms_get and hook function 18/138618/4
authorBoram Park <boram1288.park@samsung.com>
Wed, 12 Jul 2017 06:35:43 +0000 (15:35 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 18 Jul 2017 05:53:12 +0000 (05:53 +0000)
Change-Id: I3f233a550981adf6005b1445a259e63035dc457b

src/bin/e_output.c
src/bin/e_output.h

index 617e836..247ee8d 100644 (file)
@@ -1,5 +1,44 @@
 #include "e.h"
 
+static int _e_output_hooks_delete = 0;
+static int _e_output_hooks_walking = 0;
+
+static Eina_Inlist *_e_output_hooks[] =
+{
+   [E_OUTPUT_HOOK_DPMS_CHANGE] = NULL,
+};
+
+static void
+_e_output_hooks_clean(void)
+{
+   Eina_Inlist *l;
+   E_Output_Hook *ch;
+   unsigned int x;
+   for (x = 0; x < E_OUTPUT_HOOK_LAST; x++)
+     EINA_INLIST_FOREACH_SAFE(_e_output_hooks[x], l, ch)
+       {
+          if (!ch->delete_me) continue;
+          _e_output_hooks[x] = eina_inlist_remove(_e_output_hooks[x], EINA_INLIST_GET(ch));
+         free(ch);
+       }
+}
+
+static void
+_e_output_hook_call(E_Output_Hook_Point hookpoint, E_Output *output)
+{
+   E_Output_Hook *ch;
+
+   _e_output_hooks_walking++;
+   EINA_INLIST_FOREACH(_e_output_hooks[hookpoint], ch)
+     {
+        if (ch->delete_me) continue;
+        ch->func(ch->data, output);
+     }
+   _e_output_hooks_walking--;
+   if ((_e_output_hooks_walking == 0) && (_e_output_hooks_delete > 0))
+     _e_output_hooks_clean();
+}
+
 static E_Client *
 _e_output_zoom_top_visible_ec_get()
 {
@@ -302,6 +341,9 @@ _e_output_cb_output_change(tdm_output *toutput,
           else edpms = e_output->dpms;
 
           e_output->dpms = edpms;
+
+          _e_output_hook_call(E_OUTPUT_HOOK_DPMS_CHANGE, e_output);
+
           break;
        default:
           break;
@@ -904,11 +946,17 @@ e_output_dpms_set(E_Output *output, E_OUTPUT_DPMS val)
         return EINA_FALSE;
      }
 
-   output->dpms = val;
-
    return EINA_TRUE;
 }
 
+E_API E_OUTPUT_DPMS
+e_output_dpms_get(E_Output *output)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(output, E_OUTPUT_DPMS_OFF);
+
+   return output->dpms;
+}
+
 EINTERN void
 e_output_size_get(E_Output *output, int *w, int *h)
 {
@@ -1396,3 +1444,30 @@ e_output_zoom_unset(E_Output *eout)
    DBG("e_output_zoom_unset: output:%s", eout->id);
 }
 
+E_API E_Output_Hook *
+e_output_hook_add(E_Output_Hook_Point hookpoint, E_Output_Hook_Cb func, const void *data)
+{
+   E_Output_Hook *ch;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_OUTPUT_HOOK_LAST, NULL);
+   ch = E_NEW(E_Output_Hook, 1);
+   if (!ch) return NULL;
+   ch->hookpoint = hookpoint;
+   ch->func = func;
+   ch->data = (void*)data;
+   _e_output_hooks[hookpoint] = eina_inlist_append(_e_output_hooks[hookpoint], EINA_INLIST_GET(ch));
+   return ch;
+}
+
+E_API void
+e_output_hook_del(E_Output_Hook *ch)
+{
+   ch->delete_me = 1;
+   if (_e_output_hooks_walking == 0)
+     {
+        _e_output_hooks[ch->hookpoint] = eina_inlist_remove(_e_output_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
+        free(ch);
+     }
+   else
+     _e_output_hooks_delete++;
+}
index 40e6c97..23aceb0 100644 (file)
@@ -3,6 +3,11 @@
 typedef struct _E_Output        E_Output;
 typedef struct _E_Output_Mode   E_Output_Mode;
 typedef enum   _E_Output_Dpms   E_OUTPUT_DPMS;
+
+typedef struct _E_Output_Hook   E_Output_Hook;
+typedef enum   _E_Output_Hook_Point E_Output_Hook_Point;
+typedef void (*E_Output_Hook_Cb) (void *data, E_Output *output);
+
 #else
 #ifndef E_OUTPUT_H
 #define E_OUTPUT_H
@@ -15,9 +20,9 @@ typedef enum   _E_Output_Dpms   E_OUTPUT_DPMS;
 enum _E_Output_Dpms
 {
    E_OUTPUT_DPMS_ON,
-   E_OUTPUT_DPMS_OFF,
    E_OUTPUT_DPMS_STANDBY,
-   E_OUTPUT_DPMS_SUSPEND
+   E_OUTPUT_DPMS_SUSPEND,
+   E_OUTPUT_DPMS_OFF,
 };
 
 struct _E_Output_Mode
@@ -81,6 +86,21 @@ struct _E_Output
    } zoom_conf;
 };
 
+enum _E_Output_Hook_Point
+{
+   E_OUTPUT_HOOK_DPMS_CHANGE,
+   E_OUTPUT_HOOK_LAST
+};
+
+struct _E_Output_Hook
+{
+   EINA_INLIST;
+   E_Output_Hook_Point hookpoint;
+   E_Output_Hook_Cb func;
+   void *data;
+   unsigned char delete_me : 1;
+};
+
 EINTERN Eina_Bool         e_output_init(void);
 EINTERN void              e_output_shutdown(void);
 EINTERN E_Output        * e_output_new(E_Comp_Screen *e_comp_screen, int index);
@@ -94,6 +114,7 @@ EINTERN Eina_Bool         e_output_setup(E_Output *output);
 EINTERN E_Output_Mode   * e_output_best_mode_find(E_Output *output);
 EINTERN Eina_Bool         e_output_connected(E_Output *output);
 EINTERN Eina_Bool         e_output_dpms_set(E_Output *output, E_OUTPUT_DPMS val);
+E_API E_OUTPUT_DPMS       e_output_dpms_get(E_Output *output);
 EINTERN void              e_output_size_get(E_Output *output, int *w, int *h);
 EINTERN E_Plane         * e_output_default_fb_target_get(E_Output *output);
 EINTERN Eina_Bool         e_output_fake_config_set(E_Output *output, int w, int h);
@@ -107,6 +128,9 @@ E_API Eina_Bool           e_output_is_fb_composing(E_Output *output);
 E_API Eina_Bool           e_output_is_fb_full_compositing(E_Output *output);
 E_API E_Plane           * e_output_fb_target_get(E_Output *output);
 E_API E_Plane           * e_output_plane_get_by_zpos(E_Output *output, int zpos);
+E_API E_Output_Hook     * e_output_hook_add(E_Output_Hook_Point hookpoint, E_Output_Hook_Cb func, const void *data);
+E_API void                e_output_hook_del(E_Output_Hook *ch);
+
 
 #endif
 #endif