1 #include "e_mod_comp_shared_types.h"
2 #include "e_mod_comp.h"
3 #include "e_mod_comp_atoms.h"
4 #include "e_mod_comp_debug.h"
6 typedef enum _E_Comp_BG_Win_State
8 E_COMP_BG_WIN_STATE_NONE = 0,
9 E_COMP_BG_WIN_STATE_PARENT,
10 E_COMP_BG_WIN_STATE_CHILD,
11 E_COMP_BG_WIN_STATE_CHILD_WAIT_FOR_DAMAGE
12 } E_Comp_BG_Win_State;
16 E_Comp_BG_Win_State state;
21 Ecore_X_Window parent;
27 /* local subsystem functions */
28 static void _e_mod_comp_bg_win_fg_free(E_Comp_BG_Win *fg, E_Comp_Win *cw);
29 static void _e_mod_comp_bg_win_bg_free(E_Comp_BG_Win *bg, E_Comp_Win *cw);
30 static Eina_Bool _e_mod_comp_bg_win_get_prop(Ecore_X_Window win, Ecore_X_Window *wins);
31 static Eina_Bool _e_mod_comp_bg_win_setup(E_Comp_Win *cw, E_Comp_Win *cw2);
32 static Eina_Bool _e_mod_comp_bg_win_obj_set(E_Comp_Win *cw);
34 /* externally accessible functions */
36 e_mod_comp_bg_win_new(void)
39 bg = E_NEW(E_Comp_BG_Win, 1);
44 e_mod_comp_bg_win_free(E_Comp_BG_Win *bg)
48 if (bg->obj) evas_object_del(bg->obj);
51 cw = e_mod_comp_win_find(bg->win.self);
54 case E_COMP_BG_WIN_STATE_PARENT:
55 _e_mod_comp_bg_win_fg_free(bg, cw);
57 case E_COMP_BG_WIN_STATE_CHILD:
58 case E_COMP_BG_WIN_STATE_CHILD_WAIT_FOR_DAMAGE:
59 _e_mod_comp_bg_win_bg_free(bg, cw);
65 memset(bg, 0, sizeof(E_Comp_BG_Win));
70 e_mod_comp_bg_win_handler_prop(Ecore_X_Event_Window_Property *ev)
72 Eina_Bool res = EINA_FALSE;
74 Ecore_X_Window wins[2];
77 res = _e_mod_comp_bg_win_get_prop(ev->win, wins);
78 E_CHECK_RETURN(res, 0);
80 for (i = 0; i < 2; i++)
82 cw[i] = e_mod_comp_win_find(wins[i]);
85 cw[i] = e_mod_comp_border_client_find(wins[i]);
86 E_CHECK_RETURN(cw[i], 0);
90 res = _e_mod_comp_bg_win_setup(cw[0], cw[1]);
91 E_CHECK_RETURN(res, 0);
97 e_mod_comp_bg_win_handler_release(E_Comp_Win *cw)
99 E_CHECK_RETURN(cw, 0);
100 E_CHECK_RETURN(cw->bgwin, 0);
101 e_mod_comp_bg_win_free(cw->bgwin);
107 e_mod_comp_bg_win_handler_show(E_Comp_Win *cw)
109 Eina_Bool res = EINA_FALSE;
111 Ecore_X_Window wins[2];
113 res = _e_mod_comp_bg_win_get_prop
114 (e_mod_comp_util_client_xid_get(cw), wins);
115 E_CHECK_RETURN(res, 0);
117 cw2 = e_mod_comp_win_find(wins[1]);
120 cw2 = e_mod_comp_border_client_find(wins[1]);
121 E_CHECK_RETURN(cw2, 0);
124 res = _e_mod_comp_bg_win_setup(cw, cw2);
125 E_CHECK_RETURN(res, 0);
131 e_mod_comp_bg_win_handler_update(E_Comp_Win *cw)
135 E_CHECK_RETURN(cw, 0);
136 E_CHECK_RETURN(cw->bgwin, 0);
137 E_CHECK_RETURN(cw->bgwin->win.parent, 0);
138 if (cw->bgwin->state != E_COMP_BG_WIN_STATE_CHILD_WAIT_FOR_DAMAGE)
143 fgcw = e_mod_comp_win_find(cw->bgwin->win.parent);
144 E_CHECK_RETURN(fgcw, 0);
146 res = _e_mod_comp_bg_win_obj_set(fgcw);
147 E_CHECK_RETURN(res, 0);
149 cw->bgwin->state = E_COMP_BG_WIN_STATE_CHILD;
154 /* local subsystem functions */
156 _e_mod_comp_bg_win_fg_free(E_Comp_BG_Win *fg,
160 E_Comp_Win *bgcw, *fgcw;
161 E_CHECK(fg->win.child);
163 bgcw = e_mod_comp_win_find(fg->win.child);
168 E_CHECK(bg->win.parent);
170 fgcw = e_mod_comp_win_find(bg->win.parent);
179 _e_mod_comp_bg_win_bg_free(E_Comp_BG_Win *bg,
183 E_Comp_Win *fgcw, *bgcw;
184 E_CHECK(bg->win.parent);
186 fgcw = e_mod_comp_win_find(bg->win.parent);
191 E_CHECK(fg->win.child);
193 bgcw = e_mod_comp_win_find(fg->win.child);
200 e_mod_comp_bg_win_free(fg);
204 _e_mod_comp_bg_win_get_prop(Ecore_X_Window win,
205 Ecore_X_Window *wins)
207 Eina_Bool res = EINA_FALSE;
209 unsigned char *data = NULL;
210 ret = ecore_x_window_prop_property_get
211 (win, ATOM_NET_CM_WINDOW_BACKGROUND,
212 ECORE_X_ATOM_CARDINAL, 32, &data, &cnt);
213 E_CHECK_GOTO((ret > 0), cleanup);
214 E_CHECK_GOTO((data && (cnt == 2)), cleanup);
216 memcpy(wins, data, sizeof(Ecore_X_Window) * cnt);
221 if (data) E_FREE(data);
226 _e_mod_comp_bg_win_setup(E_Comp_Win *cw,
229 Eina_Bool res = EINA_FALSE;
231 if (TYPE_BG_CHECK(cw) ||
232 !TYPE_BG_CHECK(cw2) ||
239 e_mod_comp_bg_win_free(cw->bgwin);
241 cw->bgwin = e_mod_comp_bg_win_new();
242 E_CHECK_GOTO(cw->bgwin, cleanup);
243 cw->bgwin->state = E_COMP_BG_WIN_STATE_PARENT;
247 cw2->bgwin = e_mod_comp_bg_win_new();
248 E_CHECK_GOTO(cw2->bgwin, cleanup);
250 e_mod_comp_src_hidden_set_func
251 (NULL, NULL, (E_Manager_Comp_Source *)cw2, 1);
253 cw2->bgwin->hidden = EINA_TRUE;
256 cw->bgwin->win.child = cw2->win;
257 cw2->bgwin->win.parent = cw->win;
258 if (cw2->dmg_updates <= 1)
260 cw2->bgwin->state = E_COMP_BG_WIN_STATE_CHILD_WAIT_FOR_DAMAGE;
265 cw2->bgwin->state = E_COMP_BG_WIN_STATE_CHILD;
267 res = _e_mod_comp_bg_win_obj_set(cw);
268 E_CHECK_GOTO(res, cleanup);
273 if (!res && cw->bgwin)
275 e_mod_comp_bg_win_free(cw->bgwin);
282 _e_mod_comp_bg_win_obj_set(E_Comp_Win *cw)
288 Eina_Bool res = EINA_FALSE, set = EINA_FALSE;
289 E_CHECK_RETURN(cw->bgwin, 0);
291 cw2 = e_mod_comp_win_find(cw->bgwin->win.child);
292 E_CHECK_RETURN(cw2, 0);
296 cw->bgwin->w = cw2->pw;
297 cw->bgwin->h = cw2->ph;
298 cw->bgwin->obj = e_mod_comp_win_mirror_add(cw2);
299 E_CHECK_GOTO(cw->bgwin->obj, finish);
301 evas = evas_object_evas_get(cw->bgwin->obj);
302 E_CHECK_GOTO(evas, finish);
303 EINA_LIST_FOREACH(cw->objs, l, co)
306 if (evas == evas_object_evas_get(co->shadow))
308 res = edje_object_part_swallow
309 (co->shadow, "e.swallow.bgcontent",
311 E_CHECK_GOTO(res, finish);
315 E_CHECK_GOTO(set, finish);
320 e_mod_comp_src_hidden_set_func
321 (NULL, NULL, (E_Manager_Comp_Source *)cw2, 1);
322 cw2->bgwin->hidden = EINA_TRUE;
325 e_mod_comp_win_render_queue(cw);