multitouch support for xi2 and floating xi devices
[framework/uifw/ecore.git] / src / lib / ecore_x / xlib / ecore_x_xi2.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif
8
9 #include <string.h>
10
11 #include "Ecore.h"
12 #include "ecore_x_private.h"
13 #include "Ecore_X.h"
14
15 #ifdef ECORE_XI2
16 int _ecore_x_xi2_opcode = -1;
17 #endif
18
19 EAPI Eina_Bool
20 ecore_x_input_multi_select(Ecore_X_Window win)
21 {
22 #ifdef ECORE_XI2
23    int find = 0;
24    static int num;
25    static XIDeviceInfo *devs = NULL;
26    static int checked = 0;
27    static int check_ret = 1;
28    
29    if (!checked)
30      {
31         int event, error;
32         int major = 2, minor = 0;
33         
34         checked = 1;
35         if (!XQueryExtension(_ecore_x_disp, "XInputExtension", 
36                              &_ecore_x_xi2_opcode, &event, &error))
37           {
38              _ecore_x_xi2_opcode = -1;
39              check_ret = 0;
40              return 0;
41           }
42    
43         if (XIQueryVersion(_ecore_x_disp, &major, &minor) == BadRequest)
44           {
45              _ecore_x_xi2_opcode = -1;
46              check_ret = 0;
47              return 0;
48           }
49         devs = XIQueryDevice(_ecore_x_disp, XIAllDevices, &num);
50 //        XIFreeDeviceInfo(devs);
51      }
52    else
53      {
54         if (!check_ret) return 0;
55      }
56
57    if (devs)
58      {
59         int i;
60         
61         for (i = 0; i < num; i++)
62           {
63              XIDeviceInfo *dev = &(devs[i]);
64              
65              if (dev->use == XIFloatingSlave)
66                {
67                   XIEventMask eventmask;
68                   unsigned char mask[1] = { 0 };
69                   
70                   eventmask.deviceid = dev->deviceid;
71                   eventmask.mask_len = sizeof(mask);
72                   eventmask.mask = mask;
73                   XISetMask(mask, XI_ButtonPress);
74                   XISetMask(mask, XI_ButtonRelease);
75                   XISetMask(mask, XI_Motion);
76                   XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
77                   find = 1;
78                }
79           }
80      }
81    
82    return find;
83 #else
84    return 0;
85 #endif
86 }