improve x11 client focusing with mouse-based focus policies on mouse move
authorMike Blumenkrantz <zmike@osg.samsung.com>
Thu, 12 Nov 2015 22:17:38 +0000 (17:17 -0500)
committerMike Blumenkrantz <zmike@osg.samsung.com>
Thu, 12 Nov 2015 22:17:38 +0000 (17:17 -0500)
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

index dce9641..2fedda4 100644 (file)
@@ -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;