From f09e410285b724379742e5753b958cb3b51a75ad Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 12 Nov 2015 17:17:38 -0500 Subject: [PATCH] improve x11 client focusing with mouse-based focus policies on mouse move in the case that a mouse move event occurs, the compositor should validate the event to ensure that the mouse cursor is actually over the window that the event claims to be from fix T2594 --- src/bin/e_comp_x.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index dce9641e3..2fedda4c0 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -2376,8 +2376,22 @@ _e_comp_x_mouse_move(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_M if ((!ec) && (ev->window != ev->event_window)) ec = _e_comp_x_client_find_by_window(ev->event_window); if ((!ec) || e_client_util_ignored_get(ec)) return ECORE_CALLBACK_RENEW; - if ((!ec->mouse.in) && (!ec->hidden) && e_client_util_desk_visible(ec, e_desk_current_get(ec->zone))) - e_client_mouse_in(ec, e_comp_canvas_x_root_adjust(ev->root.x), e_comp_canvas_x_root_adjust(ev->root.y)); + if ((!ec->mouse.in) && evas_object_visible_get(ec->frame) && (!ec->desk->animate_count)) + { + E_Client *tec; + Ecore_Window top = e_comp_top_window_at_xy_get(ev->root.x, ev->root.y); + int x, y; + if (top == e_comp->ee_win) return ECORE_CALLBACK_RENEW; + + x = e_comp_canvas_x_root_adjust(ev->root.x); + y = e_comp_canvas_x_root_adjust(ev->root.y); + for (tec = e_client_above_get(ec); tec; tec = e_client_above_get(tec)) + { + if (!evas_object_visible_get(tec->frame)) continue; + if (E_INSIDE(x, y, tec->x, tec->y, tec->w, tec->h)) return ECORE_CALLBACK_RENEW; + } + e_client_mouse_in(ec, x, y); + } return ECORE_CALLBACK_RENEW; } E_COMP_X_PIXMAP_CHECK ECORE_CALLBACK_RENEW;