From c35fdaeb000f2074f2766ba9420e833cdad907ec Mon Sep 17 00:00:00 2001
From: Jason Gerecke <killertofu@gmail.com>
Date: Wed, 18 Dec 2013 17:57:54 -0800
Subject: [PATCH v2 2/7] Select XI2 events whenever possible

In preparation for the "axis updated" events, we replace the function
'ecore_x_input_multi_select' with a generic 'ecore_x_input_select'
that requests the X server to forward XI2 events for all slave
(i.e. physical hardware) devices.

The just-rewritten _ecore_x_input_handler has sub-handlers only
pass along appropriate events, ensuring this change doesn't suddenly
cause applications to recieve XI2 events from sources that they
haven't already been getting them from.

~~ TODO ~~
 * Make sure that we *want* to register for all XI2 events where
   we'd normally ask for multi events
---
 src/lib/ecore_x/Ecore_X.h                       |   2 +-
 src/lib/ecore_x/xlib/ecore_x_xi2.c              | 127 +++++++-----------------
 src/modules/ecore_evas/engines/x/ecore_evas_x.c |  10 +-
 3 files changed, 42 insertions(+), 97 deletions(-)

diff --git a/src/lib/ecore_x/Ecore_X.h b/src/lib/ecore_x/Ecore_X.h
index 2db94da..8cdc3d2 100644
--- a/src/lib/ecore_x/Ecore_X.h
+++ b/src/lib/ecore_x/Ecore_X.h
@@ -2515,7 +2515,7 @@ EAPI Eina_Bool      ecore_x_image_is_argb32_get(Ecore_X_Image *im);
 
 EAPI Eina_Bool      ecore_x_image_to_argb_convert(void *src, int sbpp, int sbpl, Ecore_X_Colormap c, Ecore_X_Visual v, int x, int y, int w, int h, unsigned int *dst, int dbpl, int dx, int dy);
 
-EAPI Eina_Bool      ecore_x_input_multi_select(Ecore_X_Window win);
+EAPI Eina_Bool      ecore_x_input_select(Ecore_X_Window win);
 EAPI Eina_Bool	    ecore_x_input_raw_select(Ecore_X_Window win); /**< @since 1.8 */
 
 EAPI Eina_Bool      ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win);
diff --git a/src/lib/ecore_x/xlib/ecore_x_xi2.c b/src/lib/ecore_x/xlib/ecore_x_xi2.c
index 74a4515..573e423 100644
--- a/src/lib/ecore_x/xlib/ecore_x_xi2.c
+++ b/src/lib/ecore_x/xlib/ecore_x_xi2.c
@@ -474,117 +474,62 @@ _ecore_x_input_handler(XEvent *xevent)
 }
 
 EAPI Eina_Bool
-ecore_x_input_multi_select(Ecore_X_Window win)
+ecore_x_input_select(Ecore_X_Window win)
 {
 #ifdef ECORE_XI2
    int i;
    Eina_Bool find = EINA_FALSE;
 
    if (!_ecore_x_xi2_devs)
-     return 0;
+      return EINA_FALSE;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
    for (i = 0; i < _ecore_x_xi2_num; i++)
-     {
-        XIDeviceInfo *dev = &(_ecore_x_xi2_devs[i]);
+      {
+         XIDeviceInfo *dev = &(_ecore_x_xi2_devs[i]);
+
+         if (dev->use == XIFloatingSlave || dev->use == XISlavePointer)
+            {
+               XIEventMask eventmask;
+               unsigned char mask[4] = { 0 };
+
+               eventmask.deviceid = dev->deviceid;
+               eventmask.mask_len = sizeof(mask);
+               eventmask.mask = mask;
+               XISetMask(mask, XI_ButtonPress);
+               XISetMask(mask, XI_ButtonRelease);
+               XISetMask(mask, XI_Motion);
 
-        if (dev->use == XIFloatingSlave)
-          {
-             XIEventMask eventmask;
-             unsigned char mask[4] = { 0 };
-
-             eventmask.deviceid = dev->deviceid;
-             eventmask.mask_len = sizeof(mask);
-             eventmask.mask = mask;
-             XISetMask(mask, XI_ButtonPress);
-             XISetMask(mask, XI_ButtonRelease);
-             XISetMask(mask, XI_Motion);
-             XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
-             if (_ecore_xlib_sync) ecore_x_sync();
-             find = EINA_TRUE;
-          }
-        else if (dev->use == XISlavePointer)
-          {
-             XIDeviceInfo *atdev = NULL;
-             int j;
-
-             for (j = 0; j < _ecore_x_xi2_num; j++)
-               {
-                  if (_ecore_x_xi2_devs[j].deviceid == dev->attachment)
-                    atdev = &(_ecore_x_xi2_devs[j]);
-               }
-             if (((atdev) && (atdev->use != XIMasterPointer)) ||
-                 (!atdev))
-               {
-                  XIEventMask eventmask;
-                  unsigned char mask[4] = { 0 };
-
-                  eventmask.deviceid = dev->deviceid;
-                  eventmask.mask_len = sizeof(mask);
-                  eventmask.mask = mask;
-                  XISetMask(mask, XI_ButtonPress);
-                  XISetMask(mask, XI_ButtonRelease);
-                  XISetMask(mask, XI_Motion);
 #ifdef ECORE_XI2_2
-                  Eina_Inlist *l = _ecore_x_xi2_touch_info_list;
-                  Ecore_X_Touch_Device_Info *info;
-                  info = _ecore_x_input_touch_info_get(dev);
-
-                  if (info)
-                    {
-                       XISetMask(mask, XI_TouchUpdate);
-                       XISetMask(mask, XI_TouchBegin);
-                       XISetMask(mask, XI_TouchEnd);
-
-                       l = eina_inlist_append(l, (Eina_Inlist *)info);
-                       _ecore_x_xi2_touch_info_list = l;
-                    }
+               Eina_Inlist *l = _ecore_x_xi2_touch_info_list;
+               Ecore_X_Touch_Device_Info *info;
+               info = _ecore_x_input_touch_info_get(dev);
+
+               if (info)
+                  {
+                     XISetMask(mask, XI_TouchUpdate);
+                     XISetMask(mask, XI_TouchBegin);
+                     XISetMask(mask, XI_TouchEnd);
+
+                     l = eina_inlist_append(l, (Eina_Inlist *)info);
+                     _ecore_x_xi2_touch_info_list = l;
+                  }
 #else
 # ifdef XI_TouchUpdate
-                  XISetMask(mask, XI_TouchUpdate);
+               XISetMask(mask, XI_TouchUpdate);
 # endif
 # ifdef XI_TouchBegin
-                  XISetMask(mask, XI_TouchBegin);
+               XISetMask(mask, XI_TouchBegin);
 # endif
 # ifdef XI_TouchEnd
-                  XISetMask(mask, XI_TouchEnd);
+               XISetMask(mask, XI_TouchEnd);
 # endif
 #endif /* #ifdef ECORE_XI2_2 */
 
-                  XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
-                  if (_ecore_xlib_sync) ecore_x_sync();
-                  find = EINA_TRUE;
-               }
-#ifdef ECORE_XI2_2
-             else if ((atdev) && (atdev->use == XIMasterPointer))
-               {
-                  Eina_Inlist *l = _ecore_x_xi2_touch_info_list;
-                  Ecore_X_Touch_Device_Info *info;
-                  info = _ecore_x_input_touch_info_get(dev);
-
-                  if (info)
-                    {
-                       XIEventMask eventmask;
-                       unsigned char mask[4] = { 0 };
-
-                       eventmask.deviceid = dev->deviceid;
-                       eventmask.mask_len = sizeof(mask);
-                       eventmask.mask = mask;
-
-                       XISetMask(mask, XI_TouchUpdate);
-                       XISetMask(mask, XI_TouchBegin);
-                       XISetMask(mask, XI_TouchEnd);
-                       XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
-                       if (_ecore_xlib_sync) ecore_x_sync();
-
-                       l = eina_inlist_append(l, (Eina_Inlist *)info);
-                       _ecore_x_xi2_touch_info_list = l;
-
-                       find = EINA_TRUE;
-                    }
-               }
-#endif /* #ifdef ECORE_XI2_2 */
-          }
+               XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
+               if (_ecore_xlib_sync) ecore_x_sync();
+               find = EINA_TRUE;
+            }
      }
 
    return find;
diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
index ab3f571..08b0085 100644
--- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c
+++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
@@ -2532,7 +2532,7 @@ _alpha_do(Ecore_Evas *ee, int alpha)
      }
    evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
    ecore_x_window_shape_mask_set(ee->prop.window, 0);
-   ecore_x_input_multi_select(ee->prop.window);
+   ecore_x_input_select(ee->prop.window);
    ecore_event_window_register(ee->prop.window, ee, ee->evas,
                                (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
                                (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
@@ -2686,7 +2686,7 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
           }
         evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
 //        ecore_x_window_shape_mask_set(ee->prop.window, 0);
-        ecore_x_input_multi_select(ee->prop.window);
+        ecore_x_input_select(ee->prop.window);
         ecore_event_window_register(ee->prop.window, ee, ee->evas,
                                     (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
                                     (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
@@ -3984,7 +3984,7 @@ ecore_evas_software_x11_new_internal(const char *disp_name, Ecore_X_Window paren
 
    ee->engine.func->fn_render = _ecore_evas_x_render;
    _ecore_evas_register(ee);
-   ecore_x_input_multi_select(ee->prop.window);
+   ecore_x_input_select(ee->prop.window);
    ecore_event_window_register(ee->prop.window, ee, ee->evas,
                                (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
                                (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
@@ -4301,7 +4301,7 @@ _ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window w
      {
         *winp = win;
         edata->win_extra = eina_list_append(edata->win_extra, winp);
-        ecore_x_input_multi_select(win);
+        ecore_x_input_select(win);
         ecore_event_window_register(win, ee, ee->evas,
                                     (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
                                     (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
@@ -4434,7 +4434,7 @@ ecore_evas_gl_x11_options_new_internal(const char *disp_name, Ecore_X_Window par
 
    ee->engine.func->fn_render = _ecore_evas_x_render;
    _ecore_evas_register(ee);
-   ecore_x_input_multi_select(ee->prop.window);
+   ecore_x_input_select(ee->prop.window);
    ecore_event_window_register(ee->prop.window, ee, ee->evas,
                                (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
                                (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
-- 
2.1.0

