forked from enlightenment/enlightenment
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. SVN revision: 50727
This commit is contained in:
parent
be62bae118
commit
4edb627ea6
|
@ -521,6 +521,147 @@ e_managers_keys_ungrab(void)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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)
|
||||
|
|
|
@ -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 @@ typedef struct _E_Manager E_Manager;
|
|||
|
||||
#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 @@ struct _E_Manager
|
|||
|
||||
E_Pointer *pointer;
|
||||
Ecore_X_Window initwin;
|
||||
|
||||
E_Manager_Comp *comp;
|
||||
};
|
||||
|
||||
EAPI int e_manager_init(void);
|
||||
|
@ -45,6 +65,64 @@ EAPI E_Manager *e_manager_number_get(int num);
|
|||
|
||||
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
|
||||
|
|
|
@ -7,17 +7,20 @@ typedef struct _E_Msg_Event E_Msg_Event;
|
|||
|
||||
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 @@ e_msg_shutdown(void)
|
|||
}
|
||||
|
||||
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 @@ e_msg_send(const char *name, const char *info, int val, E_Object *obj)
|
|||
}
|
||||
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 @@ _e_msg_event_cb(__UNUSED__ void *data, __UNUSED__ int ev_type, void *ev)
|
|||
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))
|
||||
{
|
||||
|
|
|
@ -12,8 +12,8 @@ typedef struct _E_Msg_Handler E_Msg_Handler;
|
|||
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
|
||||
|
|
|
@ -31,16 +31,20 @@ struct _E_Comp
|
|||
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 @@ struct _E_Comp_Win
|
|||
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 @@ struct _E_Comp_Win
|
|||
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_del(E_Comp_Win *cw);
|
|||
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 @@ _e_mod_comp_win_shape_rectangles_apply(E_Comp_Win *cw, const Ecore_X_Rectangle *
|
|||
}
|
||||
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 @@ _e_mod_comp_win_shape_rectangles_apply(E_Comp_Win *cw, const Ecore_X_Rectangle *
|
|||
{
|
||||
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 @@ _e_mod_comp_win_update(E_Comp_Win *cw)
|
|||
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 @@ _e_mod_comp_win_update(E_Comp_Win *cw)
|
|||
(!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 @@ _e_mod_comp_win_update(E_Comp_Win *cw)
|
|||
}
|
||||
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 @@ _e_mod_comp_win_update(E_Comp_Win *cw)
|
|||
{
|
||||
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 @@ _e_mod_comp_win_update(E_Comp_Win *cw)
|
|||
{
|
||||
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 @@ _e_mod_comp_cb_update(E_Comp *c)
|
|||
}
|
||||
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_cb_update(E_Comp *c)
|
|||
// _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 @@ _e_mod_comp_win_shadow_setup(E_Comp_Win *cw)
|
|||
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 @@ _e_mod_comp_win_add(E_Comp *c, Ecore_X_Window win)
|
|||
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 @@ _e_mod_comp_win_add(E_Comp *c, Ecore_X_Window win)
|
|||
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 @@ _e_mod_comp_win_del(E_Comp_Win *cw)
|
|||
}
|
||||
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 @@ _e_mod_comp_win_del(E_Comp_Win *cw)
|
|||
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_show(E_Comp_Win *cw)
|
|||
_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 @@ _e_mod_comp_win_show(E_Comp_Win *cw)
|
|||
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 @@ _e_mod_comp_win_hide(E_Comp_Win *cw)
|
|||
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 @@ _e_mod_comp_win_hide(E_Comp_Win *cw)
|
|||
// 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 @@ _e_mod_comp_win_hide(E_Comp_Win *cw)
|
|||
|
||||
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 @@ _e_mod_comp_win_hide(E_Comp_Win *cw)
|
|||
}
|
||||
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 @@ static void
|
|||
_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 @@ _e_mod_comp_win_configure(E_Comp_Win *cw, int x, int y, int w, int h, int border
|
|||
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 @@ _e_mod_comp_win_configure(E_Comp_Win *cw, int x, int y, int w, int h, int border
|
|||
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_mod_comp_configure(__UNUSED__ void *data, __UNUSED__ int type, void *event)
|
|||
{
|
||||
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,6 +2200,100 @@ _e_mod_comp_key_down(__UNUSED__ void *data, __UNUSED__ int type, void *event)
|
|||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
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 @@ _e_mod_comp_add(E_Manager *man)
|
|||
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 @@ static void
|
|||
_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 @@ _e_mod_comp_del(E_Comp *c)
|
|||
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 @@ e_mod_comp_shadow_set(void)
|
|||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue