3 struct _E_Powersave_Deferred_Action
5 void (*func)(void *data);
7 unsigned char delete_me : 1;
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);
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;
24 /* externally accessible functions */
26 e_powersave_init(void)
28 _e_powersave_mode_eval();
29 E_EVENT_POWERSAVE_UPDATE = ecore_event_type_new();
30 E_EVENT_POWERSAVE_CONFIG_UPDATE = ecore_event_type_new();
35 e_powersave_shutdown(void)
40 EAPI E_Powersave_Deferred_Action *
41 e_powersave_deferred_action_add(void (*func)(void *data), const void *data)
43 E_Powersave_Deferred_Action *pa;
45 pa = calloc(1, sizeof(E_Powersave_Deferred_Action));
47 if (deferred_timer) ecore_timer_del(deferred_timer);
48 deferred_timer = ecore_timer_add(defer_time,
49 _e_powersave_cb_deferred_timer,
53 deferred_actions = eina_list_append(deferred_actions, pa);
58 e_powersave_deferred_action_del(E_Powersave_Deferred_Action *pa)
60 if (walking_deferred_actions)
67 deferred_actions = eina_list_remove(deferred_actions, pa);
69 if (!deferred_actions)
73 ecore_timer_del(deferred_timer);
74 deferred_timer = NULL;
81 e_powersave_mode_set(E_Powersave_Mode mode)
83 E_Event_Powersave_Update *ev;
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;
92 ev = E_NEW(E_Event_Powersave_Update, 1);
94 ecore_event_add(E_EVENT_POWERSAVE_UPDATE, ev, _e_powersave_event_update_free, NULL);
95 _e_powersave_mode_eval();
99 e_powersave_mode_get(void)
101 return powersave_mode;
104 EAPI E_Powersave_Mode
105 e_powersave_mode_min_get(void)
107 return e_config->powersave.min;
110 EAPI E_Powersave_Mode
111 e_powersave_mode_max_get(void)
113 return e_config->powersave.max;
116 /* local subsystem functions */
119 _e_powersave_cb_deferred_timer(void *data __UNUSED__)
121 E_Powersave_Deferred_Action *pa;
123 walking_deferred_actions++;
124 EINA_LIST_FREE(deferred_actions, pa)
126 if (!pa->delete_me) pa->func((void *)pa->data);
129 walking_deferred_actions--;
130 if (!deferred_actions) deferred_timer = NULL;
131 return ECORE_CALLBACK_CANCEL;
135 _e_powersave_mode_eval(void)
139 switch (powersave_mode)
141 case E_POWERSAVE_MODE_NONE:
142 t = e_config->powersave.none; /* time to defer "power expensive" activities */
145 case E_POWERSAVE_MODE_LOW:
146 t = e_config->powersave.low;
149 case E_POWERSAVE_MODE_MEDIUM:
150 t = e_config->powersave.medium;
153 case E_POWERSAVE_MODE_HIGH:
154 t = e_config->powersave.high;
157 case E_POWERSAVE_MODE_EXTREME:
158 t = e_config->powersave.extreme;
167 if (deferred_timer) ecore_timer_del(deferred_timer);
168 deferred_timer = ecore_timer_add(defer_time,
169 _e_powersave_cb_deferred_timer,
176 _e_powersave_event_update_free(void *data __UNUSED__, void *event)