e passive window grabs - fix side-effect leave/enter events on clients

when you have click to focus we have a passive grab set up. somewhere
that window changed to the parent window instead of the client. this
leads to a side effect of a leave and enter event on clients for every
click. generally clients are ok with this, but some seem to have buggy
event handling. these enter/leave events are a side effect of the
passive grab even though we allow/replay the event.

this fixes that by placing passive grabs on the client window itself
instead of the parent.

@fix
This commit is contained in:
Carsten Haitzler 2015-06-28 17:24:29 +09:00
parent c30e0240e4
commit afb62b4989
2 changed files with 9 additions and 10 deletions

View File

@ -181,16 +181,15 @@ _e_comp_x_focus_setup(E_Client *ec)
if (!((e_client_focus_policy_click(ec)) ||
(e_config->always_click_to_raise) ||
(e_config->always_click_to_focus))) return;
ecore_x_window_button_grab(_e_comp_x_client_util_pwin_get(ec), 1,
ecore_x_window_button_grab(_e_comp_x_client_util_win_get(ec), 1,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
ecore_x_window_button_grab(_e_comp_x_client_util_pwin_get(ec), 2,
ecore_x_window_button_grab(_e_comp_x_client_util_win_get(ec), 2,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
ecore_x_window_button_grab(_e_comp_x_client_util_pwin_get(ec), 3,
ecore_x_window_button_grab(_e_comp_x_client_util_win_get(ec), 3,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);

View File

@ -71,9 +71,9 @@ e_focus_event_focus_in(E_Client *ec)
e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, e_client_util_pwin_get(ec));
e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, e_client_util_pwin_get(ec));
#ifndef HAVE_WAYLAND_ONLY
ecore_x_window_button_ungrab(e_client_util_pwin_get(ec), 1, 0, 1);
ecore_x_window_button_ungrab(e_client_util_pwin_get(ec), 2, 0, 1);
ecore_x_window_button_ungrab(e_client_util_pwin_get(ec), 3, 0, 1);
ecore_x_window_button_ungrab(e_client_util_win_get(ec), 1, 0, 1);
ecore_x_window_button_ungrab(e_client_util_win_get(ec), 2, 0, 1);
ecore_x_window_button_ungrab(e_client_util_win_get(ec), 3, 0, 1);
#endif
e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, e_client_util_pwin_get(ec));
e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, e_client_util_pwin_get(ec));
@ -90,15 +90,15 @@ e_focus_event_focus_out(E_Client *ec)
{
if (ec->button_grabbed) return;
#ifndef HAVE_WAYLAND_ONLY
ecore_x_window_button_grab(e_client_util_pwin_get(ec), 1,
ecore_x_window_button_grab(e_client_util_win_get(ec), 1,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
ecore_x_window_button_grab(e_client_util_pwin_get(ec), 2,
ecore_x_window_button_grab(e_client_util_win_get(ec), 2,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
ecore_x_window_button_grab(e_client_util_pwin_get(ec), 3,
ecore_x_window_button_grab(e_client_util_win_get(ec), 3,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);