From: Enlightenment S. <no-...@en...> - 2012-11-16 09:02:32
|
Log: 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. Author: englebass Date: 2012-11-16 01:02:24 -0800 (Fri, 16 Nov 2012) New Revision: 79367 Trac: http://trac.enlightenment.org/e/changeset/79367 Modified: trunk/e/src/bin/e_border.c trunk/e/src/bin/e_border.h Modified: trunk/e/src/bin/e_border.c =================================================================== --- trunk/e/src/bin/e_border.c 2012-11-16 08:39:25 UTC (rev 79366) +++ trunk/e/src/bin/e_border.c 2012-11-16 09:02:24 UTC (rev 79367) @@ -2519,6 +2519,13 @@ 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 @@ 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 @@ 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_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 @@ 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); Modified: trunk/e/src/bin/e_border.h =================================================================== --- trunk/e/src/bin/e_border.h 2012-11-16 08:39:25 UTC (rev 79366) +++ trunk/e/src/bin/e_border.h 2012-11-16 09:02:24 UTC (rev 79367) @@ -205,6 +205,7 @@ struct { Ecore_X_Window shell_win; + Ecore_X_Window lock_win; Ecore_X_Window win; int x, y, w, h; @@ -566,7 +567,6 @@ E_Layer layer; int zone; E_Maximize maximized; - unsigned int event_mask; } saved; struct |