2 #include "e_mod_comp_shared_types.h"
3 #include "e_mod_comp_atoms.h"
4 #include "e_mod_comp_debug.h"
5 #include "e_mod_comp.h"
6 #include "e_mod_comp_screen.h"
8 /* local subsystem functions */
9 static int _screen_angle_get(Ecore_X_Window root);
10 static void _screen_lock(E_Comp *c);
11 static void _screen_unlock(E_Comp *c);
12 static Eina_Bool _screen_lock_timeout(void *data);
14 /* externally accessible functions */
16 e_mod_comp_screen_rotation_init(E_Comp_Screen_Rotation *r,
21 E_CHECK_RETURN(root, 0);
22 E_CHECK_RETURN((w > 0), 0);
23 E_CHECK_RETURN((h > 0), 0);
25 r->enabled = EINA_FALSE;
28 r->angle = _screen_angle_get(root);
32 r->enabled = EINA_TRUE;
33 if (0 != (r->angle % 180))
43 e_mod_comp_screen_lock_init(E_Comp_Screen_Lock *l)
46 l->locked = EINA_FALSE;
52 e_mod_comp_screen_lock_handler_message(Ecore_X_Event_Client_Message *ev)
55 E_CHECK_RETURN(ev, 0);
56 E_CHECK_RETURN(_comp_mod->conf->use_lock_screen, 0);
58 c = e_mod_comp_find(ev->win);
61 if (ev->data.l[0] == 0) _screen_unlock(c);
62 else if (ev->data.l[0] == 1) _screen_lock(c);
68 e_mod_comp_screen_lock_func(void *data,
69 E_Manager *man __UNUSED__)
71 E_Comp *c = (E_Comp *)data;
77 e_mod_comp_screen_unlock_func(void *data,
78 E_Manager *man __UNUSED__)
80 E_Comp *c = (E_Comp *)data;
85 /* local subsystem functions */
87 _screen_angle_get(Ecore_X_Window root)
89 int ret = -1, ang = 0;
91 Ecore_X_Display* dpy = ecore_x_display_get();
92 E_CHECK_RETURN(dpy, 0);
93 E_CHECK_RETURN(ATOM_X_SCREEN_ROTATION, 0);
95 ret = ecore_x_window_prop_card32_get
96 (root, ATOM_X_SCREEN_ROTATION, &val, 1);
97 E_CHECK_RETURN((ret > 0), 0);
101 case 1: ang = 0; break;
102 case 2: ang = 90; break;
103 case 4: ang = 180; break;
104 case 8: ang = 270; break;
105 default: ang = 0; break;
112 _screen_lock(E_Comp *c)
115 E_Comp_Canvas *canvas;
118 E_CHECK(_comp_mod->conf->use_lock_screen);
119 E_CHECK(c->lock.locked != 1);
120 E_CHECK(!c->lock.timeout);
122 if (!_comp_mod->conf->lock_fps)
124 EINA_LIST_FOREACH(c->canvases, l, canvas)
126 if (!canvas) continue;
127 if (_comp_mod->conf->use_hwc)
129 if (c->hwcomp_funcs.set_full_composite)
130 c->hwcomp_funcs.set_full_composite(canvas->hwcomp);
131 #if HWC_ROTATION_PATCH
133 if (c->hwcomp_funcs.update_null_set_drawables)
134 c->hwcomp_funcs.update_null_set_drawables(canvas->hwcomp);
138 ecore_evas_manual_render_set(canvas->ee, 1);
142 c->lock.timeout = ecore_timer_add
143 (_comp_mod->conf->max_lock_screen_time,
144 _screen_lock_timeout, c);
146 c->lock.locked = EINA_TRUE;
150 _screen_unlock(E_Comp *c)
153 E_Comp_Canvas *canvas;
157 E_CHECK(_comp_mod->conf->use_lock_screen);
158 E_CHECK(c->lock.locked);
161 ecore_timer_del(c->lock.timeout);
162 c->lock.timeout = NULL;
165 // remove all cw->update_timeout
166 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
168 if ((!cw->visible) || (cw->input_only) || (cw->invalid))
170 if (cw->counter && cw->update_timeout)
173 e_mod_comp_win_damage_timeout((void*)cw);
177 // clear c->update_job
180 ecore_job_del(c->update_job);
181 c->update_job = NULL;
182 c->render_overflow = 0;
186 if (c->updates) e_mod_comp_cb_update(c);
188 EINA_LIST_FOREACH(c->canvases, l, canvas)
190 if (!canvas) continue;
192 if ((canvas->nocomp.mode == E_NOCOMP_MODE_NONE)
193 || (canvas->nocomp.mode == E_NOCOMP_MODE_PREPARE))
195 ecore_evas_manual_render(canvas->ee);
197 if (!_comp_mod->conf->lock_fps)
198 ecore_evas_manual_render_set(canvas->ee, 0);
206 _screen_lock_timeout(void *data)
208 E_Comp *c = (E_Comp*)data;
209 E_CHECK_RETURN(c, 0);