fix issue introduced with shader fixes.

SVN revision: 44997
This commit is contained in:
Carsten Haitzler 2010-01-09 00:06:53 +00:00
parent 4ed5747b83
commit 2ade583930
1 changed files with 18 additions and 6 deletions

View File

@ -60,6 +60,7 @@ struct _Comp_Win
Eina_Bool input_only : 1; // is input_only Eina_Bool input_only : 1; // is input_only
Eina_Bool argb : 1; // is argb Eina_Bool argb : 1; // is argb
Eina_Bool update : 1; // has updates to fetch Eina_Bool update : 1; // has updates to fetch
Eina_Bool redirected : 1; // has updates to fetch
}; };
static Eina_List *handlers = NULL; static Eina_List *handlers = NULL;
@ -389,6 +390,10 @@ _e_mod_comp_win_del(Comp_Win *cw)
{ {
_e_mod_comp_update_free(cw->up); _e_mod_comp_update_free(cw->up);
// printf(" [0x%x] del\n", cw->win); // printf(" [0x%x] del\n", cw->win);
if (cw->pixmap)
{
ecore_x_pixmap_free(cw->pixmap);
}
if (cw->update) if (cw->update)
{ {
cw->update = 0; cw->update = 0;
@ -406,7 +411,12 @@ _e_mod_comp_win_del(Comp_Win *cw)
eina_hash_del(windows, e_util_winid_str_get(cw->win), cw); eina_hash_del(windows, e_util_winid_str_get(cw->win), cw);
if (cw->damage) if (cw->damage)
{ {
Ecore_X_Region parts;
eina_hash_del(damages, e_util_winid_str_get(cw->damage), cw); 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); ecore_x_damage_free(cw->damage);
cw->damage = 0; cw->damage = 0;
} }
@ -419,10 +429,11 @@ _e_mod_comp_win_show(Comp_Win *cw)
{ {
if (cw->visible) return; if (cw->visible) return;
cw->visible = 1; 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) if (cw->input_only) return;
if (!cw->redirected)
{ {
cw->redirected = 1;
ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL); 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); _e_mod_comp_win_damage(cw, 0, 0, cw->w, cw->h, 0);
} }
@ -437,10 +448,11 @@ _e_mod_comp_win_hide(Comp_Win *cw)
cw->visible = 0; cw->visible = 0;
if (cw->input_only) return; if (cw->input_only) return;
// printf(" [0x%x] hid\n", cw->win); // 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); 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->pixmap = 0;
cw->pw = 0; cw->pw = 0;
cw->ph = 0; cw->ph = 0;
@ -617,6 +629,7 @@ _e_mod_comp_reparent(void *data, int type, void *event)
Ecore_X_Event_Window_Reparent *ev = event; Ecore_X_Event_Window_Reparent *ev = event;
Comp_Win *cw = _e_mod_comp_win_find(ev->win); Comp_Win *cw = _e_mod_comp_win_find(ev->win);
if (!cw) return 1; if (!cw) return 1;
// printf("== repar [0x%x] to [0x%x]\n", ev->win, ev->parent);
if (ev->parent != cw->c->man->root) if (ev->parent != cw->c->man->root)
_e_mod_comp_win_del(cw); _e_mod_comp_win_del(cw);
return 1; return 1;
@ -790,8 +803,6 @@ e_mod_comp_shutdown(void)
{ {
Comp_Win *cw; Comp_Win *cw;
if (c->render_animator)
ecore_animator_del(c->render_animator);
ecore_x_screen_is_composited_set(c->man->num, 0); ecore_x_screen_is_composited_set(c->man->num, 0);
while (c->wins) while (c->wins)
{ {
@ -804,6 +815,7 @@ e_mod_comp_shutdown(void)
// (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL); // (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL);
ecore_x_composite_render_window_disable(c->win); ecore_x_composite_render_window_disable(c->win);
if (c->man->num == 0) e_alert_composite_win = 0; if (c->man->num == 0) e_alert_composite_win = 0;
if (c->render_animator) ecore_animator_del(c->render_animator);
free(c); free(c);
} }