1 #include "ecore_xcb_private.h"
2 #ifdef ECORE_XCB_XINPUT
3 # include <xcb/xinput.h>
4 # include <xcb/xcb_event.h>
7 /* FIXME: this is a guess. can't find defines for touch events in xcb libs
9 /* these are not yet defined in xcb support for xi2 - so manually create */
10 #ifndef XCB_INPUT_DEVICE_TOUCH_BEGIN
11 #define XCB_INPUT_DEVICE_TOUCH_BEGIN 18
13 #ifndef XCB_INPUT_DEVICE_TOUCH_END
14 #define XCB_INPUT_DEVICE_TOUCH_END 19
16 #ifndef XCB_INPUT_DEVICE_TOUCH_UPDATE
17 #define XCB_INPUT_DEVICE_TOUCH_UPDATE 21
20 #ifndef XCB_INPUT_POINTER_EMULATED_MASK
21 #define XCB_INPUT_POINTER_EMULATED_MASK (1 << 16)
25 static Eina_Bool _input_avail = EINA_FALSE;
27 /* external variables */
28 int _ecore_xcb_event_input = 0;
31 _ecore_xcb_input_init(void)
33 LOGFN(__FILE__, __LINE__, __FUNCTION__);
35 #ifdef ECORE_XCB_XINPUT
36 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_input_id);
41 _ecore_xcb_input_finalize(void)
43 #ifdef ECORE_XCB_XINPUT
44 xcb_input_get_extension_version_cookie_t cookie;
45 xcb_input_get_extension_version_reply_t *reply;
49 LOGFN(__FILE__, __LINE__, __FUNCTION__);
51 #ifdef ECORE_XCB_XINPUT
53 xcb_input_get_extension_version_unchecked(_ecore_xcb_conn, 127, buff);
55 xcb_input_get_extension_version_reply(_ecore_xcb_conn, cookie, NULL);
58 _input_avail = EINA_TRUE;
64 const xcb_query_extension_reply_t *ext_reply;
66 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_input_id);
68 _ecore_xcb_event_input = ext_reply->first_event;
74 _ecore_xcb_input_shutdown(void)
76 LOGFN(__FILE__, __LINE__, __FUNCTION__);
80 #ifdef ECORE_XCB_XINPUT
81 _ecore_xcb_input_handle_event(xcb_generic_event_t *event)
83 _ecore_xcb_input_handle_event(xcb_generic_event_t * event __UNUSED__)
86 #ifdef ECORE_XCB_XINPUT
90 LOGFN(__FILE__, __LINE__, __FUNCTION__);
93 /* FIXME: look at xlib ecore_x_xi2.c to copy logic in when i can find an
94 * xcb-input lib to test with */
95 #ifdef ECORE_XCB_XINPUT
96 ev = (xcb_ge_event_t *)event;
97 switch (ev->event_type)
99 case XCB_INPUT_DEVICE_MOTION_NOTIFY:
101 xcb_input_device_motion_notify_event_t *de;
102 unsigned int child_win = 0;
104 de = (xcb_input_device_motion_notify_event_t *)ev->pad1;
105 child_win = (de->child ? de->child : de->event);
106 _ecore_xcb_event_mouse_move(de->time, de->state, de->event_x,
107 de->event_y, de->root_x, de->root_y,
108 de->event, child_win, de->root,
109 de->same_screen, de->device_id,
111 de->event_x, de->event_y,
112 de->root_x, de->root_y);
116 case XCB_INPUT_DEVICE_BUTTON_PRESS:
118 xcb_input_device_button_press_event_t *de;
119 unsigned int child_win = 0;
121 de = (xcb_input_device_button_press_event_t *)ev->pad1;
122 child_win = (de->child ? de->child : de->event);
123 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
124 de->time, de->state, de->detail,
125 de->event_x, de->event_y,
126 de->root_x, de->root_y, de->event,
128 de->same_screen, de->device_id,
130 de->event_x, de->event_y,
131 de->root_x, de->root_y);
135 case XCB_INPUT_DEVICE_BUTTON_RELEASE:
137 xcb_input_device_button_release_event_t *de;
138 unsigned int child_win = 0;
140 de = (xcb_input_device_button_release_event_t *)ev->pad1;
141 child_win = (de->child ? de->child : de->event);
142 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
143 de->time, de->state, de->detail,
144 de->event_x, de->event_y,
145 de->root_x, de->root_y, de->event,
147 de->same_screen, de->device_id,
149 de->event_x, de->event_y,
150 de->root_x, de->root_y);
154 case XCB_INPUT_DEVICE_TOUCH_UPDATE:
156 xcb_input_device_motion_notify_event_t *de;
157 unsigned int child_win = 0;
159 de = (xcb_input_device_motion_notify_event_t *)ev->pad1;
160 child_win = (de->child ? de->child : de->event);
161 _ecore_xcb_event_mouse_move(de->time, de->state, de->event_x,
162 de->event_y, de->root_x, de->root_y,
163 de->event, child_win, de->root,
164 de->same_screen, de->device_id,
166 de->event_x, de->event_y,
167 de->root_x, de->root_y);
171 case XCB_INPUT_DEVICE_TOUCH_BEGIN:
173 xcb_input_device_button_press_event_t *de;
174 unsigned int child_win = 0;
176 de = (xcb_input_device_button_press_event_t *)ev->pad1;
177 child_win = (de->child ? de->child : de->event);
178 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
179 de->time, de->state, de->detail,
180 de->event_x, de->event_y,
181 de->root_x, de->root_y, de->event,
183 de->same_screen, de->device_id,
185 de->event_x, de->event_y,
186 de->root_x, de->root_y);
190 case XCB_INPUT_DEVICE_TOUCH_END:
192 xcb_input_device_button_release_event_t *de;
193 unsigned int child_win = 0;
195 de = (xcb_input_device_button_release_event_t *)ev->pad1;
196 child_win = (de->child ? de->child : de->event);
197 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
198 de->time, de->state, de->detail,
199 de->event_x, de->event_y,
200 de->root_x, de->root_y, de->event,
202 de->same_screen, de->device_id,
204 de->event_x, de->event_y,
205 de->root_x, de->root_y);
216 ecore_x_input_multi_select(Ecore_X_Window win)
218 Eina_Bool find = EINA_FALSE;
219 #ifdef ECORE_XCB_XINPUT
220 xcb_input_list_input_devices_cookie_t dcookie;
221 xcb_input_list_input_devices_reply_t *dreply;
222 xcb_input_device_info_iterator_t diter;
225 LOGFN(__FILE__, __LINE__, __FUNCTION__);
228 if (!_input_avail) return EINA_FALSE;
230 /* FIXME: i can't seemingly test this! no xcb input lib so can't look and
231 * test and look at types etc. - look at xlib code and copy logic over
233 #ifdef ECORE_XCB_XINPUT
234 dcookie = xcb_input_list_input_devices_unchecked(_ecore_xcb_conn);
236 xcb_input_list_input_devices_reply(_ecore_xcb_conn, dcookie, NULL);
237 if (!dreply) return EINA_FALSE;
239 diter = xcb_input_list_input_devices_devices_iterator(dreply);
242 xcb_input_device_info_t *dev;
243 const xcb_input_event_class_t iclass[] =
245 XCB_INPUT_DEVICE_BUTTON_PRESS,
246 XCB_INPUT_DEVICE_BUTTON_RELEASE,
247 XCB_INPUT_DEVICE_MOTION_NOTIFY,
248 XCB_INPUT_DEVICE_TOUCH_BEGIN,
249 XCB_INPUT_DEVICE_TOUCH_END,
250 XCB_INPUT_DEVICE_TOUCH_UPDATE
254 if (dev->device_use == XCB_INPUT_DEVICE_USE_IS_X_EXTENSION_DEVICE)
256 DBG("Device %d", dev->device_id);
257 DBG("\tType: %d", dev->device_type);
258 DBG("\tNum Classes: %d", dev->num_class_info);
259 DBG("\tUse: %d", dev->device_use);
261 xcb_input_select_extension_event(_ecore_xcb_conn, win,
262 sizeof(iclass) / sizeof(xcb_input_event_class_t),
266 xcb_input_device_info_next(&diter);