From: Enlightenment S. <no-...@en...> - 2010-08-01 14:29:28
|
Log: extending comp to allow "expose" and other such things - other modules that can trivially get objects inside the compositor canvas as well as get the compositor canvas and events when it comes and goes, changes, when client sources are added, removed etc. etc. Author: raster Date: 2010-08-01 07:29:19 -0700 (Sun, 01 Aug 2010) New Revision: 50727 Modified: trunk/e/src/bin/e_manager.c trunk/e/src/bin/e_manager.h trunk/e/src/bin/e_msg.c trunk/e/src/bin/e_msg.h trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/bin/e_manager.c =================================================================== --- trunk/e/src/bin/e_manager.c 2010-08-01 03:15:40 UTC (rev 50726) +++ trunk/e/src/bin/e_manager.c 2010-08-01 14:29:19 UTC (rev 50727) @@ -521,6 +521,147 @@ } } + + + + + + +EAPI void +e_manager_comp_set(E_Manager *man, E_Manager_Comp *comp) +{ + E_OBJECT_CHECK(man); + E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE); + man->comp = comp; + e_msg_send("comp.manager", "change.comp", // name + info + 0, // val + E_OBJECT(man), // obj + NULL, // msgdata + NULL, NULL); // afterfunc + afterdata +} + +EAPI Evas * +e_manager_comp_evas_get(E_Manager *man) +{ + E_OBJECT_CHECK(man); + E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL); + if (!man->comp) return NULL; + return man->comp->func.evas_get(man->comp->data, man); +} + +EAPI void +e_manager_comp_evas_update(E_Manager *man) +{ + E_OBJECT_CHECK(man); + E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE); + if (!man->comp) return; + return man->comp->func.update(man->comp->data, man); +} + +EAPI const Eina_List * +e_manager_comp_src_list(E_Manager *man) +{ + return man->comp->func.src_list_get(man->comp->data, man); +} + +EAPI Evas_Object * +e_manager_comp_src_image_get(E_Manager *man, E_Manager_Comp_Source *src) +{ + return man->comp->func.src_image_get(man->comp->data, man, src); +} + +EAPI Evas_Object * +e_manager_comp_src_shadow_get(E_Manager *man, E_Manager_Comp_Source *src) +{ + return man->comp->func.src_shadow_get(man->comp->data, man, src); +} + +EAPI Evas_Object * +e_manager_comp_src_image_mirror_add(E_Manager *man, E_Manager_Comp_Source *src) +{ + return man->comp->func.src_image_mirror_add(man->comp->data, man, src); +} + +EAPI Eina_Bool +e_manager_comp_src_visible_get(E_Manager *man, E_Manager_Comp_Source *src) +{ + return man->comp->func.src_visible_get(man->comp->data, man, src); +} + +EAPI void +e_manager_comp_src_hidden_set(E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden) +{ + return man->comp->func.src_hidden_set(man->comp->data, man, src, hidden); +} + +EAPI Eina_Bool +e_manager_comp_src_hidden_get(E_Manager *man, E_Manager_Comp_Source *src) +{ + return man->comp->func.src_hidden_get(man->comp->data, man, src); +} + +EAPI void +e_manager_comp_event_resize_send(E_Manager *man) +{ + e_msg_send("comp.manager", "resize.comp", // name + info + 0, // val + E_OBJECT(man), // obj + NULL, // msgdata + NULL, NULL); // afterfunc + afterdata +} + +EAPI void +e_manager_comp_event_src_add_send(E_Manager *man, E_Manager_Comp_Source *src, + void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src), + void *data) +{ + e_msg_send("comp.manager", "add.src", // name + info + 0, // val + E_OBJECT(man), // obj + src, // msgdata + (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata +} + +EAPI void +e_manager_comp_event_src_del_send(E_Manager *man, E_Manager_Comp_Source *src, + void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src), + void *data) +{ + e_msg_send("comp.manager", "del.src", // name + info + 0, // val + E_OBJECT(man), // obj + src, // msgdata + (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata +} + +EAPI void +e_manager_comp_event_src_config_send(E_Manager *man, E_Manager_Comp_Source *src, + void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src), + void *data) +{ + e_msg_send("comp.manager", "config.src", // name + info + 0, // val + E_OBJECT(man), // obj + src, // msgdata + (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata +} + +EAPI void +e_manager_comp_event_src_visibility_send(E_Manager *man, E_Manager_Comp_Source *src, + void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src), + void *data) +{ + e_msg_send("comp.manager", "visibility.src", // name + info + 0, // val + E_OBJECT(man), // obj + src, // msgdata + (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata +} + + + + + /* local subsystem functions */ static void _e_manager_free(E_Manager *man) Modified: trunk/e/src/bin/e_manager.h =================================================================== --- trunk/e/src/bin/e_manager.h 2010-08-01 03:15:40 UTC (rev 50726) +++ trunk/e/src/bin/e_manager.h 2010-08-01 14:29:19 UTC (rev 50727) @@ -3,7 +3,9 @@ */ #ifdef E_TYPEDEFS -typedef struct _E_Manager E_Manager; +typedef struct _E_Manager E_Manager; +typedef struct _E_Manager_Comp E_Manager_Comp; +typedef struct _E_Manager_Comp_Source E_Manager_Comp_Source; #else #ifndef E_MANAGER_H @@ -11,6 +13,22 @@ #define E_MANAGER_TYPE (int) 0xE0b01008 +struct _E_Manager_Comp +{ + struct { + Evas * (*evas_get) (void *data, E_Manager *man); + void (*update) (void *data, E_Manager *man); + const Eina_List * (*src_list_get) (void *data, E_Manager *man); + Evas_Object * (*src_image_get) (void *data, E_Manager *man, E_Manager_Comp_Source *src); + Evas_Object * (*src_shadow_get) (void *data, E_Manager *man, E_Manager_Comp_Source *src); + Evas_Object * (*src_image_mirror_add) (void *data, E_Manager *man, E_Manager_Comp_Source *src); + Eina_Bool (*src_visible_get) (void *data, E_Manager *man, E_Manager_Comp_Source *src); + void (*src_hidden_set) (void *data, E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden); + Eina_Bool (*src_hidden_get) (void *data, E_Manager *man, E_Manager_Comp_Source *src); + } func; + void *data; +}; + struct _E_Manager { E_Object e_obj_inherit; @@ -25,6 +43,8 @@ E_Pointer *pointer; Ecore_X_Window initwin; + + E_Manager_Comp *comp; }; EAPI int e_manager_init(void); @@ -45,6 +65,64 @@ EAPI void e_managers_keys_grab(void); EAPI void e_managers_keys_ungrab(void); - + +// tenative api for e's compositor to advertise to the rest of e the comp +// canvas. on comp evas register (set evas) we send: +// e_msg_send("comp.manager", "comp.change", 0, man); +// so to hook up to it: +// static void handler(void *data, const char *name, const char *info, int val, E_Object *obj, void *msgdata) +// { +// if (!strcmp(name, "comp.manager") +// { +// if (!strcmp(info, "change.comp")) +// { // compositor canvas added or deleted +// Evas *e = e_manager_comp_evas_get((E_Manager *)obj); +// if (!e) printf("No comp manager\n"); +// else printf("comp canvas = %p\n", e); +// } +/// FIXME: implement below +// else if (!strcmp(info, "resize.comp") +// { // compositor canvas resized +// } +// else if (!strcmp(info, "add.src") +// { // compositor source added +// } +// else if (!strcmp(info, "del.src") +// { // compositor source deleted +// } +// else if (!strcmp(info, "config.src") +// { // compositor src reconfigured (moved, resized) +// } +// else if (!strcmp(info, "visible.src") +// { // compositor src shown or hidden +// } +// } +// } +// e_msg_handler_add(handler, mydata); +// +// remember to listen to zone confiugre events like: +// E_EVENT_ZONE_MOVE_RESIZE +// E_EVENT_ZONE_ADD +// E_EVENT_ZONE_DEL +// +// only 1 compositor can own a manager at a time, so before you "set" the +// comp evas, you need to get it and make sure it's NULL, if so, then +// you can set the update func and the comp evas +EAPI void e_manager_comp_set(E_Manager *man, E_Manager_Comp *comp); +EAPI Evas *e_manager_comp_evas_get(E_Manager *man); +EAPI void e_manager_comp_evas_update(E_Manager *man); +EAPI const Eina_List *e_manager_comp_src_list(E_Manager *man); +EAPI Evas_Object *e_manager_comp_src_image_get(E_Manager *man, E_Manager_Comp_Source *src); +EAPI Evas_Object *e_manager_comp_src_shadow_get(E_Manager *man, E_Manager_Comp_Source *src); +EAPI Evas_Object *e_manager_comp_src_image_mirror_add(E_Manager *man, E_Manager_Comp_Source *src); +EAPI Eina_Bool e_manager_comp_src_visible_get(E_Manager *man, E_Manager_Comp_Source *src); +EAPI void e_manager_comp_src_hidden_set(E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden); +EAPI Eina_Bool e_manager_comp_src_hidden_get(E_Manager *man, E_Manager_Comp_Source *src); +EAPI void e_manager_comp_event_resize_send(E_Manager *man); +EAPI void e_manager_comp_event_src_add_send(E_Manager *man, E_Manager_Comp_Source *src, void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src), void *data); +EAPI void e_manager_comp_event_src_del_send(E_Manager *man, E_Manager_Comp_Source *src, void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src), void *data); +EAPI void e_manager_comp_event_src_config_send(E_Manager *man, E_Manager_Comp_Source *src, void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src), void *data); +EAPI void e_manager_comp_event_src_visibility_send(E_Manager *man, E_Manager_Comp_Source *src, void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src), void *data); + #endif #endif Modified: trunk/e/src/bin/e_msg.c =================================================================== --- trunk/e/src/bin/e_msg.c 2010-08-01 03:15:40 UTC (rev 50726) +++ trunk/e/src/bin/e_msg.c 2010-08-01 14:29:19 UTC (rev 50727) @@ -7,17 +7,20 @@ struct _E_Msg_Handler { - void (*func) (void *data, const char *name, const char *info, int val, E_Object *obj); + void (*func) (void *data, const char *name, const char *info, int val, E_Object *obj, void *msgdata); void *data; unsigned char delete_me : 1; }; struct _E_Msg_Event { - char *name; - char *info; - int val; + char *name; + char *info; + int val; E_Object *obj; + void *msgdata; + void (*afterfunc) (void *data, E_Object *obj, void *msgdata); + void *afterdata; }; /* local subsystem functions */ @@ -51,7 +54,7 @@ } EAPI void -e_msg_send(const char *name, const char *info, int val, E_Object *obj) +e_msg_send(const char *name, const char *info, int val, E_Object *obj, void *msgdata, void (*afterfunc) (void *data, E_Object *obj, void *msgdata), void *afterdata) { unsigned int size, pos, name_len, info_len; E_Msg_Event *ev; @@ -76,12 +79,15 @@ } ev->val = val; ev->obj = obj; + ev->msgdata = msgdata; + ev->afterfunc = afterfunc; + ev->afterdata = afterdata; if (ev->obj) e_object_ref(ev->obj); ecore_event_add(E_EVENT_MSG, ev, _e_msg_event_free, NULL); } EAPI E_Msg_Handler * -e_msg_handler_add(void (*func) (void *data, const char *name, const char *info, int val, E_Object *obj), void *data) +e_msg_handler_add(void (*func) (void *data, const char *name, const char *info, int val, E_Object *obj, void *msgdata), void *data) { E_Msg_Handler *emsgh; @@ -122,8 +128,9 @@ EINA_LIST_FOREACH(handlers, l, emsgh) { if (!emsgh->delete_me) - emsgh->func(emsgh->data, e->name, e->info, e->val, e->obj); + emsgh->func(emsgh->data, e->name, e->info, e->val, e->obj, e->msgdata); } + if (e->afterfunc) e->afterfunc(e->afterdata, e->obj, e->msgdata); processing_handlers--; if ((processing_handlers == 0) && (del_handlers)) { Modified: trunk/e/src/bin/e_msg.h =================================================================== --- trunk/e/src/bin/e_msg.h 2010-08-01 03:15:40 UTC (rev 50726) +++ trunk/e/src/bin/e_msg.h 2010-08-01 14:29:19 UTC (rev 50727) @@ -12,8 +12,8 @@ EAPI int e_msg_init(void); EAPI int e_msg_shutdown(void); -EAPI void e_msg_send(const char *name, const char *info, int val, E_Object *obj); -EAPI E_Msg_Handler *e_msg_handler_add(void (*func) (void *data, const char *name, const char *info, int val, E_Object *obj), void *data); +EAPI void e_msg_send(const char *name, const char *info, int val, E_Object *obj, void *msgdata, void (*afterfunc) (void *data, E_Object *obj, void *msgdata), void *afterdata); +EAPI E_Msg_Handler *e_msg_handler_add(void (*func) (void *data, const char *name, const char *info, int val, E_Object *obj, void *msgdata), void *data); EAPI void e_msg_handler_del(E_Msg_Handler *emsgh); #endif Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-08-01 03:15:40 UTC (rev 50726) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-08-01 14:29:19 UTC (rev 50727) @@ -31,16 +31,20 @@ Evas *evas; E_Manager *man; Eina_Inlist *wins; + Eina_List *wins_list; Eina_List *updates; Ecore_Animator *render_animator; Ecore_Job *update_job; Ecore_Timer *new_up_timer; int animating; int render_overflow; + + E_Manager_Comp comp; Eina_Bool gl : 1; Eina_Bool grabbed : 1; Eina_Bool nocomp : 1; + Eina_Bool wins_invalid : 1; }; struct _E_Comp_Win @@ -64,6 +68,7 @@ int depth; // window depth Evas_Object *obj; // composite object Evas_Object *shobj; // shadow object + Eina_List *obj_mirror; // extra mirror objects Ecore_X_Image *xim; // x image - software fallback E_Update *up; // update handler E_Object_Delfn *dfn; // delete function handle for objects being tracked @@ -79,9 +84,14 @@ double last_visible_time; // last time window was visible double last_draw_time; // last time window was damaged + int pending_count; // pending event count + char *title, *name, *clas, *role; // fetched for override-redirect windowa Ecore_X_Window_Type primary_type; // fetched for override-redirect windowa + Eina_Bool delete_pending : 1; // delete pendig + Eina_Bool hidden_override : 1; // hidden override + Eina_Bool animating : 1; // it's busy animating - defer hides/dels Eina_Bool force : 1; // force del/hide even if animating Eina_Bool defer_hide : 1; // flag to get hide to work on deferred hide @@ -122,6 +132,18 @@ static void _e_mod_comp_win_hide(E_Comp_Win *cw); static void _e_mod_comp_win_configure(E_Comp_Win *cw, int x, int y, int w, int h, int border); +static void +_e_mod_comp_cb_pending_after(void *data, E_Manager *man, E_Manager_Comp_Source *src) +{ + E_Comp_Win *cw = (E_Comp_Win *)src; + cw->pending_count--; + if (!cw->delete_pending) return; + if (cw->pending_count == 0) + { + free(cw); + } +} + static E_Comp_Win * _e_mod_comp_fullscreen_check(E_Comp *c) { @@ -174,6 +196,7 @@ } if (rects) { + // XXXX: do all the below to cw->obj_mirror list unsigned int *pix, *p; unsigned char *spix, *sp; int w, h, px, py; @@ -243,6 +266,7 @@ { if (cw->shaped) { + // XXXX: do all the below to cw->obj_mirror list unsigned int *pix, *p; int w, h, px, py; @@ -351,7 +375,7 @@ if ((cw->pw <= 0) || (cw->ph <= 0)) { if (cw->native) - { + { // XXXX: do all the below to cw->obj_mirror list DBG(" [0x%x] free native\n", cw->win); evas_object_image_native_surface_set(cw->obj, NULL); cw->native = 0; @@ -386,6 +410,7 @@ (!cw->shaped) && (!cw->rects)/* && (!cw->shape_changed)*/) { // DBG("DEBUG - pm now %x\n", ecore_x_composite_name_window_pixmap_get(cw->win)); + // XXXX: do all the below to cw->obj_mirror list evas_object_image_size_set(cw->obj, cw->pw, cw->ph); if (!cw->native) { @@ -417,6 +442,7 @@ } else { + // XXXX: do all the below to cw->obj_mirror list evas_object_image_native_surface_set(cw->obj, NULL); cw->native = 0; if (!cw->xim) @@ -429,6 +455,7 @@ { if (cw->xim) { + // XXXX: do all the below to cw->obj_mirror list unsigned int *pix; pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); @@ -481,11 +508,16 @@ { if (!evas_object_visible_get(cw->shobj)) { - evas_object_show(cw->shobj); + if (!cw->hidden_override) evas_object_show(cw->shobj); edje_object_signal_emit(cw->shobj, "e,state,visible,on", "e"); if (!cw->animating) cw->c->animating++; _e_mod_comp_win_render_queue(cw); cw->animating = 1; + + cw->pending_count++; + e_manager_comp_event_src_visibility_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); } } if ((cw->shobj) && (cw->obj)) @@ -648,6 +680,7 @@ } if (cw->xim) { + // XXXX: do all the below to cw->obj_mirror list evas_object_image_size_set(cw->obj, 1, 1); evas_object_image_data_set(cw->obj, NULL); ecore_x_image_free(cw->xim); @@ -743,7 +776,11 @@ // _e_mod_comp_win_damage(cw, 0, 0, cw->w, cw->h, 0); if (cw->visible) { - evas_object_show(cw->shobj); + if (!cw->hidden_override) evas_object_show(cw->shobj); + cw->pending_count++; + e_manager_comp_event_src_visibility_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); // no need for effect } _e_mod_comp_win_render_queue(cw); @@ -977,6 +1014,7 @@ const char *title = NULL, *name = NULL, *clas = NULL, *role = NULL; Ecore_X_Window_Type primary_type = ECORE_X_WINDOW_TYPE_UNKNOWN; + // XXXX: do all the below to cw->obj_mirror list evas_object_image_smooth_scale_set(cw->obj, _comp_mod->conf->smooth_windows); if (cw->bd) { @@ -1277,12 +1315,18 @@ free(rects); } } + + cw->pending_count++; + e_manager_comp_event_src_add_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); } else { cw->shobj = evas_object_rectangle_add(c->evas); evas_object_color_set(cw->shobj, 0, 0, 0, 64); } + c->wins_invalid = 1; c->wins = eina_inlist_append(c->wins, EINA_INLIST_GET(cw)); cw->up = e_mod_comp_update_new(); e_mod_comp_update_tile_size_set(cw->up, 32, 32); @@ -1305,6 +1349,16 @@ static void _e_mod_comp_win_del(E_Comp_Win *cw) { + int pending_count; + + if ((!cw->input_only) && (!cw->invalid)) + { + cw->pending_count++; + e_manager_comp_event_src_del_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); + } + e_mod_comp_update_free(cw->up); DBG(" [0x%x] del\n", cw->win); if (cw->rects) @@ -1355,12 +1409,14 @@ } if (cw->xim) { + // XXXX: do all the below to cw->obj_mirror list evas_object_image_data_set(cw->obj, NULL); ecore_x_image_free(cw->xim); cw->xim = NULL; } if (cw->obj) { + // XXXX: do all the below to cw->obj_mirror list evas_object_del(cw->obj); cw->obj = NULL; } @@ -1385,7 +1441,13 @@ if (cw->name) free(cw->name); if (cw->clas) free(cw->clas); if (cw->role) free(cw->role); + cw->c->wins_invalid = 1; cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw)); + pending_count = cw->pending_count; + memset(cw, 0, sizeof(E_Comp_Win)); + cw->pending_count = pending_count; + cw->delete_pending = 1; + if (cw->pending_count > 0) return; free(cw); } @@ -1398,6 +1460,7 @@ _e_mod_comp_win_configure(cw, cw->hidden.x, cw->hidden.y, cw->w, cw->h, cw->border); if ((cw->input_only) || (cw->invalid)) return; if (cw->pixmap) ecore_x_pixmap_free(cw->pixmap); + // XXXX: do all the below to cw->obj_mirror list evas_object_image_size_set(cw->obj, cw->pw, cw->ph); /* cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win); @@ -1473,11 +1536,16 @@ if (cw->dmg_updates >= 1) { cw->defer_hide = 0; - evas_object_show(cw->shobj); + if (!cw->hidden_override) evas_object_show(cw->shobj); edje_object_signal_emit(cw->shobj, "e,state,visible,on", "e"); if (!cw->animating) cw->c->animating++; cw->animating = 1; _e_mod_comp_win_render_queue(cw); + + cw->pending_count++; + e_manager_comp_event_src_visibility_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); } _e_mod_comp_win_render_queue(cw); } @@ -1501,6 +1569,11 @@ if (!cw->animating) cw->c->animating++; cw->animating = 1; _e_mod_comp_win_render_queue(cw); + + cw->pending_count++; + e_manager_comp_event_src_visibility_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); return; } cw->defer_hide = 0; @@ -1519,6 +1592,7 @@ // getting pixmap againand well - getting texture too again. why? if (cw->redirected) { + // XXXX: do all the below to cw->obj_mirror list if (cw->pixmap) ecore_x_pixmap_free(cw->pixmap); evas_object_image_size_set(cw->obj, 1, 1); cw->pixmap = 0; @@ -1572,6 +1646,7 @@ if (cw->native) { + // XXXX: do all the below to cw->obj_mirror list evas_object_image_native_surface_set(cw->obj, NULL); cw->native = 0; } @@ -1585,6 +1660,7 @@ } if (cw->xim) { + // XXXX: do all the below to cw->obj_mirror list evas_object_image_size_set(cw->obj, 1, 1); evas_object_image_data_set(cw->obj, NULL); ecore_x_image_free(cw->xim); @@ -1616,32 +1692,47 @@ _e_mod_comp_win_raise_above(E_Comp_Win *cw, E_Comp_Win *cw2) { DBG(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); + cw->c->wins_invalid = 1; cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw)); cw->c->wins = eina_inlist_append_relative(cw->c->wins, EINA_INLIST_GET(cw), EINA_INLIST_GET(cw2)); evas_object_stack_above(cw->shobj, cw2->shobj); _e_mod_comp_win_render_queue(cw); + cw->pending_count++; + e_manager_comp_event_src_config_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); } static void _e_mod_comp_win_raise(E_Comp_Win *cw) { DBG(" [0x%x] rai\n", cw->win); + cw->c->wins_invalid = 1; cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw)); cw->c->wins = eina_inlist_append(cw->c->wins, EINA_INLIST_GET(cw)); evas_object_raise(cw->shobj); _e_mod_comp_win_render_queue(cw); + cw->pending_count++; + e_manager_comp_event_src_config_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); } static void _e_mod_comp_win_lower(E_Comp_Win *cw) { DBG(" [0x%x] low\n", cw->win); + cw->c->wins_invalid = 1; cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw)); cw->c->wins = eina_inlist_prepend(cw->c->wins, EINA_INLIST_GET(cw)); evas_object_lower(cw->shobj); _e_mod_comp_win_render_queue(cw); + cw->pending_count++; + e_manager_comp_event_src_config_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); } static void @@ -1688,6 +1779,7 @@ cw->h + (cw->border * 2)); if (cw->xim) { + // XXXX: do all the below to cw->obj_mirror list evas_object_image_data_set(cw->obj, NULL); ecore_x_image_free(cw->xim); cw->xim = NULL; @@ -1705,6 +1797,10 @@ cw->hidden.h = cw->h; if ((cw->input_only) || (cw->invalid)) return; _e_mod_comp_win_render_queue(cw); + cw->pending_count++; + e_manager_comp_event_src_config_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); } static void @@ -1836,8 +1932,7 @@ { E_Comp_Win *cw3 = (E_Comp_Win *)(EINA_INLIST_GET(cw)->prev); - if (cw3 != cw2) - _e_mod_comp_win_raise_above(cw, cw2); + if (cw3 != cw2) _e_mod_comp_win_raise_above(cw, cw2); } } @@ -2105,7 +2200,101 @@ } ////////////////////////////////////////////////////////////////////////// +static Evas * +_e_mod_comp_evas_get_func(void *data, E_Manager *man) +{ + E_Comp *c = data; + return c->evas; +} +static void +_e_mod_comp_update_func(void *data, E_Manager *man) +{ + E_Comp *c = data; + _e_mod_comp_render_queue(c); +} + +static const Eina_List * +_e_mod_comp_src_list_get_func(void *data, E_Manager *man) +{ + E_Comp *c = data; + E_Comp_Win *cw; + + if (!c->wins) return NULL; + if (c->wins_invalid) + { + c->wins_invalid = 0; + if (c->wins_list) eina_list_free(c->wins_list); + c->wins_list = NULL; + EINA_INLIST_REVERSE_FOREACH(c->wins, cw) + { + if ((cw->input_only) || (cw->invalid)) + continue; + c->wins_list = eina_list_append(c->wins_list, cw); + } + } + return c->wins_list; +} + +static Evas_Object * +_e_mod_comp_src_image_get_func(void *data, E_Manager *man, E_Manager_Comp_Source *src) +{ + E_Comp *c = data; + E_Comp_Win *cw = (E_Comp_Win *)src; + return cw->obj; +} + +static Evas_Object * +_e_mod_comp_src_shadow_get_func(void *data, E_Manager *man, E_Manager_Comp_Source *src) +{ + E_Comp *c = data; + E_Comp_Win *cw = (E_Comp_Win *)src; + return cw->shobj; +} + +static Evas_Object * +_e_mod_comp_src_image_mirror_add_func(void *data, E_Manager *man, E_Manager_Comp_Source *src) +{ + E_Comp *c = data; + E_Comp_Win *cw = (E_Comp_Win *)src; + + // FIXME: do XXXXXX + return NULL; +} + +static Eina_Bool +_e_mod_comp_src_visible_get_func(void *data, E_Manager *man, E_Manager_Comp_Source *src) +{ + E_Comp *c = data; + E_Comp_Win *cw = (E_Comp_Win *)src; + return cw->visible; +} + +static void +_e_mod_comp_src_hidden_set_func(void *data, E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden) +{ + E_Comp *c = data; + E_Comp_Win *cw = (E_Comp_Win *)src; + cw->hidden_override = hidden; + if (cw->visible) + { + if (cw->hidden_override) evas_object_hide(cw->shobj); + else evas_object_show(cw->shobj); + } + else + { + if (cw->hidden_override) evas_object_hide(cw->shobj); + } +} + +static Eina_Bool +_e_mod_comp_src_hidden_get_func(void *data, E_Manager *man, E_Manager_Comp_Source *src) +{ + E_Comp *c = data; + E_Comp_Win *cw = (E_Comp_Win *)src; + return cw->hidden_override; +} + static E_Comp * _e_mod_comp_add(E_Manager *man) { @@ -2231,6 +2420,19 @@ ECORE_EVENT_MODIFIER_SHIFT | ECORE_EVENT_MODIFIER_CTRL | ECORE_EVENT_MODIFIER_ALT, 0); + + c->comp.data = c; + c->comp.func.evas_get = _e_mod_comp_evas_get_func; + c->comp.func.update = _e_mod_comp_update_func; + c->comp.func.src_list_get = _e_mod_comp_src_list_get_func; + c->comp.func.src_image_get = _e_mod_comp_src_image_get_func; + c->comp.func.src_shadow_get = _e_mod_comp_src_shadow_get_func; + c->comp.func.src_image_mirror_add = _e_mod_comp_src_image_mirror_add_func; + c->comp.func.src_visible_get = _e_mod_comp_src_visible_get_func; + c->comp.func.src_hidden_set = _e_mod_comp_src_hidden_set_func; + c->comp.func.src_hidden_get = _e_mod_comp_src_hidden_get_func; + + e_manager_comp_set(c->man, &(c->comp)); return c; } @@ -2238,6 +2440,8 @@ _e_mod_comp_del(E_Comp *c) { E_Comp_Win *cw; + + e_manager_comp_set(c->man, NULL); ecore_x_window_key_ungrab(c->man->root, "Home", @@ -2271,6 +2475,7 @@ if (c->render_animator) ecore_animator_del(c->render_animator); if (c->new_up_timer) ecore_timer_del(c->new_up_timer); if (c->update_job) ecore_job_del(c->update_job); + if (c->wins_list) eina_list_free(c->wins_list); ecore_x_e_comp_sync_supported_set(c->man->root, 0); @@ -2369,6 +2574,11 @@ if (!cw->animating) cw->c->animating++; _e_mod_comp_win_render_queue(cw); cw->animating = 1; + + cw->pending_count++; + e_manager_comp_event_src_visibility_send + (cw->c->man, (E_Manager_Comp_Source *)cw, + _e_mod_comp_cb_pending_after, cw->c); } } } |