1 //////////////////////////////////////////////////////////////////////////
3 // TODO (no specific order):
4 // 1. abstract evas object and compwin so we can duplicate the object N times
5 // in N canvases - for winlist, everything, pager etc. too
6 // 2. implement "unmapped composite cache" -> N pixels worth of unmapped
7 // windows to be fully composited. only the most active/recent.
8 // 3. for unmapped windows - when window goes out of unmapped comp cachew
9 // make a miniature copy (1/4 width+height?) and set property on window
11 // 8. obey transparent property
12 // 9. shortcut lots of stuff to draw inside the compositor - shelf,
13 // wallpaper, efm - hell even menus and anything else in e (this is what
14 // e18 was mostly about)
15 // 10. fullscreen windows need to be able to bypass compositing *seems buggy*
17 //////////////////////////////////////////////////////////////////////////
21 #include "e_mod_main.h"
22 #include "e_mod_comp.h"
23 #include "e_mod_comp_update.h"
24 #include "e_mod_comp_rotation.h"
25 #include "e_mod_comp_data.h"
26 #include "e_mod_comp_animation.h"
35 #if COMP_LOGGER_BUILD_ENABLE
36 typedef struct _Comp_Logger Comp_Logger;
40 char logger_dump_file[256];
42 int comp_logger_type = LT_NOTHING;
43 #define STR_ATOM_CM_LOG "_E_COMP_LOG"
44 Ecore_X_Atom ATOM_CM_LOG = 0;
45 #define STR_ATOM_CM_LOG_DUMP_DONE "_E_COMP_LOG_DUMP_DONE"
46 Ecore_X_Atom ATOM_CM_LOG_DUMP_DONE = 0;
51 #define _WND_REQUEST_ANGLE_IDX 0
52 #define _WND_CURR_ANGLE_IDX 1
53 #define STR_ATOM_FAKE_LAUNCH_IMAGE "_E_COMP_FAKE_LAUNCH_IMAGE"
54 #define STR_ATOM_FAKE_LAUNCH "_E_COMP_FAKE_LAUNCH"
55 #define STR_ATOM_NET_CM_EFFECT_ENABLE "_NET_CM_EFFECT_ENABLE"
56 #define STR_ATOM_NET_CM_WINDOW_EFFECT_ENABLE "_NET_CM_WINDOW_EFFECT_ENABLE"
57 #define STR_ATOM_NET_CM_WINDOW_EFFECT_CLIENT_STATE "_NET_CM_WINDOW_EFFECT_CLIENT_STATE"
58 #define STR_ATOM_NET_CM_WINDOW_EFFECT_STATE "_NET_CM_WINDOW_EFFECT_STATE"
59 #define STR_ATOM_NET_CM_WINDOW_EFFECT_TYPE "_NET_CM_WINDOW_EFFECT_TYPE"
60 #define STR_ATOM_NET_CM_EFFECT_DEFAULT "_NET_CM_EFFECT_DEFAULT"
61 #define STR_ATOM_NET_CM_EFFECT_NONE "_NET_CM_EFFECT_NONE"
62 #define STR_ATOM_NET_CM_EFFECT_CUSTOM0 "_NET_CM_EFFECT_CUSTOM0"
63 #define STR_ATOM_NET_CM_EFFECT_CUSTOM1 "_NET_CM_EFFECT_CUSTOM1"
64 #define STR_ATOM_NET_CM_EFFECT_CUSTOM2 "_NET_CM_EFFECT_CUSTOM2"
65 #define STR_ATOM_NET_CM_EFFECT_CUSTOM3 "_NET_CM_EFFECT_CUSTOM3"
66 #define STR_ATOM_NET_CM_EFFECT_CUSTOM4 "_NET_CM_EFFECT_CUSTOM4"
67 #define STR_ATOM_NET_CM_EFFECT_CUSTOM5 "_NET_CM_EFFECT_CUSTOM5"
68 #define STR_ATOM_NET_CM_EFFECT_CUSTOM6 "_NET_CM_EFFECT_CUSTOM6"
69 #define STR_ATOM_NET_CM_EFFECT_CUSTOM7 "_NET_CM_EFFECT_CUSTOM7"
70 #define STR_ATOM_NET_CM_EFFECT_CUSTOM8 "_NET_CM_EFFECT_CUSTOM8"
71 #define STR_ATOM_NET_CM_EFFECT_CUSTOM9 "_NET_CM_EFFECT_CUSTOM9"
72 #define STR_ATOM_OVERAY_WINDOW "_E_COMP_OVERAY_WINDOW"
73 #define STR_ATOM_X_HIBERNATION_STATE "X_HIBERNATION_STATE"
74 #define STR_ATOM_X_SCREEN_ROTATION "X_SCREEN_ROTATION"
75 #define STR_ATOM_CM_LOCK_SCREEN "_E_COMP_LOCK_SCREEN"
76 #define STR_ATOM_CM_PIXMAP_ROTATION_SUPPORTED "_E_COMP_PIXMAP_ROTATION_SUPPORTED"
77 #define STR_ATOM_CM_PIXMAP_ROTATION_STATE "_E_COMP_PIXMAP_ROTATION_STATE"
78 #define STR_ATOM_CM_PIXMAP_ROTATION_BEGIN "_E_COMP_PIXMAP_ROTATION_BEGIN"
79 #define STR_ATOM_CM_PIXMAP_ROTATION_BEGIN_DONE "_E_COMP_PIXMAP_ROTATION_BEGIN_DONE"
80 #define STR_ATOM_CM_PIXMAP_ROTATION_END "_E_COMP_PIXMAP_ROTATION_END"
81 #define STR_ATOM_CM_PIXMAP_ROTATION_END_DONE "_E_COMP_PIXMAP_ROTATION_END_DONE"
82 #define STR_ATOM_CM_PIXMAP_ROTATION_REQUEST "_E_COMP_PIXMAP_ROTATION_REQUEST"
83 #define STR_ATOM_CM_PIXMAP_ROTATION_REQUEST_DONE "_E_COMP_PIXMAP_ROTATION_REQUEST_DONE"
84 #define STR_ATOM_CM_PIXMAP_ROTATION_RESIZE_PIXMAP "_E_COMP_PIXMAP_ROTATION_RESIZE_PIXMAP"
85 #define STR_ATOM_CAPTURE_EFFECT "_E_COMP_CAPTURE_EFFECT"
87 /* static global variables */
88 static Eina_List *handlers = NULL;
89 static Eina_List *compositors = NULL;
90 static Eina_Hash *windows = NULL;
91 static Eina_Hash *borders = NULL;
92 static Eina_Hash *damages = NULL;
93 static E_Comp *_comp = NULL;
95 /* global variables */
96 Ecore_X_Atom ATOM_FAKE_LAUNCH = 0;
97 Ecore_X_Atom ATOM_FAKE_LAUNCH_IMAGE = 0;
98 Ecore_X_Atom ATOM_EFFECT_ENABLE = 0;
99 Ecore_X_Atom ATOM_WINDOW_EFFECT_ENABLE = 0;
100 Ecore_X_Atom ATOM_WINDOW_EFFECT_CLIENT_STATE = 0;
101 Ecore_X_Atom ATOM_WINDOW_EFFECT_STATE = 0;
102 Ecore_X_Atom ATOM_WINDOW_EFFECT_TYPE = 0;
103 Ecore_X_Atom ATOM_EFFECT_DEFAULT = 0;
104 Ecore_X_Atom ATOM_EFFECT_NONE = 0;
105 Ecore_X_Atom ATOM_EFFECT_CUSTOM0 = 0;
106 Ecore_X_Atom ATOM_EFFECT_CUSTOM1 = 0;
107 Ecore_X_Atom ATOM_EFFECT_CUSTOM2 = 0;
108 Ecore_X_Atom ATOM_EFFECT_CUSTOM3 = 0;
109 Ecore_X_Atom ATOM_EFFECT_CUSTOM4 = 0;
110 Ecore_X_Atom ATOM_EFFECT_CUSTOM5 = 0;
111 Ecore_X_Atom ATOM_EFFECT_CUSTOM6 = 0;
112 Ecore_X_Atom ATOM_EFFECT_CUSTOM7 = 0;
113 Ecore_X_Atom ATOM_EFFECT_CUSTOM8 = 0;
114 Ecore_X_Atom ATOM_EFFECT_CUSTOM9 = 0;
115 Ecore_X_Atom ATOM_OVERAY_WINDOW = 0;
116 Ecore_X_Atom ATOM_X_HIBERNATION_STATE = 0;
117 Ecore_X_Atom ATOM_X_SCREEN_ROTATION = 0;
118 Ecore_X_Atom ATOM_CM_LOCK_SCREEN = 0;
119 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_SUPPORTED = 0;
120 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_STATE = 0;
121 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_BEGIN = 0;
122 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_BEGIN_DONE = 0;
123 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_END = 0;
124 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_END_DONE = 0;
125 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_REQUEST = 0;
126 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_REQUEST_DONE = 0;
127 Ecore_X_Atom ATOM_CM_PIXMAP_ROTATION_RESIZE_PIXMAP= 0;
128 Ecore_X_Atom ATOM_CAPTURE_EFFECT = 0;
130 /* static functions */
131 static void _e_mod_comp_set (E_Comp *c);
132 E_Comp * _e_mod_comp_get (void);
133 static void _e_mod_comp_render_queue (E_Comp *c);
134 static void _e_mod_comp_win_damage (E_Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg);
135 static void _e_mod_comp_win_del (E_Comp_Win *cw);
136 static void _e_mod_comp_win_real_hide (E_Comp_Win *cw);
137 static void _e_mod_comp_win_hide (E_Comp_Win *cw);
138 static void _e_mod_comp_win_configure (E_Comp_Win *cw, int x, int y, int w, int h, int border);
139 static void _e_mod_comp_screen_lock (E_Comp *c);
140 static void _e_mod_comp_screen_unlock (E_Comp *c);
141 static Eina_Bool _e_mod_comp_screen_lock_timeout (void *data);
142 static void _e_mod_comp_screen_lock_func (void *data, E_Manager *man __UNUSED__);
143 static void _e_mod_comp_screen_unlock_func (void *data, E_Manager *man __UNUSED__);
144 static Eina_Bool _e_mod_comp_win_rotation_begin_timeout (void *data);
145 static Eina_Bool _e_mod_comp_win_rotation_end_timeout (void *data);
146 static Eina_Bool _e_mod_comp_win_damage_timeout (void *data);
147 static void _e_mod_comp_win_raise (E_Comp_Win *cw);
148 static void _e_mod_comp_win_lower (E_Comp_Win *cw);
149 static void _e_mod_comp_win_unredirect (E_Comp_Win *cw);
150 static E_Comp_Win * _e_mod_comp_win_find (Ecore_X_Window win);
151 static Eina_Bool _e_mod_comp_win_add_damage (E_Comp_Win *cw, Ecore_X_Damage damage);
152 static Eina_Bool _e_mod_comp_win_del_damage (E_Comp_Win *cw, Ecore_X_Damage damage);
153 static E_Comp_Win * _e_mod_comp_border_client_find (Ecore_X_Window win);
154 static void _e_mod_comp_win_recreate_shobj (E_Comp_Win *cw);
155 static void _e_mod_comp_win_cb_setup (E_Comp_Win *cw);
156 static Eina_Bool _e_mod_comp_is_next_win_stack (E_Comp_Win *cw, E_Comp_Win *cw2);
157 static Eina_Bool _e_mod_comp_get_edje_error (E_Comp_Win *cw);
158 static void _e_mod_comp_atom_init (void);
159 static Eina_Bool _e_mod_comp_cb_update (E_Comp *c);
160 static Ecore_X_Window _e_mod_comp_win_get_client_xid (E_Comp_Win *cw);
161 static Eina_Bool _e_mod_comp_win_is_border (E_Comp_Win *cw);
163 /* non-static functions */
164 void _e_mod_comp_done_defer (E_Comp_Win *cw);
165 void _e_mod_comp_cb_pending_after (void *data __UNUSED__, E_Manager *man __UNUSED__, E_Manager_Comp_Source *src);
166 E_Comp * _e_mod_comp_find (Ecore_X_Window root);
167 Eina_Bool _e_mod_comp_fake_launch_timeout (void *data);
168 void _e_mod_comp_win_render_queue (E_Comp_Win *cw);
169 void _e_mod_comp_send_window_effect_client_state (E_Comp_Win *cw, Eina_Bool effect_state);
170 Eina_Bool _e_mod_comp_win_check_visible (E_Comp_Win *cw);
171 Eina_Bool _e_mod_comp_win_check_visible3 (E_Comp_Win *cw);
172 E_Comp_Win * _e_mod_comp_win_transient_parent_find (E_Comp_Win * cw);
173 E_Comp_Win * _e_mod_comp_win_find_background_win (E_Comp_Win * cw);
174 E_Comp_Win * _e_mod_comp_win_find_by_indicator (E_Comp *c);
175 E_Comp_Win * _e_mod_comp_win_find_fake_background_win (E_Comp *c);
176 void _e_mod_comp_disable_touch_event_block (E_Comp *c);
177 void _e_mod_comp_enable_touch_event_block (E_Comp *c);
178 void _e_mod_comp_win_inc_animating (E_Comp_Win *cw);
179 void _e_mod_comp_win_dec_animating (E_Comp_Win *cw);
180 void ecore_x_e_comp_dri_buff_flip_supported_set (Ecore_X_Window root, Eina_Bool enabled); // TODO
182 /* extern functions */
183 extern Eina_Bool _e_mod_comp_is_quickpanel_window (E_Border *bd);
184 extern Eina_Bool _e_mod_comp_is_task_manager_window (E_Border *bd);
185 extern Eina_Bool _e_mod_comp_is_live_magazine_window (E_Border *bd);
186 extern Eina_Bool _e_mod_comp_is_lock_screen_window (E_Border *bd);
187 extern Eina_Bool _e_mod_comp_is_indicator_window (E_Border *bd);
188 extern Eina_Bool _e_mod_comp_is_isf_main_window (E_Border *bd);
189 extern Eina_Bool _e_mod_comp_is_isf_sub_window (E_Border *bd);
190 extern Eina_Bool _e_mod_comp_is_normal_window (E_Border *bd);
191 extern Eina_Bool _e_mod_comp_is_tooltip_window (E_Border *bd);
192 extern Eina_Bool _e_mod_comp_is_combo_window (E_Border *bd);
193 extern Eina_Bool _e_mod_comp_is_dnd_window (E_Border *bd);
194 extern Eina_Bool _e_mod_comp_is_desktop_window (E_Border *bd);
195 extern Eina_Bool _e_mod_comp_is_toolbar_window (E_Border *bd);
196 extern Eina_Bool _e_mod_comp_is_menu_window (E_Border *bd);
197 extern Eina_Bool _e_mod_comp_is_splash_window (E_Border *bd);
198 extern Eina_Bool _e_mod_comp_is_drop_down_menu_window (E_Border *bd);
199 extern Eina_Bool _e_mod_comp_is_notification_window (E_Border *bd);
200 extern Eina_Bool _e_mod_comp_is_utility_window (E_Border *bd);
201 extern Eina_Bool _e_mod_comp_is_popup_menu_window (E_Border *bd);
202 extern Eina_Bool _e_mod_comp_is_dialog_window (E_Border *bd);
203 extern void _e_mod_comp_window_effect_policy (E_Comp_Win *cw);
204 extern Eina_Bool _e_mod_comp_window_restack_policy (E_Comp_Win *cw, E_Comp_Win *cw2);
205 extern Eina_Bool _e_mod_comp_window_rotation_policy (E_Comp_Win *cw);
206 extern int _e_mod_comp_shadow_policy (E_Comp_Win *cw);
207 extern void _e_mod_comp_window_show_effect (E_Comp_Win *cw);
208 extern void _e_mod_comp_window_hide_effect (E_Comp_Win *cw);
209 extern void _e_mod_comp_window_restack_effect (E_Comp_Win *cw, E_Comp_Win *cw2);
210 extern void _e_mod_comp_disable_effect_stage (E_Comp *c);
211 extern Eina_Bool _e_mod_comp_fake_show (Ecore_X_Event_Client_Message *ev);
212 extern Eina_Bool _e_mod_comp_fake_hide (Ecore_X_Event_Client_Message *ev);
213 extern void _e_mod_comp_disable_fake_launch (E_Comp *c);
214 extern E_Comp_Effect_Type _e_mod_comp_get_effect_type (Ecore_X_Atom *atom);
215 extern void _e_mod_comp_window_lower_effect (E_Comp_Win *cw, E_Comp_Win *cw2);
218 _e_mod_comp_capture_effect( Ecore_X_Event_Client_Message *ev )
222 if ( ev == NULL ) return ECORE_CALLBACK_PASS_ON;
223 c = _e_mod_comp_find(ev->win);
224 if (!c) return ECORE_CALLBACK_PASS_ON;
226 evas_object_show(c->capture_effect_obj);
227 evas_object_raise(c->capture_effect_obj);
228 edje_object_signal_emit(c->capture_effect_obj, "img,state,capture,on", "img");
230 return ECORE_CALLBACK_PASS_ON;
234 _e_mod_comp_capture_effect_show_done(void *data,
235 Evas_Object *obj __UNUSED__,
236 const char *emission __UNUSED__,
237 const char *source __UNUSED__)
239 E_Comp *c = (E_Comp*)data;
241 evas_object_hide(c->capture_effect_obj);
245 _e_mod_comp_get_edje_error(E_Comp_Win *cw)
247 int error = EDJE_LOAD_ERROR_NONE;
249 if ((error = edje_object_load_error_get(cw->shobj)) != EDJE_LOAD_ERROR_NONE)
251 Ecore_X_Window win = _e_mod_comp_win_get_client_xid(cw);
254 case EDJE_LOAD_ERROR_GENERIC: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_GENERIC! win:0x%08x\n", win); break;
255 case EDJE_LOAD_ERROR_DOES_NOT_EXIST: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_DOES_NOT_EXIST! win:0x%08x\n", win); break;
256 case EDJE_LOAD_ERROR_PERMISSION_DENIED: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_PERMISSION_DENIED! win:0x%08x\n", win); break;
257 case EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED! win:0x%08x\n", win); break;
258 case EDJE_LOAD_ERROR_CORRUPT_FILE: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_CORRUPT_FILE! win:0x%08x\n", win); break;
259 case EDJE_LOAD_ERROR_UNKNOWN_FORMAT: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_UNKNOWN_FORMAT! win:0x%08x\n", win); break;
260 case EDJE_LOAD_ERROR_INCOMPATIBLE_FILE: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_INCOMPATIBLE_FILE! win:0x%08x\n", win); break;
261 case EDJE_LOAD_ERROR_UNKNOWN_COLLECTION: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_UNKNOWN_COLLECTION! win:0x%08x\n", win); break;
262 case EDJE_LOAD_ERROR_RECURSIVE_REFERENCE: fprintf(stderr, "[E17-comp] EDJE_LOAD_ERROR_RECURSIVE_REFERENCE! win:0x%08x\n", win); break;
272 static Ecore_X_Window
273 _e_mod_comp_win_get_client_xid(E_Comp_Win *cw)
276 if (cw->bd) return cw->bd->client.win;
281 _e_mod_comp_win_is_border(E_Comp_Win *cw)
283 if (!cw) return EINA_FALSE;
284 if (cw->bd) return EINA_TRUE;
285 else return EINA_FALSE;
289 _e_mod_comp_fps_update(E_Comp *c)
291 if (_comp_mod->conf->fps_show)
295 c->fps_bg = evas_object_rectangle_add(c->evas);
296 evas_object_color_set(c->fps_bg, 0, 0, 0, 128);
297 evas_object_layer_set(c->fps_bg, EVAS_LAYER_MAX);
298 evas_object_show(c->fps_bg);
300 c->fps_fg = evas_object_text_add(c->evas);
301 evas_object_text_font_set(c->fps_fg, "Sans", 10);
302 evas_object_text_text_set(c->fps_fg, "???");
303 evas_object_color_set(c->fps_fg, 255, 255, 255, 255);
304 evas_object_layer_set(c->fps_fg, EVAS_LAYER_MAX);
305 evas_object_show(c->fps_fg);
312 evas_object_del(c->fps_fg);
317 evas_object_del(c->fps_bg);
324 _e_mod_comp_fps_toggle(void)
331 if (_comp_mod->conf->fps_show)
333 _comp_mod->conf->fps_show = 0;
334 e_config_save_queue();
338 _comp_mod->conf->fps_show = 1;
339 e_config_save_queue();
341 EINA_LIST_FOREACH(compositors, l, c) _e_mod_comp_cb_update(c);
346 _e_mod_comp_get_atom_name(Ecore_X_Atom a)
350 if (ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE && a == ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE ) return "SYNC_DRAW_DONE";
351 else if (ECORE_X_ATOM_E_COMP_SYNC_COUNTER && a == ECORE_X_ATOM_E_COMP_SYNC_COUNTER ) return "SYNC_COUNTER";
352 else if (ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE && a == ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE) return "WIN_ROT_ANGLE";
353 else if (ECORE_X_ATOM_NET_WM_WINDOW_OPACITY && a == ECORE_X_ATOM_NET_WM_WINDOW_OPACITY ) return "WM_WINDOW_OPACITY";
354 else if (ATOM_EFFECT_ENABLE && a == ATOM_EFFECT_ENABLE ) return "CM_EFFECT_ENABLE";
355 else if (ATOM_WINDOW_EFFECT_ENABLE && a == ATOM_WINDOW_EFFECT_ENABLE ) return "WINDOW_EFFECT_ENABLE";
356 else if (ATOM_WINDOW_EFFECT_CLIENT_STATE && a == ATOM_WINDOW_EFFECT_CLIENT_STATE ) return "EFFECT_CLIENT_STATE";
357 else if (ATOM_WINDOW_EFFECT_STATE && a == ATOM_WINDOW_EFFECT_STATE ) return "EFFECT_STATE";
358 else if (ATOM_WINDOW_EFFECT_TYPE && a == ATOM_WINDOW_EFFECT_TYPE ) return "EFFECT_TYPE";
359 else if (ATOM_EFFECT_DEFAULT && a == ATOM_EFFECT_DEFAULT ) return "EFFECT_DEFAULT";
360 else if (ATOM_EFFECT_NONE && a == ATOM_EFFECT_NONE ) return "EFFECT_NONE";
361 else if (ATOM_EFFECT_CUSTOM0 && a == ATOM_EFFECT_CUSTOM0 ) return "EFFECT_CUSTOM0";
362 else if (ATOM_EFFECT_CUSTOM1 && a == ATOM_EFFECT_CUSTOM1 ) return "EFFECT_CUSTOM1";
363 else if (ATOM_EFFECT_CUSTOM2 && a == ATOM_EFFECT_CUSTOM2 ) return "EFFECT_CUSTOM2";
364 else if (ATOM_EFFECT_CUSTOM3 && a == ATOM_EFFECT_CUSTOM3 ) return "EFFECT_CUSTOM3";
365 else if (ATOM_EFFECT_CUSTOM4 && a == ATOM_EFFECT_CUSTOM4 ) return "EFFECT_CUSTOM4";
366 else if (ATOM_EFFECT_CUSTOM5 && a == ATOM_EFFECT_CUSTOM5 ) return "EFFECT_CUSTOM5";
367 else if (ATOM_EFFECT_CUSTOM6 && a == ATOM_EFFECT_CUSTOM6 ) return "EFFECT_CUSTOM6";
368 else if (ATOM_EFFECT_CUSTOM7 && a == ATOM_EFFECT_CUSTOM7 ) return "EFFECT_CUSTOM7";
369 else if (ATOM_EFFECT_CUSTOM8 && a == ATOM_EFFECT_CUSTOM8 ) return "EFFECT_CUSTOM8";
370 else if (ATOM_EFFECT_CUSTOM9 && a == ATOM_EFFECT_CUSTOM9 ) return "EFFECT_CUSTOM9";
371 else if (ATOM_FAKE_LAUNCH_IMAGE && a == ATOM_FAKE_LAUNCH_IMAGE ) return "FAKE_LAUNCH_IMAGE";
372 else if (ATOM_FAKE_LAUNCH && a == ATOM_FAKE_LAUNCH ) return "FAKE_LAUNCH";
373 else if (ATOM_CM_LOCK_SCREEN && a == ATOM_CM_LOCK_SCREEN ) return "LOCK_SCREEN";
374 else if (ATOM_CM_PIXMAP_ROTATION_SUPPORTED && a == ATOM_CM_PIXMAP_ROTATION_SUPPORTED ) return "PIX_ROT_SUPPORTED";
375 else if (ATOM_CM_PIXMAP_ROTATION_STATE && a == ATOM_CM_PIXMAP_ROTATION_STATE ) return "PIX_ROT_STATE";
376 else if (ATOM_CM_PIXMAP_ROTATION_BEGIN && a == ATOM_CM_PIXMAP_ROTATION_BEGIN ) return "PIX_ROT_BEGIN";
377 else if (ATOM_CM_PIXMAP_ROTATION_BEGIN_DONE && a == ATOM_CM_PIXMAP_ROTATION_BEGIN_DONE ) return "PIX_ROT_BEGIN_DONE";
378 else if (ATOM_CM_PIXMAP_ROTATION_END && a == ATOM_CM_PIXMAP_ROTATION_END ) return "PIX_ROT_END";
379 else if (ATOM_CM_PIXMAP_ROTATION_END_DONE && a == ATOM_CM_PIXMAP_ROTATION_END_DONE ) return "PIX_ROT_END_DONE";
380 else if (ATOM_CM_PIXMAP_ROTATION_REQUEST && a == ATOM_CM_PIXMAP_ROTATION_REQUEST ) return "PIX_ROT_REQUEST";
381 else if (ATOM_CM_PIXMAP_ROTATION_REQUEST_DONE && a == ATOM_CM_PIXMAP_ROTATION_REQUEST_DONE ) return "PIX_ROT_REQUEST_DONE";
382 else if (ATOM_CM_PIXMAP_ROTATION_RESIZE_PIXMAP && a == ATOM_CM_PIXMAP_ROTATION_RESIZE_PIXMAP ) return "PIX_ROT_RESIZE_PIXMAP";
383 else if (ATOM_OVERAY_WINDOW && a == ATOM_OVERAY_WINDOW ) return "OVERAY_WINDOW";
384 else if (ATOM_X_HIBERNATION_STATE && a == ATOM_X_HIBERNATION_STATE ) return "HIBERNATION_STATE";
385 else if (ATOM_X_SCREEN_ROTATION && a == ATOM_X_SCREEN_ROTATION ) return "SCREEN_ROTATION";
386 #if COMP_LOGGER_BUILD_ENABLE
387 else if (ATOM_CM_LOG && a == ATOM_CM_LOG ) return "CM_LOG";
388 else if (ATOM_CM_LOG_DUMP_DONE && a == ATOM_CM_LOG_DUMP_DONE ) return "CM_LOG_DUMP_DONE";
389 #endif /* COMP_LOGGER_BUILD_ENABLE */
395 _e_mod_comp_rotation_release(E_Comp_Win *cw)
397 if (!cw || !cw->rotating || !cw->rotobj) return EINA_FALSE;
400 "[COMP] %31s w:0x%08x bd:%s release rotobj. animating:%d\n",
401 "PIX_ROT", _e_mod_comp_win_get_client_xid(cw),
402 cw->bd ? "O" : "X", cw->animating);
410 cw->rotating = EINA_FALSE;
412 Ecore_X_Damage damage;
413 damage = e_mod_comp_rotation_get_damage(cw->rotobj);
414 if (damage) _e_mod_comp_win_del_damage(cw, damage);
416 e_mod_comp_rotation_end(cw->rotobj);
417 e_mod_comp_rotation_free(cw->rotobj);
420 e_mod_comp_rotation_done_send
421 (_e_mod_comp_win_get_client_xid(cw),
422 ATOM_CM_PIXMAP_ROTATION_END_DONE);
425 "[COMP] %31s w:0x%08x send END_DONE.\n",
426 "PIX_ROT", _e_mod_comp_win_get_client_xid(cw));
432 _e_mod_comp_rotation_handle_message(Ecore_X_Event_Client_Message *ev)
434 Ecore_X_Atom type = ev->message_type;
436 E_Comp_Win *cw = NULL;
438 cw = _e_mod_comp_border_client_find(ev->win);
441 cw = _e_mod_comp_win_find(ev->win);
447 if (type == ATOM_CM_PIXMAP_ROTATION_BEGIN)
450 "[COMP] %31s w:0x%08x bd:%d c:0x%08x cw:%p\n",
451 "PIX_ROT", win, _e_mod_comp_win_is_border(cw),
452 _e_mod_comp_win_get_client_xid(cw), cw);
454 if (cw->rotating || cw->rotobj)
457 "[COMP] %31s w:0x%08x invalid BEGIN_REQUEST. rotating:%d rotobj:%p\n",
458 "PIX_ROT", ev->win, cw->rotating, cw->rotobj);
463 "[COMP] %31s w:0x%08x BEGIN_REQUEST.\n",
466 cw->rotobj = e_mod_comp_rotation_new();
467 if (!cw->rotobj) return 0;
469 cw->rotating = EINA_TRUE;
471 edje_object_part_unswallow(cw->shobj, cw->obj);
472 _e_mod_comp_win_unredirect(cw);
474 e_mod_comp_rotation_done_send
475 (win, ATOM_CM_PIXMAP_ROTATION_BEGIN_DONE);
478 "[COMP] %31s w:0x%08x send BEGIN_DONE.\n",
481 else if (type == ATOM_CM_PIXMAP_ROTATION_END)
484 "[COMP] %31s w:0x%08x bd:%d c:0x%08x cw:%p\n",
485 "PIX_ROT", win, _e_mod_comp_win_is_border(cw),
486 _e_mod_comp_win_get_client_xid(cw), cw);
488 if (!cw->rotating || !cw->rotobj)
491 "[COMP] %31s w:0x%08x invalid END_REQUEST. rotating:%d rotobj:%p\n",
492 "PIX_ROT", ev->win, cw->rotating, cw->rotobj);
496 _e_mod_comp_win_dec_animating(cw);
499 "[COMP] %31s w:0x%08x end END_REQUEST. release rotobj.\n",
502 _e_mod_comp_rotation_release(cw);
504 else if (type == ATOM_CM_PIXMAP_ROTATION_REQUEST)
507 "[COMP] %31s w:0x%08x bd:%d c:0x%08x cw:%p\n",
508 "PIX_ROT", win, _e_mod_comp_win_is_border(cw),
509 _e_mod_comp_win_get_client_xid(cw), cw);
511 if (!cw->rotating || !cw->rotobj)
514 "[COMP] %31s w:0x%08x invalid ROTATION_REQUEST. rotating:%d rotobj:%p\n",
515 "PIX_ROT", ev->win, cw->rotating, cw->rotobj);
520 "[COMP] %31s w:0x%08x ROTATION_REQUEST.\n",
523 Ecore_X_Damage damage;
524 damage = e_mod_comp_rotation_get_damage(cw->rotobj);
525 if (damage) _e_mod_comp_win_del_damage(cw, damage);
528 edje_object_part_unswallow(cw->shobj, cw->obj);
534 "[COMP] %31s w:0x%08x can't create cw->obj. cw->c:NULL\n",
539 cw->obj = evas_object_image_filled_add(cw->c->evas);
540 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
543 evas_object_image_alpha_set(cw->obj, 1);
545 evas_object_image_alpha_set(cw->obj, 0);
547 evas_object_show(cw->obj);
548 evas_object_pass_events_set(cw->obj, 1);
551 "[COMP] %31s w:0x%08x create cw->obj:%p (alpha:%d).\n",
552 "PIX_ROT", ev->win, cw->obj, cw->argb);
555 if (!e_mod_comp_rotation_request(cw->rotobj,
561 cw->x, cw->y, cw->w, cw->h))
564 "[COMP] %31s w:0x%08x e_mod_comp_rotation_request() failed.\n",
569 e_mod_comp_update_resize(cw->up, cw->w, cw->h);
570 e_mod_comp_update_add(cw->up, 0, 0, cw->w, cw->h);
574 damage = e_mod_comp_rotation_get_damage(cw->rotobj);
575 if (!damage) return 0;
576 _e_mod_comp_win_add_damage(cw, damage);
577 e_mod_comp_rotation_done_send(win, ATOM_CM_PIXMAP_ROTATION_REQUEST_DONE);
580 "[COMP] %31s w:0x%08x send ROTATION_DONE.\n",
590 _e_mod_comp_win_add_damage(E_Comp_Win *cw,
591 Ecore_X_Damage damage)
593 return eina_hash_add(damages, e_util_winid_str_get(damage), cw);
597 _e_mod_comp_win_del_damage(E_Comp_Win *cw,
598 Ecore_X_Damage damage)
600 return eina_hash_del(damages, e_util_winid_str_get(damage), cw);
604 _e_mod_comp_win_get_prop_angle(Ecore_X_Window win,
608 Eina_Bool res = EINA_FALSE;
610 int angle[2] = {-1, -1};
611 unsigned char* prop_data = NULL;
613 ret = ecore_x_window_prop_property_get(win,
614 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
615 ECORE_X_ATOM_CARDINAL,
621 if (prop_data) free(prop_data);
624 if (ret && prop_data)
626 memcpy (&angle, prop_data, sizeof (int)*count);
627 if (count == 2) res = EINA_TRUE;
630 if (prop_data) free(prop_data);
632 *req = angle[_WND_REQUEST_ANGLE_IDX];
633 *curr = angle[_WND_CURR_ANGLE_IDX];
635 if (angle[0] == -1 && angle[1] == -1) res = EINA_FALSE;
637 L(LT_EVENT_X, "[COMP] %31s %d=>%d count:%d res:%s\n", \
639 angle[_WND_CURR_ANGLE_IDX], \
640 angle[_WND_REQUEST_ANGLE_IDX], \
642 res ? "Ture" : "False");
648 _e_mod_comp_win_check_visible(E_Comp_Win *cw)
650 Eina_Bool visible = EINA_FALSE;
651 E_Comp_Win *check_cw = NULL;
653 EINA_INLIST_REVERSE_FOREACH(cw->c->wins, check_cw)
655 if (check_cw->x == 0 &&
657 check_cw->w == cw->c->man->w &&
658 check_cw->h == cw->c->man->h)
665 if (!check_cw->visible ) continue;
666 if ( check_cw->defer_hide) continue;
667 if ( check_cw->invalid ) continue;
668 if ( check_cw->input_only) continue;
669 if ( check_cw->argb ) continue;
677 _e_mod_comp_win_check_visible2(E_Comp_Win *cw)
679 E_Comp_Win *find_cw = NULL;
682 Ecore_X_Region VisibleRegion = 0;
683 Ecore_X_Region CurrentRegion = 0;
684 Ecore_X_Region ResultRegion = 0;
686 Ecore_X_Rectangle *rects = NULL;
687 Ecore_X_Rectangle bounds = { 0, 0, 0, 0 };
691 Ecore_X_Rectangle screen_rect = { 0, 0, cw->c->man->w, cw->c->man->h };
692 Ecore_X_Rectangle window_rect;
694 Eina_Bool visible = EINA_FALSE;
702 || (!E_INTERSECTS(0, 0, c->man->w, c->man->h,
703 cw->x, cw->y, cw->w, cw->h))))
708 VisibleRegion = ecore_x_region_new(&screen_rect, 1);
710 EINA_INLIST_REVERSE_FOREACH(cw->c->wins, find_cw)
717 window_rect.x = find_cw->x;
718 window_rect.y = find_cw->y;
719 window_rect.width = find_cw->w;
720 window_rect.height = find_cw->h;
721 CurrentRegion = ecore_x_region_new(&window_rect, 1);
723 ResultRegion = ecore_x_region_new(&screen_rect, 1);
724 // result = visible intersect current
725 ecore_x_region_intersect(ResultRegion, VisibleRegion, CurrentRegion);
726 rects = ecore_x_region_fetch(ResultRegion, &num_rects, &bounds);
735 visible = EINA_FALSE;
739 else if (((!find_cw->visible)
740 || (find_cw->defer_hide)
741 || (find_cw->invalid)
742 || (find_cw->input_only)
743 || (find_cw->argb) // this code may cause bug.
744 || (!E_INTERSECTS(0, 0, c->man->w, c->man->h,
745 cw->x, cw->y, cw->w, cw->h))))
754 window_rect.x = find_cw->x;
755 window_rect.y = find_cw->y;
756 window_rect.width = find_cw->w;
757 window_rect.height = find_cw->h;
759 CurrentRegion = ecore_x_region_new(&window_rect, 1);
760 ResultRegion = ecore_x_region_new(&screen_rect, 1);
762 // result = visible - current
763 ecore_x_region_subtract (ResultRegion, VisibleRegion, CurrentRegion);
764 rects = ecore_x_region_fetch (ResultRegion, &num_rects, &bounds);
768 visible = EINA_FALSE;
773 ecore_x_region_copy(VisibleRegion, ResultRegion);
774 if (rects) free(rects);
775 ecore_x_region_free(ResultRegion);
776 ecore_x_region_free(CurrentRegion);
781 if (rects) free(rects);
782 ecore_x_region_free(ResultRegion);
783 ecore_x_region_free(CurrentRegion);
784 ecore_x_region_free(VisibleRegion);
790 _e_mod_comp_win_check_visible3(E_Comp_Win *cw)
792 Eina_Bool visible = EINA_FALSE;
793 E_Comp_Win *check_cw = NULL;
795 EINA_INLIST_REVERSE_FOREACH(cw->c->wins, check_cw)
797 if (check_cw->x == 0 &&
799 check_cw->w == cw->c->man->w &&
800 check_cw->h == cw->c->man->h &&
801 !check_cw->input_only &&
815 _e_mod_comp_prop_window_rotation(Ecore_X_Event_Window_Property *ev)
817 E_Comp_Win *cw = NULL;
822 "[COMP] %31s\n", "PROP_ILLUME_ROT_WND_ANG");
824 cw = _e_mod_comp_border_client_find(ev->win);
827 cw = _e_mod_comp_win_find(ev->win);
830 Ecore_X_Sync_Counter counter = ecore_x_e_comp_sync_counter_get(ev->win);
831 ecore_x_e_comp_sync_cancel_send(ev->win);
832 if (counter) ecore_x_sync_counter_inc(counter, 1);
837 // if window's rotation effect type is NONE,
838 // then do not show rotation effect.
839 // just return from here
840 if (cw->rotation_effect == COMP_EFFECT_NONE)
843 ecore_x_sync_counter_inc(cw->counter, 1);
846 cw->counter = ecore_x_e_comp_sync_counter_get(_e_mod_comp_win_get_client_xid(cw));
847 if (cw->counter) ecore_x_sync_counter_inc(cw->counter, 1);
852 if (!_e_mod_comp_win_get_prop_angle(_e_mod_comp_win_get_client_xid(cw),
857 ecore_x_sync_counter_inc(cw->counter, 1);
860 cw->counter = ecore_x_e_comp_sync_counter_get(_e_mod_comp_win_get_client_xid(cw));
861 if (cw->counter) ecore_x_sync_counter_inc(cw->counter, 1);
866 if (req_angle == cur_angle)
868 // candidate window of keypad requests rotation with same angles.
870 ecore_x_sync_counter_inc(cw->counter, 1);
873 cw->counter = ecore_x_e_comp_sync_counter_get(_e_mod_comp_win_get_client_xid(cw));
874 if (cw->counter) ecore_x_sync_counter_inc(cw->counter, 1);
879 if (_e_mod_comp_window_rotation_policy(cw))
881 cw->req_ang = req_angle;
882 cw->cur_ang = cur_angle;
883 cw->ready_win_rot_effect = EINA_TRUE;
884 if (cw->win_rot_timeout)
886 ecore_timer_del(cw->win_rot_timeout);
887 cw->win_rot_timeout = NULL;
889 cw->win_rot_timeout = ecore_timer_add(4.0f,
890 _e_mod_comp_win_rotation_begin_timeout,
893 ecore_x_sync_counter_inc(cw->counter, 1);
896 cw->counter = ecore_x_e_comp_sync_counter_get(_e_mod_comp_win_get_client_xid(cw));
897 if (cw->counter) ecore_x_sync_counter_inc(cw->counter, 1);
903 cw->win_rot_timeout);
907 cw->req_ang = req_angle;
908 cw->cur_ang = req_angle;
909 cw->ready_win_rot_effect = EINA_FALSE;
911 ecore_x_sync_counter_inc(cw->counter, 1);
914 cw->counter = ecore_x_e_comp_sync_counter_get(_e_mod_comp_win_get_client_xid(cw));
915 if (cw->counter) ecore_x_sync_counter_inc(cw->counter, 1);
922 cw->ready_win_rot_effect);
928 _e_mod_comp_win_rotation_begin(E_Comp_Win *cw, Eina_Bool timeout)
930 cw->ready_win_rot_effect = EINA_FALSE;
933 "[COMP] %31s timeout:%d\n",
934 "win_rot_begin", timeout);
936 if (cw->win_rot_timeout)
938 ecore_timer_del(cw->win_rot_timeout);
939 cw->win_rot_timeout = NULL;
942 if (cw->rotation_effect == COMP_EFFECT_NONE) return EINA_TRUE;
945 switch (cw->req_ang - cw->cur_ang)
947 case -270: edje_object_signal_emit(cw->shobj, "e,state,window,rotation,90", "e"); break;
948 case -180: edje_object_signal_emit(cw->shobj, "e,state,window,rotation,180", "e"); break;
949 case -90: edje_object_signal_emit(cw->shobj, "e,state,window,rotation,-90", "e"); break;
950 case 0: edje_object_signal_emit(cw->shobj, "e,state,window,rotation,0", "e"); break;
951 case 90: edje_object_signal_emit(cw->shobj, "e,state,window,rotation,90", "e"); break;
952 case 180: edje_object_signal_emit(cw->shobj, "e,state,window,rotation,-180", "e"); break;
953 case 270: edje_object_signal_emit(cw->shobj, "e,state,window,rotation,-90", "e"); break;
954 default : edje_object_signal_emit(cw->shobj, "e,state,window,rotation,0", "e"); break;
957 cw->win_rot_effect = 1;
958 _e_mod_comp_win_inc_animating(cw);
964 if (cw->update_timeout)
966 ecore_timer_del(cw->update_timeout);
967 cw->update_timeout = NULL;
970 cw->c->updates = eina_list_append(cw->c->updates, cw);
973 _e_mod_comp_win_render_queue(cw);
975 ecore_x_sync_counter_inc(cw->counter, 1);
978 cw->counter = ecore_x_e_comp_sync_counter_get(_e_mod_comp_win_get_client_xid(cw));
979 if (cw->counter) ecore_x_sync_counter_inc(cw->counter, 1);
983 // TODO: remove argb check code for the ticker window
986 evas_object_stack_below(cw->c->bg_img, cw->shobj);
987 cw->c->use_bg_img = 1;
990 cw->win_rot_timeout = ecore_timer_add(4.0f,
991 _e_mod_comp_win_rotation_end_timeout,
998 _e_mod_comp_win_rotation_done(void *data,
999 Evas_Object *obj __UNUSED__,
1000 const char *emission __UNUSED__,
1001 const char *source __UNUSED__)
1003 E_Comp_Win *cw = (E_Comp_Win*)data;
1006 if (cw->win_rot_timeout)
1008 ecore_timer_del(cw->win_rot_timeout);
1009 cw->win_rot_timeout = NULL;
1012 if ( !cw->show_done ) cw->show_done = EINA_TRUE;
1013 evas_object_stack_below(cw->c->bg_img, evas_object_bottom_get(cw->c->evas));
1014 cw->c->use_bg_img = 0;
1015 cw->win_rot_effect = 0;
1018 "[COMP] %31s %s w:0x%08x\n",
1019 "EFFECT", "WIN_ROT_DONE",
1020 _e_mod_comp_win_get_client_xid(cw));
1022 _e_mod_comp_done_defer(cw);
1026 _e_mod_comp_win_rotation_release(E_Comp_Win *cw)
1028 cw->ready_win_rot_effect = EINA_FALSE;
1032 if (cw->win_rot_timeout)
1034 ecore_timer_del(cw->win_rot_timeout);
1035 cw->win_rot_timeout = NULL;
1041 _e_mod_comp_send_window_effect_client_state(E_Comp_Win *cw,
1044 Ecore_X_Window win = 0;
1045 long d[5] = { 0L, 0L, 0L, 0L, 0L };
1048 win = _e_mod_comp_win_get_client_xid(cw);
1051 if (state) d[0] = 1L;
1054 ecore_x_client_message32_send
1055 (win, ATOM_WINDOW_EFFECT_CLIENT_STATE,
1056 StructureNotifyMask, d[0], d[1], d[2], d[3], d[4]);
1060 _e_mod_comp_is_next_win_stack(E_Comp_Win *cw,
1063 Eina_Inlist *wins_list;
1064 if (!cw || !cw2) return EINA_FALSE;
1066 while ((wins_list = EINA_INLIST_GET(cw)->prev) != NULL)
1068 cw = _EINA_INLIST_CONTAINER(cw, wins_list);
1078 _e_mod_comp_win_find_by_indicator(E_Comp *c)
1081 EINA_INLIST_FOREACH(c->wins, cw)
1083 if (_e_mod_comp_is_indicator_window(cw->bd)) return cw;
1092 #define _MAKE_ATOM(a, s) \
1094 a = ecore_x_atom_get(s); \
1097 "[E-comp] ##s creation failed.\n"); \
1101 _e_mod_comp_atom_init(void)
1103 _MAKE_ATOM(ATOM_FAKE_LAUNCH_IMAGE, STR_ATOM_FAKE_LAUNCH_IMAGE );
1104 _MAKE_ATOM(ATOM_FAKE_LAUNCH, STR_ATOM_FAKE_LAUNCH );
1105 _MAKE_ATOM(ATOM_EFFECT_ENABLE, STR_ATOM_NET_CM_EFFECT_ENABLE );
1106 _MAKE_ATOM(ATOM_WINDOW_EFFECT_ENABLE, STR_ATOM_NET_CM_WINDOW_EFFECT_ENABLE );
1107 _MAKE_ATOM(ATOM_WINDOW_EFFECT_CLIENT_STATE, STR_ATOM_NET_CM_WINDOW_EFFECT_CLIENT_STATE);
1108 _MAKE_ATOM(ATOM_WINDOW_EFFECT_STATE, STR_ATOM_NET_CM_WINDOW_EFFECT_STATE );
1109 _MAKE_ATOM(ATOM_WINDOW_EFFECT_TYPE, STR_ATOM_NET_CM_WINDOW_EFFECT_TYPE );
1110 _MAKE_ATOM(ATOM_EFFECT_DEFAULT, STR_ATOM_NET_CM_EFFECT_DEFAULT );
1111 _MAKE_ATOM(ATOM_EFFECT_NONE, STR_ATOM_NET_CM_EFFECT_NONE );
1112 _MAKE_ATOM(ATOM_EFFECT_CUSTOM0, STR_ATOM_NET_CM_EFFECT_CUSTOM0 );
1113 _MAKE_ATOM(ATOM_EFFECT_CUSTOM1, STR_ATOM_NET_CM_EFFECT_CUSTOM1 );
1114 _MAKE_ATOM(ATOM_EFFECT_CUSTOM2, STR_ATOM_NET_CM_EFFECT_CUSTOM2 );
1115 _MAKE_ATOM(ATOM_EFFECT_CUSTOM3, STR_ATOM_NET_CM_EFFECT_CUSTOM3 );
1116 _MAKE_ATOM(ATOM_EFFECT_CUSTOM4, STR_ATOM_NET_CM_EFFECT_CUSTOM4 );
1117 _MAKE_ATOM(ATOM_EFFECT_CUSTOM5, STR_ATOM_NET_CM_EFFECT_CUSTOM5 );
1118 _MAKE_ATOM(ATOM_EFFECT_CUSTOM6, STR_ATOM_NET_CM_EFFECT_CUSTOM6 );
1119 _MAKE_ATOM(ATOM_EFFECT_CUSTOM7, STR_ATOM_NET_CM_EFFECT_CUSTOM7 );
1120 _MAKE_ATOM(ATOM_EFFECT_CUSTOM8, STR_ATOM_NET_CM_EFFECT_CUSTOM8 );
1121 _MAKE_ATOM(ATOM_EFFECT_CUSTOM9, STR_ATOM_NET_CM_EFFECT_CUSTOM9 );
1122 _MAKE_ATOM(ATOM_OVERAY_WINDOW, STR_ATOM_OVERAY_WINDOW );
1123 _MAKE_ATOM(ATOM_X_HIBERNATION_STATE, STR_ATOM_X_HIBERNATION_STATE );
1124 _MAKE_ATOM(ATOM_CM_LOCK_SCREEN, STR_ATOM_CM_LOCK_SCREEN );
1125 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_SUPPORTED, STR_ATOM_CM_PIXMAP_ROTATION_SUPPORTED );
1126 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_STATE, STR_ATOM_CM_PIXMAP_ROTATION_STATE );
1127 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_BEGIN, STR_ATOM_CM_PIXMAP_ROTATION_BEGIN );
1128 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_BEGIN_DONE, STR_ATOM_CM_PIXMAP_ROTATION_BEGIN_DONE );
1129 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_END, STR_ATOM_CM_PIXMAP_ROTATION_END );
1130 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_END_DONE, STR_ATOM_CM_PIXMAP_ROTATION_END_DONE );
1131 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_REQUEST, STR_ATOM_CM_PIXMAP_ROTATION_REQUEST );
1132 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_REQUEST_DONE, STR_ATOM_CM_PIXMAP_ROTATION_REQUEST_DONE );
1133 _MAKE_ATOM(ATOM_CM_PIXMAP_ROTATION_RESIZE_PIXMAP, STR_ATOM_CM_PIXMAP_ROTATION_RESIZE_PIXMAP );
1134 _MAKE_ATOM(ATOM_X_SCREEN_ROTATION, STR_ATOM_X_SCREEN_ROTATION );
1135 _MAKE_ATOM(ATOM_CAPTURE_EFFECT, STR_ATOM_CAPTURE_EFFECT );
1136 #if COMP_LOGGER_BUILD_ENABLE
1137 _MAKE_ATOM(ATOM_CM_LOG, STR_ATOM_CM_LOG );
1138 _MAKE_ATOM(ATOM_CM_LOG_DUMP_DONE, STR_ATOM_CM_LOG_DUMP_DONE );
1143 _e_mod_comp_cb_pending_after(void *data __UNUSED__,
1144 E_Manager *man __UNUSED__,
1145 E_Manager_Comp_Source *src)
1147 E_Comp_Win *cw = (E_Comp_Win *)src;
1148 cw->pending_count--;
1149 if (!cw->delete_pending) return;
1150 if (cw->pending_count == 0)
1157 _e_mod_comp_set(E_Comp *c)
1162 "[E17-comp] %s(%d) E_Comp setup failed.\n",
1163 __func__, __LINE__);
1170 _e_mod_comp_get(void)
1176 _e_mod_comp_dump_cw_stack(Eina_Bool to_file,
1182 const char *file, *group;
1183 int x, y, w, h, i = 1;
1186 c = _e_mod_comp_get();
1189 if ((to_file) && (name))
1191 fs = fopen(name, "w");
1194 fprintf(stderr, "can't open %s file.\n", name);
1196 to_file = EINA_FALSE;
1200 fprintf(fs, "B-------------------------------------------------------------------------------------------------------------------------------------\n");
1201 fprintf(fs, " No WinID shobj x y w h ex ey ew eh W S O clipper shower swallow group st \n");
1202 fprintf(fs, "--------------------------------------------------------------------------------------------------------------------------------------\n");
1203 fprintf(fs, " c->bg_img : %s 0x%08x\n", evas_object_visible_get(c->bg_img) ? "O" : "X", (unsigned int)c->bg_img);
1204 fprintf(fs, "--------------------------------------------------------------------------------------------------------------------------------------\n");
1206 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
1208 edje_object_file_get(cw->shobj, &file, &group);
1209 evas_object_geometry_get(cw->shobj, &x, &y, &w, &h);
1211 " %2d 0x%07x 0x%08x %4d %4d %4d %4d %4d %4d %4d %4d %s %s %s %10.10s %.1f %10.10s %.1f %10.10s %.1f %15.15s %d\n",
1213 _e_mod_comp_win_get_client_xid(cw),
1214 (unsigned int)cw->shobj,
1215 cw->x, cw->y, cw->w, cw->h,
1217 cw->visible ? "O" : "X",
1218 evas_object_visible_get(cw->shobj) ? "O" : "X",
1219 evas_object_visible_get(cw->obj) ? "O" : "X",
1220 edje_object_part_state_get(cw->shobj, "clipper", &val), val,
1221 edje_object_part_state_get(cw->shobj, "shower", &val), val,
1222 edje_object_part_state_get(cw->shobj, "e.swallow.content", &val), val,
1223 group, cw->effect_stage);
1228 fprintf(fs, "--------------------------------------------------------------------------------------------------------------------------------------\n");
1229 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
1232 file = group = NULL;
1233 edje_object_file_get(cw->shobj,
1237 i, _e_mod_comp_win_get_client_xid(cw),
1243 fprintf(fs, "--------------------------------------------------------------------------------------------------------------------------------------\n");
1244 fprintf(fs, " No WinID shobj obj found_o x y w h ex ey ew eh | W S O\n");
1245 fprintf(fs, "--------------------------------------------------------------------------------------------------------------------------------------\n");
1246 Evas_Object *o = evas_object_top_get(c->evas);
1247 Eina_Bool found = 0;
1248 Ecore_X_Window cid = 0;
1249 char *wname = NULL, *wclas = NULL;
1253 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
1259 cid = _e_mod_comp_win_get_client_xid(cw);
1260 ecore_x_icccm_name_class_get(cid, &wname, &wclas);
1261 ecore_x_netwm_pid_get(cid, &pid);
1266 evas_object_geometry_get(o, &x, &y, &w, &h);
1268 if (found && cw->visible)
1271 " %2d 0x%07x 0x%08x 0x%08x 0x%08x %4d,%4d %4dx%4d %4d,%4d %4dx%4d | %s %s %s %4d, %s, %s\n",
1273 _e_mod_comp_win_get_client_xid(cw),
1274 (unsigned int)cw->shobj,
1275 (unsigned int)cw->obj,
1277 cw->x, cw->y, cw->w, cw->h,
1279 cw->visible ? "O" : "X",
1280 evas_object_visible_get(cw->shobj) ? "O" : "X",
1281 evas_object_visible_get(o) ? "O" : "X",
1284 else if (o == c->bg_img)
1287 " %2d %31.31s 0x%08x %19.19s %4d,%4d %4dx%4d | %s <-- bg_img\n",
1288 i, " ", (unsigned int)o, " ", x, y, w, h, evas_object_visible_get(o) ? "O" : "X");
1290 else if (evas_object_visible_get(o))
1295 " %2d 0x%07x 0x%08x 0x%08x 0x%08x %4d,%4d %4dx%4d %4d,%4d %4dx%4d | %s %s %s %4d, %s, %s\n",
1297 _e_mod_comp_win_get_client_xid(cw),
1298 (unsigned int)cw->shobj,
1299 (unsigned int)cw->obj,
1301 cw->x, cw->y, cw->w, cw->h,
1303 cw->visible ? "O" : "X",
1304 evas_object_visible_get(cw->shobj) ? "O" : "X",
1305 evas_object_visible_get(o) ? "O" : "X",
1311 " %2d %31.31s 0x%08x %19.19s %4d,%4d %4dx%4d | %s\n",
1312 i, " ", (unsigned int)o, " ", x, y, w, h,
1313 evas_object_visible_get(o) ? "O" : "X");
1317 o = evas_object_below_get(o);
1319 if (wname) free(wname);
1320 if (wclas) free(wclas);
1321 wname = wclas = NULL;
1326 fprintf(fs, "E-------------------------------------------------------------------------------------------------------------------------------------\n");
1329 if (to_file) fclose(fs);
1333 _e_mod_comp_fullscreen_check(E_Comp *c)
1336 if (!c->wins) return NULL;
1337 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
1339 if ((!cw->visible) || (cw->input_only) || (cw->invalid))
1341 if ((cw->x == 0) && (cw->y == 0)
1342 && ((cw->x + cw->w) >= c->man->w)
1343 && ((cw->y + cw->h) >= c->man->h)
1344 && (!cw->argb) && (!cw->shaped))
1353 static inline Eina_Bool
1354 _e_mod_comp_shaped_check(int w,
1356 const Ecore_X_Rectangle *rects,
1359 if ((!rects) || (num < 1)) return EINA_FALSE;
1360 if (num > 1) return EINA_TRUE;
1361 if ((rects[0].x == 0) && (rects[0].y == 0) &&
1362 ((int)(rects[0].width) == w) && ((int)(rects[0].height) == h))
1367 static inline Eina_Bool
1368 _e_mod_comp_win_shaped_check(const E_Comp_Win *cw,
1369 const Ecore_X_Rectangle *rects,
1372 return _e_mod_comp_shaped_check(cw->w, cw->h, rects, num);
1376 _e_mod_comp_win_shape_rectangles_apply(E_Comp_Win *cw,
1377 const Ecore_X_Rectangle *rects,
1384 if (!_e_mod_comp_win_shaped_check(cw, rects, num))
1390 unsigned int *pix, *p;
1391 unsigned char *spix, *sp;
1394 evas_object_image_size_get(cw->obj, &w, &h);
1395 if ((w > 0) && (h > 0))
1400 "BUGGER: shape with native surface. cw=%p\n",
1405 evas_object_image_native_surface_set(cw->obj, NULL);
1406 evas_object_image_alpha_set(cw->obj, 1);
1407 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1409 evas_object_image_native_surface_set(o, NULL);
1410 evas_object_image_alpha_set(o, 1);
1412 pix = evas_object_image_data_get(cw->obj, 1);
1415 spix = calloc(w * h, sizeof(unsigned char));
1418 for (i = 0; i < num; i++)
1422 rx = rects[i].x; ry = rects[i].y;
1423 rw = rects[i].width; rh = rects[i].height;
1424 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
1425 sp = spix + (w * ry) + rx;
1426 for (py = 0; py < rh; py++)
1428 for (px = 0; px < rw; px++)
1437 for (py = 0; py < h; py++)
1439 for (px = 0; px < w; px++)
1441 unsigned int mask, imask;
1442 mask = ((unsigned int)(*sp)) << 24;
1444 imask |= imask >> 8;
1445 imask |= imask >> 8;
1446 *p = mask | (*p & imask);
1453 evas_object_image_data_set(cw->obj, pix);
1454 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
1455 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1457 evas_object_image_data_set(o, pix);
1458 evas_object_image_data_update_add(o, 0, 0, w, h);
1467 unsigned int *pix, *p;
1470 evas_object_image_size_get(cw->obj, &w, &h);
1471 if ((w > 0) && (h > 0))
1476 "BUGGER: shape with native surface? cw=%p\n",
1481 evas_object_image_alpha_set(cw->obj, 0);
1482 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1484 evas_object_image_alpha_set(o, 1);
1486 pix = evas_object_image_data_get(cw->obj, 1);
1490 for (py = 0; py < h; py++)
1492 for (px = 0; px < w; px++)
1496 evas_object_image_data_set(cw->obj, pix);
1497 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
1498 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1500 evas_object_image_data_set(o, pix);
1501 evas_object_image_data_update_add(o, 0, 0, w, h);
1506 // dont need to fix alpha chanel as blending
1507 // should be totally off here regardless of
1508 // alpha channel content
1513 _e_mod_comp_win_free_xim(E_Comp_Win *cw)
1517 evas_object_image_data_set(cw->obj, NULL);
1518 ecore_x_image_free(cw->xim);
1524 _e_mod_comp_win_update(E_Comp_Win *cw)
1531 if (_comp_mod->conf->grab) ecore_x_grab();
1543 if (cw->resize_hide) cw->resize_hide = EINA_FALSE;
1546 res = e_mod_comp_rotation_update(cw->rotobj,
1553 if ((cw->visible) && (cw->dmg_updates > 0))
1555 Evas_Object *shobj = e_mod_comp_rotation_get_shobj(cw->rotobj);
1558 if (!evas_object_visible_get(shobj))
1560 evas_object_show(cw->obj);
1561 evas_object_show(shobj);
1562 e_mod_comp_rotation_show_effect(cw->rotobj);
1563 _e_mod_comp_win_inc_animating(cw);
1566 else if(e_mod_comp_rotation_angle_is_changed(cw->rotobj))
1568 e_mod_comp_rotation_request_effect(cw->rotobj);
1569 _e_mod_comp_win_inc_animating(cw);
1574 if (_comp_mod->conf->grab) ecore_x_ungrab();
1589 if (cw->shape_changed)
1597 ecore_x_pixmap_geometry_get(cw->win, NULL, NULL, &(cw->w), &(cw->h));
1598 cw->rects = ecore_x_window_shape_rectangles_get(cw->win, &(cw->rects_num));
1602 for (i = 0; i < cw->rects_num; i++)
1604 int_w = (int)cw->rects[i].width;
1605 int_h = (int)cw->rects[i].height;
1606 E_RECTS_CLIP_TO_RECT(cw->rects[i].x,
1610 0, 0, cw->w, cw->h);
1611 cw->rects[i].width = (unsigned int)int_w;
1612 cw->rects[i].height = (unsigned int)int_h;
1615 if (!_e_mod_comp_win_shaped_check(cw, cw->rects, cw->rects_num))
1621 if ((cw->rects) && (!cw->shaped)) cw->shaped = 1;
1622 else if ((!cw->rects) && (cw->shaped)) cw->shaped = 0;
1626 if ((cw->needpix) && (cw->dmg_updates <= 0))
1628 if (_comp_mod->conf->grab) ecore_x_ungrab();
1632 if ((!cw->pixmap) || (cw->needpix))
1635 pm = ecore_x_composite_name_window_pixmap_get(cw->win);
1638 Ecore_X_Pixmap oldpm;
1641 if (cw->xim) cw->needxim = 1;
1647 ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph));
1648 // pixmap's size is not equal with window's size case
1649 if (!((cw->pw == cw->w) && (cw->ph == cw->h)))
1652 "[COMP] pixmap is not prepared yet!! win: 0x%07x \n",
1658 ecore_x_pixmap_free(pm);
1659 if (_comp_mod->conf->grab) ecore_x_ungrab();
1668 if ((cw->pw <= 0) || (cw->ph <= 0))
1672 evas_object_image_native_surface_set(cw->obj, NULL);
1674 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1676 evas_object_image_native_surface_set(o, NULL);
1681 ecore_x_pixmap_free(cw->pixmap);
1687 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
1689 e_mod_comp_update_resize(cw->up, cw->pw, cw->ph);
1690 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
1696 if (!((cw->pw > 0) && (cw->ph > 0)))
1698 evas_object_image_native_surface_set(cw->obj, NULL);
1699 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1701 evas_object_image_native_surface_set(o, NULL);
1705 ecore_x_pixmap_free(oldpm);
1710 if (!((cw->pw > 0) && (cw->ph > 0)))
1712 if (_comp_mod->conf->grab) ecore_x_ungrab();
1716 // update obj geometry when task switcher is not open
1717 // or task switcher is open and new window is added
1718 cw->defer_move_resize = EINA_FALSE;
1719 if ( !cw->c->switcher_animating ||
1721 (cw->c->switcher && !cw->first_show_worked) ||
1722 (cw->c->switcher && cw->win_type == WIN_INDICATOR))
1724 evas_object_move(cw->shobj, cw->x, cw->y);
1725 evas_object_resize(cw->shobj,
1726 cw->pw + (cw->border * 2),
1727 cw->ph + (cw->border * 2));
1731 cw->defer_move_resize = EINA_TRUE;
1735 && (_comp_mod->conf->texture_from_pixmap)
1739 evas_object_image_size_set(cw->obj, cw->pw, cw->ph);
1740 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1742 evas_object_image_size_set(o, cw->pw, cw->ph);
1746 Evas_Native_Surface ns;
1748 ns.version = EVAS_NATIVE_SURFACE_VERSION;
1749 ns.type = EVAS_NATIVE_SURFACE_X11;
1750 ns.data.x11.visual = cw->vis;
1751 ns.data.x11.pixmap = cw->pixmap;
1752 evas_object_image_native_surface_set(cw->obj, &ns);
1754 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1756 evas_object_image_native_surface_set(o, &ns);
1760 r = e_mod_comp_update_rects_get(cw->up);
1763 e_mod_comp_update_clear(cw->up);
1764 for (i = 0; r[i].w > 0; i++)
1767 x = r[i].x; y = r[i].y;
1768 w = r[i].w; h = r[i].h;
1769 evas_object_image_data_update_add(cw->obj, x, y, w, h);
1770 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1772 evas_object_image_data_update_add(o, x, y, w, h);
1785 evas_object_image_native_surface_set(cw->obj, NULL);
1786 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1788 evas_object_image_native_surface_set(o, NULL);
1797 evas_object_image_size_set(cw->obj, 1, 1);
1798 evas_object_image_data_set(cw->obj, NULL);
1799 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1801 evas_object_image_size_set(o, 1, 1);
1802 evas_object_image_data_set(o, NULL);
1804 ecore_x_image_free(cw->xim);
1810 if ((cw->xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth)))
1811 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
1813 r = e_mod_comp_update_rects_get(cw->up);
1816 Eina_Bool get_image_failed = 0;
1820 pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL);
1821 evas_object_image_data_set(cw->obj, pix);
1822 evas_object_image_size_set(cw->obj, cw->pw, cw->ph);
1823 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1825 evas_object_image_data_set(o, pix);
1826 evas_object_image_size_set(o, cw->pw, cw->ph);
1829 e_mod_comp_update_clear(cw->up);
1830 for (i = 0; r[i].w > 0; i++)
1833 x = r[i].x; y = r[i].y;
1834 w = r[i].w; h = r[i].h;
1835 if (!ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h))
1837 e_mod_comp_update_add(cw->up, x, y, w, h);
1839 get_image_failed = 1;
1843 pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL);
1844 evas_object_image_data_set(cw->obj, pix);
1845 evas_object_image_data_update_add(cw->obj, x, y, w, h);
1846 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
1848 evas_object_image_data_set(o, pix);
1849 evas_object_image_data_update_add(o, x, y, w, h);
1856 if (!get_image_failed)
1859 _e_mod_comp_win_shape_rectangles_apply(cw,
1864 if (cw->shape_changed)
1865 _e_mod_comp_win_shape_rectangles_apply(cw,
1870 cw->shape_changed = 0;
1876 if (cw->resize_hide)
1878 evas_object_show(cw->shobj);
1879 cw->resize_hide = EINA_FALSE;
1885 && (cw->dmg_updates >= 1))
1887 if (!evas_object_visible_get(cw->shobj)
1888 && !(cw->animate_hide))
1890 if (!cw->hidden_override)
1891 evas_object_show(cw->shobj);
1894 "[COMP] WIN_EFFECT : Show signal Emit -> win:0x%08x\n",
1897 _e_mod_comp_window_show_effect(cw);
1901 if (cw->ready_win_rot_effect)
1902 _e_mod_comp_win_rotation_begin(cw, EINA_FALSE);
1904 if (_comp_mod->conf->grab) ecore_x_ungrab();
1908 _e_mod_comp_pre_swap(void *data,
1912 L(LT_EVENT_X, "[COMP] %15.15s\n", "SWAP");
1913 if (_comp_mod->conf->grab)
1924 _e_mod_comp_cb_delayed_update_timer(void *data)
1927 _e_mod_comp_render_queue(c);
1928 c->new_up_timer = NULL;
1929 return ECORE_CALLBACK_CANCEL;
1933 _e_mod_comp_cb_update(E_Comp *c)
1938 Eina_List *new_updates = NULL; // for failed pixmap fetches - get them next frame
1939 Eina_List *update_done = NULL;
1941 c->update_job = NULL;
1942 if (c->nocomp) goto nocomp;
1943 if (_comp_mod->conf->grab)
1949 EINA_LIST_FREE(c->updates, cw)
1952 if (_comp_mod->conf->efl_sync)
1954 if (((cw->counter) && (cw->drawme)) || (!cw->counter))
1956 _e_mod_comp_win_update(cw);
1958 update_done = eina_list_append(update_done, cw);
1965 _e_mod_comp_win_update(cw);
1967 new_updates = eina_list_append(new_updates, cw);
1970 _e_mod_comp_fps_update(c);
1971 if (_comp_mod->conf->fps_show)
1974 double fps = 0.0, t, dt;
1976 Evas_Coord x = 0, y = 0, w = 0, h = 0;
1979 t = ecore_time_get();
1981 if (_comp_mod->conf->fps_average_range < 1)
1982 _comp_mod->conf->fps_average_range = 30;
1983 else if (_comp_mod->conf->fps_average_range > 120)
1984 _comp_mod->conf->fps_average_range = 120;
1986 dt = t - c->frametimes[_comp_mod->conf->fps_average_range - 1];
1988 if (dt > 0.0) fps = (double)_comp_mod->conf->fps_average_range / dt;
1991 if (fps > 0.0) snprintf(buf, sizeof(buf), "FPS: %1.1f", fps);
1992 else snprintf(buf, sizeof(buf), "N/A");
1994 for (i = 121; i >= 1; i--) c->frametimes[i] = c->frametimes[i - 1];
1995 c->frametimes[0] = t;
1998 if (c->frameskip >= _comp_mod->conf->fps_average_range)
2001 evas_object_text_text_set(c->fps_fg, buf);
2004 evas_object_geometry_get(c->fps_fg, NULL, NULL, &w, &h);
2008 z = e_util_zone_current_get(c->man);
2012 switch (_comp_mod->conf->fps_corner)
2014 case 3: // bottom-right
2015 x = z->x + z->w - w;
2016 y = z->y + z->h - h;
2018 case 2: // bottom-left
2020 y = z->y + z->h - h;
2022 case 1: // top-right
2023 x = z->x + z->w - w;
2026 default: // 0 // top-left
2032 evas_object_move(c->fps_bg, x, y);
2033 evas_object_resize(c->fps_bg, w, h);
2034 evas_object_move(c->fps_fg, x + 4, y + 4);
2037 if (_comp_mod->conf->lock_fps)
2039 ecore_evas_manual_render(c->ee);
2041 if (_comp_mod->conf->efl_sync)
2043 EINA_LIST_FREE(update_done, cw)
2046 ecore_x_sync_counter_inc(cw->counter, 1);
2049 if (_comp_mod->conf->grab)
2059 if (c->new_up_timer) ecore_timer_del(c->new_up_timer);
2061 ecore_timer_add(0.001, _e_mod_comp_cb_delayed_update_timer, c);
2063 c->updates = new_updates;
2064 if (!c->animating) c->render_overflow--;
2067 cw = _e_mod_comp_fullscreen_check(c);
2070 if (_comp_mod->conf->nocomp_fs)
2074 printf("NOCOMP!\n");
2075 printf("kill comp %x\n", cw->win);
2077 c->render_overflow = OVER_FLOW;
2078 ecore_x_window_hide(c->win);
2082 printf("^^^^ undirect1 %x\n", cw->win);
2083 ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
2090 ecore_x_pixmap_free(cw->pixmap);
2094 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
2098 evas_object_image_size_set(cw->obj, 1, 1);
2099 evas_object_image_data_set(cw->obj, NULL);
2100 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
2102 evas_object_image_size_set(o, 1, 1);
2103 evas_object_image_data_set(o, NULL);
2105 ecore_x_image_free(cw->xim);
2110 Ecore_X_Region parts;
2112 eina_hash_del(damages, e_util_winid_str_get(cw->damage), cw);
2113 parts = ecore_x_region_new(NULL, 0);
2114 ecore_x_damage_subtract(cw->damage, 0, parts);
2115 ecore_x_region_free(parts);
2116 ecore_x_damage_free(cw->damage);
2119 if (cw->update_timeout)
2121 ecore_timer_del(cw->update_timeout);
2122 cw->update_timeout = NULL;
2127 cw->c->updates = eina_list_remove(cw->c->updates, cw);
2132 Ecore_X_Window _win = _e_mod_comp_win_get_client_xid(cw);
2133 ecore_x_e_comp_sync_cancel_send(_win);
2134 ecore_x_sync_counter_inc(cw->counter, 1);
2136 _e_mod_comp_render_queue(c);
2146 c->render_overflow = OVER_FLOW;
2147 ecore_x_window_show(c->win);
2148 EINA_INLIST_FOREACH(c->wins, cw)
2150 if (!cw->nocomp) continue;
2152 printf("restore comp %x --- %x\n", cw->win, cw->pixmap);
2153 if (cw->pixmap) ecore_x_pixmap_free(cw->pixmap);
2160 cw->damage = ecore_x_damage_new
2161 (cw->win, ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES);
2162 eina_hash_add(damages, e_util_winid_str_get(cw->damage), cw);
2164 if (!cw->redirected)
2166 printf("^^^^ redirect2 %x\n", cw->win);
2168 ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
2169 cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win);
2171 ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph));
2177 printf(" %x %ix%i\n", cw->pixmap, cw->pw, cw->ph);
2178 if ((cw->pw <= 0) || (cw->ph <= 0))
2180 ecore_x_pixmap_free(cw->pixmap);
2183 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
2185 cw->dmg_updates = 0;
2186 e_mod_comp_update_resize(cw->up, cw->pw, cw->ph);
2187 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
2191 if (!cw->hidden_override) evas_object_show(cw->shobj);
2192 // no need for effect
2193 cw->pending_count++;
2194 e_manager_comp_event_src_visibility_send
2195 (cw->c->man, (E_Manager_Comp_Source *)cw,
2196 _e_mod_comp_cb_pending_after, cw->c);
2199 _e_mod_comp_win_render_queue(cw);
2202 Ecore_X_Window _win = _e_mod_comp_win_get_client_xid(cw);
2203 ecore_x_e_comp_sync_begin_send(_win);
2209 if (c->render_overflow <= 0)
2211 c->render_overflow = 0;
2212 if (c->render_animator) c->render_animator = NULL;
2213 return ECORE_CALLBACK_CANCEL;
2215 return ECORE_CALLBACK_RENEW;
2219 _e_mod_comp_cb_job(void *data)
2221 _e_mod_comp_cb_update(data);
2225 _e_mod_comp_cb_animator(void *data)
2227 return _e_mod_comp_cb_update(data);
2231 _e_mod_comp_render_queue(E_Comp *c)
2233 if (_comp_mod->conf->lock_fps)
2235 if (c->render_animator)
2237 c->render_overflow = OVER_FLOW;
2240 c->render_animator = ecore_animator_add(_e_mod_comp_cb_animator, c);
2246 ecore_job_del(c->update_job);
2247 c->update_job = NULL;
2248 c->render_overflow = 0;
2250 c->update_job = ecore_job_add(_e_mod_comp_cb_job, c);
2255 _e_mod_comp_win_render_queue(E_Comp_Win *cw)
2257 _e_mod_comp_render_queue(cw->c);
2261 _e_mod_comp_find(Ecore_X_Window root)
2266 // fixme: use hash if compositors list > 4
2267 EINA_LIST_FOREACH(compositors, l, c)
2270 if (c->man->root == root) return c;
2276 _e_mod_comp_win_find(Ecore_X_Window win)
2278 return eina_hash_find(windows, e_util_winid_str_get(win));
2282 _e_mod_comp_border_client_find(Ecore_X_Window win)
2284 return eina_hash_find(borders, e_util_winid_str_get(win));
2288 _e_mod_comp_win_damage_find(Ecore_X_Damage damage)
2290 return eina_hash_find(damages, e_util_winid_str_get(damage));
2294 _e_mod_comp_win_is_borderless(E_Comp_Win *cw)
2296 if (!cw->bd) return 1;
2297 if ((cw->bd->client.border.name) &&
2298 (!strcmp(cw->bd->client.border.name, "borderless")))
2304 _e_mod_comp_fake_launch_timeout(void *data)
2306 E_Comp *c = (E_Comp*)data;
2307 E_Comp_Win *background_cw = NULL;
2308 E_Comp_Win *find_cw = NULL;
2310 if (!c->fake_launch_state) return 0;
2312 if (c->fake_launch_timeout)
2314 ecore_timer_del(c->fake_launch_timeout);
2315 c->fake_launch_timeout = NULL;
2318 c->fake_launch_state = EINA_FALSE;
2320 c->fake_launch_done = EINA_FALSE;
2322 // background hide effect
2323 background_cw = _e_mod_comp_win_find_fake_background_win(c);
2326 EINA_INLIST_FOREACH(c->wins, find_cw)
2328 if ((find_cw->invalid)
2329 || (find_cw->input_only)
2330 || (find_cw->win == background_cw->win)
2331 || _e_mod_comp_is_indicator_window(find_cw->bd))
2337 if (evas_object_visible_get(find_cw->shobj))
2339 // do hide window which is not related window animation effect.
2340 find_cw->animate_hide = EINA_TRUE;
2341 evas_object_hide(find_cw->shobj);
2346 //show background image when background show animation is emitted.
2347 evas_object_stack_below(c->bg_img, evas_object_bottom_get(c->evas));
2349 background_cw->animate_hide = EINA_FALSE;
2351 edje_object_signal_emit(background_cw->shobj,
2352 "e,state,background,visible,off",
2355 "[COMP] WIN_EFFECT : Background Show Effect signal Emit -> win:0x%08x\n",
2356 background_cw->win);
2358 _e_mod_comp_win_inc_animating(background_cw);
2361 // background show effect
2362 edje_object_signal_emit(c->fake_img_shobj,
2363 "fake,state,visible,off",
2366 "[COMP] WIN_EFFECT : Fake Hide signal Emit\n");
2372 _e_mod_comp_screen_lock(E_Comp *c)
2374 if (!_comp_mod || !c) return;
2375 if (!_comp_mod->conf->use_lock_screen) return;
2376 if (c->lock_screen == 1) return;
2377 if (c->lock_screen_timeout) return;
2379 if (!_comp_mod->conf->lock_fps)
2380 ecore_evas_manual_render_set(c->ee, 1);
2382 c->lock_screen_timeout = ecore_timer_add(_comp_mod->conf->max_lock_screen_time,
2383 _e_mod_comp_screen_lock_timeout,
2389 _e_mod_comp_screen_unlock(E_Comp *c)
2393 if (!_comp_mod || !c) return;
2394 if (!_comp_mod->conf->use_lock_screen) return;
2395 if (c->lock_screen == 0) return;
2396 if (c->lock_screen_timeout)
2398 ecore_timer_del(c->lock_screen_timeout);
2399 c->lock_screen_timeout = NULL;
2402 /////////////////////////////////////////////////////////
2403 // To ensure the correct screen appearance
2404 // 1. remove all cw->update_timeout
2405 // 2. clear c->update_job
2406 // 3. clear c->updates using _e_mod_comp_cb_update()
2408 /////////////////////////////////////////////////////////
2410 // remove all cw->update_timeout
2411 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
2413 if ((!cw->visible) || (cw->input_only) || (cw->invalid))
2415 if (cw->counter && cw->update_timeout)
2418 _e_mod_comp_win_damage_timeout((void*)cw);
2422 // clear c->update_job
2425 ecore_job_del(c->update_job);
2426 c->update_job = NULL;
2427 c->render_overflow = 0;
2431 if (c->updates) _e_mod_comp_cb_update(c);
2433 ecore_evas_manual_render(c->ee);
2435 if (!_comp_mod->conf->lock_fps)
2436 ecore_evas_manual_render_set(c->ee, 0);
2442 _e_mod_comp_screen_lock_timeout(void *data)
2444 E_Comp *c = (E_Comp*)data;
2445 _e_mod_comp_screen_unlock(c);
2446 return ECORE_CALLBACK_CANCEL;
2450 _e_mod_comp_win_rotation_begin_timeout(void *data)
2452 E_Comp_Win *cw = (E_Comp_Win*)data;
2453 if (!cw) return EINA_FALSE;
2455 fprintf(stderr, "[E17-comp] %s(%d) w:0x%08x\n",
2457 _e_mod_comp_win_get_client_xid(cw));
2459 _e_mod_comp_win_rotation_begin(cw, EINA_TRUE);
2461 return ECORE_CALLBACK_CANCEL;
2465 _e_mod_comp_win_rotation_end_timeout(void *data)
2467 E_Comp_Win *cw = (E_Comp_Win*)data;
2468 if (!cw) return EINA_FALSE;
2470 fprintf(stderr,"[E17-comp] %s(%d) w:0x%08x\n",
2472 _e_mod_comp_win_get_client_xid(cw));
2474 _e_mod_comp_win_rotation_done((void*)cw,
2479 return ECORE_CALLBACK_CANCEL;
2483 _e_mod_comp_win_damage_timeout(void *data)
2485 E_Comp_Win *cw = data;
2489 if (cw->update_timeout)
2491 ecore_timer_del(cw->update_timeout);
2492 cw->update_timeout = NULL;
2495 cw->c->updates = eina_list_append(cw->c->updates, cw);
2498 _e_mod_comp_win_render_queue(cw);
2499 if (cw->update_timeout)
2501 ecore_timer_del(cw->update_timeout);
2502 cw->update_timeout = NULL;
2504 return ECORE_CALLBACK_CANCEL;
2508 _e_mod_comp_object_del(void *data,
2511 E_Comp_Win *cw = data;
2513 _e_mod_comp_win_render_queue(cw);
2515 _e_mod_comp_rotation_release(cw);
2521 Ecore_X_Window _w = _e_mod_comp_win_get_client_xid(cw);
2522 ecore_x_e_comp_sync_cancel_send(_w);
2523 ecore_x_sync_counter_inc(cw->counter, 1);
2525 if (cw->bd) eina_hash_del(borders, e_util_winid_str_get(cw->bd->client.win), cw);
2527 evas_object_data_del(cw->shobj, "border");
2529 else if (obj == cw->pop)
2532 evas_object_data_del(cw->shobj, "popup");
2534 else if (obj == cw->menu)
2537 evas_object_data_del(cw->shobj, "menu");
2541 e_object_delfn_del(obj, cw->dfn);
2547 _e_mod_comp_done_defer(E_Comp_Win *cw)
2549 _e_mod_comp_win_dec_animating(cw);
2551 if (cw->defer_raise == EINA_TRUE)
2554 "[COMP] w:0x%08x force win to raise. bd:%s\n",
2555 _e_mod_comp_win_get_client_xid(cw),
2556 cw->bd ? "O" : "X");
2559 EINA_INLIST_FOREACH(cw->c->wins, _cw)
2561 evas_object_raise(_cw->shobj);
2562 if (cw->c->use_bg_img && _cw->win_rot_effect)
2564 evas_object_stack_below(cw->c->bg_img, _cw->shobj);
2567 cw->defer_raise = EINA_FALSE;
2568 edje_object_signal_emit(cw->shobj,
2569 "e,state,raise_above_post,on",
2576 "[COMP] %31s w:0x%08x force win to hide. bd:%s\n",
2577 "EDJ_DONE", _e_mod_comp_win_get_client_xid(cw),
2578 cw->bd ? "O" : "X");
2580 _e_mod_comp_win_hide(cw);
2586 "[COMP] %31s w:0x%08x force win to delete. bd:%s\n",
2587 "EDJ_DONE", _e_mod_comp_win_get_client_xid(cw),
2588 cw->bd ? "O" : "X");
2590 _e_mod_comp_win_del(cw);
2596 _e_mod_comp_show_done(void *data,
2597 Evas_Object *obj __UNUSED__,
2598 const char *emission __UNUSED__,
2599 const char *source __UNUSED__)
2601 E_Comp_Win *cw = data;
2603 LOG(LOG_DEBUG, "LAUNCH", "[e17:Application:Launching:done]");
2605 "[COMP] WIN_EFFECT : Show done -> win:0x%08x\n",
2608 if ((cw->win_type == WIN_TASK_MANAGER)
2609 && (cw->c->switcher == EINA_TRUE))
2612 Evas_Coord x, y, w, h;
2614 cw->c->switcher_animating = EINA_FALSE;
2615 EINA_INLIST_REVERSE_FOREACH(cw->c->wins, _cw)
2617 if ((_cw->visible == 1)
2618 && evas_object_visible_get(_cw->shobj)
2619 && evas_object_visible_get(_cw->obj)
2620 && !_e_mod_comp_is_indicator_window(_cw->bd))
2622 evas_object_geometry_get(_cw->shobj,
2624 if (w == _cw->c->screen_w
2625 && h == _cw->c->screen_h)
2628 // return all windows to original position
2629 evas_object_move(_cw->shobj, 0, 0);
2631 if ( _cw->defer_move_resize )
2633 evas_object_move(_cw->shobj, _cw->x, _cw->y );
2634 evas_object_resize(_cw->shobj, _cw->pw + (_cw->border * 2),
2635 _cw->ph + (_cw->border * 2));
2636 _cw->defer_move_resize = EINA_FALSE;
2640 _e_mod_comp_disable_effect_stage(_e_mod_comp_get());
2642 cw->show_done = EINA_TRUE;
2643 _e_mod_comp_done_defer(cw);
2647 _e_mod_comp_hide_done(void *data,
2648 Evas_Object *obj __UNUSED__,
2649 const char *emission __UNUSED__,
2650 const char *source __UNUSED__)
2652 E_Comp_Win *cw = data;
2655 "[COMP] WIN_EFFECT : Hide done -> win:0x%08x\n",
2658 if ((cw->win_type == WIN_TASK_MANAGER)
2659 && (cw->c->switcher))
2662 cw->c->switcher_animating = EINA_FALSE;
2663 if (cw->c->selected_pos > 0) cw->c->selected_pos = 0;
2664 // task switcher is closed
2665 cw->c->switcher = EINA_FALSE;
2666 _e_mod_comp_disable_effect_stage(_e_mod_comp_get());
2668 EINA_INLIST_REVERSE_FOREACH(cw->c->wins, _cw)
2670 if ( (_cw->visible == 1)
2671 && evas_object_visible_get(_cw->shobj)
2672 && !_e_mod_comp_is_indicator_window(_cw->bd)
2673 && (_cw->defer_move_resize == EINA_TRUE) )
2675 evas_object_move(_cw->shobj, _cw->x, _cw->y );
2676 evas_object_resize(_cw->shobj, _cw->pw + (_cw->border * 2),
2677 _cw->ph + (_cw->border * 2));
2678 _cw->defer_move_resize = EINA_FALSE;
2683 cw->show_done = EINA_FALSE;
2684 _e_mod_comp_done_defer(cw);
2688 _e_mod_comp_raise_above_hide_done(void *data,
2689 Evas_Object *obj __UNUSED__,
2690 const char *emission __UNUSED__,
2691 const char *source __UNUSED__)
2693 E_Comp_Win *cw = data;
2695 "[COMP] WIN_EFFECT : Raise Above Hide done -> win:0x%08x\n",
2698 _e_mod_comp_disable_effect_stage(_e_mod_comp_get());
2699 _e_mod_comp_done_defer(cw);
2703 _e_mod_comp_fake_show_done(void *data,
2704 Evas_Object *obj __UNUSED__,
2705 const char *emission __UNUSED__,
2706 const char *source __UNUSED__)
2709 E_Comp_Win* cw = NULL;
2712 "[COMP] FAKE_EFFECT : FAKE Show done\n");
2714 c->fake_launch_done = EINA_TRUE;
2715 if ((c->fake_win != 0)
2716 && (c->fake_launch_state))
2718 cw = _e_mod_comp_win_find(c->fake_win);
2721 // send_noeffect_signal
2722 edje_object_signal_emit(cw->shobj,
2723 "e,state,visible,on,noeffect",
2725 _e_mod_comp_disable_fake_launch(cw->c);
2731 _e_mod_comp_fake_hide_done(void *data,
2732 Evas_Object *obj __UNUSED__,
2733 const char *emission __UNUSED__,
2734 const char *source __UNUSED__)
2739 "[COMP] FAKE_EFFECT : Hide done \n");
2741 _e_mod_comp_disable_touch_event_block(c);
2743 evas_object_hide(c->fake_img_shobj);
2744 edje_object_part_unswallow(c->fake_img_shobj, c->fake_img_obj);
2745 evas_object_del(c->fake_img_obj);
2747 utilx_ungrab_key(ecore_x_display_get(), c->win, KEY_SELECT);
2748 utilx_ungrab_key(ecore_x_display_get(), c->win, KEY_VOLUMEUP);
2749 utilx_ungrab_key(ecore_x_display_get(), c->win, KEY_VOLUMEDOWN);
2750 utilx_ungrab_key(ecore_x_display_get(), c->win, KEY_CAMERA);
2754 _e_mod_comp_background_show_done(void *data,
2755 Evas_Object *obj __UNUSED__,
2756 const char *emission __UNUSED__,
2757 const char *source __UNUSED__)
2759 E_Comp_Win *cw = data;
2762 "[COMP] WIN_EFFECT : Background Show done -> win:0x%08x\n",
2765 cw->effect_stage = EINA_FALSE;
2766 _e_mod_comp_disable_effect_stage(cw->c);
2769 "[COMP] WIN_EFFECT : Background Show done (Background show animate_hide window) -> win:0x%08x\n",
2772 _e_mod_comp_done_defer(cw);
2776 _e_mod_comp_background_hide_done(void *data,
2777 Evas_Object *obj __UNUSED__,
2778 const char *emission __UNUSED__,
2779 const char *source __UNUSED__)
2781 E_Comp_Win *cw = data;
2784 "[COMP] WIN_EFFECT : Background Hide done -> win:0x%08x\n",
2787 cw->effect_stage = EINA_FALSE;
2788 _e_mod_comp_disable_effect_stage(cw->c);
2791 "[COMP] WIN_EFFECT : Background Hide done (Background hide animate_hide window) -> win:0x%08x\n",
2794 _e_mod_comp_done_defer(cw);
2797 // if Border is not existed then, return itself.
2798 // otherwise, return itself or parent.
2800 _e_mod_comp_win_transient_parent_find(E_Comp_Win *cw)
2802 Ecore_X_Window transient_parent;
2803 E_Comp_Win *parent_cw = NULL;
2804 E_Border *bd = NULL;
2809 transient_parent = bd->win;
2813 parent_cw = _e_mod_comp_win_find(transient_parent);
2820 _e_mod_comp_win_find_background_win(E_Comp_Win *cw)
2822 Eina_Inlist *wins_list;
2823 E_Comp_Win *find_cw = cw;
2824 if (!find_cw) return NULL;
2826 while ((wins_list = EINA_INLIST_GET(find_cw)->prev) != NULL)
2828 find_cw = _EINA_INLIST_CONTAINER(find_cw, wins_list);
2829 if ((find_cw->w == find_cw->c->man->w) &&
2830 (find_cw->h == find_cw->c->man->h) &&
2831 (find_cw->x == 0) &&
2832 (find_cw->y == 0) &&
2833 (find_cw->visible) &&
2834 (find_cw->invalid == EINA_FALSE) &&
2835 (find_cw->input_only == EINA_FALSE))
2844 _e_mod_comp_win_find_fake_background_win(E_Comp *c)
2846 E_Comp_Win *find_cw = NULL;
2847 if (!c) return NULL;
2849 EINA_INLIST_REVERSE_FOREACH(c->wins, find_cw)
2851 if ((find_cw->w == c->man->w) &&
2852 (find_cw->h == c->man->h) &&
2853 (find_cw->x == 0) &&
2854 (find_cw->y == 0) &&
2855 (find_cw->visible) &&
2856 (find_cw->invalid == EINA_FALSE) &&
2857 (find_cw->input_only == EINA_FALSE))
2866 _e_mod_comp_win_sync_setup(E_Comp_Win *cw,
2869 if (!_comp_mod->conf->efl_sync) return;
2872 if (_e_mod_comp_win_is_borderless(cw)
2873 || (_comp_mod->conf->loose_sync))
2874 cw->counter = ecore_x_e_comp_sync_counter_get(win);
2877 ecore_x_e_comp_sync_cancel_send(win);
2882 cw->counter = ecore_x_e_comp_sync_counter_get(win);
2888 E_Comp_Win *client_cw = _e_mod_comp_win_find(win);
2890 client_cw->counter == cw->counter)
2892 ecore_x_sync_counter_inc(cw->counter, 1);
2897 ecore_x_e_comp_sync_begin_send(win);
2898 ecore_x_sync_counter_inc(cw->counter, 1);
2903 _e_mod_comp_win_shadow_setup(E_Comp_Win *cw)
2910 evas_object_image_smooth_scale_set(cw->obj, _comp_mod->conf->smooth_windows);
2911 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
2913 evas_object_image_smooth_scale_set(o, _comp_mod->conf->smooth_windows);
2916 if (_comp_mod->conf->shadow_file)
2918 ok = _e_mod_comp_shadow_policy(cw);
2924 "[E17-comp] EDC Animation isn't loaded! win:0x%08x %s(%d) file:%s\n",
2925 cw->win, __func__, __LINE__, _comp_mod->conf->shadow_file);
2927 _e_mod_comp_get_edje_error(cw);
2929 if (_comp_mod->conf->shadow_style)
2931 snprintf(buf, sizeof(buf), "e/comp/%s", _comp_mod->conf->shadow_style);
2932 ok = e_theme_edje_object_set(cw->shobj,
2933 "base/theme/borders",
2938 ok = e_theme_edje_object_set(cw->shobj,
2939 "base/theme/borders",
2943 // fallback to local shadow.edj - will go when default theme supports this
2947 "[E17-comp] EDC Animation isn't loaded! win:0x%08x %s(%d)\n",
2948 cw->win, __func__, __LINE__);
2949 _e_mod_comp_get_edje_error(cw);
2950 snprintf(buf, sizeof(buf), "%s/shadow.edj", e_module_dir_get(_comp_mod->module));
2951 ok = edje_object_file_set(cw->shobj, buf, "shadow");
2953 if (!edje_object_part_swallow(cw->shobj,
2954 "e.swallow.content",
2958 "[E17-comp] Window pixmap didn't swalloed! win:0x%08x %s(%d)\n",
2959 cw->win, __func__, __LINE__);
2962 _e_mod_comp_get_edje_error(cw);
2963 edje_object_signal_emit(cw->shobj,
2964 "e,state,shadow,off",
2969 if (cw->bd->focused)
2970 edje_object_signal_emit(cw->shobj,
2973 if (cw->bd->client.icccm.urgent)
2974 edje_object_signal_emit(cw->shobj,
2975 "e,state,urgent,on",
2980 static Evas_Object *
2981 _e_mod_comp_win_mirror_add(E_Comp_Win *cw)
2985 if (!cw->c) return NULL;
2987 o = evas_object_image_filled_add(cw->c->evas);
2988 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
2989 cw->obj_mirror = eina_list_append(cw->obj_mirror, o);
2991 if ((cw->pixmap) && (cw->pw > 0) && (cw->ph > 0))
2997 alpha = evas_object_image_alpha_get(cw->obj);
2998 evas_object_image_size_get(cw->obj, &w, &h);
3000 evas_object_image_alpha_set(o, alpha);
3004 pix = evas_object_image_data_get(cw->obj, 0);
3005 evas_object_image_data_set(o, pix);
3006 evas_object_image_size_set(o, w, h);
3007 evas_object_image_data_set(o, pix);
3008 evas_object_image_data_update_add(o, 0, 0, w, h);
3014 Evas_Native_Surface ns;
3016 ns.version = EVAS_NATIVE_SURFACE_VERSION;
3017 ns.type = EVAS_NATIVE_SURFACE_X11;
3018 ns.data.x11.visual = cw->vis;
3019 ns.data.x11.pixmap = cw->pixmap;
3020 evas_object_image_size_set(o, w, h);
3021 evas_object_image_native_surface_set(o, &ns);
3022 evas_object_image_data_update_add(o, 0, 0, w, h);
3026 pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL);
3027 evas_object_image_data_set(o, pix);
3028 evas_object_image_size_set(o, w, h);
3029 evas_object_image_data_set(o, pix);
3030 evas_object_image_data_update_add(o, 0, 0, w, h);
3033 evas_object_image_size_set(o, w, h);
3034 evas_object_image_data_update_add(o, 0, 0, w, h);
3042 _e_mod_comp_win_add(E_Comp *c,
3045 Ecore_X_Window_Attributes att;
3048 cw = calloc(1, sizeof(E_Comp_Win));
3049 if (!cw) return NULL;
3053 cw->bd = e_border_find_by_window(cw->win);
3054 cw->resize_hide = EINA_FALSE;
3055 cw->animate_hide = EINA_FALSE;
3056 cw->animatable = EINA_TRUE;
3057 cw->first_show_worked = EINA_FALSE;
3058 cw->show_done = EINA_FALSE;
3059 cw->effect_stage = EINA_FALSE;
3060 cw->win_type = WIN_NORMAL;
3061 cw->defer_move_resize = EINA_FALSE;
3062 //cw->ready_hide_effect = EINA_FALSE;
3064 _e_mod_comp_window_effect_policy(cw);
3066 if (_comp_mod->conf->grab) ecore_x_grab();
3069 eina_hash_add(borders, e_util_winid_str_get(cw->bd->client.win), cw);
3070 cw->dfn = e_object_delfn_add(E_OBJECT(cw->bd),
3071 _e_mod_comp_object_del, cw);
3073 if (_e_mod_comp_is_normal_window(cw->bd) ) cw->win_type = WIN_NORMAL;
3074 else if (_e_mod_comp_is_quickpanel_window(cw->bd) ) cw->win_type = WIN_QUICKPANEL;
3075 else if (_e_mod_comp_is_task_manager_window(cw->bd) ) cw->win_type = WIN_TASK_MANAGER;
3076 else if (_e_mod_comp_is_live_magazine_window(cw->bd) ) cw->win_type = WIN_LIVE_MAGAZINE;
3077 else if (_e_mod_comp_is_lock_screen_window(cw->bd) ) cw->win_type = WIN_LOCK_SCREEN;
3078 else if (_e_mod_comp_is_indicator_window(cw->bd) ) cw->win_type = WIN_INDICATOR;
3079 else if (_e_mod_comp_is_isf_main_window(cw->bd) ) cw->win_type = WIN_ISF_MAIN;
3080 else if (_e_mod_comp_is_isf_sub_window(cw->bd) ) cw->win_type = WIN_ISF_SUB;
3081 else if (_e_mod_comp_is_tooltip_window(cw->bd) ) cw->win_type = WIN_TOOLTIP;
3082 else if (_e_mod_comp_is_combo_window(cw->bd) ) cw->win_type = WIN_COMBO;
3083 else if (_e_mod_comp_is_dnd_window(cw->bd) ) cw->win_type = WIN_DND;
3084 else if (_e_mod_comp_is_desktop_window(cw->bd) ) cw->win_type = WIN_DESKTOP;
3085 else if (_e_mod_comp_is_toolbar_window(cw->bd) ) cw->win_type = WIN_TOOLBAR;
3086 else if (_e_mod_comp_is_menu_window(cw->bd) ) cw->win_type = WIN_MENU;
3087 else if (_e_mod_comp_is_splash_window(cw->bd) ) cw->win_type = WIN_SPLASH;
3088 else if (_e_mod_comp_is_drop_down_menu_window(cw->bd)) cw->win_type = WIN_DROP_DOWN_MENU;
3089 else if (_e_mod_comp_is_notification_window(cw->bd) ) cw->win_type = WIN_NOTIFICATION;
3090 else if (_e_mod_comp_is_utility_window(cw->bd) ) cw->win_type = WIN_UTILITY;
3091 else if (_e_mod_comp_is_popup_menu_window(cw->bd) ) cw->win_type = WIN_POPUP_MENU;
3092 else if (_e_mod_comp_is_dialog_window(cw->bd) ) cw->win_type = WIN_DIALOG;
3096 cw->pop = e_popup_find_by_window(cw->win);
3098 cw->dfn = e_object_delfn_add(E_OBJECT(cw->pop),
3099 _e_mod_comp_object_del, cw);
3102 cw->menu = e_menu_find_by_window(cw->win);
3104 cw->dfn = e_object_delfn_add(E_OBJECT(cw->menu),
3105 _e_mod_comp_object_del, cw);
3108 char *netwm_title = NULL;
3109 cw->title = ecore_x_icccm_title_get(cw->win);
3110 if (ecore_x_netwm_name_get(cw->win, &netwm_title))
3112 if (cw->title) free(cw->title);
3113 cw->title = netwm_title;
3115 ecore_x_icccm_name_class_get(cw->win, &cw->name, &cw->clas);
3116 cw->role = ecore_x_icccm_window_role_get(cw->win);
3117 if (!ecore_x_netwm_window_type_get(cw->win, &cw->primary_type))
3118 cw->primary_type = ECORE_X_WINDOW_TYPE_UNKNOWN;
3122 // fixme: could use bd/pop/menu for this too
3123 memset((&att), 0, sizeof(Ecore_X_Window_Attributes));
3124 if (!ecore_x_window_attributes_get(cw->win, &att))
3127 if (_comp_mod->conf->grab) ecore_x_ungrab();
3131 if ((!att.input_only) &&
3132 ((att.depth != 24) && (att.depth != 32)))
3134 printf("WARNING: window 0x%x not 24/32bpp -> %ibpp\n",
3135 cw->win, att.depth);
3138 cw->input_only = att.input_only;
3139 cw->override = att.override;
3140 cw->vis = att.visual;
3141 cw->depth = att.depth;
3142 cw->argb = ecore_x_window_argb_get(cw->win);
3144 eina_hash_add(windows, e_util_winid_str_get(cw->win), cw);
3146 if ((!cw->input_only) && (!cw->invalid))
3148 Ecore_X_Rectangle *rects;
3151 cw->damage = ecore_x_damage_new
3152 (cw->win, ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES);
3153 eina_hash_add(damages, e_util_winid_str_get(cw->damage), cw);
3154 cw->shobj = edje_object_add(c->evas);
3155 if (!cw->c->use_bg_img)
3157 evas_object_stack_below(cw->c->bg_img, evas_object_bottom_get(cw->c->evas));
3159 cw->obj = evas_object_image_filled_add(c->evas);
3160 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
3162 if (cw->argb) evas_object_image_alpha_set(cw->obj, 1);
3163 else evas_object_image_alpha_set(cw->obj, 0);
3165 _e_mod_comp_win_shadow_setup(cw);
3166 _e_mod_comp_win_cb_setup(cw);
3168 evas_object_show(cw->obj);
3169 ecore_x_window_shape_events_select(cw->win, 1);
3170 rects = ecore_x_window_shape_rectangles_get(cw->win, &num);
3177 for (i = 0; i < num; i++)
3179 int_w = (int)rects[i].width;
3180 int_h = (int)rects[i].height;
3181 E_RECTS_CLIP_TO_RECT(rects[i].x, rects[i].y,
3183 0, 0, att.w, att.h);
3184 rects[i].width = (unsigned int)int_w;
3185 rects[i].height = (unsigned int)int_h;
3188 if (!_e_mod_comp_shaped_check(att.w, att.h, rects, num))
3195 cw->shape_changed = 1;
3199 if (cw->bd) evas_object_data_set(cw->shobj, "border", cw->bd);
3200 else if (cw->pop) evas_object_data_set(cw->shobj, "popup", cw->pop);
3201 else if (cw->menu) evas_object_data_set(cw->shobj, "menu", cw->menu);
3203 evas_object_pass_events_set(cw->obj, 1);
3205 cw->pending_count++;
3206 e_manager_comp_event_src_add_send
3207 (cw->c->man, (E_Manager_Comp_Source *)cw,
3208 _e_mod_comp_cb_pending_after, cw->c);
3212 cw->shobj = evas_object_rectangle_add(c->evas);
3213 evas_object_color_set(cw->shobj, 0, 0, 0, 0);
3215 evas_object_pass_events_set(cw->shobj, 1);
3216 evas_object_data_set(cw->shobj, "win",
3217 (void *)((unsigned long)cw->win));
3218 evas_object_data_set(cw->shobj, "src", cw);
3220 c->wins_invalid = 1;
3221 c->wins = eina_inlist_append(c->wins, EINA_INLIST_GET(cw));
3222 cw->up = e_mod_comp_update_new();
3223 e_mod_comp_update_tile_size_set(cw->up, 32, 32);
3225 e_mod_comp_update_policy_set
3226 (cw->up, E_UPDATE_POLICY_HALF_WIDTH_OR_MORE_ROUND_UP_TO_FULL_WIDTH);
3227 if (((!cw->input_only) && (!cw->invalid)) && (cw->override))
3230 cw->dmg_updates = 0;
3232 if (_comp_mod->conf->grab) ecore_x_ungrab();
3237 _e_mod_comp_win_del(E_Comp_Win *cw)
3243 // while win_hide animation is progressing, at that time win_del is called,
3244 // background window effect is may not work fully.
3245 // so, explicit call disable effect stage function.
3246 if (cw->effect_stage)
3247 _e_mod_comp_disable_effect_stage(cw->c);
3253 _e_mod_comp_send_window_effect_client_state(cw, EINA_FALSE);
3256 if ((!cw->input_only) && (!cw->invalid))
3258 cw->pending_count++;
3259 e_manager_comp_event_src_del_send
3260 (cw->c->man, (E_Manager_Comp_Source *)cw,
3261 _e_mod_comp_cb_pending_after, cw->c);
3264 e_mod_comp_update_free(cw->up);
3265 _e_mod_comp_rotation_release(cw);
3267 // release window rotation stuffs
3268 _e_mod_comp_win_rotation_release(cw);
3275 if (cw->update_timeout)
3277 ecore_timer_del(cw->update_timeout);
3278 cw->update_timeout = NULL;
3284 eina_hash_del(borders, e_util_winid_str_get(cw->bd->client.win), cw);
3285 e_object_delfn_del(E_OBJECT(cw->bd), cw->dfn);
3290 e_object_delfn_del(E_OBJECT(cw->pop), cw->dfn);
3295 e_object_delfn_del(E_OBJECT(cw->menu), cw->dfn);
3305 evas_object_image_native_surface_set(cw->obj, NULL);
3306 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
3308 evas_object_image_native_surface_set(o, NULL);
3312 ecore_x_pixmap_free(cw->pixmap);
3316 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
3317 _e_mod_comp_win_free_xim(cw);
3328 cw->c->updates = eina_list_remove(cw->c->updates, cw);
3333 EINA_LIST_FREE(cw->obj_mirror, _o)
3336 if (cw->xim) evas_object_image_data_set(_o, NULL);
3337 evas_object_del(_o);
3342 evas_object_image_data_set(cw->obj, NULL);
3343 ecore_x_image_free(cw->xim);
3348 evas_object_del(cw->obj);
3353 evas_object_del(cw->shobj);
3357 eina_hash_del(windows, e_util_winid_str_get(cw->win), cw);
3360 Ecore_X_Region parts;
3362 eina_hash_del(damages, e_util_winid_str_get(cw->damage), cw);
3363 parts = ecore_x_region_new(NULL, 0);
3364 ecore_x_damage_subtract(cw->damage, 0, parts);
3365 ecore_x_region_free(parts);
3366 ecore_x_damage_free(cw->damage);
3369 if (cw->title) free(cw->title);
3370 if (cw->name) free(cw->name);
3371 if (cw->clas) free(cw->clas);
3372 if (cw->role) free(cw->role);
3373 cw->c->wins_invalid = 1;
3374 cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw));
3375 pending_count = cw->pending_count;
3376 memset(cw, 0, sizeof(E_Comp_Win));
3377 cw->pending_count = pending_count;
3378 cw->delete_pending = 1;
3379 if (cw->pending_count > 0) return;
3384 _e_mod_comp_win_show(E_Comp_Win *cw)
3389 // if win_hide was showed then immediatly win_show() function is called. case.
3390 if (cw->defer_hide == 1) cw->defer_hide = 0;
3391 if (cw->visible) return;
3393 _e_mod_comp_win_configure(cw,
3394 cw->hidden.x, cw->hidden.y,
3397 if ((cw->input_only) || (cw->invalid)) return;
3400 _e_mod_comp_win_sync_setup(cw, cw->bd->client.win);
3402 _e_mod_comp_win_sync_setup(cw, cw->win);
3409 evas_object_image_native_surface_set(cw->obj, NULL);
3411 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
3413 evas_object_image_native_surface_set(o, NULL);
3418 ecore_x_pixmap_free(cw->pixmap);
3422 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
3426 evas_object_image_size_set(cw->obj, 1, 1);
3427 evas_object_image_data_set(cw->obj, NULL);
3428 ecore_x_image_free(cw->xim);
3430 _e_mod_comp_win_free_xim(cw);
3431 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
3433 evas_object_image_size_set(o, 1, 1);
3434 evas_object_image_data_set(o, NULL);
3445 if ((!cw->redirected) || (!cw->pixmap))
3447 if (!cw->pixmap) cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win);
3449 "[COMP]\t\tSHOW ecore_x_composite_name_window_pixmap_get() pixmap:0x%08x after redirect\n",
3452 ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph));
3458 if ((cw->pw <= 0) || (cw->ph <= 0))
3462 ecore_x_pixmap_free(cw->pixmap);
3466 "[COMP]\t\tSHOW free pixmap: 0x%08x invalid pixmap size.\n",
3472 e_mod_comp_update_resize(cw->up, cw->pw, cw->ph);
3473 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
3475 evas_object_image_size_set(cw->obj, cw->pw, cw->ph);
3476 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
3478 evas_object_image_size_set(o, cw->pw, cw->ph);
3482 "[COMP]\t\tSHOW redirect win pixmap:0x%08x %3dx%3d\n",
3483 cw->pixmap, cw->pw, cw->ph);
3485 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
3488 if (cw->dmg_updates >= 1)
3490 if ((cw->c->gl) && (_comp_mod->conf->texture_from_pixmap))
3493 cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win);
3497 ecore_x_pixmap_geometry_get(cw->pixmap,
3499 &(cw->pw), &(cw->ph));
3507 if ((cw->pw <= 0) || (cw->ph <= 0))
3510 ecore_x_pixmap_free(cw->pixmap);
3514 "[COMP]\t\tSHOW free pixmap: 0x%08x invalid pixmap size.\n",
3519 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
3520 evas_object_image_size_set(cw->obj, cw->pw, cw->ph);
3521 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
3523 evas_object_image_size_set(o, cw->pw, cw->ph);
3527 Evas_Native_Surface ns;
3528 ns.version = EVAS_NATIVE_SURFACE_VERSION;
3529 ns.type = EVAS_NATIVE_SURFACE_X11;
3530 ns.data.x11.visual = cw->vis;
3531 ns.data.x11.pixmap = cw->pixmap;
3532 evas_object_image_native_surface_set(cw->obj, &ns);
3534 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
3536 evas_object_image_native_surface_set(o, &ns);
3539 evas_object_image_data_update_add(cw->obj, 0, 0, cw->pw, cw->ph);
3548 if (!cw->hidden_override)
3550 if ( cw->defer_move_resize )
3552 evas_object_move(cw->shobj, cw->x, cw->y );
3553 evas_object_resize(cw->shobj, cw->pw + (cw->border * 2),
3554 cw->ph + (cw->border * 2));
3555 cw->defer_move_resize = EINA_FALSE;
3557 evas_object_show(cw->shobj);
3560 "[COMP]\t\tSHOW evas_object_show()\n");
3562 "[COMP] WIN_EFFECT : Show signal Emit -> win:0x%08x\n",
3564 _e_mod_comp_window_show_effect(cw);
3567 _e_mod_comp_win_render_queue(cw);
3571 _e_mod_comp_win_unredirect(E_Comp_Win *cw)
3573 if (!cw->visible) return;
3574 if ((cw->input_only) || (cw->invalid)) return;
3578 evas_object_hide(cw->obj);
3579 evas_object_del(cw->obj);
3582 if (cw->update_timeout)
3584 ecore_timer_del(cw->update_timeout);
3585 cw->update_timeout = NULL;
3589 evas_object_image_native_surface_set(cw->obj, NULL);
3594 ecore_x_pixmap_free(cw->pixmap);
3601 evas_object_image_size_set(cw->obj, 1, 1);
3602 evas_object_image_data_set(cw->obj, NULL);
3603 ecore_x_image_free(cw->xim);
3608 ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
3613 _e_mod_comp_win_del_damage(cw, cw->damage);
3614 ecore_x_damage_subtract(cw->damage, 0, 0);
3615 ecore_x_damage_free(cw->damage);
3621 _e_mod_comp_win_real_hide(E_Comp_Win *cw)
3625 _e_mod_comp_win_hide(cw);
3629 _e_mod_comp_win_hide(cw);
3633 _e_mod_comp_win_hide(E_Comp_Win *cw)
3638 if ((!cw->visible) && (!cw->defer_hide)) return;
3640 if ((cw->input_only) || (cw->invalid)) return;
3642 /* release window rotation stuffs */
3643 _e_mod_comp_win_rotation_release(cw);
3650 e_mod_comp_rotation_end_effect(cw->rotobj);
3652 _e_mod_comp_win_inc_animating(cw);
3654 cw->pending_count++;
3657 "[COMP] %31s w:0x%08x hide rotobj. bd:%s force:%d defer_hide:%d\n",
3658 "PIX_ROT", _e_mod_comp_win_get_client_xid(cw),
3659 cw->bd ? "O" : "X", cw->force, cw->defer_hide);
3666 _e_mod_comp_rotation_release(cw);
3673 _e_mod_comp_window_hide_effect(cw);
3678 evas_object_hide(cw->shobj);
3680 Ecore_X_Window _w = _e_mod_comp_win_get_client_xid(cw);
3681 if (cw->update_timeout)
3683 ecore_timer_del(cw->update_timeout);
3684 cw->update_timeout = NULL;
3686 if (_comp_mod->conf->keep_unmapped)
3688 if (_comp_mod->conf->send_flush) ecore_x_e_comp_flush_send(_w);
3689 if (_comp_mod->conf->send_dump) ecore_x_e_comp_dump_send(_w);
3695 evas_object_image_native_surface_set(cw->obj, NULL);
3697 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
3699 evas_object_image_native_surface_set(o, NULL);
3704 ecore_x_pixmap_free(cw->pixmap);
3708 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
3712 evas_object_image_size_set(cw->obj, 1, 1);
3713 evas_object_image_data_set(cw->obj, NULL);
3714 ecore_x_image_free(cw->xim);
3716 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
3718 evas_object_image_size_set(o, 1, 1);
3719 evas_object_image_data_set(o, NULL);
3728 _e_mod_comp_win_render_queue(cw);
3729 if (_comp_mod->conf->send_flush) ecore_x_e_comp_flush_send(_w);
3730 if (_comp_mod->conf->send_dump) ecore_x_e_comp_dump_send(_w);
3734 _e_mod_comp_win_raise_above(E_Comp_Win *cw,
3737 Eina_Bool show_stack_before = EINA_FALSE;
3738 Eina_Bool show_stack_after = EINA_FALSE;
3739 Eina_Bool real_show_stack_effect = EINA_TRUE;
3741 E_Comp_Win *lower_background = NULL;
3744 "[COMP] WIN_EFFECT : Raise Above [0x%x] <- [0x%x]\n",
3745 _e_mod_comp_win_get_client_xid(cw),
3746 _e_mod_comp_win_get_client_xid(cw2));
3748 if (cw->c->switcher)
3751 Evas_Coord x, y, w, h;
3752 E_Comp_Win *find_cw;
3753 EINA_INLIST_REVERSE_FOREACH(cw->c->wins, find_cw)
3755 if (find_cw->visible
3756 && evas_object_visible_get(find_cw->shobj)
3757 && evas_object_visible_get(find_cw->obj)
3758 && (find_cw->win_type != WIN_INDICATOR)
3759 && (find_cw->win_type != WIN_TASK_MANAGER))
3761 evas_object_geometry_get( find_cw->shobj, &x, &y, &w, &h );
3762 if ( w == find_cw->c->screen_w && h == find_cw->c->screen_h )
3767 cw->c->selected_pos = i;
3775 cw->c->wins_invalid = 1;
3777 lower_background = _e_mod_comp_win_find_background_win(cw);
3778 //real show effect check 1
3779 show_stack_before = _e_mod_comp_is_next_win_stack(cw, cw2);
3781 cw->c->wins = eina_inlist_remove(cw->c->wins,
3782 EINA_INLIST_GET(cw));
3783 cw->c->wins = eina_inlist_append_relative(cw->c->wins,
3784 EINA_INLIST_GET(cw),
3785 EINA_INLIST_GET(cw2));
3786 //real show effect check 2
3787 show_stack_after = _e_mod_comp_is_next_win_stack(cw, cw2);
3789 if (show_stack_before == show_stack_after)
3790 real_show_stack_effect = EINA_FALSE;
3792 // indicate slide up and down, save current position, size, color
3793 if ( ( _e_mod_comp_window_restack_policy(cw, cw2) == EINA_TRUE)
3794 && ( real_show_stack_effect == EINA_TRUE)
3795 && ( cw->first_show_worked == EINA_TRUE) )
3797 _e_mod_comp_window_restack_effect(cw, cw2);
3799 else if ( ( _e_mod_comp_window_restack_policy(cw, lower_background) == EINA_TRUE )
3800 && ( real_show_stack_effect == EINA_FALSE)
3801 && ( cw->show_done == EINA_TRUE)
3802 && ( _e_mod_comp_win_check_visible2(cw) == EINA_FALSE ) )
3803 // && ( cw->ready_hide_effect == EINA_TRUE) )
3805 _e_mod_comp_window_lower_effect(cw, lower_background);
3809 evas_object_stack_above(cw->shobj, cw2->shobj);
3811 // for no-effect window
3812 if ( (cw->visible == EINA_TRUE)
3813 && (cw->first_show_worked == EINA_TRUE ) )
3815 edje_object_signal_emit(cw->shobj,
3816 "e,state,visible,on,noeffect",
3819 "[COMP] WIN_EFFECT : Raise above(for no-effect window) signal Emit -> win:0x%08x\n",
3821 _e_mod_comp_win_inc_animating(cw);
3825 _e_mod_comp_win_render_queue(cw);
3826 cw->pending_count++;
3827 e_manager_comp_event_src_config_send
3828 (cw->c->man, (E_Manager_Comp_Source *)cw,
3829 _e_mod_comp_cb_pending_after, cw->c);
3833 _e_mod_comp_win_raise(E_Comp_Win *cw)
3835 cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw));
3836 cw->c->wins = eina_inlist_append(cw->c->wins, EINA_INLIST_GET(cw));
3838 evas_object_raise(cw->shobj);
3839 _e_mod_comp_win_render_queue(cw);
3843 _e_mod_comp_win_lower(E_Comp_Win *cw)
3845 cw->c->wins_invalid = 1;
3846 cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw));
3847 cw->c->wins = eina_inlist_prepend(cw->c->wins, EINA_INLIST_GET(cw));
3849 evas_object_lower(cw->shobj);
3850 _e_mod_comp_win_render_queue(cw);
3851 cw->pending_count++;
3852 e_manager_comp_event_src_config_send
3853 (cw->c->man, (E_Manager_Comp_Source *)cw,
3854 _e_mod_comp_cb_pending_after, cw->c);
3858 _e_mod_comp_win_configure(E_Comp_Win *cw,
3863 if (cw->rotating && cw->rotobj)
3865 if (!((w == cw->w) && (h == cw->h)))
3867 Ecore_X_Window win = _e_mod_comp_win_get_client_xid(cw);
3870 "[COMP] %31s w:0x%08x bd:%s resize.\n",
3871 "PIX_ROT", win, cw->bd ? "O" : "X");
3873 _e_mod_comp_win_recreate_shobj(cw);
3874 e_mod_comp_rotation_done_send(win, ATOM_CM_PIXMAP_ROTATION_RESIZE_PIXMAP);
3877 "[COMP] %31s w:0x%08x send ROTATION_RESIZE_PIXMAP.\n",
3882 if (!((w == cw->w) && (h == cw->h)))
3887 cw->dmg_updates = 0;
3894 cw->border = border;
3898 if (!((x == cw->x) && (y == cw->y)))
3903 evas_object_move(cw->shobj, cw->x, cw->y);
3909 if (cw->border != border)
3911 cw->border = border;
3912 evas_object_resize(cw->shobj,
3913 cw->pw + (cw->border * 2),
3914 cw->ph + (cw->border * 2));
3916 cw->hidden.w = cw->w;
3917 cw->hidden.h = cw->h;
3918 if ((cw->input_only) || (cw->invalid) || (cw->needpix)) return;
3919 _e_mod_comp_win_render_queue(cw);
3920 cw->pending_count++;
3921 e_manager_comp_event_src_config_send
3922 (cw->c->man, (E_Manager_Comp_Source *)cw,
3923 _e_mod_comp_cb_pending_after, cw->c);
3927 _e_mod_comp_win_damage(E_Comp_Win *cw,
3932 if ((cw->input_only) || (cw->invalid)) return;
3933 if ((dmg) && (cw->rotating))
3935 e_mod_comp_rotation_damage(cw->rotobj);
3938 else if ((dmg) && (cw->damage))
3940 Ecore_X_Region parts;
3941 parts = ecore_x_region_new(NULL, 0);
3942 ecore_x_damage_subtract(cw->damage, 0, parts);
3943 ecore_x_region_free(parts);
3946 e_mod_comp_update_add(cw->up, x, y, w, h);
3951 if (!cw->update_timeout)
3952 cw->update_timeout = ecore_timer_add
3953 (ecore_animator_frametime_get() * 600,
3954 _e_mod_comp_win_damage_timeout, cw);
3959 /* to fix noise window appearing when non-EFL's window is showing,
3960 * add a check code that checks and skips first damage.
3961 * first damage is generated by the X server when copying image of the
3962 * root window. - gl77.lee 110208
3966 && (cw->dmg_updates <= 1))
3971 "[COMP] %31s w:0x%08x bd:%s skip first damage.\n",
3972 "X_DAMAGE", _e_mod_comp_win_get_client_xid(cw),
3973 cw->bd ? "O" : "X");
3981 cw->c->updates = eina_list_append(cw->c->updates, cw);
3983 _e_mod_comp_win_render_queue(cw);
3987 _e_mod_comp_win_reshape(E_Comp_Win *cw)
3989 if (cw->shape_changed) return;
3990 cw->shape_changed = 1;
3994 cw->c->updates = eina_list_append(cw->c->updates, cw);
3996 e_mod_comp_update_add(cw->up, 0, 0, cw->w, cw->h);
3997 _e_mod_comp_win_render_queue(cw);
4001 _e_mod_comp_create(void *data __UNUSED__,
4002 int type __UNUSED__,
4005 Ecore_X_Event_Window_Create *ev = event;
4007 E_Comp *c = _e_mod_comp_find(ev->parent);
4008 if (!c) return ECORE_CALLBACK_PASS_ON;
4009 if (_e_mod_comp_win_find(ev->win)) return ECORE_CALLBACK_PASS_ON;
4010 if (c->win == ev->win) return ECORE_CALLBACK_PASS_ON;
4011 if (c->ee_win == ev->win) return ECORE_CALLBACK_PASS_ON;
4013 "[COMP] ev:%15.15s w:0x%08x\n",
4014 "X_CREATE", ev->win);
4015 cw = _e_mod_comp_win_add(c, ev->win);
4017 _e_mod_comp_win_configure(cw,
4021 return ECORE_CALLBACK_PASS_ON;
4025 _e_mod_comp_destroy(void *data __UNUSED__,
4026 int type __UNUSED__,
4029 Ecore_X_Event_Window_Destroy *ev = event;
4030 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
4031 if (!cw) return ECORE_CALLBACK_PASS_ON;
4032 if (_e_mod_comp_win_is_border(cw)) return ECORE_CALLBACK_PASS_ON;
4034 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
4035 "X_DESTROY", ev->win, _e_mod_comp_win_is_border(cw),
4036 _e_mod_comp_win_get_client_xid(cw), cw);
4037 if (cw->animating) cw->delete_me = 1;
4038 else _e_mod_comp_win_del(cw);
4039 return ECORE_CALLBACK_PASS_ON;
4043 _e_mod_comp_show(void *data __UNUSED__,
4044 int type __UNUSED__,
4047 Ecore_X_Event_Window_Show *ev = event;
4048 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
4049 if (!cw) return ECORE_CALLBACK_PASS_ON;
4050 if (cw->visible) return ECORE_CALLBACK_PASS_ON;
4051 if (_e_mod_comp_win_is_border(cw)) return ECORE_CALLBACK_PASS_ON;
4053 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
4054 "X_SHOW", ev->win, _e_mod_comp_win_is_border(cw),
4055 _e_mod_comp_win_get_client_xid(cw), cw);
4056 _e_mod_comp_win_show(cw);
4057 return ECORE_CALLBACK_PASS_ON;
4061 _e_mod_comp_hide(void *data __UNUSED__,
4062 int type __UNUSED__,
4065 Ecore_X_Event_Window_Hide *ev = event;
4066 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
4067 if (!cw) return ECORE_CALLBACK_PASS_ON;
4068 if (!cw->visible) return ECORE_CALLBACK_PASS_ON;
4069 if (_e_mod_comp_win_is_border(cw)) return ECORE_CALLBACK_PASS_ON;
4071 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
4072 "X_HIDE", ev->win, _e_mod_comp_win_is_border(cw),
4073 _e_mod_comp_win_get_client_xid(cw), cw);
4074 _e_mod_comp_win_real_hide(cw);
4075 return ECORE_CALLBACK_PASS_ON;
4079 _e_mod_comp_reparent(void *data __UNUSED__,
4080 int type __UNUSED__,
4083 Ecore_X_Event_Window_Reparent *ev = event;
4084 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
4085 if (!cw) return ECORE_CALLBACK_PASS_ON;
4087 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p TO rw:0x%08x\n",
4088 "X_REPARENT", ev->win, _e_mod_comp_win_is_border(cw),
4089 _e_mod_comp_win_get_client_xid(cw), cw, ev->parent);
4090 if (ev->parent != cw->c->man->root)
4092 L(LT_EVENT_X, "[COMP] %31s w:0x%08x\n", "DEL", ev->win);
4093 _e_mod_comp_win_del(cw);
4096 return ECORE_CALLBACK_PASS_ON;
4100 _e_mod_comp_configure(void *data __UNUSED__,
4101 int type __UNUSED__,
4104 Ecore_X_Event_Window_Configure *ev = event;
4105 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
4106 if (!cw) return ECORE_CALLBACK_PASS_ON;
4108 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p %4d %4d %3dx%3d\n",
4109 "X_CONFIGURE", ev->win, _e_mod_comp_win_is_border(cw),
4110 _e_mod_comp_win_get_client_xid(cw), cw, ev->x, ev->y, ev->w, ev->h);
4111 if (ev->abovewin == 0)
4113 if (EINA_INLIST_GET(cw)->prev)
4116 "[COMP] %31s w:0x%08x\n",
4119 _e_mod_comp_win_lower(cw);
4124 E_Comp_Win *cw2 = _e_mod_comp_win_find(ev->abovewin);
4127 E_Comp_Win *cw3 = (E_Comp_Win *)(EINA_INLIST_GET(cw)->prev);
4131 "[COMP] %31s above_w:0x%08x\n",
4132 "RAISE_ABOVE", ev->abovewin);
4134 _e_mod_comp_win_raise_above(cw, cw2);
4139 if (!((cw->x == ev->x) && (cw->y == ev->y)) &&
4140 ((cw->w == ev->w) && (cw->h == ev->h)) &&
4141 _e_mod_comp_win_is_border(cw))
4143 return ECORE_CALLBACK_PASS_ON;
4146 if (!((cw->x == ev->x) && (cw->y == ev->y) &&
4147 (cw->w == ev->w) && (cw->h == ev->h) &&
4148 (cw->border == ev->border)))
4150 _e_mod_comp_win_configure(cw,
4155 return ECORE_CALLBACK_PASS_ON;
4159 _e_mod_comp_stack(void *data __UNUSED__,
4160 int type __UNUSED__,
4163 Ecore_X_Event_Window_Stack *ev = event;
4164 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
4166 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
4167 "X_STACK", ev->win, _e_mod_comp_win_is_border(cw), _e_mod_comp_win_get_client_xid(cw), cw);
4168 if (!cw) return ECORE_CALLBACK_PASS_ON;
4169 if (ev->detail == ECORE_X_WINDOW_STACK_ABOVE) _e_mod_comp_win_raise(cw);
4170 else _e_mod_comp_win_lower(cw);
4171 return ECORE_CALLBACK_PASS_ON;
4175 _e_mod_comp_prop_effect_state(Ecore_X_Event_Window_Property *ev __UNUSED__)
4178 unsigned int val = 0;
4181 c = _e_mod_comp_get();
4185 "[E17-comp] _e_mod_comp_prop_effect_state failed.\n");
4189 ret = ecore_x_window_prop_card32_get(c->man->root,
4192 if (ret == -1) return EINA_FALSE;
4195 "[COMP] %31s propval:%d\n",
4196 "PROP_COMP_EFFECT_STATE", val);
4200 c->animatable = EINA_TRUE;
4201 _comp_mod->conf->default_window_effect = 1;
4202 e_config_domain_save("module.comp-slp",
4203 _comp_mod->conf_edd,
4208 c->animatable = EINA_FALSE;
4209 _comp_mod->conf->default_window_effect = 0;
4210 e_config_domain_save("module.comp-slp",
4211 _comp_mod->conf_edd,
4216 "[COMP] %31s c->animatable:%d\n",
4217 "ATOM_WINDOW_EFFECT_ENABLE",
4224 _e_mod_comp_prop_window_effect_state(Ecore_X_Event_Window_Property *ev)
4226 E_Comp_Win *cw = NULL;
4227 unsigned int val = 0;
4230 ret = ecore_x_window_prop_card32_get(ev->win,
4231 ATOM_WINDOW_EFFECT_ENABLE,
4234 if (ret == -1) return EINA_FALSE;
4237 "[COMP] %31s propval:%d\n",
4238 "PROP_COMP_EFFECT_STATE", val);
4240 cw = _e_mod_comp_win_find(ev->win);
4241 if (cw) cw->animatable = val;
4244 cw = _e_mod_comp_border_client_find(ev->win);
4245 if (!cw) return EINA_FALSE;
4246 cw->animatable = val;
4250 "[COMP] %31s cw->animatable:%d\n",
4251 "ATOM_WINDOW_EFFECT_ENABLE",
4258 _e_mod_comp_prop_effect_style(Ecore_X_Event_Window_Property *ev)
4260 E_Comp_Win *cw = NULL;
4261 Ecore_X_Atom *atoms = NULL;
4264 num = ecore_x_window_prop_atom_list_get(ev->win,
4265 ATOM_WINDOW_EFFECT_TYPE,
4270 if (num > 0) free(atoms);
4276 "PROP_COMP_EFFECT_STYLE");
4278 cw = _e_mod_comp_win_find(ev->win);
4281 cw->show_effect = _e_mod_comp_get_effect_type(&atoms[0]);
4282 cw->hide_effect = _e_mod_comp_get_effect_type(&atoms[1]);
4283 cw->restack_effect = _e_mod_comp_get_effect_type(&atoms[2]);
4284 cw->rotation_effect = _e_mod_comp_get_effect_type(&atoms[3]);
4285 cw->focusin_effect = _e_mod_comp_get_effect_type(&atoms[4]);
4286 cw->focusout_effect = _e_mod_comp_get_effect_type(&atoms[5]);
4290 cw = _e_mod_comp_border_client_find(ev->win);
4293 if (num > 0) free(atoms);
4296 cw->show_effect = _e_mod_comp_get_effect_type(&atoms[0]);
4297 cw->hide_effect = _e_mod_comp_get_effect_type(&atoms[1]);
4298 cw->restack_effect = _e_mod_comp_get_effect_type(&atoms[2]);
4299 cw->rotation_effect = _e_mod_comp_get_effect_type(&atoms[3]);
4300 cw->focusin_effect = _e_mod_comp_get_effect_type(&atoms[4]);
4301 cw->focusout_effect = _e_mod_comp_get_effect_type(&atoms[5]);
4304 if (num > 0) free(atoms);
4310 #if COMP_LOGGER_BUILD_ENABLE
4312 _e_mod_comp_prop_log(Ecore_X_Event_Window_Property *ev)
4316 unsigned char* prop_data = NULL;
4317 Comp_Logger comp_log_info;
4319 comp_log_info.logger_type = 0;
4320 memset(comp_log_info.logger_dump_file, '\0', 256 * sizeof(char) );
4322 ret = ecore_x_window_prop_property_get(ev->win,
4324 ECORE_X_ATOM_CARDINAL,
4330 if (prop_data) free(prop_data);
4333 if ((ret > 0) && prop_data)
4336 "[E17-comp] %s(%d) comp_logger_type: ",
4337 __func__, __LINE__);
4339 if (comp_logger_type == LT_NOTHING) fprintf(stdout, "LT_NOTHING ");
4340 else if (comp_logger_type == LT_ALL ) fprintf(stdout, "LT_ALL " );
4341 else fprintf(stdout, "%d ", comp_logger_type);
4343 fprintf(stdout, "-> ");
4345 memcpy(&comp_log_info, prop_data, sizeof(Comp_Logger) );
4346 comp_logger_type = comp_log_info.logger_type;
4348 if (comp_logger_type == LT_NOTHING ) fprintf(stdout, "LT_NOTHING\n");
4349 else if (comp_logger_type == LT_ALL ) fprintf(stdout, "LT_ALL\n" );
4350 else fprintf(stdout, "%d\n", comp_logger_type);
4352 if (comp_logger_type == LT_CREATE)
4354 _e_mod_comp_dump_cw_stack(EINA_FALSE, NULL);
4355 _e_mod_comp_fps_toggle();
4357 if ( ( comp_logger_type == LT_DUMP )
4358 && ( strlen(comp_log_info.logger_dump_file) > 0 ) )
4360 _e_mod_comp_dump_cw_stack(EINA_TRUE, comp_log_info.logger_dump_file);
4362 ecore_x_client_message32_send (ecore_x_window_root_first_get(),
4363 ATOM_CM_LOG_DUMP_DONE,
4364 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
4367 if(prop_data) free(prop_data);
4372 #endif /* COMP_LOGGER_BUILD_ENABLE */
4375 _e_mod_comp_prop_opacity(Ecore_X_Event_Window_Property *ev)
4377 E_Comp_Win *cw = NULL;
4378 unsigned int val = 0;
4381 cw = _e_mod_comp_win_find(ev->win);
4384 cw = _e_mod_comp_border_client_find(ev->win);
4385 if (!cw) return EINA_FALSE;
4388 ret = ecore_x_window_prop_card32_get(cw->win,
4389 ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
4391 if (ret == -1) return EINA_FALSE;
4393 cw->use_opacity = EINA_TRUE;
4394 cw->opacity = (val >> 24);
4395 evas_object_color_set(cw->shobj,
4405 _e_mod_comp_prop_sync_counter(Ecore_X_Event_Window_Property *ev)
4407 E_Comp_Win *cw = NULL;
4408 cw = _e_mod_comp_win_find(ev->win);
4409 if (!cw) cw = _e_mod_comp_border_client_find(ev->win);
4411 Ecore_X_Sync_Counter counter = ecore_x_e_comp_sync_counter_get(ev->win);
4414 if (cw->counter != counter)
4416 Ecore_X_Window _w = _e_mod_comp_win_get_client_xid(cw);
4419 ecore_x_e_comp_sync_cancel_send(_w);
4420 ecore_x_sync_counter_inc(cw->counter, 1);
4422 cw->counter = counter;
4425 ecore_x_sync_counter_inc(cw->counter, 1);
4426 ecore_x_e_comp_sync_begin_send(_w);
4432 if (counter) ecore_x_sync_counter_inc(counter, 1);
4438 _e_mod_comp_property(void *data __UNUSED__,
4439 int type __UNUSED__,
4440 void *event __UNUSED__)
4442 Ecore_X_Event_Window_Property *ev = event;
4444 if (!ev) return ECORE_CALLBACK_PASS_ON;
4445 if (!ev->atom) return ECORE_CALLBACK_PASS_ON;
4446 if (!_e_mod_comp_get_atom_name(ev->atom)) return ECORE_CALLBACK_PASS_ON;
4450 "[COMP] ev:%15.15s w:0x%08x atom:%s\n",
4451 "X_PROPERTY", ev->win,
4452 _e_mod_comp_get_atom_name(a));
4454 if (a == ECORE_X_ATOM_E_COMP_SYNC_COUNTER ) _e_mod_comp_prop_sync_counter(ev);
4455 else if (a == ATOM_EFFECT_ENABLE ) _e_mod_comp_prop_effect_state(ev);
4456 else if (a == ATOM_WINDOW_EFFECT_ENABLE ) _e_mod_comp_prop_window_effect_state(ev);
4457 else if (a == ATOM_WINDOW_EFFECT_TYPE ) _e_mod_comp_prop_effect_style(ev);
4458 else if (a == ECORE_X_ATOM_NET_WM_WINDOW_OPACITY ) _e_mod_comp_prop_opacity(ev);
4459 else if (a == ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE) _e_mod_comp_prop_window_rotation(ev);
4460 #if COMP_LOGGER_BUILD_ENABLE
4461 else if (a == ATOM_CM_LOG ) _e_mod_comp_prop_log(ev);
4462 #endif /* COMP_LOGGER_BUILD_ENABLE */
4464 return ECORE_CALLBACK_PASS_ON;
4468 _e_mod_comp_msg_sync_draw_done(Ecore_X_Event_Client_Message *ev)
4470 E_Comp_Win *cw = NULL;
4471 int v = 0, w = 0, h = 0;
4472 cw = _e_mod_comp_border_client_find(ev->data.l[0]);
4478 if (!cw->bd) return EINA_FALSE;
4479 if ((Ecore_X_Window)(ev->data.l[0]) != cw->bd->client.win) return EINA_FALSE;
4483 cw = _e_mod_comp_win_find(ev->data.l[0]);
4484 if (!cw || (ev->data.l[0] != (int)cw->win))
4486 Ecore_X_Sync_Counter counter = ecore_x_e_comp_sync_counter_get(ev->win);
4487 ecore_x_e_comp_sync_cancel_send(ev->win);
4488 if (counter) ecore_x_sync_counter_inc(counter, 1);
4490 "[COMP] ev:%15.15s w:0x%08x type:%s !cw v%d %03dx%03d\n",
4491 "X_CLIENT_MSG", ev->win, "SYNC_DRAW_DONE", v, w, h);
4497 cw->counter = ecore_x_e_comp_sync_counter_get(_e_mod_comp_win_get_client_xid(cw));
4500 ecore_x_sync_counter_inc(cw->counter, 1);
4501 ecore_x_e_comp_sync_begin_send(_e_mod_comp_win_get_client_xid(cw));
4504 "[COMP] ev:%15.15s w:0x%08x type:%s !cw->counter v%d %03dx%03d\n",
4505 "X_CLIENT_MSG", _e_mod_comp_win_get_client_xid(cw),
4506 "SYNC_DRAW_DONE", v, w, h);
4512 if (cw->update_timeout)
4514 ecore_timer_del(cw->update_timeout);
4515 cw->update_timeout = NULL;
4518 cw->c->updates = eina_list_append(cw->c->updates, cw);
4523 "[COMP] ev:%15.15s w:0x%08x type:%s v%d %03dx%03d\n",
4524 "X_CLIENT_MSG", _e_mod_comp_win_get_client_xid(cw),
4525 "SYNC_DRAW_DONE", v, w, h);
4527 _e_mod_comp_win_render_queue(cw);
4532 _e_mod_comp_hib_leave(void)
4534 E_Comp *c = _e_mod_comp_get();
4537 if (!c || !_comp_mod)
4540 "[E17-comp] _e_mod_comp_hib_leave failed.\n");
4541 return ECORE_CALLBACK_PASS_ON;
4544 cfg = e_config_domain_load("module.comp-slp",
4545 _comp_mod->conf_edd);
4547 return ECORE_CALLBACK_PASS_ON;
4549 if (cfg->default_window_effect != c->animatable)
4551 if (cfg->default_window_effect)
4553 c->animatable = EINA_TRUE;
4554 _comp_mod->conf->default_window_effect = 1;
4558 c->animatable = EINA_FALSE;
4559 _comp_mod->conf->default_window_effect = 0;
4561 ecore_x_window_prop_card32_set
4562 (c->man->root, ATOM_EFFECT_ENABLE,
4563 (unsigned int *)(&(_comp_mod->conf->default_window_effect)), 1);
4566 if (cfg->shadow_file)
4567 eina_stringshare_del(cfg->shadow_file);
4568 if (cfg->shadow_style)
4569 eina_stringshare_del(cfg->shadow_style);
4572 return ECORE_CALLBACK_PASS_ON;
4576 _e_mod_comp_message(void *data __UNUSED__,
4577 int type __UNUSED__,
4580 Ecore_X_Event_Client_Message *ev = event;
4582 if (ev->format != 32)
4583 return ECORE_CALLBACK_PASS_ON;
4585 if (ev->message_type == ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE)
4587 _e_mod_comp_msg_sync_draw_done(ev);
4588 return ECORE_CALLBACK_PASS_ON;
4591 if (_e_mod_comp_rotation_handle_message(ev))
4593 return ECORE_CALLBACK_PASS_ON;
4596 if (_comp_mod->conf->use_lock_screen)
4598 if (ev->message_type == ATOM_CM_LOCK_SCREEN)
4600 E_Comp *c = _e_mod_comp_find(ev->win);
4602 return ECORE_CALLBACK_PASS_ON;
4603 if (ev->data.l[0] == 1)
4604 _e_mod_comp_screen_lock(c);
4605 else if (ev->data.l[0] == 0)
4606 _e_mod_comp_screen_unlock(c);
4607 return ECORE_CALLBACK_PASS_ON;
4611 if ((ev->message_type == ATOM_FAKE_LAUNCH)
4612 && (ev->data.l[0] == 1))
4614 return _e_mod_comp_fake_show(ev);
4617 if ((ev->message_type == ATOM_FAKE_LAUNCH)
4618 && (ev->data.l[0] == 0))
4620 return _e_mod_comp_fake_hide(ev);
4623 if ((ev->message_type == ATOM_X_HIBERNATION_STATE)
4624 && (ev->data.l[0] == 0))
4626 return _e_mod_comp_hib_leave();
4629 if (ev->message_type == ATOM_CAPTURE_EFFECT)
4631 return _e_mod_comp_capture_effect(ev);
4634 return ECORE_CALLBACK_PASS_ON;
4638 _e_mod_comp_shape(void *data __UNUSED__,
4639 int type __UNUSED__,
4642 Ecore_X_Event_Window_Shape *ev = event;
4643 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
4644 if (!cw) return ECORE_CALLBACK_PASS_ON;
4645 if (ev->type != ECORE_X_SHAPE_BOUNDING) return ECORE_CALLBACK_PASS_ON;
4647 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
4648 "X_SHAPE", ev->win, _e_mod_comp_win_is_border(cw), _e_mod_comp_win_get_client_xid(cw), cw);
4649 _e_mod_comp_win_reshape(cw);
4650 return ECORE_CALLBACK_PASS_ON;
4654 _e_mod_comp_damage(void *data __UNUSED__,
4655 int type __UNUSED__,
4658 Ecore_X_Event_Damage *ev = event;
4659 E_Comp_Win *cw = _e_mod_comp_win_damage_find(ev->damage);
4662 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p %4d %4d %3dx%3d\n",
4663 "X_DAMAGE", ev->drawable, _e_mod_comp_win_is_border(cw),
4664 _e_mod_comp_win_get_client_xid(cw), cw,
4665 ev->area.x, ev->area.y, ev->area.width, ev->area.height);
4670 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p %4d %4d %3dx%3d ERR1\n",
4671 "X_DAMAGE", ev->drawable, _e_mod_comp_win_is_border(cw),
4672 _e_mod_comp_win_get_client_xid(cw), cw,
4673 ev->area.x, ev->area.y, ev->area.width, ev->area.height);
4675 cw = _e_mod_comp_border_client_find(ev->drawable);
4679 L(LT_EVENT_X,"[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p %4d %4d %3dx%3d ERR2\n",
4680 "X_DAMAGE", ev->drawable, _e_mod_comp_win_is_border(cw),
4681 _e_mod_comp_win_get_client_xid(cw), cw,
4682 ev->area.x, ev->area.y, ev->area.width, ev->area.height);
4683 return ECORE_CALLBACK_PASS_ON;
4687 _e_mod_comp_win_damage(cw,
4688 ev->area.x, ev->area.y,
4689 ev->area.width, ev->area.height, 1);
4690 return ECORE_CALLBACK_PASS_ON;
4694 _e_mod_comp_damage_win(void *data __UNUSED__,
4695 int type __UNUSED__,
4698 Ecore_X_Event_Window_Damage *ev = event;
4702 // fixme: use hash if compositors list > 4
4703 EINA_LIST_FOREACH(compositors, l, c)
4706 if (ev->win == c->ee_win)
4708 // expose on comp win - init win or some other bypass win did it
4709 _e_mod_comp_render_queue(c);
4713 return ECORE_CALLBACK_PASS_ON;
4717 _e_mod_comp_randr(void *data __UNUSED__,
4718 int type __UNUSED__,
4719 __UNUSED__ void *event)
4725 "[COMP] ev:%15.15s\n",
4728 EINA_LIST_FOREACH(compositors, l, c)
4731 ecore_evas_resize(c->ee,
4735 return ECORE_CALLBACK_PASS_ON;
4739 _e_mod_comp_bd_add(void *data __UNUSED__,
4740 int type __UNUSED__,
4743 E_Event_Border_Add *ev = event;
4745 E_Comp* c = _e_mod_comp_find(ev->border->zone->container->manager->root);
4747 "[COMP] ev:%15.15s w:0x%08x\n",
4748 "BD_ADD", ev->border->win);
4749 if (!c) return ECORE_CALLBACK_PASS_ON;
4750 if (_e_mod_comp_win_find(ev->border->win)) return ECORE_CALLBACK_PASS_ON;
4751 if (c->win == ev->border->win) return ECORE_CALLBACK_PASS_ON;
4752 if (c->ee_win == ev->border->win) return ECORE_CALLBACK_PASS_ON;
4753 cw = _e_mod_comp_win_add(c, ev->border->win);
4755 _e_mod_comp_win_configure(cw,
4760 ev->border->client.initial_attributes.border);
4762 if ( ev->border->internal && ev->border->visible )
4763 _e_mod_comp_win_show(cw);
4765 return ECORE_CALLBACK_PASS_ON;
4769 _e_mod_comp_bd_del(void *data __UNUSED__,
4770 int type __UNUSED__,
4773 E_Event_Border_Remove *ev = event;
4774 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4776 "[COMP] ev:%15.15s w:0x%08x\n",
4777 "BD_DEL", ev->border->win);
4778 if (!cw) return ECORE_CALLBACK_PASS_ON;
4779 if (cw->bd == ev->border) _e_mod_comp_object_del(cw, ev->border);
4780 if (cw->animating) cw->delete_me = 1;
4781 else _e_mod_comp_win_del(cw);
4782 return ECORE_CALLBACK_PASS_ON;
4786 _e_mod_comp_bd_show(void *data __UNUSED__,
4787 int type __UNUSED__,
4790 E_Event_Border_Show *ev = event;
4791 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4793 "[COMP] ev:%15.15s w:0x%08x\n",
4794 "BD_SHOW", ev->border->win);
4795 if (!cw) return ECORE_CALLBACK_PASS_ON;
4796 if (cw->visible) return ECORE_CALLBACK_PASS_ON;
4797 _e_mod_comp_win_show(cw);
4798 return ECORE_CALLBACK_PASS_ON;
4802 _e_mod_comp_bd_hide(void *data __UNUSED__,
4803 int type __UNUSED__,
4806 E_Event_Border_Hide *ev = event;
4807 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4809 "[COMP] ev:%15.15s w:0x%08x\n",
4810 "BD_HIDE", ev->border->win);
4811 if (!cw) return ECORE_CALLBACK_PASS_ON;
4812 if (!cw->visible) return ECORE_CALLBACK_PASS_ON;
4813 _e_mod_comp_win_hide(cw);
4814 return ECORE_CALLBACK_PASS_ON;
4818 _e_mod_comp_bd_move(void *data __UNUSED__,
4819 int type __UNUSED__,
4822 E_Event_Border_Move *ev = event;
4823 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4824 if (!cw) return ECORE_CALLBACK_PASS_ON;
4827 "[COMP] ev:%15.15s w:0x%08x cw->x: %d, cw->y: %d, cw->visible: %d, \
4828 cw->hidden.x: %d, cw->hidden.y: %d, ev->x: %d, ev->y: %d\n",
4829 "BD_MOVE", ev->border->win, cw->x, cw->y, cw->visible,
4830 cw->hidden.x, cw->hidden.y, ev->border->x, ev->border->y);
4832 if (!((cw->x == ev->border->x) && (cw->y == ev->border->y))
4835 _e_mod_comp_win_configure(cw,
4842 else if (!((cw->hidden.x == ev->border->x) && (cw->hidden.y == ev->border->y))
4845 _e_mod_comp_win_configure(cw,
4852 return ECORE_CALLBACK_PASS_ON;
4856 _e_mod_comp_bd_resize(void *data __UNUSED__,
4857 int type __UNUSED__,
4860 E_Event_Border_Resize *ev = event;
4861 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4863 "[COMP] ev:%15.15s w:0x%08x\n",
4864 "BD_RESIZE", ev->border->win);
4865 if (!cw) return ECORE_CALLBACK_PASS_ON;
4866 if ((cw->w == ev->border->w) && (cw->h == ev->border->h))
4867 return ECORE_CALLBACK_PASS_ON;
4868 _e_mod_comp_win_configure(cw,
4870 ev->border->w, ev->border->h,
4872 return ECORE_CALLBACK_PASS_ON;
4876 _e_mod_comp_bd_iconify(void *data __UNUSED__,
4877 int type __UNUSED__,
4880 E_Event_Border_Iconify *ev = event;
4881 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4883 "[COMP] ev:%15.15s w:0x%08x\n",
4884 "BD_ICONIFY", ev->border->win);
4885 if (!cw) return ECORE_CALLBACK_PASS_ON;
4886 // fimxe: special iconfiy anim
4887 return ECORE_CALLBACK_PASS_ON;
4891 _e_mod_comp_bd_uniconify(void *data __UNUSED__,
4892 int type __UNUSED__,
4895 E_Event_Border_Uniconify *ev = event;
4896 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4898 "[COMP] ev:%15.15s w:0x%08x\n",
4899 "BD_UNICONIFY", ev->border->win);
4900 if (!cw) return ECORE_CALLBACK_PASS_ON;
4901 // fimxe: special uniconfiy anim
4902 return ECORE_CALLBACK_PASS_ON;
4906 _e_mod_comp_bd_urgent_change(void *data __UNUSED__,
4907 int type __UNUSED__,
4910 E_Event_Border_Urgent_Change *ev = event;
4911 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4913 "[COMP] ev:%15.15s w:0x%08x\n",
4914 "BD_URGENTCHANGE", ev->border->win);
4915 if (!cw) return ECORE_CALLBACK_PASS_ON;
4916 if (cw->bd->client.icccm.urgent)
4917 edje_object_signal_emit(cw->shobj, "e,state,urgent,on", "e");
4919 edje_object_signal_emit(cw->shobj, "e,state,urgent,off", "e");
4920 return ECORE_CALLBACK_PASS_ON;
4924 _e_mod_comp_bd_focus_in(void *data __UNUSED__,
4925 int type __UNUSED__,
4928 E_Event_Border_Focus_In *ev = event;
4929 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4931 "[COMP] ev:%15.15s w:0x%08x\n",
4932 "BD_FOCUS_IN", ev->border->win);
4933 if (!cw) return ECORE_CALLBACK_PASS_ON;
4934 edje_object_signal_emit(cw->shobj, "e,state,focus,on", "e");
4935 return ECORE_CALLBACK_PASS_ON;
4939 _e_mod_comp_bd_focus_out(void *data __UNUSED__,
4940 int type __UNUSED__,
4943 E_Event_Border_Focus_Out *ev = event;
4944 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4946 "[COMP] ev:%15.15s w:0x%08x\n",
4947 "BD_FOCUS_OUT", ev->border->win);
4948 if (!cw) return ECORE_CALLBACK_PASS_ON;
4949 edje_object_signal_emit(cw->shobj, "e,state,focus,off", "e");
4950 return ECORE_CALLBACK_PASS_ON;
4954 _e_mod_comp_bd_property(void *data __UNUSED__,
4955 int type __UNUSED__,
4958 E_Event_Border_Property *ev = event;
4959 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
4961 "[COMP] ev:%15.15s w:0x%08x\n",
4962 "BD_PROPERTY", ev->border->win);
4963 if (!cw) return ECORE_CALLBACK_PASS_ON;
4964 // fimxe: other properties?
4965 return ECORE_CALLBACK_PASS_ON;
4969 _e_mod_comp_key_down(void *data __UNUSED__,
4970 int type __UNUSED__,
4973 Ecore_Event_Key *ev = event;
4975 if ((!strcmp(ev->keyname, "Home")) &&
4976 (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) &&
4977 (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
4978 (ev->modifiers & ECORE_EVENT_MODIFIER_ALT))
4982 _e_mod_config_free(_comp_mod->module);
4983 _e_mod_config_new(_comp_mod->module);
4985 e_module_disable(_comp_mod->module);
4987 e_sys_action_do(E_SYS_RESTART, NULL);
4990 return ECORE_CALLBACK_PASS_ON;
4994 _e_mod_comp_evas_get_func(void *data,
4995 E_Manager *man __UNUSED__)
5002 _e_mod_comp_update_func(void *data,
5003 E_Manager *man __UNUSED__)
5006 _e_mod_comp_render_queue(c);
5009 static const Eina_List *
5010 _e_mod_comp_src_list_get_func(void *data,
5011 E_Manager *man __UNUSED__)
5016 if (!c->wins) return NULL;
5017 if (c->wins_invalid)
5019 c->wins_invalid = 0;
5020 if (c->wins_list) eina_list_free(c->wins_list);
5021 c->wins_list = NULL;
5022 EINA_INLIST_FOREACH(c->wins, cw)
5024 if ((cw->shobj) && (cw->obj))
5025 c->wins_list = eina_list_append(c->wins_list, cw);
5028 return c->wins_list;
5031 static Evas_Object *
5032 _e_mod_comp_src_image_get_func(void *data __UNUSED__,
5033 E_Manager *man __UNUSED__,
5034 E_Manager_Comp_Source *src)
5036 E_Comp_Win *cw = (E_Comp_Win *)src;
5037 if (!cw->c) return NULL;
5041 static Evas_Object *
5042 _e_mod_comp_src_shadow_get_func(void *data __UNUSED__,
5043 E_Manager *man __UNUSED__,
5044 E_Manager_Comp_Source *src)
5046 E_Comp_Win *cw = (E_Comp_Win *)src;
5047 if (!cw->c) return NULL;
5051 static Evas_Object *
5052 _e_mod_comp_src_image_mirror_add_func(void *data __UNUSED__,
5053 E_Manager *man __UNUSED__,
5054 E_Manager_Comp_Source *src)
5056 E_Comp_Win *cw = (E_Comp_Win *)src;
5057 if (!cw->c) return NULL;
5058 return _e_mod_comp_win_mirror_add(cw);
5062 _e_mod_comp_src_visible_get_func(void *data __UNUSED__,
5063 E_Manager *man __UNUSED__,
5064 E_Manager_Comp_Source *src)
5066 E_Comp_Win *cw = (E_Comp_Win *)src;
5067 if (!cw->c) return 0;
5072 _e_mod_comp_src_hidden_set_func(void *data __UNUSED__,
5073 E_Manager *man __UNUSED__,
5074 E_Manager_Comp_Source *src,
5077 E_Comp_Win *cw = (E_Comp_Win *)src;
5079 if (cw->hidden_override == hidden) return;
5080 cw->hidden_override = hidden;
5082 e_border_comp_hidden_set(cw->bd,
5083 cw->hidden_override);
5086 if (cw->hidden_override)
5087 evas_object_hide(cw->shobj);
5089 evas_object_show(cw->shobj);
5093 if (cw->hidden_override)
5094 evas_object_hide(cw->shobj);
5099 _e_mod_comp_src_hidden_get_func(void *data __UNUSED__,
5100 E_Manager *man __UNUSED__,
5101 E_Manager_Comp_Source *src)
5103 E_Comp_Win *cw = (E_Comp_Win *)src;
5104 if (!cw->c) return 0;
5105 return cw->hidden_override;
5109 _e_mod_comp_screen_lock_func(void *data,
5110 E_Manager *man __UNUSED__)
5113 _e_mod_comp_screen_lock(c);
5117 _e_mod_comp_screen_unlock_func(void *data,
5118 E_Manager *man __UNUSED__)
5121 _e_mod_comp_screen_unlock(c);
5125 _e_mod_comp_get_screen_angle(Ecore_X_Window root)
5127 int ret = -1, ang = 0;
5128 unsigned int val = 0;
5129 Ecore_X_Display* dpy = ecore_x_display_get();
5131 if (!ATOM_X_SCREEN_ROTATION) return 0;
5133 ret = ecore_x_window_prop_card32_get(root, ATOM_X_SCREEN_ROTATION, &val, 1);
5134 if (ret == -1) return 0;
5138 case 1: ang = 0; break;
5139 case 2: ang = 90; break;
5140 case 4: ang = 180; break;
5141 case 8: ang = 270; break;
5142 default: ang = 0; break;
5149 _e_mod_comp_add(E_Manager *man)
5152 Ecore_X_Window *wins;
5153 Ecore_X_Window_Attributes att;
5157 c = calloc(1, sizeof(E_Comp));
5158 if (!c) return NULL;
5160 if (_comp_mod->conf->vsync)
5162 e_util_env_set("__GL_SYNC_TO_VBLANK", "1");
5166 e_util_env_set("__GL_SYNC_TO_VBLANK", NULL);
5169 ecore_x_e_comp_sync_supported_set(man->root, _comp_mod->conf->efl_sync);
5172 c->win = ecore_x_composite_render_window_enable(man->root);
5175 e_util_dialog_internal
5176 (_("Compositor Error"),
5177 _("Your screen does not support the compositor<br>"
5178 "overlay window. This is needed for it to<br>"
5184 memset((&att), 0, sizeof(Ecore_X_Window_Attributes));
5185 ecore_x_window_attributes_get(c->win, &att);
5187 if ((att.depth != 24) && (att.depth != 32))
5189 e_util_dialog_internal
5190 (_("Compositor Error"),
5191 _("Your screen is not in 24/32bit display mode.<br>"
5192 "This is required to be your default depth<br>"
5193 "setting for the compositor to work properly."));
5194 ecore_x_composite_render_window_disable(c->win);
5199 if (c->man->num == 0) e_alert_composite_win = c->win;
5201 if (_comp_mod->conf->engine == E_EVAS_ENGINE_GL_X11)
5206 c->screen_w = man->w;
5207 c->screen_h = man->h;
5208 c->screen_ang = _e_mod_comp_get_screen_angle(c->man->root);
5210 if (0 != c->screen_ang)
5212 c->screen_rotation = EINA_TRUE;
5213 if (0 != (c->screen_ang % 180))
5215 c->screen_w = man->h;
5216 c->screen_h = man->w;
5220 if (_comp_mod->conf->indirect)
5222 opt[opt_i] = ECORE_EVAS_GL_X11_OPT_INDIRECT;
5227 if (_comp_mod->conf->vsync)
5229 opt[opt_i] = ECORE_EVAS_GL_X11_OPT_VSYNC;
5236 opt[opt_i] = ECORE_EVAS_GL_X11_OPT_NONE;
5237 c->ee = ecore_evas_gl_x11_options_new
5238 (NULL, c->win, 0, 0, c->screen_w, c->screen_h, opt);
5241 c->ee = ecore_evas_gl_x11_new(NULL, c->win, 0, 0, c->screen_w, c->screen_h);
5245 ecore_evas_gl_x11_pre_post_swap_callback_set
5246 (c->ee, c, _e_mod_comp_pre_swap, NULL);
5250 c->ee = ecore_evas_software_x11_new(NULL, c->win, 0, 0, man->w, man->h);
5252 ecore_evas_comp_sync_set(c->ee, 0);
5253 ecore_evas_manual_render_set(c->ee, _comp_mod->conf->lock_fps);
5254 c->evas = ecore_evas_get(c->ee);
5255 ecore_evas_show(c->ee);
5257 if (c->screen_rotation)
5258 ecore_evas_rotation_with_resize_set(c->ee, c->screen_ang);
5260 c->ee_win = ecore_evas_window_get(c->ee);
5261 ecore_x_screen_is_composited_set(c->man->num, c->ee_win);
5263 ecore_x_e_comp_dri_buff_flip_supported_set
5264 (c->man->root, _comp_mod->conf->dri_buff_flip);
5266 ecore_x_composite_redirect_subwindows
5267 (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL);
5269 wins = ecore_x_window_children_get(c->man->root, &num);
5272 for (i = 0; i < num; i++)
5275 int x, y, w, h, border;
5276 char *wname = NULL, *wclass = NULL;
5278 ecore_x_icccm_name_class_get(wins[i], &wname, &wclass);
5279 if ((man->initwin == wins[i]) ||
5280 ((wname) && (wclass) && (!strcmp(wname, "E")) &&
5281 (!strcmp(wclass, "Init_Window"))))
5285 ecore_x_window_reparent(wins[i], c->win, 0, 0);
5289 if (wname) free(wname);
5290 if (wclass) free(wclass);
5291 wname = wclass = NULL;
5292 cw = _e_mod_comp_win_add(c, wins[i]);
5294 ecore_x_window_geometry_get(cw->win, &x, &y, &w, &h);
5295 border = ecore_x_window_border_width_get(cw->win);
5296 if (wins[i] == c->win) continue;
5297 _e_mod_comp_win_configure(cw, x, y, w, h, border);
5298 if (ecore_x_window_visible_get(wins[i]))
5299 _e_mod_comp_win_show(cw);
5304 ecore_x_window_key_grab(c->man->root,
5306 ECORE_EVENT_MODIFIER_SHIFT |
5307 ECORE_EVENT_MODIFIER_CTRL |
5308 ECORE_EVENT_MODIFIER_ALT, 0);
5311 c->bg_img = evas_object_rectangle_add(c->evas);
5312 evas_object_color_set(c->bg_img, 0, 0, 0, 255);
5314 evas_object_stack_below(c->bg_img, evas_object_bottom_get(c->evas));
5315 evas_object_show(c->bg_img);
5316 evas_object_move(c->bg_img, 0, 0);
5317 evas_object_resize(c->bg_img, c->man->w, c->man->h); // resize to root window's width, height
5319 c->fake_img_shobj = NULL;
5320 c->fake_img_shobj = edje_object_add(c->evas);
5321 ok = edje_object_file_set(c->fake_img_shobj, _comp_mod->conf->shadow_file, "fake_effect_twist");
5325 "[E17-comp] FAKE IMG EDC Animation isn't loaded!\n");
5328 edje_object_signal_callback_add(c->fake_img_shobj,
5329 "fake,action,hide,done",
5331 _e_mod_comp_fake_hide_done, c);
5333 evas_object_move(c->fake_img_shobj, 0, 0);
5334 evas_object_resize(c->fake_img_shobj, c->man->w, c->man->h);
5335 c->fake_launch_state = EINA_FALSE;
5337 c->fake_launch_timeout = NULL;
5339 c->fake_launch_done = EINA_FALSE;
5341 edje_object_signal_callback_add(c->fake_img_shobj,
5342 "fake,action,show,done",
5344 _e_mod_comp_fake_show_done, c);
5346 c->capture_effect_obj = NULL;
5347 c->capture_effect_obj = edje_object_add(c->evas);
5348 ok = edje_object_file_set(c->capture_effect_obj, _comp_mod->conf->shadow_file, "capture_effect");
5352 "[E17-comp] CAPTURE EFFECT EDC Animation isn't loaded!\n");
5354 edje_object_signal_callback_add(c->capture_effect_obj,
5355 "img,capture,show,done",
5357 _e_mod_comp_capture_effect_show_done, c);
5359 evas_object_move(c->capture_effect_obj, 0, 0);
5360 evas_object_resize(c->capture_effect_obj, c->man->w, c->man->h);
5362 c->switcher_animating = EINA_FALSE;
5365 c->comp.func.evas_get = _e_mod_comp_evas_get_func;
5366 c->comp.func.update = _e_mod_comp_update_func;
5367 c->comp.func.src_list_get = _e_mod_comp_src_list_get_func;
5368 c->comp.func.src_image_get = _e_mod_comp_src_image_get_func;
5369 c->comp.func.src_shadow_get = _e_mod_comp_src_shadow_get_func;
5370 c->comp.func.src_image_mirror_add = _e_mod_comp_src_image_mirror_add_func;
5371 c->comp.func.src_visible_get = _e_mod_comp_src_visible_get_func;
5372 c->comp.func.src_hidden_set = _e_mod_comp_src_hidden_set_func;
5373 c->comp.func.src_hidden_get = _e_mod_comp_src_hidden_get_func;
5374 c->comp.func.screen_lock = _e_mod_comp_screen_lock_func;
5375 c->comp.func.screen_unlock = _e_mod_comp_screen_unlock_func;
5377 e_manager_comp_set(c->man, &(c->comp));
5383 _e_mod_comp_del(E_Comp *c)
5387 e_manager_comp_set(c->man, NULL);
5389 ecore_x_window_key_ungrab(c->man->root,
5391 ECORE_EVENT_MODIFIER_SHIFT |
5392 ECORE_EVENT_MODIFIER_CTRL |
5393 ECORE_EVENT_MODIFIER_ALT, 0);
5401 evas_object_del(c->fps_fg);
5406 evas_object_del(c->fps_bg);
5409 ecore_x_screen_is_composited_set(c->man->num, 0);
5412 cw = (E_Comp_Win *)(c->wins);
5415 ecore_x_sync_counter_free(cw->counter);
5419 _e_mod_comp_win_hide(cw);
5421 _e_mod_comp_win_del(cw);
5423 ecore_evas_free(c->ee);
5424 ecore_x_composite_unredirect_subwindows
5425 (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL);
5426 ecore_x_composite_render_window_disable(c->win);
5427 if (c->man->num == 0) e_alert_composite_win = 0;
5428 if (c->render_animator) ecore_animator_del(c->render_animator);
5429 if (c->new_up_timer) ecore_timer_del(c->new_up_timer);
5430 if (c->update_job) ecore_job_del(c->update_job);
5431 if (c->wins_list) eina_list_free(c->wins_list);
5433 ecore_x_e_comp_dri_buff_flip_supported_set(c->man->root, 0);
5435 ecore_x_e_comp_sync_supported_set(c->man->root, 0);
5440 e_mod_comp_init(void)
5444 E_Comp *comp = NULL;
5445 unsigned int effect_enable = 0;
5446 unsigned int window_effect_state = 0;
5448 windows = eina_hash_string_superfast_new(NULL);
5449 borders = eina_hash_string_superfast_new(NULL);
5450 damages = eina_hash_string_superfast_new(NULL);
5452 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CREATE, _e_mod_comp_create, NULL));
5453 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _e_mod_comp_destroy, NULL));
5454 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, _e_mod_comp_show, NULL));
5455 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, _e_mod_comp_hide, NULL));
5456 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_REPARENT, _e_mod_comp_reparent, NULL));
5457 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _e_mod_comp_configure, NULL));
5458 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_STACK, _e_mod_comp_stack, NULL));
5459 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _e_mod_comp_property, NULL));
5460 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _e_mod_comp_message, NULL));
5461 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHAPE, _e_mod_comp_shape, NULL));
5462 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_DAMAGE_NOTIFY, _e_mod_comp_damage, NULL));
5463 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE, _e_mod_comp_damage_win, NULL));
5464 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _e_mod_comp_key_down, NULL));
5465 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_CONTAINER_RESIZE, _e_mod_comp_randr, NULL));
5466 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_ADD, _e_mod_comp_bd_add, NULL));
5467 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_REMOVE, _e_mod_comp_bd_del, NULL));
5468 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_SHOW, _e_mod_comp_bd_show, NULL));
5469 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_HIDE, _e_mod_comp_bd_hide, NULL));
5470 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_MOVE, _e_mod_comp_bd_move, NULL));
5471 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_RESIZE, _e_mod_comp_bd_resize, NULL));
5472 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_ICONIFY, _e_mod_comp_bd_iconify, NULL));
5473 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_UNICONIFY, _e_mod_comp_bd_uniconify, NULL));
5474 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_URGENT_CHANGE, _e_mod_comp_bd_urgent_change, NULL));
5475 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_FOCUS_IN, _e_mod_comp_bd_focus_in, NULL));
5476 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_FOCUS_OUT, _e_mod_comp_bd_focus_out, NULL));
5477 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_PROPERTY, _e_mod_comp_bd_property, NULL));
5479 _e_mod_comp_atom_init();
5481 EINA_LIST_FOREACH(e_manager_list(), l, man)
5484 c = _e_mod_comp_add(man);
5485 if (c) compositors = eina_list_append(compositors, c);
5486 if (c) _e_mod_comp_set(c);
5489 comp = _e_mod_comp_get();
5492 if (_comp_mod->conf->default_window_effect)
5497 ecore_x_window_prop_card32_set(comp->man->root,
5500 ecore_x_window_prop_card32_set(comp->man->root,
5501 ATOM_WINDOW_EFFECT_STATE,
5502 &window_effect_state, 1);
5503 ecore_x_window_prop_property_set(comp->man->root,
5505 ECORE_X_ATOM_WINDOW,
5509 ecore_animator_frametime_set(1.0f/60.0f);
5515 e_mod_comp_shutdown(void)
5519 EINA_LIST_FREE(compositors, c) _e_mod_comp_del(c);
5521 E_FREE_LIST(handlers, ecore_event_handler_del);
5523 eina_hash_free(damages);
5524 eina_hash_free(windows);
5525 eina_hash_free(borders);
5527 _e_mod_comp_set(NULL);
5531 e_mod_comp_shadow_set(void)
5536 EINA_LIST_FOREACH(compositors, l, c)
5540 ecore_evas_manual_render_set(c->ee, _comp_mod->conf->lock_fps);
5541 EINA_INLIST_FOREACH(c->wins, cw)
5543 if ((cw->shobj) && (cw->obj))
5545 _e_mod_comp_win_shadow_setup(cw);
5549 "[COMP] WIN_EFFECT : Show signal Emit (e_mod_comp_shadow_set()) -> win:0x%08x\n",
5553 edje_object_signal_emit(cw->shobj,
5554 "e,state,visible,on",
5557 edje_object_signal_emit(cw->shobj,
5558 "e,state,visible,on,noeffect",
5561 _e_mod_comp_win_inc_animating(cw);
5562 cw->pending_count++;
5563 e_manager_comp_event_src_visibility_send
5564 (cw->c->man, (E_Manager_Comp_Source *)cw,
5565 _e_mod_comp_cb_pending_after, cw->c);
5573 e_mod_comp_manager_get(E_Manager *man)
5575 return _e_mod_comp_find(man->root);
5579 e_mod_comp_win_find_by_window(E_Comp *c,
5584 EINA_INLIST_FOREACH(c->wins, cw)
5586 if (cw->win == win) return cw;
5592 e_mod_comp_win_find_by_border(E_Comp *c,
5597 EINA_INLIST_FOREACH(c->wins, cw)
5599 if (cw->bd == bd) return cw;
5605 e_mod_comp_win_find_by_popup(E_Comp *c,
5610 EINA_INLIST_FOREACH(c->wins, cw)
5612 if (cw->pop == pop) return cw;
5618 e_mod_comp_win_find_by_menu(E_Comp *c,
5623 EINA_INLIST_FOREACH(c->wins, cw)
5625 if (cw->menu == menu) return cw;
5631 e_mod_comp_win_evas_object_get(E_Comp_Win *cw)
5633 if (!cw) return NULL;
5638 e_mod_comp_win_mirror_object_add(Evas *e __UNUSED__,
5639 E_Comp_Win *cw __UNUSED__)
5645 _e_mod_comp_win_cb_setup(E_Comp_Win *cw)
5647 edje_object_signal_callback_add(cw->shobj, "e,action,show,done", "e", _e_mod_comp_show_done, cw);
5648 edje_object_signal_callback_add(cw->shobj, "e,action,hide,done", "e", _e_mod_comp_hide_done, cw);
5649 edje_object_signal_callback_add(cw->shobj, "e,action,background,show,done", "e", _e_mod_comp_background_show_done, cw);
5650 edje_object_signal_callback_add(cw->shobj, "e,action,background,hide,done", "e", _e_mod_comp_background_hide_done, cw);
5651 edje_object_signal_callback_add(cw->shobj, "e,action,window,rotation,done", "e", _e_mod_comp_win_rotation_done, cw);
5652 edje_object_signal_callback_add(cw->shobj, "e,action,raise_above_hide,done","e", _e_mod_comp_raise_above_hide_done,cw);
5656 _e_mod_comp_win_recreate_shobj(E_Comp_Win *cw)
5658 /* backup below obj */
5659 Eina_Bool bottom = EINA_FALSE;
5661 Evas_Object *below_obj = evas_object_below_get(cw->shobj);
5664 if (evas_object_bottom_get(cw->c->evas) == cw->shobj)
5667 "[COMP] %31s w:0x%08x bd:%s shobj is bottom.\n",
5668 "PIX_ROT", _e_mod_comp_win_get_client_xid(cw),
5669 cw->bd ? "O" : "X");
5676 evas_object_hide(cw->obj);
5677 evas_object_del(cw->obj);
5682 evas_object_hide(cw->obj);
5683 evas_object_del(cw->shobj);
5687 cw->shobj = edje_object_add(cw->c->evas);
5688 cw->obj = evas_object_image_filled_add(cw->c->evas);
5689 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
5692 evas_object_image_alpha_set(cw->obj, 1);
5694 evas_object_image_alpha_set(cw->obj, 0);
5696 _e_mod_comp_win_shadow_setup(cw);
5697 _e_mod_comp_win_cb_setup(cw);
5699 evas_object_show(cw->obj);
5700 evas_object_pass_events_set(cw->obj, 1);
5701 evas_object_pass_events_set(cw->shobj, 1);
5705 below_obj = evas_object_below_get(cw->shobj);
5707 evas_object_stack_above(cw->shobj, below_obj);
5709 "[COMP] %31s w:0x%08x bd:%s shobj restore stack.\n",
5710 "PIX_ROT", _e_mod_comp_win_get_client_xid(cw),
5711 cw->bd ? "O" : "X");
5715 _e_mod_comp_enable_touch_event_block(E_Comp *c)
5718 if (!c->win) return;
5720 ecore_x_window_shape_input_rectangle_set(c->win, 0, 0, c->man->w, c->man->h );
5724 _e_mod_comp_disable_touch_event_block(E_Comp *c)
5727 if (!c->win) return;
5729 ecore_x_window_shape_input_rectangle_set(c->win, -1, -1, 1, 1 );
5733 _e_mod_comp_win_inc_animating(E_Comp_Win *cw)
5738 // send current effect status is starting.
5739 _e_mod_comp_send_window_effect_client_state(cw, EINA_TRUE);
5744 // if previous effect is not done case
5747 // send previous effect status is done
5748 _e_mod_comp_send_window_effect_client_state(cw, EINA_FALSE);
5751 // send current effect status is starting.
5752 _e_mod_comp_send_window_effect_client_state(cw, EINA_TRUE);
5754 _e_mod_comp_win_render_queue(cw);
5758 _e_mod_comp_win_dec_animating(E_Comp_Win *cw)
5760 if (cw->animating) cw->c->animating--;
5763 _e_mod_comp_send_window_effect_client_state(cw, EINA_FALSE);
5764 _e_mod_comp_win_render_queue(cw);