forked from enlightenment/enlightenment
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:
parent
76f55c6195
commit
6004ba2eaa
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue