The problem that e17 couldn't move/resize window when the window fetch the rotation...
[platform/core/uifw/e17.git] / src / bin / e_powersave.c
1 #include "e.h"
2
3 struct _E_Powersave_Deferred_Action
4 {
5    void          (*func)(void *data);
6    const void   *data;
7    unsigned char delete_me : 1;
8 };
9
10 /* local subsystem functions */
11 static Eina_Bool _e_powersave_cb_deferred_timer(void *data);
12 static void      _e_powersave_mode_eval(void);
13 static void      _e_powersave_event_update_free(void *data __UNUSED__, void *event);
14
15 /* local subsystem globals */
16 EAPI int E_EVENT_POWERSAVE_UPDATE = 0;
17 EAPI int E_EVENT_POWERSAVE_CONFIG_UPDATE = 0;
18 static int walking_deferred_actions = 0;
19 static Eina_List *deferred_actions = NULL;
20 static Ecore_Timer *deferred_timer = NULL;
21 static E_Powersave_Mode powersave_mode = E_POWERSAVE_MODE_LOW;
22 static double defer_time = 5.0;
23
24 /* externally accessible functions */
25 EINTERN int
26 e_powersave_init(void)
27 {
28    _e_powersave_mode_eval();
29    E_EVENT_POWERSAVE_UPDATE = ecore_event_type_new();
30    E_EVENT_POWERSAVE_CONFIG_UPDATE = ecore_event_type_new();
31    return 1;
32 }
33
34 EINTERN int
35 e_powersave_shutdown(void)
36 {
37    return 1;
38 }
39
40 EAPI E_Powersave_Deferred_Action *
41 e_powersave_deferred_action_add(void (*func)(void *data), const void *data)
42 {
43    E_Powersave_Deferred_Action *pa;
44
45    pa = calloc(1, sizeof(E_Powersave_Deferred_Action));
46    if (!pa) return NULL;
47    if (deferred_timer) ecore_timer_del(deferred_timer);
48    deferred_timer = ecore_timer_add(defer_time,
49                                     _e_powersave_cb_deferred_timer,
50                                     NULL);
51    pa->func = func;
52    pa->data = data;
53    deferred_actions = eina_list_append(deferred_actions, pa);
54    return pa;
55 }
56
57 EAPI void
58 e_powersave_deferred_action_del(E_Powersave_Deferred_Action *pa)
59 {
60    if (walking_deferred_actions)
61      {
62         pa->delete_me = 1;
63         return;
64      }
65    else
66      {
67         deferred_actions = eina_list_remove(deferred_actions, pa);
68         free(pa);
69         if (!deferred_actions)
70           {
71              if (deferred_timer)
72                {
73                   ecore_timer_del(deferred_timer);
74                   deferred_timer = NULL;
75                }
76           }
77      }
78 }
79
80 EAPI void
81 e_powersave_mode_set(E_Powersave_Mode mode)
82 {
83    E_Event_Powersave_Update *ev;
84
85    if (mode < e_config->powersave.min) mode = e_config->powersave.min;
86    else if (mode > e_config->powersave.max)
87      mode = e_config->powersave.max;
88    if (powersave_mode == mode) return;
89    printf("CHANGE PW SAVE MODE TO %i / %i\n", (int)mode, E_POWERSAVE_MODE_EXTREME);
90    powersave_mode = mode;
91
92    ev = E_NEW(E_Event_Powersave_Update, 1);
93    ev->mode = mode;
94    ecore_event_add(E_EVENT_POWERSAVE_UPDATE, ev, _e_powersave_event_update_free, NULL);
95    _e_powersave_mode_eval();
96 }
97
98 EAPI E_Powersave_Mode
99 e_powersave_mode_get(void)
100 {
101    return powersave_mode;
102 }
103
104 EAPI E_Powersave_Mode
105 e_powersave_mode_min_get(void)
106 {
107    return e_config->powersave.min;
108 }
109
110 EAPI E_Powersave_Mode
111 e_powersave_mode_max_get(void)
112 {
113    return e_config->powersave.max;
114 }
115
116 /* local subsystem functions */
117
118 static Eina_Bool
119 _e_powersave_cb_deferred_timer(void *data __UNUSED__)
120 {
121    E_Powersave_Deferred_Action *pa;
122
123    walking_deferred_actions++;
124    EINA_LIST_FREE(deferred_actions, pa)
125      {
126         if (!pa->delete_me) pa->func((void *)pa->data);
127         free(pa);
128      }
129    walking_deferred_actions--;
130    if (!deferred_actions) deferred_timer = NULL;
131    return ECORE_CALLBACK_CANCEL;
132 }
133
134 static void
135 _e_powersave_mode_eval(void)
136 {
137    double t = 0.0;
138
139    switch (powersave_mode)
140      {
141       case E_POWERSAVE_MODE_NONE:
142         t = e_config->powersave.none; /* time to defer "power expensive" activities */
143         break;
144
145       case E_POWERSAVE_MODE_LOW:
146         t = e_config->powersave.low;
147         break;
148
149       case E_POWERSAVE_MODE_MEDIUM:
150         t = e_config->powersave.medium;
151         break;
152
153       case E_POWERSAVE_MODE_HIGH:
154         t = e_config->powersave.high;
155         break;
156
157       case E_POWERSAVE_MODE_EXTREME:
158         t = e_config->powersave.extreme;
159         break;
160
161       default:
162         return;
163         break;
164      }
165    if (t != defer_time)
166      {
167         if (deferred_timer) ecore_timer_del(deferred_timer);
168         deferred_timer = ecore_timer_add(defer_time,
169                                          _e_powersave_cb_deferred_timer,
170                                          NULL);
171         defer_time = t;
172      }
173 }
174
175 static void
176 _e_powersave_event_update_free(void *data __UNUSED__, void *event)
177 {
178    free(event);
179 }
180