e: prevent events on modal parent

This fixes trapping of events on modal parents. We can't change event
mask, as that changes the event _we_ receive, not the client. We must
add and input window above the parent which traps the events.

SVN revision: 79367
This commit is contained in:
Sebastian Dransfeld 2012-11-16 09:02:24 +00:00
parent 76f55c6195
commit 6004ba2eaa
2 changed files with 30 additions and 10 deletions

View File

@ -2519,6 +2519,13 @@ e_border_unshade(E_Border *bd,
bd->h - (bd->client_inset.t + bd->client_inset.b) -
bd->client.h,
bd->client.w, bd->client.h);
if (bd->client.lock_win)
{
ecore_x_window_move_resize(bd->client.lock_win, 0,
bd->h - (bd->client_inset.t + bd->client_inset.b) -
bd->client.h,
bd->client.w, bd->client.h);
}
}
else if (bd->shade.dir == E_DIRECTION_LEFT)
{
@ -2527,6 +2534,13 @@ e_border_unshade(E_Border *bd,
bd->w - (bd->client_inset.l + bd->client_inset.r) -
bd->client.h,
0, bd->client.w, bd->client.h);
if (bd->client.lock_win)
{
ecore_x_window_move_resize(bd->client.lock_win,
bd->w - (bd->client_inset.l + bd->client_inset.r) -
bd->client.h,
0, bd->client.w, bd->client.h);
}
}
else
ecore_x_window_gravity_set(bd->client.win, ECORE_X_GRAVITY_NE);
@ -5075,10 +5089,13 @@ _e_border_del(E_Border *bd)
bd->parent->transients = eina_list_remove(bd->parent->transients, bd);
if (bd->parent->modal == bd)
{
ecore_x_event_mask_unset(bd->parent->client.win, ECORE_X_EVENT_MASK_WINDOW_DAMAGE | ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
ecore_x_event_mask_set(bd->parent->client.win, bd->parent->saved.event_mask);
if (bd->parent->client.lock_win)
{
ecore_x_window_hide(bd->parent->client.lock_win);
ecore_x_window_free(bd->parent->client.lock_win);
bd->parent->client.lock_win = 0;
}
bd->parent->lock_close = 0;
bd->parent->saved.event_mask = 0;
bd->parent->modal = NULL;
}
bd->parent = NULL;
@ -7371,13 +7388,13 @@ _e_border_eval0(E_Border *bd)
e_border_layer_set(bd, bd->parent->layer);
if ((e_config->modal_windows) && (bd->client.netwm.state.modal))
{
Ecore_X_Window_Attributes attr;
bd->parent->modal = bd;
ecore_x_window_attributes_get(bd->parent->client.win, &attr);
bd->parent->saved.event_mask = attr.event_mask.mine;
bd->parent->lock_close = 1;
ecore_x_event_mask_unset(bd->parent->client.win, attr.event_mask.mine);
ecore_x_event_mask_set(bd->parent->client.win, ECORE_X_EVENT_MASK_WINDOW_DAMAGE | ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
if (!bd->client.lock_win)
{
bd->client.lock_win = ecore_x_window_input_new(bd->client.shell_win, 0, 0, bd->client.w, bd->client.h);
ecore_x_window_show(bd->client.lock_win);
}
}
if (e_config->focus_setting == E_FOCUS_NEW_DIALOG ||
@ -8523,7 +8540,10 @@ _e_border_eval(E_Border *bd)
if (bd->internal_ecore_evas)
ecore_evas_move_resize(bd->internal_ecore_evas, x, y, bd->client.w, bd->client.h);
else if (!bd->client.e.state.video)
ecore_x_window_move_resize(bd->client.win, x, y, bd->client.w, bd->client.h);
{
ecore_x_window_move_resize(bd->client.win, x, y, bd->client.w, bd->client.h);
ecore_x_window_move_resize(bd->client.lock_win, x, y, bd->client.w, bd->client.h);
}
ecore_evas_move_resize(bd->bg_ecore_evas, 0, 0, bd->w, bd->h);
evas_object_resize(bd->bg_object, bd->w, bd->h);

View File

@ -205,6 +205,7 @@ struct _E_Border
struct
{
Ecore_X_Window shell_win;
Ecore_X_Window lock_win;
Ecore_X_Window win;
int x, y, w, h;
@ -566,7 +567,6 @@ struct _E_Border
E_Layer layer;
int zone;
E_Maximize maximized;
unsigned int event_mask;
} saved;
struct