From: Enlightenment S. <no-...@en...> - 2010-01-06 14:19:09
|
Log: compositing... well... it gets pixels and draws... and have image objects. alpha and shaped windows not handled currently. using evas as renderer. Author: raster Date: 2010-01-06 06:18:47 -0800 (Wed, 06 Jan 2010) New Revision: 44921 Modified: trunk/e/src/modules/comp/e_mod_comp.c trunk/e/src/modules/comp/e_mod_main.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-06 14:14:23 UTC (rev 44920) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-06 14:18:47 UTC (rev 44921) @@ -3,13 +3,501 @@ #include "e_mod_comp.h" #include "config.h" +typedef struct _Comp Comp; +typedef struct _Comp_Win Comp_Win; + +struct _Comp +{ + Ecore_X_Window win; + Ecore_Evas *ee; + Ecore_X_Window ee_win; + Evas *evas; + E_Manager *man; + Eina_Inlist *wins; +}; + +struct _Comp_Win +{ + EINA_INLIST; + + Comp *c; // parent compositor + Ecore_X_Window win; // raw window - for menus etc. + E_Border *bd; // if its a border - later + E_Popup *pop; // if its a popup - later + int x, y, w, h; // geometry + int border; // border width + Ecore_X_Pixmap pixmap; // the compositing pixmap + Ecore_X_Damage damage; // damage region + Ecore_X_Visual vis; + int depth; + Evas_Object *obj; // shadow object + Ecore_X_Image *xim; // x image - software fallback + // fixme: evas object its mapped to + // fixme: shape rects + // ... + Eina_Bool visible : 1; // is visible + Eina_Bool input_only : 1; // is input_only +}; + +static Eina_List *handlers = NULL; +static Eina_List *compositors = NULL; +static Eina_Hash *windows = NULL; +static Eina_Hash *damages = NULL; + +static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h); + +static Comp * +_e_mod_comp_find(Ecore_X_Window root) +{ + Eina_List *l; + Comp *c; + + // fixme: use hash if compositors list > 4 + EINA_LIST_FOREACH(compositors, l, c) + { + if (c->man->root == root) return c; + } + return NULL; +} + +static Comp_Win * +_e_mod_comp_win_find(Ecore_X_Window win) +{ + Eina_List *l; + Comp_Win *cw; + + cw = eina_hash_find(windows, e_util_winid_str_get(win)); + return cw; +} + +static Comp_Win * +_e_mod_comp_win_damage_find(Ecore_X_Damage damage) +{ + Comp_Win *cw; + + cw = eina_hash_find(damages, e_util_winid_str_get(damage)); + return cw; +} + +static Comp_Win * +_e_mod_comp_win_add(Comp *c, Ecore_X_Window win) +{ + Ecore_X_Window_Attributes att; + Comp_Win *cw; + + cw = calloc(1, sizeof(Comp_Win)); + if (!cw) return NULL; + cw->win = win; + // FIXME: check if bd or pop - track + c->wins = eina_inlist_append(c->wins, EINA_INLIST_GET(cw)); + cw->c = c; + ecore_x_window_attributes_get(cw->win, &att); + cw->input_only = att.input_only; + cw->vis = att.visual; + cw->depth = att.depth; + eina_hash_add(windows, e_util_winid_str_get(cw->win), cw); + if (!cw->input_only) + { + cw->damage = ecore_x_damage_new(cw->win, ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES); + eina_hash_add(damages, e_util_winid_str_get(cw->damage), cw); + cw->obj = evas_object_image_filled_add(c->evas); + evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888); + evas_object_image_alpha_set(cw->obj, 0); + } + return cw; +} + +static void +_e_mod_comp_win_del(Comp_Win *cw) +{ + if (cw->xim) + { + evas_object_image_data_set(cw->obj, NULL); + ecore_x_image_free(cw->xim); + } + if (cw->obj) + { + evas_object_del(cw->obj); + } + eina_hash_del(windows, e_util_winid_str_get(cw->win), cw); + if (cw->damage) + { + eina_hash_del(damages, e_util_winid_str_get(cw->damage), cw); + ecore_x_damage_free(cw->damage); + cw->damage = 0; + } + cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw)); + free(cw); +} + +static void +_e_mod_comp_win_show(Comp_Win *cw) +{ + if (cw->visible) return; + cw->visible = 1; + if (cw->input_only) return; + if (!cw->pixmap) + { + ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); + _e_mod_comp_win_damage(cw, 0, 0, cw->w, cw->h); + } + evas_object_show(cw->obj); +} + +static void +_e_mod_comp_win_hide(Comp_Win *cw) +{ + if (!cw->visible) return; + cw->visible = 0; + if (cw->input_only) return; + if (cw->pixmap) + { + ecore_x_pixmap_free(cw->pixmap); + ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); + cw->pixmap = 0; + } + evas_object_hide(cw->obj); +} + +static void +_e_mod_comp_win_raise_above(Comp_Win *cw, Comp_Win *cw2) +{ + if (cw->input_only) return; + evas_object_stack_above(cw->obj, cw2->obj); +} + +static void +_e_mod_comp_win_raise(Comp_Win *cw) +{ + if (cw->input_only) return; + evas_object_raise(cw->obj); +} + +static void +_e_mod_comp_win_lower(Comp_Win *cw) +{ + if (cw->input_only) return; + evas_object_lower(cw->obj); +} + +static void +_e_mod_comp_win_configure(Comp_Win *cw, int x, int y, int w, int h, int border) +{ + if (!((x == cw->c) && (y == cw->y))) + { + cw->x = x; + cw->y = y; + evas_object_move(cw->obj, cw->x, cw->y); + } + if (!((w == cw->w) && (h == cw->h))) + { +// ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); +// ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); + if (cw->pixmap) + { + ecore_x_pixmap_free(cw->pixmap); + cw->pixmap = 0; + } + cw->w = w; + cw->h = h; + evas_object_resize(cw->obj, cw->w, cw->h); + if (cw->xim) + { + evas_object_image_data_set(cw->obj, NULL); + ecore_x_image_free(cw->xim); + cw->xim = NULL; + } + } + cw->border = border; + if (cw->input_only) return; +} + +static void +_e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h) +{ + Ecore_X_Region parts; + + if (cw->input_only) return; + parts = ecore_x_region_new(NULL, 0); + ecore_x_damage_subtract(cw->damage, 0, parts); + ecore_x_region_free(parts); + // FIXME: add rect to queue for this compwin + if (!cw->pixmap) + cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win); + + if (!cw->xim) + { + if (cw->xim = ecore_x_image_new(cw->w, cw->h, cw->vis, cw->depth)) + { + x = 0; + y = 0; + w = cw->w; + h = cw->h; + } + } + if (cw->xim) + { + unsigned int *pix; + + ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); + pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); + if (0) + { + int i; + + for (i = 0; i < (w * h); i++) + pix[i] = i | 0xff0000ff; + } + evas_object_image_data_set(cw->obj, pix); + evas_object_image_size_set(cw->obj, cw->w, cw->h); + evas_object_image_data_update_add(cw->obj, x, y, w, h); + } +} + +////////////////////////////////////////////////////////////////////////// + +static int +_e_mod_comp_create(void *data, int type, void *event) +{ // do nothing. only worry about maps + Ecore_X_Event_Window_Create *ev = event; + Comp_Win *cw; + Comp *c = _e_mod_comp_find(ev->parent); + if (!c) return 1; + if (_e_mod_comp_win_find(ev->win)) return 1; + if (c->win == ev->win) return 1; + if (c->ee_win == ev->win) return 1; + cw = _e_mod_comp_win_add(c, ev->win); + _e_mod_comp_win_configure(cw, ev->x, ev->y, ev->w, ev->h, ev->border); + return 1; +} + +static int +_e_mod_comp_destroy(void *data, int type, void *event) +{ // do nothing. only worry about unmaps + Ecore_X_Event_Window_Destroy *ev = event; + Comp_Win *cw = _e_mod_comp_win_find(ev->win); + if (!cw) return 1; + if (ev->event_win != cw->c->man->root) return 1; + _e_mod_comp_win_del(cw); + return 1; +} + +static int +_e_mod_comp_show(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Show *ev = event; + Comp_Win *cw = _e_mod_comp_win_find(ev->win); + if (!cw) return 1; +// if (ev->event_win != cw->c->man->root) return 1; + if (cw->visible) return 1; + _e_mod_comp_win_show(cw); + return 1; +} + +static int +_e_mod_comp_hide(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Hide *ev = event; + Comp_Win *cw = _e_mod_comp_win_find(ev->win); + if (!cw) return 1; +// if (ev->event_win != cw->c->man->root) return 1; + if (!cw->visible) return 1; + _e_mod_comp_win_hide(cw); + return 1; +} + +static int +_e_mod_comp_reparent(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Reparent *ev = event; + Comp_Win *cw = _e_mod_comp_win_find(ev->win); + if (!cw) return 1; + if (ev->parent != cw->c->man->root) + _e_mod_comp_win_del(cw); + return 1; +} + +static int +_e_mod_comp_configure(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Configure *ev = event; + Comp_Win *cw = _e_mod_comp_win_find(ev->win); + if (!cw) return 1; + if (ev->event_win != cw->c->man->root) return 1; + + if (ev->abovewin == 0) + { + if (EINA_INLIST_GET(cw)->prev) _e_mod_comp_win_lower(cw); + } + else + { + Comp_Win *cw2 = _e_mod_comp_win_find(ev->abovewin); + + if (cw2) + { + Comp_Win *cw3 = (Comp_Win *)(EINA_INLIST_GET(cw)->prev); + + if (cw3 != cw2) _e_mod_comp_win_raise_above(cw, cw2); + } + } + + if (!((cw->x == ev->x) && (cw->y == ev->y) && + (cw->w == ev->h) && (cw->h == ev->h) && + (cw->border == ev->border))) + { + _e_mod_comp_win_configure(cw, ev->x, ev->y, ev->w, ev->h, ev->border); + } + return 1; +} + +static int +_e_mod_comp_stack(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Stack *ev = event; + Comp_Win *cw = _e_mod_comp_win_find(ev->win); + if (!cw) return 1; + if (ev->event_win != cw->c->man->root) return 1; + if (ev->detail == ECORE_X_WINDOW_STACK_ABOVE) _e_mod_comp_win_raise(cw); + else _e_mod_comp_win_lower(cw); + return 1; +} + +static int +_e_mod_comp_property(void *data, int type, void *event) +{ // later + Ecore_X_Event_Window_Property *ev = event; + return 1; +} + +static int +_e_mod_comp_message(void *data, int type, void *event) +{ // later + Ecore_X_Event_Client_Message *ev = event; + return 1; +} + +static int +_e_mod_comp_shape(void *data, int type, void *event) +{ // later + Ecore_X_Event_Window_Shape *ev = event; + return 1; +} + +////////////////////////////////////////////////////////////////////////// + +static int +_e_mod_comp_damage(void *data, int type, void *event) +{ + Ecore_X_Event_Damage *ev = event; + Comp_Win *cw = _e_mod_comp_win_damage_find(ev->damage); + if (!cw) return 1; + _e_mod_comp_win_damage(cw, ev->area.x, ev->area.y, ev->area.width, ev->area.height); + return 1; +} + +static Comp * +_e_mod_comp_add(E_Manager *man) +{ + Comp *c; + Ecore_X_Window *wins; + int i, num; + + c = calloc(1, sizeof(Comp)); + if (!c) return NULL; + c->man = man; + c->win = ecore_x_composite_render_window_enable(man->root); + c->ee = ecore_evas_software_x11_new(NULL, c->win, 0, 0, man->w, man->h); + c->evas = ecore_evas_get(c->ee); + ecore_evas_show(c->ee); + + { + Evas_Object *o; + + o = evas_object_rectangle_add(c->evas); + evas_object_color_set(o, 255, 128, 20, 200); + evas_object_resize(o, 500, 300); + evas_object_show(o); + } + + c->ee_win = ecore_evas_software_x11_window_get(c->ee); +// ecore_x_composite_unredirect_subwindows +// (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); + + wins = ecore_x_window_children_get(c->man->root, &num); + if (wins) + { + for (i = 0; i < num; i++) + { + Comp_Win *cw; + int x, y, w, h, border; + + cw = _e_mod_comp_win_add(c, wins[i]); + if (!cw) continue; + ecore_x_window_geometry_get(cw->win, &x, &y, &w, &h); + border = ecore_x_window_border_width_get(cw->win); + if (wins[i] == c->win) continue; + _e_mod_comp_win_configure(cw, x, y, w, h, border); + if (ecore_x_window_visible_get(wins[i])) + { + _e_mod_comp_win_show(cw); + } + } + free(wins); + } + + return c; +} + +////////////////////////////////////////////////////////////////////////// + Eina_Bool e_mod_comp_init(void) { + Eina_List *l; + E_Manager *man; + + windows = eina_hash_string_superfast_new(NULL); + damages = eina_hash_string_superfast_new(NULL); + + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CREATE, _e_mod_comp_create, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _e_mod_comp_destroy, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, _e_mod_comp_show, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, _e_mod_comp_hide, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_REPARENT, _e_mod_comp_reparent, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _e_mod_comp_configure, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_STACK, _e_mod_comp_stack, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _e_mod_comp_property, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _e_mod_comp_message, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHAPE, _e_mod_comp_shape, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_DAMAGE_NOTIFY, _e_mod_comp_damage, NULL)); + + EINA_LIST_FOREACH(e_manager_list(), l, man) + { + compositors = eina_list_append(compositors, _e_mod_comp_add(man)); + } + return 1; } void e_mod_comp_shutdown(void) { + Comp *c; + + EINA_LIST_FREE(compositors, c) + { + if (c) + { + ecore_evas_free(c->ee); +// ecore_x_composite_unredirect_subwindows +// (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); + ecore_x_composite_render_window_disable(c->win); + free(c); + } + } + + E_FREE_LIST(handlers, ecore_event_handler_del); + + eina_hash_free(damages); + eina_hash_free(windows); } Modified: trunk/e/src/modules/comp/e_mod_main.c =================================================================== --- trunk/e/src/modules/comp/e_mod_main.c 2010-01-06 14:14:23 UTC (rev 44920) +++ trunk/e/src/modules/comp/e_mod_main.c 2010-01-06 14:18:47 UTC (rev 44921) @@ -42,7 +42,10 @@ _comp_mod = mod; - e_mod_comp_init(); + if (!e_mod_comp_init()) + { + // FIXME: handle if comp init fails + } return mod; } |
From: Enlightenment S. <no-...@en...> - 2010-01-06 14:26:55
|
Log: unload and leave screen usable... Author: raster Date: 2010-01-06 06:26:49 -0800 (Wed, 06 Jan 2010) New Revision: 44922 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-06 14:18:47 UTC (rev 44921) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-06 14:26:49 UTC (rev 44922) @@ -486,14 +486,19 @@ EINA_LIST_FREE(compositors, c) { - if (c) + Comp_Win *cw; + + while (c->wins) { - ecore_evas_free(c->ee); + cw = c->wins; + _e_mod_comp_win_hide(cw); + _e_mod_comp_win_del(cw); + } + ecore_evas_free(c->ee); // ecore_x_composite_unredirect_subwindows // (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); - ecore_x_composite_render_window_disable(c->win); - free(c); - } + ecore_x_composite_render_window_disable(c->win); + free(c); } E_FREE_LIST(handlers, ecore_event_handler_del); |
From: Enlightenment S. <no-...@en...> - 2010-01-06 15:21:22
|
Log: fix uninit val read Author: raster Date: 2010-01-06 07:21:16 -0800 (Wed, 06 Jan 2010) New Revision: 44926 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-06 15:21:01 UTC (rev 44925) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-06 15:21:16 UTC (rev 44926) @@ -91,6 +91,7 @@ // FIXME: check if bd or pop - track c->wins = eina_inlist_append(c->wins, EINA_INLIST_GET(cw)); cw->c = c; + memset((&att), 0, sizeof(Ecore_X_Window_Attributes)); ecore_x_window_attributes_get(cw->win, &att); cw->input_only = att.input_only; cw->vis = att.visual; |
From: Enlightenment S. <no-...@en...> - 2010-01-07 06:30:04
|
Log: defeereed on-frame updates only now (need to be more sophisitcated as this has a 1 frame delaye or wors on e's own renderings) fix stacking issues. Author: raster Date: 2010-01-06 22:29:53 -0800 (Wed, 06 Jan 2010) New Revision: 44939 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 05:29:06 UTC (rev 44938) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 06:29:53 UTC (rev 44939) @@ -14,6 +14,8 @@ Evas *evas; E_Manager *man; Eina_Inlist *wins; + Eina_List *updates; + Ecore_Animator *render_animator; }; struct _Comp_Win @@ -37,6 +39,7 @@ // ... Eina_Bool visible : 1; // is visible Eina_Bool input_only : 1; // is input_only + Eina_Bool update : 1; // has updates to fetch }; static Eina_List *handlers = NULL; @@ -46,6 +49,35 @@ static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h); +static int +_e_mod_comp_cb_animator(void *data) +{ + Comp *c = data; + Comp_Win *cw; + + c->render_animator = NULL; + EINA_LIST_FREE(c->updates, cw) + { + cw->update = 0; + // FIXME: accumulate updates and fetch them all here + } + ecore_evas_manual_render(c->ee); + return 0; +} + +static void +_e_mod_comp_render_queue(Comp *c) +{ + if (c->render_animator) return; + c->render_animator = ecore_animator_add(_e_mod_comp_cb_animator, c); +} + +static void +_e_mod_comp_win_render_queue(Comp_Win *cw) +{ + _e_mod_comp_render_queue(cw->c); +} + static Comp * _e_mod_comp_find(Ecore_X_Window root) { @@ -105,12 +137,24 @@ evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888); evas_object_image_alpha_set(cw->obj, 0); } + else + { + cw->obj = evas_object_rectangle_add(c->evas); + evas_object_color_set(cw->obj, 0, 0, 0, 64); + } + printf(" [0x%x] add\n", cw->win); return cw; } static void _e_mod_comp_win_del(Comp_Win *cw) { + printf(" [0x%x] del\n", cw->win); + if (cw->update) + { + cw->update = 0; + cw->c->updates = eina_list_remove(cw->c->updates, cw); + } if (cw->xim) { evas_object_image_data_set(cw->obj, NULL); @@ -137,12 +181,14 @@ if (cw->visible) return; cw->visible = 1; if (cw->input_only) return; + printf(" [0x%x] sho\n", cw->win); if (!cw->pixmap) { ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); _e_mod_comp_win_damage(cw, 0, 0, cw->w, cw->h); } evas_object_show(cw->obj); + _e_mod_comp_win_render_queue(cw); } static void @@ -151,6 +197,7 @@ if (!cw->visible) return; cw->visible = 0; if (cw->input_only) return; + printf(" [0x%x] hid\n", cw->win); if (cw->pixmap) { ecore_x_pixmap_free(cw->pixmap); @@ -158,27 +205,42 @@ cw->pixmap = 0; } evas_object_hide(cw->obj); + _e_mod_comp_win_render_queue(cw); } static void _e_mod_comp_win_raise_above(Comp_Win *cw, Comp_Win *cw2) { + printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); + 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->obj, cw2->obj); + _e_mod_comp_win_render_queue(cw); if (cw->input_only) return; - evas_object_stack_above(cw->obj, cw2->obj); } static void _e_mod_comp_win_raise(Comp_Win *cw) { + printf(" [0x%x] rai\n", cw->win); + 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->obj); + _e_mod_comp_win_render_queue(cw); if (cw->input_only) return; - evas_object_raise(cw->obj); } static void _e_mod_comp_win_lower(Comp_Win *cw) { + printf(" [0x%x] low\n", cw->win); + 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->obj); + _e_mod_comp_win_render_queue(cw); if (cw->input_only) return; - evas_object_lower(cw->obj); } static void @@ -186,12 +248,14 @@ { if (!((x == cw->x) && (y == cw->y))) { + printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); cw->x = x; cw->y = y; evas_object_move(cw->obj, cw->x, cw->y); } if (!((w == cw->w) && (h == cw->h))) { + printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); // ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); // ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); if (cw->pixmap) @@ -211,6 +275,7 @@ } cw->border = border; if (cw->input_only) return; + _e_mod_comp_win_render_queue(cw); } static void @@ -219,6 +284,7 @@ Ecore_X_Region parts; if (cw->input_only) return; + printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); parts = ecore_x_region_new(NULL, 0); ecore_x_damage_subtract(cw->damage, 0, parts); ecore_x_region_free(parts); @@ -242,17 +308,16 @@ ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); - if (0) - { - int i; - - for (i = 0; i < (w * h); i++) - pix[i] = i | 0xff0000ff; - } evas_object_image_data_set(cw->obj, pix); evas_object_image_size_set(cw->obj, cw->w, cw->h); evas_object_image_data_update_add(cw->obj, x, y, w, h); } + _e_mod_comp_win_render_queue(cw); + if (!cw->update) + { + cw->update = 1; + cw->c->updates = eina_list_append(cw->c->updates, cw); + } } ////////////////////////////////////////////////////////////////////////// @@ -337,8 +402,16 @@ if (cw2) { Comp_Win *cw3 = (Comp_Win *)(EINA_INLIST_GET(cw)->prev); - - if (cw3 != cw2) _e_mod_comp_win_raise_above(cw, cw2); + + if (cw3 != cw2) + { + if (cw3) + printf("... currently above [0x%x]\n", cw3->win); + else + printf("... currently at bottom\n"); + printf("... ... move above [0x%x]\n", cw2->win); + _e_mod_comp_win_raise_above(cw, cw2); + } } } @@ -409,18 +482,10 @@ c->win = ecore_x_composite_render_window_enable(man->root); if (c->man->num == 0) e_alert_composite_win = c->win; c->ee = ecore_evas_software_x11_new(NULL, c->win, 0, 0, man->w, man->h); + ecore_evas_manual_render_set(c->ee, 1); c->evas = ecore_evas_get(c->ee); ecore_evas_show(c->ee); - { - Evas_Object *o; - - o = evas_object_rectangle_add(c->evas); - evas_object_color_set(o, 255, 128, 20, 200); - evas_object_resize(o, 500, 300); - evas_object_show(o); - } - c->ee_win = ecore_evas_software_x11_window_get(c->ee); // ecore_x_composite_unredirect_subwindows // (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); |
From: Enlightenment S. <no-...@en...> - 2010-01-07 13:48:09
|
Log: fixme-- Author: raster Date: 2010-01-07 05:47:54 -0800 (Thu, 07 Jan 2010) New Revision: 44947 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 13:45:51 UTC (rev 44946) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 13:47:54 UTC (rev 44947) @@ -54,7 +54,6 @@ Ecore_X_Image *xim; // x image - software fallback Update *up; // update handler // fixme: shape rects - // fixme: argb windows // ... Eina_Bool visible : 1; // is visible Eina_Bool input_only : 1; // is input_only |
From: Enlightenment S. <no-...@en...> - 2010-01-07 13:54:49
|
Log: lots of fixes. looking solid now. bugs gone. argb windows handled. proper update queue with tile updates etc. Author: raster Date: 2010-01-07 05:45:51 -0800 (Thu, 07 Jan 2010) New Revision: 44946 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 13:36:45 UTC (rev 44945) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 13:45:51 UTC (rev 44946) @@ -3,6 +3,24 @@ #include "e_mod_comp.h" #include "config.h" +typedef struct _Update Update; +typedef struct _Update_Rect Update_Rect; + +struct _Update +{ + int w, h; + int tw, th; + int tsw, tsh; + unsigned char *tiles; +}; + +struct _Update_Rect +{ + EINA_INLIST; + int x, y, w, h; +}; + + typedef struct _Comp Comp; typedef struct _Comp_Win Comp_Win; @@ -34,11 +52,13 @@ int depth; Evas_Object *obj; // shadow object Ecore_X_Image *xim; // x image - software fallback - // fixme: evas object its mapped to + Update *up; // update handler // fixme: shape rects + // fixme: argb windows // ... Eina_Bool visible : 1; // is visible Eina_Bool input_only : 1; // is input_only + Eina_Bool argb : 1; // is argb Eina_Bool update : 1; // has updates to fetch }; @@ -47,6 +67,174 @@ static Eina_Hash *windows = NULL; static Eina_Hash *damages = NULL; +////////////////////////////////////////////////////////////////////////// + +static Update * +_e_mod_comp_update_new(void) +{ + Update *up; + + up = calloc(1, sizeof(Update)); + up->tsw = 32; + up->tsh = 32; + return up; +} + +static void +_e_mod_comp_update_free(Update *up) +{ + if (up->tiles) free(up->tiles); + free(up); +} + +static void +_e_mod_comp_update_resize(Update *up, int w, int h) +{ + if ((up->w == w) && (up->h == h)) return; + up->w = w; + up->h = h; + up->tw = (up->w + up->tsw - 1) / up->tsw; + up->th = (up->h + up->tsh - 1) / up->tsh; + if (up->tiles) + { + free(up->tiles); + up->tiles = NULL; + } +} + +static void +_e_mod_comp_tiles_alloc(Update *up) +{ + if (up->tiles) return; + up->tiles = calloc(up->tw * up->th, sizeof(unsigned char)); +} + +static void +_e_mod_comp_update_add(Update *up, int x, int y, int w, int h) +{ + int tx, ty, txx, tyy, xx, yy; + unsigned char *t, *t2; + + _e_mod_comp_tiles_alloc(up); + + // fixme: adjust to allow for optimizations in grabbing of ximages + if (1) + { + if (w > (up->w / 2)) + { + x = 0; + w = up->w; + } + } + + tx = x / up->tsw; + ty = y / up->tsh; + txx = (x + w - 1) / up->tsw; + tyy = (y + h - 1) / up->tsh; + t = up->tiles + (ty * up->tw) + tx; + for (yy = ty; yy <= tyy; yy++) + { + t2 = t; + for (xx = tx; xx <= txx; xx++) + { + *t2 = 1; + t2++; + } + t += up->tw; + } +} + +static Update_Rect * +_e_mod_comp_update_rects_get(Update *up) +{ + Update_Rect *r; + int ri = 0; + int x, y; + unsigned char *t, *t2, *t3; + + r = calloc((up->tw * up->th) + 1, sizeof(Update_Rect)); + if (!r) return NULL; + t = up->tiles; + for (y = 0; y < up->th; y++) + { + for (x = 0; x < up->tw; x++) + { + if (*t) + { + int can_expand_x = 1, can_expand_y = 1; + int xx = 0, yy = 0; + + t2 = t + 1; + while (can_expand_x) + { + xx++; + if ((x + xx) >= up->tw) can_expand_x = 0; + else if (!*t2) can_expand_x = 0; + if (can_expand_x) *t2 = 0; + t2++; + } + t3 = t; + while (can_expand_y) + { + int i; + + yy++; + t3 += up->tw; + if ((y + yy) >= up->th) can_expand_y = 0; + if (can_expand_y) + { + t2 = t3; + for (i = 0; i < xx; i++) + { + if (!*t2) + { + can_expand_y = 0; + break; + } + t2++; + } + } + if (can_expand_y) + { + t2 = t3; + for (i = 0; i < xx; i++) + { + *t2 = 0; + t2++; + } + } + } + *t = 0; + r[ri].x = x * up->tsw; + r[ri].y = y * up->tsh; + r[ri].w = xx * up->tsw; + r[ri].h = yy * up->tsh; + if ((r[ri].x + r[ri].w) > up->w) r[ri].w = up->w - r[ri].x; + if ((r[ri].y + r[ri].h) > up->h) r[ri].h = up->h - r[ri].y; + if ((r[ri].w <= 0) || (r[ri].h <= 0)) r[ri].w = 0; + else ri++; + x += xx - 1; + t += xx - 1; + } + t++; + } + } + return r; +} + +static void +_e_mod_comp_update_clear(Update *up) +{ + if (up->tiles) + { + free(up->tiles); + up->tiles = NULL; + } +} + +////////////////////////////////////////////////////////////////////////// + + static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h); static int @@ -58,8 +246,31 @@ c->render_animator = NULL; EINA_LIST_FREE(c->updates, cw) { + Update_Rect *r; + int i; + cw->update = 0; - // FIXME: accumulate updates and fetch them all here + r = _e_mod_comp_update_rects_get(cw->up); + _e_mod_comp_update_clear(cw->up); + if (cw->xim) + { + for (i = 0; r[i].w > 0; i++) + { + unsigned int *pix; + int x, y, w, h; + + x = r[i].x; + y = r[i].y; + w = r[i].w; + h = r[i].h; + ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); + pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); + evas_object_image_size_set(cw->obj, cw->w, cw->h); + evas_object_image_data_set(cw->obj, pix); + evas_object_image_data_update_add(cw->obj, x, y, w, h); + } + } + free(r); } ecore_evas_manual_render(c->ee); return 0; @@ -128,6 +339,7 @@ cw->input_only = att.input_only; cw->vis = att.visual; cw->depth = att.depth; + cw->argb = ecore_x_window_argb_get(cw->win); eina_hash_add(windows, e_util_winid_str_get(cw->win), cw); if (!cw->input_only) { @@ -135,21 +347,26 @@ eina_hash_add(damages, e_util_winid_str_get(cw->damage), cw); cw->obj = evas_object_image_filled_add(c->evas); evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(cw->obj, 0); + if (cw->argb) + evas_object_image_alpha_set(cw->obj, 1); + else + evas_object_image_alpha_set(cw->obj, 0); } else { cw->obj = evas_object_rectangle_add(c->evas); evas_object_color_set(cw->obj, 0, 0, 0, 64); } - printf(" [0x%x] add\n", cw->win); + cw->up = _e_mod_comp_update_new(); +// printf(" [0x%x] add\n", cw->win); return cw; } static void _e_mod_comp_win_del(Comp_Win *cw) { - printf(" [0x%x] del\n", cw->win); + _e_mod_comp_update_free(cw->up); +// printf(" [0x%x] del\n", cw->win); if (cw->update) { cw->update = 0; @@ -181,7 +398,7 @@ if (cw->visible) return; cw->visible = 1; if (cw->input_only) return; - printf(" [0x%x] sho\n", cw->win); +// printf(" [0x%x] sho\n", cw->win); if (!cw->pixmap) { ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); @@ -197,7 +414,7 @@ if (!cw->visible) return; cw->visible = 0; if (cw->input_only) return; - printf(" [0x%x] hid\n", cw->win); +// printf(" [0x%x] hid\n", cw->win); if (cw->pixmap) { ecore_x_pixmap_free(cw->pixmap); @@ -211,7 +428,7 @@ static void _e_mod_comp_win_raise_above(Comp_Win *cw, Comp_Win *cw2) { - printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); +// printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); 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), @@ -224,7 +441,7 @@ static void _e_mod_comp_win_raise(Comp_Win *cw) { - printf(" [0x%x] rai\n", cw->win); +// printf(" [0x%x] rai\n", cw->win); 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->obj); @@ -235,7 +452,7 @@ static void _e_mod_comp_win_lower(Comp_Win *cw) { - printf(" [0x%x] low\n", cw->win); +// printf(" [0x%x] low\n", cw->win); 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->obj); @@ -248,14 +465,14 @@ { if (!((x == cw->x) && (y == cw->y))) { - printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); +// printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); cw->x = x; cw->y = y; evas_object_move(cw->obj, cw->x, cw->y); } if (!((w == cw->w) && (h == cw->h))) { - printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); +// printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); // ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); // ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); if (cw->pixmap) @@ -272,6 +489,7 @@ ecore_x_image_free(cw->xim); cw->xim = NULL; } + _e_mod_comp_update_resize(cw->up, cw->w, cw->h); } cw->border = border; if (cw->input_only) return; @@ -284,11 +502,10 @@ Ecore_X_Region parts; if (cw->input_only) return; - printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); +// printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); parts = ecore_x_region_new(NULL, 0); ecore_x_damage_subtract(cw->damage, 0, parts); ecore_x_region_free(parts); - // FIXME: add rect to queue for this compwin if (!cw->pixmap) cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win); @@ -302,6 +519,7 @@ h = cw->h; } } + /* if (cw->xim) { unsigned int *pix; @@ -312,12 +530,14 @@ evas_object_image_size_set(cw->obj, cw->w, cw->h); evas_object_image_data_update_add(cw->obj, x, y, w, h); } + */ _e_mod_comp_win_render_queue(cw); if (!cw->update) { cw->update = 1; cw->c->updates = eina_list_append(cw->c->updates, cw); } + _e_mod_comp_update_add(cw->up, x, y, w, h); } ////////////////////////////////////////////////////////////////////////// @@ -404,14 +624,7 @@ Comp_Win *cw3 = (Comp_Win *)(EINA_INLIST_GET(cw)->prev); if (cw3 != cw2) - { - if (cw3) - printf("... currently above [0x%x]\n", cw3->win); - else - printf("... currently at bottom\n"); - printf("... ... move above [0x%x]\n", cw2->win); - _e_mod_comp_win_raise_above(cw, cw2); - } + _e_mod_comp_win_raise_above(cw, cw2); } } @@ -465,7 +678,9 @@ Ecore_X_Event_Damage *ev = event; Comp_Win *cw = _e_mod_comp_win_damage_find(ev->damage); if (!cw) return 1; - _e_mod_comp_win_damage(cw, ev->area.x, ev->area.y, ev->area.width, ev->area.height); + _e_mod_comp_win_damage(cw, + ev->area.x, ev->area.y, + ev->area.width, ev->area.height); return 1; } |
From: Enlightenment S. <no-...@en...> - 2010-01-07 14:01:43
|
Log: fix segv. Author: raster Date: 2010-01-07 06:01:35 -0800 (Thu, 07 Jan 2010) New Revision: 44948 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 13:47:54 UTC (rev 44947) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 14:01:35 UTC (rev 44948) @@ -150,7 +150,8 @@ int ri = 0; int x, y; unsigned char *t, *t2, *t3; - + + if (!up->tiles) return NULL; r = calloc((up->tw * up->th) + 1, sizeof(Update_Rect)); if (!r) return NULL; t = up->tiles; @@ -250,23 +251,26 @@ cw->update = 0; r = _e_mod_comp_update_rects_get(cw->up); - _e_mod_comp_update_clear(cw->up); - if (cw->xim) + if (r) { - for (i = 0; r[i].w > 0; i++) + _e_mod_comp_update_clear(cw->up); + if (cw->xim) { - unsigned int *pix; - int x, y, w, h; - - x = r[i].x; - y = r[i].y; - w = r[i].w; - h = r[i].h; - ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); - pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); - evas_object_image_size_set(cw->obj, cw->w, cw->h); - evas_object_image_data_set(cw->obj, pix); - evas_object_image_data_update_add(cw->obj, x, y, w, h); + for (i = 0; r[i].w > 0; i++) + { + unsigned int *pix; + int x, y, w, h; + + x = r[i].x; + y = r[i].y; + w = r[i].w; + h = r[i].h; + ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); + pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); + evas_object_image_size_set(cw->obj, cw->w, cw->h); + evas_object_image_data_set(cw->obj, pix); + evas_object_image_data_update_add(cw->obj, x, y, w, h); + } } } free(r); |
From: Enlightenment S. <no-...@en...> - 2010-01-08 08:24:53
|
Log: use new selection compositor set call! Author: raster Date: 2010-01-08 00:24:46 -0800 (Fri, 08 Jan 2010) New Revision: 44970 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 08:24:35 UTC (rev 44969) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 08:24:46 UTC (rev 44970) @@ -705,6 +705,7 @@ ecore_evas_show(c->ee); c->ee_win = ecore_evas_software_x11_window_get(c->ee); + ecore_x_screen_is_composited_set(c->man->num, c->ee_win); // ecore_x_composite_unredirect_subwindows // (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); @@ -773,6 +774,7 @@ { Comp_Win *cw; + ecore_x_screen_is_composited_set(c->man->num, 0); while (c->wins) { cw = (Comp_Win *)(c->wins); |
From: Enlightenment S. <no-...@en...> - 2010-01-08 10:01:20
|
Log: unload cleanly - del animator! Author: raster Date: 2010-01-08 02:01:13 -0800 (Fri, 08 Jan 2010) New Revision: 44972 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 08:39:50 UTC (rev 44971) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 10:01:13 UTC (rev 44972) @@ -774,6 +774,8 @@ { Comp_Win *cw; + if (c->render_animator) + ecore_animator_del(c->render_animator); ecore_x_screen_is_composited_set(c->man->num, 0); while (c->wins) { |
From: Enlightenment S. <no-...@en...> - 2010-01-08 11:29:40
|
Log: fix shading of windows Author: raster Date: 2010-01-08 03:29:32 -0800 (Fri, 08 Jan 2010) New Revision: 44974 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 11:29:20 UTC (rev 44973) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 11:29:32 UTC (rev 44974) @@ -45,6 +45,7 @@ E_Border *bd; // if its a border - later E_Popup *pop; // if its a popup - later int x, y, w, h; // geometry + int pw, ph; // pixmap w/h int border; // border width Ecore_X_Pixmap pixmap; // the compositing pixmap Ecore_X_Damage damage; // damage region @@ -114,8 +115,14 @@ int tx, ty, txx, tyy, xx, yy; unsigned char *t, *t2; + if ((w <= 0) || (h <= 0)) return; + if ((up->tw <= 0) || (up->th <= 0)) return; + _e_mod_comp_tiles_alloc(up); + E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, up->w, up->h); + if ((w <= 0) || (h <= 0)) return; + // fixme: adjust to allow for optimizations in grabbing of ximages if (1) { @@ -235,7 +242,7 @@ ////////////////////////////////////////////////////////////////////////// -static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h); +static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg); static int _e_mod_comp_cb_animator(void *data) @@ -250,12 +257,24 @@ int i; cw->update = 0; + if (!cw->pixmap) + { + cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win); + ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph)); + } + if ((cw->pw > 0) && (cw->ph > 0)) + _e_mod_comp_update_resize(cw->up, cw->pw, cw->ph); + if (!cw->xim) + { + if (cw->xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth)) + _e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph); + } r = _e_mod_comp_update_rects_get(cw->up); - if (r) + if (r) { - _e_mod_comp_update_clear(cw->up); if (cw->xim) { + _e_mod_comp_update_clear(cw->up); for (i = 0; r[i].w > 0; i++) { unsigned int *pix; @@ -267,13 +286,13 @@ h = r[i].h; ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); - evas_object_image_size_set(cw->obj, cw->w, cw->h); + evas_object_image_size_set(cw->obj, cw->pw, cw->ph); evas_object_image_data_set(cw->obj, pix); evas_object_image_data_update_add(cw->obj, x, y, w, h); } } + free(r); } - free(r); } ecore_evas_manual_render(c->ee); return 0; @@ -361,7 +380,7 @@ evas_object_color_set(cw->obj, 0, 0, 0, 64); } cw->up = _e_mod_comp_update_new(); -// printf(" [0x%x] add\n", cw->win); + printf(" [0x%x] add\n", cw->win); return cw; } @@ -369,7 +388,7 @@ _e_mod_comp_win_del(Comp_Win *cw) { _e_mod_comp_update_free(cw->up); -// printf(" [0x%x] del\n", cw->win); + printf(" [0x%x] del\n", cw->win); if (cw->update) { cw->update = 0; @@ -401,11 +420,11 @@ if (cw->visible) return; cw->visible = 1; if (cw->input_only) return; -// printf(" [0x%x] sho\n", cw->win); + printf(" [0x%x] sho\n", cw->win); if (!cw->pixmap) { ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); - _e_mod_comp_win_damage(cw, 0, 0, cw->w, cw->h); + _e_mod_comp_win_damage(cw, 0, 0, cw->w, cw->h, 0); } evas_object_show(cw->obj); _e_mod_comp_win_render_queue(cw); @@ -417,12 +436,14 @@ if (!cw->visible) return; cw->visible = 0; if (cw->input_only) return; -// printf(" [0x%x] hid\n", cw->win); + printf(" [0x%x] hid\n", cw->win); if (cw->pixmap) { ecore_x_pixmap_free(cw->pixmap); ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); cw->pixmap = 0; + cw->pw = 0; + cw->ph = 0; } evas_object_hide(cw->obj); _e_mod_comp_win_render_queue(cw); @@ -431,7 +452,7 @@ static void _e_mod_comp_win_raise_above(Comp_Win *cw, Comp_Win *cw2) { -// printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); + printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); 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), @@ -444,7 +465,7 @@ static void _e_mod_comp_win_raise(Comp_Win *cw) { -// printf(" [0x%x] rai\n", cw->win); + printf(" [0x%x] rai\n", cw->win); 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->obj); @@ -455,7 +476,7 @@ static void _e_mod_comp_win_lower(Comp_Win *cw) { -// printf(" [0x%x] low\n", cw->win); + printf(" [0x%x] low\n", cw->win); 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->obj); @@ -468,20 +489,22 @@ { if (!((x == cw->x) && (y == cw->y))) { -// printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); + printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); cw->x = x; cw->y = y; evas_object_move(cw->obj, cw->x, cw->y); } if (!((w == cw->w) && (h == cw->h))) { -// printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); + printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); // ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); // ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); if (cw->pixmap) { ecore_x_pixmap_free(cw->pixmap); cw->pixmap = 0; + cw->pw = 0; + cw->ph = 0; } cw->w = w; cw->h = h; @@ -492,35 +515,28 @@ ecore_x_image_free(cw->xim); cw->xim = NULL; } - _e_mod_comp_update_resize(cw->up, cw->w, cw->h); } - cw->border = border; + if (cw->border != border) + { + cw->border = border; + // FIXME: handle border + } if (cw->input_only) return; _e_mod_comp_win_render_queue(cw); } static void -_e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h) +_e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg) { - Ecore_X_Region parts; - if (cw->input_only) return; -// printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); - parts = ecore_x_region_new(NULL, 0); - ecore_x_damage_subtract(cw->damage, 0, parts); - ecore_x_region_free(parts); - if (!cw->pixmap) - cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win); + printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); + if (dmg) + { + Ecore_X_Region parts; - if (!cw->xim) - { - if (cw->xim = ecore_x_image_new(cw->w, cw->h, cw->vis, cw->depth)) - { - x = 0; - y = 0; - w = cw->w; - h = cw->h; - } + parts = ecore_x_region_new(NULL, 0); + ecore_x_damage_subtract(cw->damage, 0, parts); + ecore_x_region_free(parts); } /* if (cw->xim) @@ -534,13 +550,13 @@ evas_object_image_data_update_add(cw->obj, x, y, w, h); } */ - _e_mod_comp_win_render_queue(cw); if (!cw->update) { cw->update = 1; cw->c->updates = eina_list_append(cw->c->updates, cw); } _e_mod_comp_update_add(cw->up, x, y, w, h); + _e_mod_comp_win_render_queue(cw); } ////////////////////////////////////////////////////////////////////////// @@ -683,7 +699,7 @@ if (!cw) return 1; _e_mod_comp_win_damage(cw, ev->area.x, ev->area.y, - ev->area.width, ev->area.height); + ev->area.width, ev->area.height, 1); return 1; } |
From: Enlightenment S. <no-...@en...> - 2010-01-08 11:30:30
|
Log: printf-- Author: raster Date: 2010-01-08 03:30:24 -0800 (Fri, 08 Jan 2010) New Revision: 44975 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 11:29:32 UTC (rev 44974) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 11:30:24 UTC (rev 44975) @@ -380,7 +380,7 @@ evas_object_color_set(cw->obj, 0, 0, 0, 64); } cw->up = _e_mod_comp_update_new(); - printf(" [0x%x] add\n", cw->win); +// printf(" [0x%x] add\n", cw->win); return cw; } @@ -388,7 +388,7 @@ _e_mod_comp_win_del(Comp_Win *cw) { _e_mod_comp_update_free(cw->up); - printf(" [0x%x] del\n", cw->win); +// printf(" [0x%x] del\n", cw->win); if (cw->update) { cw->update = 0; @@ -420,7 +420,7 @@ if (cw->visible) return; cw->visible = 1; if (cw->input_only) return; - printf(" [0x%x] sho\n", cw->win); +// printf(" [0x%x] sho\n", cw->win); if (!cw->pixmap) { ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); @@ -436,7 +436,7 @@ if (!cw->visible) return; cw->visible = 0; if (cw->input_only) return; - printf(" [0x%x] hid\n", cw->win); +// printf(" [0x%x] hid\n", cw->win); if (cw->pixmap) { ecore_x_pixmap_free(cw->pixmap); @@ -452,7 +452,7 @@ static void _e_mod_comp_win_raise_above(Comp_Win *cw, Comp_Win *cw2) { - printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); +// printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); 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), @@ -465,7 +465,7 @@ static void _e_mod_comp_win_raise(Comp_Win *cw) { - printf(" [0x%x] rai\n", cw->win); +// printf(" [0x%x] rai\n", cw->win); 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->obj); @@ -476,7 +476,7 @@ static void _e_mod_comp_win_lower(Comp_Win *cw) { - printf(" [0x%x] low\n", cw->win); +// printf(" [0x%x] low\n", cw->win); 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->obj); @@ -489,14 +489,14 @@ { if (!((x == cw->x) && (y == cw->y))) { - printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); +// printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); cw->x = x; cw->y = y; evas_object_move(cw->obj, cw->x, cw->y); } if (!((w == cw->w) && (h == cw->h))) { - printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); +// printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); // ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); // ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); if (cw->pixmap) @@ -529,7 +529,7 @@ _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg) { if (cw->input_only) return; - printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); +// printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); if (dmg) { Ecore_X_Region parts; |
From: Enlightenment S. <no-...@en...> - 2010-01-09 00:07:00
|
Log: fix issue introduced with shader fixes. Author: raster Date: 2010-01-08 16:06:53 -0800 (Fri, 08 Jan 2010) New Revision: 44997 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-08 23:27:15 UTC (rev 44996) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-09 00:06:53 UTC (rev 44997) @@ -60,6 +60,7 @@ Eina_Bool input_only : 1; // is input_only Eina_Bool argb : 1; // is argb Eina_Bool update : 1; // has updates to fetch + Eina_Bool redirected : 1; // has updates to fetch }; static Eina_List *handlers = NULL; @@ -389,6 +390,10 @@ { _e_mod_comp_update_free(cw->up); // printf(" [0x%x] del\n", cw->win); + if (cw->pixmap) + { + ecore_x_pixmap_free(cw->pixmap); + } if (cw->update) { cw->update = 0; @@ -406,7 +411,12 @@ eina_hash_del(windows, e_util_winid_str_get(cw->win), cw); if (cw->damage) { + Ecore_X_Region parts; + eina_hash_del(damages, e_util_winid_str_get(cw->damage), cw); + parts = ecore_x_region_new(NULL, 0); + ecore_x_damage_subtract(cw->damage, 0, parts); + ecore_x_region_free(parts); ecore_x_damage_free(cw->damage); cw->damage = 0; } @@ -419,10 +429,11 @@ { if (cw->visible) return; cw->visible = 1; +// printf(" [0x%x] sho\n", cw->win); if (cw->input_only) return; -// printf(" [0x%x] sho\n", cw->win); - if (!cw->pixmap) + if (!cw->redirected) { + cw->redirected = 1; ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); _e_mod_comp_win_damage(cw, 0, 0, cw->w, cw->h, 0); } @@ -437,10 +448,11 @@ cw->visible = 0; if (cw->input_only) return; // printf(" [0x%x] hid\n", cw->win); - if (cw->pixmap) + if (cw->redirected) { - ecore_x_pixmap_free(cw->pixmap); ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); + cw->redirected = 0; + if (cw->pixmap) ecore_x_pixmap_free(cw->pixmap); cw->pixmap = 0; cw->pw = 0; cw->ph = 0; @@ -617,6 +629,7 @@ Ecore_X_Event_Window_Reparent *ev = event; Comp_Win *cw = _e_mod_comp_win_find(ev->win); if (!cw) return 1; +// printf("== repar [0x%x] to [0x%x]\n", ev->win, ev->parent); if (ev->parent != cw->c->man->root) _e_mod_comp_win_del(cw); return 1; @@ -790,8 +803,6 @@ { Comp_Win *cw; - if (c->render_animator) - ecore_animator_del(c->render_animator); ecore_x_screen_is_composited_set(c->man->num, 0); while (c->wins) { @@ -804,6 +815,7 @@ // (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); ecore_x_composite_render_window_disable(c->win); if (c->man->num == 0) e_alert_composite_win = 0; + if (c->render_animator) ecore_animator_del(c->render_animator); free(c); } |
From: Enlightenment S. <no-...@en...> - 2010-01-09 00:38:08
|
Log: handle border! Author: raster Date: 2010-01-08 16:35:21 -0800 (Fri, 08 Jan 2010) New Revision: 44998 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-09 00:06:53 UTC (rev 44997) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-09 00:35:21 UTC (rev 44998) @@ -520,7 +520,9 @@ } cw->w = w; cw->h = h; - evas_object_resize(cw->obj, cw->w, cw->h); + evas_object_resize(cw->obj, + cw->w + (cw->border * 2), + cw->h + (cw->border * 2)); if (cw->xim) { evas_object_image_data_set(cw->obj, NULL); @@ -531,7 +533,9 @@ if (cw->border != border) { cw->border = border; - // FIXME: handle border + evas_object_resize(cw->obj, + cw->w + (cw->border * 2), + cw->h + (cw->border * 2)); } if (cw->input_only) return; _e_mod_comp_win_render_queue(cw); |
From: Enlightenment S. <no-...@en...> - 2010-01-09 02:46:03
|
Log: fix random white/black box thing. Author: raster Date: 2010-01-08 18:45:50 -0800 (Fri, 08 Jan 2010) New Revision: 45000 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-09 01:01:56 UTC (rev 44999) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-09 02:45:50 UTC (rev 45000) @@ -70,6 +70,12 @@ ////////////////////////////////////////////////////////////////////////// +#if 0 +#define DBG(f, x...) printf(f, ##x) +#else +#define DBG(f, x...) +#endif + static Update * _e_mod_comp_update_new(void) { @@ -243,6 +249,7 @@ ////////////////////////////////////////////////////////////////////////// +static void _e_mod_comp_render_queue(Comp *c); static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg); static int @@ -250,6 +257,7 @@ { Comp *c = data; Comp_Win *cw; + Eina_List *new_updates = NULL; // for failed pixmap fetches - get them next frame c->render_animator = NULL; EINA_LIST_FREE(c->updates, cw) @@ -261,41 +269,64 @@ if (!cw->pixmap) { cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win); - ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph)); + if (cw->pixmap) + ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph)); + else + { + cw->pw = 0; + cw->ph = 0; + } + DBG("REND [0x%x] pixma = [0x%x], %ix%i\n", cw->win, cw->pixmap, cw->pw, cw->ph); + if ((cw->pw <= 0) || (cw->ph <= 0)) + { + ecore_x_pixmap_free(cw->pixmap); + cw->pixmap = 0; + cw->pw = 0; + cw->ph = 0; + } } if ((cw->pw > 0) && (cw->ph > 0)) - _e_mod_comp_update_resize(cw->up, cw->pw, cw->ph); - if (!cw->xim) { - if (cw->xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth)) - _e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph); - } - r = _e_mod_comp_update_rects_get(cw->up); - if (r) - { - if (cw->xim) + _e_mod_comp_update_resize(cw->up, cw->pw, cw->ph); + if (!cw->xim) { - _e_mod_comp_update_clear(cw->up); - for (i = 0; r[i].w > 0; i++) + if (cw->xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth)) + _e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph); + } + r = _e_mod_comp_update_rects_get(cw->up); + if (r) + { + if (cw->xim) { - unsigned int *pix; - int x, y, w, h; - - x = r[i].x; - y = r[i].y; - w = r[i].w; - h = r[i].h; - ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); - pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); - evas_object_image_size_set(cw->obj, cw->pw, cw->ph); - evas_object_image_data_set(cw->obj, pix); - evas_object_image_data_update_add(cw->obj, x, y, w, h); + _e_mod_comp_update_clear(cw->up); + for (i = 0; r[i].w > 0; i++) + { + unsigned int *pix; + int x, y, w, h; + + x = r[i].x; + y = r[i].y; + w = r[i].w; + h = r[i].h; + ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); + pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); + evas_object_image_size_set(cw->obj, cw->pw, cw->ph); + evas_object_image_data_set(cw->obj, pix); + evas_object_image_data_update_add(cw->obj, x, y, w, h); + } } + free(r); } - free(r); + else + { + cw->update = 1; + new_updates = eina_list_append(new_updates, cw); + _e_mod_comp_render_queue(c); + } } } ecore_evas_manual_render(c->ee); + c->updates = new_updates; return 0; } @@ -381,7 +412,7 @@ evas_object_color_set(cw->obj, 0, 0, 0, 64); } cw->up = _e_mod_comp_update_new(); -// printf(" [0x%x] add\n", cw->win); + DBG(" [0x%x] add\n", cw->win); return cw; } @@ -389,7 +420,7 @@ _e_mod_comp_win_del(Comp_Win *cw) { _e_mod_comp_update_free(cw->up); -// printf(" [0x%x] del\n", cw->win); + DBG(" [0x%x] del\n", cw->win); if (cw->pixmap) { ecore_x_pixmap_free(cw->pixmap); @@ -429,7 +460,7 @@ { if (cw->visible) return; cw->visible = 1; -// printf(" [0x%x] sho\n", cw->win); + DBG(" [0x%x] sho ++++++++++\n", cw->win); if (cw->input_only) return; if (!cw->redirected) { @@ -447,16 +478,19 @@ if (!cw->visible) return; cw->visible = 0; if (cw->input_only) return; -// printf(" [0x%x] hid\n", cw->win); + DBG(" [0x%x] hid --\n", cw->win); if (cw->redirected) { ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); cw->redirected = 0; - if (cw->pixmap) ecore_x_pixmap_free(cw->pixmap); - cw->pixmap = 0; cw->pw = 0; cw->ph = 0; } + if (cw->pixmap) + { + ecore_x_pixmap_free(cw->pixmap); + cw->pixmap = 0; + } evas_object_hide(cw->obj); _e_mod_comp_win_render_queue(cw); } @@ -464,7 +498,7 @@ static void _e_mod_comp_win_raise_above(Comp_Win *cw, Comp_Win *cw2) { -// printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); + DBG(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); 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), @@ -477,7 +511,7 @@ static void _e_mod_comp_win_raise(Comp_Win *cw) { -// printf(" [0x%x] rai\n", cw->win); + DBG(" [0x%x] rai\n", cw->win); 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->obj); @@ -488,7 +522,7 @@ static void _e_mod_comp_win_lower(Comp_Win *cw) { -// printf(" [0x%x] low\n", cw->win); + DBG(" [0x%x] low\n", cw->win); 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->obj); @@ -501,14 +535,14 @@ { if (!((x == cw->x) && (y == cw->y))) { -// printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); + DBG(" [0x%x] mov %4i %4i\n", cw->win, x, y); cw->x = x; cw->y = y; evas_object_move(cw->obj, cw->x, cw->y); } if (!((w == cw->w) && (h == cw->h))) { -// printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); + DBG(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); // ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); // ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); if (cw->pixmap) @@ -545,8 +579,8 @@ _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg) { if (cw->input_only) return; -// printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); - if (dmg) + DBG(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); + if ((dmg) && (cw->damage)) { Ecore_X_Region parts; @@ -598,7 +632,7 @@ Ecore_X_Event_Window_Destroy *ev = event; Comp_Win *cw = _e_mod_comp_win_find(ev->win); if (!cw) return 1; - if (ev->event_win != cw->c->man->root) return 1; +// if (ev->event_win != cw->c->man->root) return 1; _e_mod_comp_win_del(cw); return 1; } @@ -633,7 +667,7 @@ Ecore_X_Event_Window_Reparent *ev = event; Comp_Win *cw = _e_mod_comp_win_find(ev->win); if (!cw) return 1; -// printf("== repar [0x%x] to [0x%x]\n", ev->win, ev->parent); + DBG("== repar [0x%x] to [0x%x]\n", ev->win, ev->parent); if (ev->parent != cw->c->man->root) _e_mod_comp_win_del(cw); return 1; @@ -645,7 +679,7 @@ Ecore_X_Event_Window_Configure *ev = event; Comp_Win *cw = _e_mod_comp_win_find(ev->win); if (!cw) return 1; - if (ev->event_win != cw->c->man->root) return 1; +// if (ev->event_win != cw->c->man->root) return 1; if (ev->abovewin == 0) { @@ -679,7 +713,7 @@ Ecore_X_Event_Window_Stack *ev = event; Comp_Win *cw = _e_mod_comp_win_find(ev->win); if (!cw) return 1; - if (ev->event_win != cw->c->man->root) return 1; +// if (ev->event_win != cw->c->man->root) return 1; if (ev->detail == ECORE_X_WINDOW_STACK_ABOVE) _e_mod_comp_win_raise(cw); else _e_mod_comp_win_lower(cw); return 1; |
From: Enlightenment S. <no-...@en...> - 2010-01-11 02:48:05
|
Log: handle shaped windows on compositing. not pretty - but needed. Author: raster Date: 2010-01-10 18:47:59 -0800 (Sun, 10 Jan 2010) New Revision: 45028 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 00:50:14 UTC (rev 45027) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 02:47:59 UTC (rev 45028) @@ -59,8 +59,10 @@ Eina_Bool visible : 1; // is visible Eina_Bool input_only : 1; // is input_only Eina_Bool argb : 1; // is argb + Eina_Bool shaped : 1; // is shaped Eina_Bool update : 1; // has updates to fetch Eina_Bool redirected : 1; // has updates to fetch + Eina_Bool shape_changed : 1; // shape changed }; static Eina_List *handlers = NULL; @@ -309,11 +311,103 @@ w = r[i].w; h = r[i].h; ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); + DBG("UPDATE [0x%x] %i %i %ix%i\n", cw->win, x, y, w, h); pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); evas_object_image_size_set(cw->obj, cw->pw, cw->ph); evas_object_image_data_set(cw->obj, pix); evas_object_image_data_update_add(cw->obj, x, y, w, h); + if (cw->shaped) cw->shape_changed = 1; } + if ((cw->shape_changed) && (!cw->argb)) +// if (0) + { + Ecore_X_Rectangle *rects; + int num, i; + + DBG("SHAPE [0x%x] change\n", cw->win); + rects = ecore_x_window_shape_rectangles_get + (cw->win, &num); + if ((rects) && (num == 1)) + { + DBG("SHAPE [0x%x] rect 1\n", cw->win); + if ((rects[0].x == 0) && + (rects[0].y == 0) && + (rects[0].width == cw->w) && + (rects[0].height == cw->h)) + { + DBG("SHAPE [0x%x] rect solid\n", cw->win); + free(rects); + rects = NULL; + } + } + if (rects) + { + unsigned int *pix, *p; + unsigned char *spix, *sp; + int w, h, px, py; + + cw->shaped = 1; + evas_object_image_size_get(cw->obj, &w, &h); + if ((w > 0) && (h > 0)) + { + pix = evas_object_image_data_get(cw->obj, 1); + spix = calloc(w * h, sizeof(unsigned char)); + if (spix) + { + DBG("SHAPE [0x%x] rects %i\n", num); + for (i = 0; i < num; i++) + { + int rx, ry, rw, rh; + + rx = rects[i].x; + ry = rects[i].y; + rw = rects[i].width; + rh = rects[i].height; + E_RECTS_CLIP_TO_RECT + (rx, ry, rw, rh, 0, 0, w, h); + sp = spix + (w * ry) + rx; + for (py = 0; py < rh; py++) + { + for (px = 0; px < rw; px++) + { + *sp = 1; + sp++; + } + sp += w - rw; + } + } + sp = spix; + p = pix; + for (py = 0; py < h; py++) + { + for (px = 0; px < w; px++) + { + if (*sp) + *p |= 0xff000000; + else + *p = 0x00000000; + sp++; + p++; + } + } + free(spix); + } + evas_object_image_data_set(cw->obj, pix); + evas_object_image_alpha_set(cw->obj, 1); + evas_object_image_data_update_add(cw->obj, 0, 0, w, h); + } + free(rects); + } + else + { + cw->shaped = 0; + evas_object_image_alpha_set(cw->obj, 0); + // dont need to fix alpha chanel as blending + // should be totally off here regardless of + // alpha channe; content + } + cw->shape_changed = 0; + } } free(r); } @@ -397,6 +491,9 @@ eina_hash_add(windows, e_util_winid_str_get(cw->win), cw); if (!cw->input_only) { + Ecore_X_Rectangle *rects; + int num; + cw->damage = ecore_x_damage_new(cw->win, ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES); eina_hash_add(damages, e_util_winid_str_get(cw->damage), cw); cw->obj = evas_object_image_filled_add(c->evas); @@ -405,6 +502,28 @@ evas_object_image_alpha_set(cw->obj, 1); else evas_object_image_alpha_set(cw->obj, 0); + ecore_x_window_shape_events_select(cw->win, 1); + rects = ecore_x_window_shape_rectangles_get(cw->win, &num); + if (rects) + { + if ((rects) && (num == 1)) + { + if ((rects[0].x == 0) && + (rects[0].y == 0) && + (rects[0].width == att.w) && + (rects[0].height == att.h)) + { + free(rects); + rects = NULL; + } + } + if (rects) + { + cw->shaped = 1; + cw->shape_changed = 1; + free(rects); + } + } } else { @@ -609,6 +728,20 @@ _e_mod_comp_win_render_queue(cw); } +static void +_e_mod_comp_win_reshape(Comp_Win *cw) +{ + if (cw->shape_changed) return; + cw->shape_changed = 1; + if (!cw->update) + { + cw->update = 1; + cw->c->updates = eina_list_append(cw->c->updates, cw); + } + _e_mod_comp_update_add(cw->up, 0, 0, cw->w, cw->h); + _e_mod_comp_win_render_queue(cw); +} + ////////////////////////////////////////////////////////////////////////// static int @@ -737,6 +870,10 @@ _e_mod_comp_shape(void *data, int type, void *event) { // later Ecore_X_Event_Window_Shape *ev = event; + Comp_Win *cw = _e_mod_comp_win_find(ev->win); + if (!cw) return 1; +// if (ev->event_win != cw->c->man->root) return 1; + _e_mod_comp_win_reshape(cw); return 1; } |
From: Enlightenment S. <no-...@en...> - 2010-01-11 02:59:38
|
Log: todo's Author: raster Date: 2010-01-10 18:59:32 -0800 (Sun, 10 Jan 2010) New Revision: 45030 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 02:58:47 UTC (rev 45029) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 02:59:32 UTC (rev 45030) @@ -3,6 +3,18 @@ #include "e_mod_comp.h" #include "config.h" +// TODO (no specific order): +// 1. abstract evas object and compwin so we can duplicate the object N times +// in N canvases - for winlist, everything, pager etc. too +// 2. implement "unmapped composite cache" -> N pixels worth of unmapped +// windows to be fully composited. only the most active/recent. +// 3. for unmapped windows - when window goes out of unmapped comp cache +// make a miniature copy (1/4 width+height?) and set property on window +// with pixmap id +// 4. add shadow to rect non argb windows +// 5. abstract composite canvas to add extras in and "expose" it +// 6. other engine fast-paths (gl specifically)! + typedef struct _Update Update; typedef struct _Update_Rect Update_Rect; @@ -54,8 +66,6 @@ Evas_Object *obj; // shadow object Ecore_X_Image *xim; // x image - software fallback Update *up; // update handler - // fixme: shape rects - // ... Eina_Bool visible : 1; // is visible Eina_Bool input_only : 1; // is input_only Eina_Bool argb : 1; // is argb |
From: Enlightenment S. <no-...@en...> - 2010-01-11 03:03:15
|
Log: more todo Author: raster Date: 2010-01-10 19:03:08 -0800 (Sun, 10 Jan 2010) New Revision: 45031 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 02:59:32 UTC (rev 45030) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 03:03:08 UTC (rev 45031) @@ -14,6 +14,9 @@ // 4. add shadow to rect non argb windows // 5. abstract composite canvas to add extras in and "expose" it // 6. other engine fast-paths (gl specifically)! +// 7. check depth is 32bpp- cant do 16bpp compositing. +// 8. transparenty property +// 9. shortcut lots of stuff to draw inside the compositor - shelf, wallpaper, efm - hell even menus and anything else in e typedef struct _Update Update; typedef struct _Update_Rect Update_Rect; |
From: Enlightenment S. <no-...@en...> - 2010-01-11 03:28:27
|
Log: move update off to its own file - its pretty much stand-alone. need to fix the optimisation for sw engine there though. Author: raster Date: 2010-01-10 19:28:20 -0800 (Sun, 10 Jan 2010) New Revision: 45032 Added: trunk/e/src/modules/comp/e_mod_comp_update.c trunk/e/src/modules/comp/e_mod_comp_update.h Modified: trunk/e/src/modules/comp/Makefile.am trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/Makefile.am =================================================================== --- trunk/e/src/modules/comp/Makefile.am 2010-01-11 03:03:08 UTC (rev 45031) +++ trunk/e/src/modules/comp/Makefile.am 2010-01-11 03:28:20 UTC (rev 45032) @@ -23,7 +23,9 @@ e_mod_config.c \ e_mod_config.h \ e_mod_comp.c \ - e_mod_comp.h + e_mod_comp.h \ + e_mod_comp_update.c \ + e_mod_comp_update.h module_la_LIBADD = @e_libs@ @dlopen_libs@ module_la_LDFLAGS = -module -avoid-version Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 03:03:08 UTC (rev 45031) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 03:28:20 UTC (rev 45032) @@ -1,6 +1,7 @@ #include "e.h" #include "e_mod_main.h" #include "e_mod_comp.h" +#include "e_mod_comp_update.h" #include "config.h" // TODO (no specific order): @@ -16,26 +17,10 @@ // 6. other engine fast-paths (gl specifically)! // 7. check depth is 32bpp- cant do 16bpp compositing. // 8. transparenty property -// 9. shortcut lots of stuff to draw inside the compositor - shelf, wallpaper, efm - hell even menus and anything else in e +// 9. shortcut lots of stuff to draw inside the compositor - shelf, wallpaper, +// efm - hell even menus and anything else in e (this is what e18 was +// mostly about) -typedef struct _Update Update; -typedef struct _Update_Rect Update_Rect; - -struct _Update -{ - int w, h; - int tw, th; - int tsw, tsh; - unsigned char *tiles; -}; - -struct _Update_Rect -{ - EINA_INLIST; - int x, y, w, h; -}; - - typedef struct _Comp Comp; typedef struct _Comp_Win Comp_Win; @@ -91,179 +76,6 @@ #define DBG(f, x...) #endif -static Update * -_e_mod_comp_update_new(void) -{ - Update *up; - - up = calloc(1, sizeof(Update)); - up->tsw = 32; - up->tsh = 32; - return up; -} - -static void -_e_mod_comp_update_free(Update *up) -{ - if (up->tiles) free(up->tiles); - free(up); -} - -static void -_e_mod_comp_update_resize(Update *up, int w, int h) -{ - if ((up->w == w) && (up->h == h)) return; - up->w = w; - up->h = h; - up->tw = (up->w + up->tsw - 1) / up->tsw; - up->th = (up->h + up->tsh - 1) / up->tsh; - if (up->tiles) - { - free(up->tiles); - up->tiles = NULL; - } -} - -static void -_e_mod_comp_tiles_alloc(Update *up) -{ - if (up->tiles) return; - up->tiles = calloc(up->tw * up->th, sizeof(unsigned char)); -} - -static void -_e_mod_comp_update_add(Update *up, int x, int y, int w, int h) -{ - int tx, ty, txx, tyy, xx, yy; - unsigned char *t, *t2; - - if ((w <= 0) || (h <= 0)) return; - if ((up->tw <= 0) || (up->th <= 0)) return; - - _e_mod_comp_tiles_alloc(up); - - E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, up->w, up->h); - if ((w <= 0) || (h <= 0)) return; - - // fixme: adjust to allow for optimizations in grabbing of ximages - if (1) - { - if (w > (up->w / 2)) - { - x = 0; - w = up->w; - } - } - - tx = x / up->tsw; - ty = y / up->tsh; - txx = (x + w - 1) / up->tsw; - tyy = (y + h - 1) / up->tsh; - t = up->tiles + (ty * up->tw) + tx; - for (yy = ty; yy <= tyy; yy++) - { - t2 = t; - for (xx = tx; xx <= txx; xx++) - { - *t2 = 1; - t2++; - } - t += up->tw; - } -} - -static Update_Rect * -_e_mod_comp_update_rects_get(Update *up) -{ - Update_Rect *r; - int ri = 0; - int x, y; - unsigned char *t, *t2, *t3; - - if (!up->tiles) return NULL; - r = calloc((up->tw * up->th) + 1, sizeof(Update_Rect)); - if (!r) return NULL; - t = up->tiles; - for (y = 0; y < up->th; y++) - { - for (x = 0; x < up->tw; x++) - { - if (*t) - { - int can_expand_x = 1, can_expand_y = 1; - int xx = 0, yy = 0; - - t2 = t + 1; - while (can_expand_x) - { - xx++; - if ((x + xx) >= up->tw) can_expand_x = 0; - else if (!*t2) can_expand_x = 0; - if (can_expand_x) *t2 = 0; - t2++; - } - t3 = t; - while (can_expand_y) - { - int i; - - yy++; - t3 += up->tw; - if ((y + yy) >= up->th) can_expand_y = 0; - if (can_expand_y) - { - t2 = t3; - for (i = 0; i < xx; i++) - { - if (!*t2) - { - can_expand_y = 0; - break; - } - t2++; - } - } - if (can_expand_y) - { - t2 = t3; - for (i = 0; i < xx; i++) - { - *t2 = 0; - t2++; - } - } - } - *t = 0; - r[ri].x = x * up->tsw; - r[ri].y = y * up->tsh; - r[ri].w = xx * up->tsw; - r[ri].h = yy * up->tsh; - if ((r[ri].x + r[ri].w) > up->w) r[ri].w = up->w - r[ri].x; - if ((r[ri].y + r[ri].h) > up->h) r[ri].h = up->h - r[ri].y; - if ((r[ri].w <= 0) || (r[ri].h <= 0)) r[ri].w = 0; - else ri++; - x += xx - 1; - t += xx - 1; - } - t++; - } - } - return r; -} - -static void -_e_mod_comp_update_clear(Update *up) -{ - if (up->tiles) - { - free(up->tiles); - up->tiles = NULL; - } -} - -////////////////////////////////////////////////////////////////////////// - - static void _e_mod_comp_render_queue(Comp *c); static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg); |
From: Enlightenment S. <no-...@en...> - 2010-01-11 03:32:05
|
Log: oops - fogot to fix symbols used. fix. Author: raster Date: 2010-01-10 19:31:59 -0800 (Sun, 10 Jan 2010) New Revision: 45033 Modified: trunk/e/src/modules/comp/e_mod_comp.c trunk/e/src/modules/comp/e_mod_comp_update.h Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 03:28:20 UTC (rev 45032) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 03:31:59 UTC (rev 45033) @@ -114,18 +114,18 @@ } if ((cw->pw > 0) && (cw->ph > 0)) { - _e_mod_comp_update_resize(cw->up, cw->pw, cw->ph); + e_mod_comp_update_resize(cw->up, cw->pw, cw->ph); if (!cw->xim) { if (cw->xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth)) - _e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph); + e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph); } - r = _e_mod_comp_update_rects_get(cw->up); + r = e_mod_comp_update_rects_get(cw->up); if (r) { if (cw->xim) { - _e_mod_comp_update_clear(cw->up); + e_mod_comp_update_clear(cw->up); for (i = 0; r[i].w > 0; i++) { unsigned int *pix; @@ -355,7 +355,7 @@ cw->obj = evas_object_rectangle_add(c->evas); evas_object_color_set(cw->obj, 0, 0, 0, 64); } - cw->up = _e_mod_comp_update_new(); + cw->up = e_mod_comp_update_new(); DBG(" [0x%x] add\n", cw->win); return cw; } @@ -363,7 +363,7 @@ static void _e_mod_comp_win_del(Comp_Win *cw) { - _e_mod_comp_update_free(cw->up); + e_mod_comp_update_free(cw->up); DBG(" [0x%x] del\n", cw->win); if (cw->pixmap) { @@ -549,7 +549,7 @@ cw->update = 1; cw->c->updates = eina_list_append(cw->c->updates, cw); } - _e_mod_comp_update_add(cw->up, x, y, w, h); + e_mod_comp_update_add(cw->up, x, y, w, h); _e_mod_comp_win_render_queue(cw); } @@ -563,7 +563,7 @@ cw->update = 1; cw->c->updates = eina_list_append(cw->c->updates, cw); } - _e_mod_comp_update_add(cw->up, 0, 0, cw->w, cw->h); + e_mod_comp_update_add(cw->up, 0, 0, cw->w, cw->h); _e_mod_comp_win_render_queue(cw); } Modified: trunk/e/src/modules/comp/e_mod_comp_update.h =================================================================== --- trunk/e/src/modules/comp/e_mod_comp_update.h 2010-01-11 03:28:20 UTC (rev 45032) +++ trunk/e/src/modules/comp/e_mod_comp_update.h 2010-01-11 03:31:59 UTC (rev 45033) @@ -11,12 +11,12 @@ int x, y, w, h; }; -Update *e_mod_comp_update_new(void); -void e_mod_comp_update_free(Update *up); -void e_mod_comp_update_resize(Update *up, int w, int h); -void e_mod_comp_update_add(Update *up, int x, int y, int w, int h); -Update_Rect *e_mod_comp_update_rects_get(Update *up); -void e_mod_comp_update_clear(Update *up); +Update *e_mod_comp_update_new (void); +void e_mod_comp_update_free (Update *up); +void e_mod_comp_update_resize (Update *up, int w, int h); +void e_mod_comp_update_add (Update *up, int x, int y, int w, int h); +Update_Rect *e_mod_comp_update_rects_get (Update *up); +void e_mod_comp_update_clear (Update *up); #endif #endif |
From: Enlightenment S. <no-...@en...> - 2010-01-11 08:43:32
|
Log: knock off some todo's Author: raster Date: 2010-01-11 00:43:24 -0800 (Mon, 11 Jan 2010) New Revision: 45041 Modified: trunk/e/src/modules/comp/e_mod_comp.c trunk/e/src/modules/comp/e_mod_comp_update.c trunk/e/src/modules/comp/e_mod_comp_update.h Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 07:16:42 UTC (rev 45040) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-11 08:43:24 UTC (rev 45041) @@ -15,11 +15,11 @@ // 4. add shadow to rect non argb windows // 5. abstract composite canvas to add extras in and "expose" it // 6. other engine fast-paths (gl specifically)! -// 7. check depth is 32bpp- cant do 16bpp compositing. // 8. transparenty property -// 9. shortcut lots of stuff to draw inside the compositor - shelf, wallpaper, -// efm - hell even menus and anything else in e (this is what e18 was -// mostly about) +// 9. shortcut lots of stuff to draw inside the compositor - shelf, +// wallpaper, efm - hell even menus and anything else in e (this is what +// e18 was mostly about) +// 10. fullscreen windows need to be able to bypass compositing typedef struct _Comp Comp; typedef struct _Comp_Win Comp_Win; @@ -305,10 +305,15 @@ if (!cw) return NULL; cw->win = win; // FIXME: check if bd or pop - track - c->wins = eina_inlist_append(c->wins, EINA_INLIST_GET(cw)); cw->c = c; memset((&att), 0, sizeof(Ecore_X_Window_Attributes)); ecore_x_window_attributes_get(cw->win, &att); + if ((!att.input_only) && (att.depth != 24)) + { + printf("WARNING: window 0x%x not 24/32bpp -> %ibpp\n", cw->win, att.depth); + free(cw); + return NULL; + } cw->input_only = att.input_only; cw->vis = att.visual; cw->depth = att.depth; @@ -355,7 +360,11 @@ cw->obj = evas_object_rectangle_add(c->evas); evas_object_color_set(cw->obj, 0, 0, 0, 64); } + 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); + // for software: + e_mod_comp_update_policy_set(cw->up, UPDATE_POLICY_HALF_WIDTH_OR_MORE_ROUND_UP_TO_FULL_WIDTH); DBG(" [0x%x] add\n", cw->win); return cw; } @@ -580,7 +589,7 @@ if (c->win == ev->win) return 1; if (c->ee_win == ev->win) return 1; cw = _e_mod_comp_win_add(c, ev->win); - _e_mod_comp_win_configure(cw, ev->x, ev->y, ev->w, ev->h, ev->border); + if (cw) _e_mod_comp_win_configure(cw, ev->x, ev->y, ev->w, ev->h, ev->border); return 1; } @@ -721,12 +730,39 @@ { Comp *c; Ecore_X_Window *wins; + Ecore_X_Window_Attributes att; int i, num; c = calloc(1, sizeof(Comp)); if (!c) return NULL; c->man = man; c->win = ecore_x_composite_render_window_enable(man->root); + if (!c->win) + { + e_util_dialog_internal + (_("Compositor Error"), + _("Your screen does not support the compositor<br>" + "overlay window. This is needed for it to<br>" + "function.")); + free(c); + return NULL; + } + + memset((&att), 0, sizeof(Ecore_X_Window_Attributes)); + ecore_x_window_attributes_get(c->win, &att); + + if (att.depth != 24) + { + e_util_dialog_internal + (_("Compositor Error"), + _("Your screen is not in 24/32bit display mode.<br>" + "This is required to be your default depth<br>" + "setting for the compositor to work properly.")); + ecore_x_composite_render_window_disable(c->win); + free(c); + return NULL; + } + if (c->man->num == 0) e_alert_composite_win = c->win; c->ee = ecore_evas_software_x11_new(NULL, c->win, 0, 0, man->w, man->h); ecore_evas_manual_render_set(c->ee, 1); @@ -763,6 +799,27 @@ return c; } +static void +_e_mod_comp_del(Comp *c) +{ + Comp_Win *cw; + + ecore_x_screen_is_composited_set(c->man->num, 0); + while (c->wins) + { + cw = (Comp_Win *)(c->wins); + _e_mod_comp_win_hide(cw); + _e_mod_comp_win_del(cw); + } + ecore_evas_free(c->ee); +// ecore_x_composite_unredirect_subwindows +// (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); + ecore_x_composite_render_window_disable(c->win); + if (c->man->num == 0) e_alert_composite_win = 0; + if (c->render_animator) ecore_animator_del(c->render_animator); + free(c); +} + ////////////////////////////////////////////////////////////////////////// Eina_Bool @@ -788,7 +845,10 @@ EINA_LIST_FOREACH(e_manager_list(), l, man) { - compositors = eina_list_append(compositors, _e_mod_comp_add(man)); + Comp *c; + + c = _e_mod_comp_add(man); + if (c) compositors = eina_list_append(compositors, c); } return 1; @@ -799,25 +859,7 @@ { Comp *c; - EINA_LIST_FREE(compositors, c) - { - Comp_Win *cw; - - ecore_x_screen_is_composited_set(c->man->num, 0); - while (c->wins) - { - cw = (Comp_Win *)(c->wins); - _e_mod_comp_win_hide(cw); - _e_mod_comp_win_del(cw); - } - ecore_evas_free(c->ee); -// ecore_x_composite_unredirect_subwindows -// (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); - ecore_x_composite_render_window_disable(c->win); - if (c->man->num == 0) e_alert_composite_win = 0; - if (c->render_animator) ecore_animator_del(c->render_animator); - free(c); - } + EINA_LIST_FREE(compositors, c) _e_mod_comp_del(c); E_FREE_LIST(handlers, ecore_event_handler_del); Modified: trunk/e/src/modules/comp/e_mod_comp_update.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp_update.c 2010-01-11 07:16:42 UTC (rev 45040) +++ trunk/e/src/modules/comp/e_mod_comp_update.c 2010-01-11 08:43:24 UTC (rev 45041) @@ -11,6 +11,7 @@ int tw, th; int tsw, tsh; unsigned char *tiles; + Update_Policy pol; }; static void @@ -30,6 +31,7 @@ up = calloc(1, sizeof(Update)); up->tsw = 32; up->tsh = 32; + up->pol = UPDATE_POLICY_RAW; return up; } @@ -41,6 +43,21 @@ } void +e_mod_comp_update_policy_set(Update *up, Update_Policy pol) +{ + up->pol = pol; +} + +void +e_mod_comp_update_tile_size_set(Update *up, int tsw, int tsh) +{ + if ((up->tsw == tsw) && (up->tsh == tsh)) return; + up->tsw = tsw; + up->tsh = tsh; + e_mod_comp_update_clear(up); +} + +void e_mod_comp_update_resize(Update *up, int w, int h) { if ((up->w == w) && (up->h == h)) return; @@ -69,14 +86,19 @@ E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, up->w, up->h); if ((w <= 0) || (h <= 0)) return; - /* fixme: optimisation specific to the software enigine - abstract */ - if (1) + switch (up->pol) { + case UPDATE_POLICY_RAW: + break; + case UPDATE_POLICY_HALF_WIDTH_OR_MORE_ROUND_UP_TO_FULL_WIDTH: if (w > (up->w / 2)) { x = 0; w = up->w; } + break; + default: + break; } tx = x / up->tsw; Modified: trunk/e/src/modules/comp/e_mod_comp_update.h =================================================================== --- trunk/e/src/modules/comp/e_mod_comp_update.h 2010-01-11 07:16:42 UTC (rev 45040) +++ trunk/e/src/modules/comp/e_mod_comp_update.h 2010-01-11 08:43:24 UTC (rev 45041) @@ -5,18 +5,25 @@ typedef struct _Update Update; typedef struct _Update_Rect Update_Rect; +typedef enum _Update_Policy +{ + UPDATE_POLICY_RAW, + UPDATE_POLICY_HALF_WIDTH_OR_MORE_ROUND_UP_TO_FULL_WIDTH, +} Update_Policy; struct _Update_Rect { int x, y, w, h; }; -Update *e_mod_comp_update_new (void); -void e_mod_comp_update_free (Update *up); -void e_mod_comp_update_resize (Update *up, int w, int h); -void e_mod_comp_update_add (Update *up, int x, int y, int w, int h); -Update_Rect *e_mod_comp_update_rects_get (Update *up); -void e_mod_comp_update_clear (Update *up); +Update *e_mod_comp_update_new (void); +void e_mod_comp_update_free (Update *up); +void e_mod_comp_update_policy_set (Update *up, Update_Policy pol); +void e_mod_comp_update_tile_size_set (Update *up, int tsw, int tsh); +void e_mod_comp_update_resize (Update *up, int w, int h); +void e_mod_comp_update_add (Update *up, int x, int y, int w, int h); +Update_Rect *e_mod_comp_update_rects_get (Update *up); +void e_mod_comp_update_clear (Update *up); #endif #endif |
From: Enlightenment S. <no-...@en...> - 2010-01-15 05:54:21
|
Log: handle screen randr. Author: raster Date: 2010-01-14 21:54:14 -0800 (Thu, 14 Jan 2010) New Revision: 45166 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-15 05:47:31 UTC (rev 45165) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-15 05:54:14 UTC (rev 45166) @@ -20,6 +20,7 @@ // wallpaper, efm - hell even menus and anything else in e (this is what // e18 was mostly about) // 10. fullscreen windows need to be able to bypass compositing +// 11. handle root window resize! // ////////////////////////////////////////////////////////////////////////// @@ -854,6 +855,18 @@ return 1; } +static int +_e_mod_comp_randr(void *data, int type, void *event) +{ + Eina_List *l; + E_Comp *c; + + EINA_LIST_FOREACH(compositors, l, c) + { + ecore_evas_resize(c->ee, c->man->w, c->man->h); + } +} + ////////////////////////////////////////////////////////////////////////// static E_Comp * @@ -974,6 +987,8 @@ handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHAPE, _e_mod_comp_shape, NULL)); handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_DAMAGE_NOTIFY, _e_mod_comp_damage, NULL)); + handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_CONTAINER_RESIZE, _e_mod_comp_randr, NULL)); + EINA_LIST_FOREACH(e_manager_list(), l, man) { E_Comp *c; |
From: Enlightenment S. <no-...@en...> - 2010-01-20 04:45:56
|
Log: fix shadow on/off config Author: raster Date: 2010-01-19 20:45:47 -0800 (Tue, 19 Jan 2010) New Revision: 45351 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-20 03:59:32 UTC (rev 45350) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-20 04:45:47 UTC (rev 45351) @@ -1035,7 +1035,7 @@ EINA_INLIST_FOREACH(c->wins, cw) { - if (cw->shobj) + if (evas_object_visible_get(cw->obj) && (cw->shobj)) { if (_comp_mod->conf->use_shadow) { |
From: Enlightenment S. <no-...@en...> - 2010-01-21 08:44:49
|
Log: optin to use gl for compositing... uses native surface stuff froom evas. Author: raster Date: 2010-01-21 00:44:41 -0800 (Thu, 21 Jan 2010) New Revision: 45384 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-21 08:44:11 UTC (rev 45383) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-21 08:44:41 UTC (rev 45384) @@ -196,43 +196,92 @@ } if (!((cw->pw > 0) && (cw->ph > 0))) return; - e_mod_comp_update_resize(cw->up, cw->pw, cw->ph); - if (!cw->xim) + if ((cw->pw != cw->w) || (cw->ph != cw->h)) { - if (cw->xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth)) - e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph); + ecore_x_window_geometry_get(cw->win, + &(cw->x), &(cw->y), + &(cw->w), &(cw->h)); + evas_object_move(cw->obj, cw->x, cw->y); + if (cw->shobj) + { + evas_object_move(cw->shobj, cw->x, cw->y); + } + evas_object_resize(cw->obj, + cw->w + (cw->border * 2), + cw->h + (cw->border * 2)); + if (cw->shobj) + { + evas_object_resize(cw->shobj, + cw->w + (cw->border * 2), + cw->h + (cw->border * 2)); + } } - r = e_mod_comp_update_rects_get(cw->up); - if (r) + + e_mod_comp_update_resize(cw->up, cw->pw, cw->ph); + if ((cw->c->gl) && (!cw->shaped) && (!cw->shape_changed)) { - if (cw->xim) + r = e_mod_comp_update_rects_get(cw->up); + if (r) { e_mod_comp_update_clear(cw->up); for (i = 0; r[i].w > 0; i++) { - unsigned int *pix; + Evas_Native_Surface ns; int x, y, w, h; - + x = r[i].x; y = r[i].y; w = r[i].w; h = r[i].h; - ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); DBG("UPDATE [0x%x] %i %i %ix%i\n", cw->win, x, y, w, h); - pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); evas_object_image_size_set(cw->obj, cw->pw, cw->ph); - evas_object_image_data_set(cw->obj, pix); + ns.data.x11.visual = cw->vis; + ns.data.x11.pixmap = cw->pixmap; + evas_object_image_native_surface_set(cw->obj, &ns); evas_object_image_data_update_add(cw->obj, x, y, w, h); - if (cw->shaped) cw->shape_changed = 1; } - if ((cw->shape_changed) && (!cw->argb)) + free(r); + } + else + cw->update = 1; + } + else + { + if (!cw->xim) + { + if (cw->xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth)) + e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph); + } + r = e_mod_comp_update_rects_get(cw->up); + if (r) + { + if (cw->xim) { - _e_mod_comp_win_shape_rectangles_apply(cw); - cw->shape_changed = 0; + e_mod_comp_update_clear(cw->up); + for (i = 0; r[i].w > 0; i++) + { + unsigned int *pix; + int x, y, w, h; + + x = r[i].x; y = r[i].y; + w = r[i].w; h = r[i].h; + ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); + DBG("UPDATE [0x%x] %i %i %ix%i\n", cw->win, x, y, w, h); + pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); + evas_object_image_size_set(cw->obj, cw->pw, cw->ph); + evas_object_image_data_set(cw->obj, pix); + evas_object_image_data_update_add(cw->obj, x, y, w, h); + if (cw->shaped) cw->shape_changed = 1; + } + if ((cw->shape_changed) && (!cw->argb)) + { + _e_mod_comp_win_shape_rectangles_apply(cw); + cw->shape_changed = 0; + } } + free(r); } - free(r); + else + cw->update = 1; } - else - cw->update = 1; if (cw->shobj) { if (cw->shaped) evas_object_hide(cw->shobj); @@ -247,6 +296,8 @@ Eina_List *new_updates = NULL; // for failed pixmap fetches - get them next frame c->render_animator = NULL; +// ecore_x_grab(); +// ecore_x_sync(); EINA_LIST_FREE(c->updates, cw) { _e_mod_comp_win_update(cw); @@ -256,6 +307,7 @@ ecore_evas_manual_render(c->ee); if (new_updates) _e_mod_comp_render_queue(c); c->updates = new_updates; +// ecore_x_ungrab(); return 0; } |
From: Enlightenment S. <no-...@en...> - 2010-01-21 13:01:03
|
Log: rememebr to free up memory for uncomposited windows Author: raster Date: 2010-01-21 04:42:33 -0800 (Thu, 21 Jan 2010) New Revision: 45387 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-21 09:56:49 UTC (rev 45386) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-21 12:42:33 UTC (rev 45387) @@ -621,6 +621,22 @@ { evas_object_hide(cw->shobj); } + evas_object_image_size_set(cw->obj, 1, 1); + if (cw->pixmap) + { + ecore_x_pixmap_free(cw->pixmap); + cw->pixmap = 0; + cw->pw = 0; + cw->ph = 0; + } + if (cw->xim) + { + evas_object_image_data_set(cw->obj, NULL); + ecore_x_image_free(cw->xim); + cw->xim = NULL; + } + if (cw->c->gl) + evas_object_image_native_surface_set(cw->obj, NULL); _e_mod_comp_win_render_queue(cw); } |
From: Enlightenment S. <no-...@en...> - 2010-01-22 09:30:28
|
Log: fix for gl mode - update rects Author: raster Date: 2010-01-22 01:30:16 -0800 (Fri, 22 Jan 2010) New Revision: 45435 Modified: trunk/e/src/modules/comp/e_mod_comp.c Modified: trunk/e/src/modules/comp/e_mod_comp.c =================================================================== --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-22 07:21:03 UTC (rev 45434) +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-22 09:30:16 UTC (rev 45435) @@ -172,7 +172,7 @@ _e_mod_comp_win_update(E_Comp_Win *cw) { E_Update_Rect *r; - int i; + int i, new_pixmap = 0; cw->update = 0; if (!cw->pixmap) @@ -193,6 +193,8 @@ cw->pw = 0; cw->ph = 0; } + else + new_pixmap = 1; } if (!((cw->pw > 0) && (cw->ph > 0))) return; @@ -220,6 +222,8 @@ e_mod_comp_update_resize(cw->up, cw->pw, cw->ph); if ((cw->c->gl) && (!cw->shaped) && (!cw->shape_changed)) { + if (new_pixmap) + e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph); r = e_mod_comp_update_rects_get(cw->up); if (r) { |