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
This commit is contained in:
parent
ab751d1e73
commit
7bdbc9c9e4
|
@ -2266,8 +2266,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(ec->comp, ev->root.x), e_comp_canvas_x_root_adjust(ec->comp, 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(ec->comp, ev->root.x, ev->root.y);
|
||||
int x, y;
|
||||
if (top == ec->comp->ee_win) return ECORE_CALLBACK_RENEW;
|
||||
|
||||
x = e_comp_canvas_x_root_adjust(ec->comp, ev->root.x);
|
||||
y = e_comp_canvas_x_root_adjust(ec->comp, 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;
|
||||
|
|
Loading…
Reference in New Issue