2 #include "e_input_private.h"
4 #include "e_keyrouter_private.h"
5 #include "e_input_event.h"
6 #include "e_devicemgr.h"
10 #define G_LIST_GET_DATA(list) ((list) ? (((GList *)(list))->data) : NULL)
12 static void _device_modifiers_update(E_Input_Evdev *edev);
13 static void _device_configured_size_get(E_Input_Evdev *edev, int *x, int *y, int *w, int *h);
14 static void _device_output_assign(E_Input_Evdev *edev, E_Input_Seat_Capabilities cap);
17 _device_calibration_set(E_Input_Evdev *edev)
22 E_Comp_Config *comp_conf;
24 if (e_comp->e_comp_screen->num_outputs > 1) //multiple outputs
26 comp_conf = e_comp_config_get();
27 if (comp_conf && (comp_conf->input_output_assign_policy == 1)) //use output-assignment policy
29 _device_output_assign(edev, E_INPUT_SEAT_POINTER);
30 _device_output_assign(edev, E_INPUT_SEAT_TOUCH);
34 output = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
35 e_output_size_get(output, &w, &h);
39 edev->mouse.minx = edev->mouse.miny = 0;
43 if (libinput_device_has_capability(edev->device, LIBINPUT_DEVICE_CAP_POINTER))
45 edev->seat->ptr.dx = (double)(w / 2);
46 edev->seat->ptr.dy = (double)(h / 2);
47 edev->seat->ptr.ix = (int)edev->seat->ptr.dx;
48 edev->seat->ptr.iy = (int)edev->seat->ptr.dy;
49 edev->mouse.dx = edev->seat->ptr.dx;
50 edev->mouse.dy = edev->seat->ptr.dy;
52 if (output->config.rotation == 90 || output->config.rotation == 270)
54 temp = edev->mouse.minx;
55 edev->mouse.minx = edev->mouse.miny;
56 edev->mouse.miny = temp;
58 temp = edev->mouse.maxw;
59 edev->mouse.maxw = edev->mouse.maxh;
60 edev->mouse.maxh = temp;
66 #ifdef _F_E_INPUT_ENABLE_DEVICE_CALIBRATION_
72 if ((!libinput_device_config_calibration_has_matrix(edev->device)) ||
73 (libinput_device_config_calibration_get_default_matrix(edev->device, cal) != 0))
76 sysname = libinput_device_get_sysname(edev->device);
78 devices = eeze_udev_find_by_subsystem_sysname("input", sysname);
79 if (eina_list_count(devices) < 1) return;
81 #ifdef _F_E_INPUT_USE_WL_CALIBRATION_
83 enum libinput_config_status status;
85 EINA_LIST_FREE(devices, device)
87 vals = eeze_udev_syspath_get_property(device, "WL_CALIBRATION");
89 (sscanf(vals, "%f %f %f %f %f %f",
90 &cal[0], &cal[1], &cal[2], &cal[3], &cal[4], &cal[5]) != 6))
97 libinput_device_config_calibration_set_matrix(edev->device, cal);
99 if (status != LIBINPUT_CONFIG_STATUS_SUCCESS)
100 ERR("Failed to apply calibration");
103 eina_stringshare_del(device);
106 #endif//_F_E_INPUT_USE_WL_CALIBRATION_
107 #endif//_F_E_INPUT_ENABLE_DEVICE_CALIBRATION_
112 _device_output_assign(E_Input_Evdev *edev, E_Input_Seat_Capabilities cap)
117 Eina_Bool need_assign_output = EINA_FALSE;
118 const char *output_name;
121 if (!(edev->caps & cap)) return;
122 if (edev->output_name) return; //already assigned
123 if (e_comp->e_comp_screen->num_outputs <= 1) return;
125 last_output_idx = e_comp->e_comp_screen->num_outputs - 1;
126 EINA_LIST_FOREACH(edev->seat->devices, l, ed)
128 if (!(ed->caps & cap)) continue;
129 if (ed == edev) continue;
132 need_assign_output = EINA_FALSE;
135 need_assign_output = EINA_TRUE;
137 if (need_assign_output)
139 output = e_output_find_by_index(last_output_idx);
140 if (!output || !output->info.connected) return;
141 output_name = e_output_output_id_get(output);
142 if (output_name) edev->output_name = eina_stringshare_add(output_name);
143 ELOGF("E_INPUT_EVDEV", "Device is assigned to output:%s", NULL, output_name);
148 _device_touch_count_update(E_Input_Evdev *edev)
150 unsigned int device_touch_count = 0;
151 static unsigned int _max_device_touch_count = 0;
153 E_Input *ei = e_input_get();
154 EINA_SAFETY_ON_NULL_RETURN(ei);
156 device_touch_count = libinput_device_touch_get_touch_count(edev->device);
158 if (_max_device_touch_count < device_touch_count)
159 _max_device_touch_count = device_touch_count;
161 if (e_config->configured_max_touch.use)
163 if (_max_device_touch_count > 0 && e_config->configured_max_touch.count > _max_device_touch_count)
165 ELOGF("E_INPUT_EVDEV_TOUCH", "Touch max count(%d) must be less or equal to device's touch count(%d) !\nTouch max count has been shrinken to %d.\n",
166 NULL, e_config->configured_max_touch.count, _max_device_touch_count, _max_device_touch_count);
167 ei->touch_max_count = _max_device_touch_count;
171 if (ei->touch_max_count != e_config->configured_max_touch.count)
173 ELOGF("E_INPUT_EVDEV_TOUCH", "Touch_max_count has been updated to %d -> %d.\n",
174 NULL, ei->touch_max_count, e_config->configured_max_touch.count);
175 ei->touch_max_count = e_config->configured_max_touch.count;
181 if (ei->touch_max_count < _max_device_touch_count)
183 ELOGF("E_INPUT_EVDEV_TOUCH", "Touch_max_count has been updated to %d -> %d.\n", NULL,
184 ei->touch_max_count, _max_device_touch_count);
185 ei->touch_max_count = _max_device_touch_count;
189 ei->touch_device_count++;
190 ELOGF("E_INPUT_EVDEV_TOUCH", "Touch device count is %d.\n", NULL, ei->touch_device_count);
194 _device_configure(E_Input_Evdev *edev)
196 if (libinput_device_config_tap_get_finger_count(edev->device) > 0)
198 Eina_Bool tap = EINA_FALSE;
200 tap = libinput_device_config_tap_get_default_enabled(edev->device);
201 libinput_device_config_tap_set_enabled(edev->device, tap);
204 _device_calibration_set(edev);
208 _device_keyboard_setup(E_Input_Evdev *edev)
210 E_Input_Backend *input;
211 xkb_mod_index_t xkb_idx;
213 if ((!edev) || (!edev->seat)) return;
214 if (!(input = edev->seat->input)) return;
215 if (!input->dev->xkb_ctx) return;
217 g_mutex_init(&edev->xkb.keymap_mutex);
219 /* create keymap from xkb context */
220 g_mutex_lock(&edev->xkb.keymap_mutex);
221 edev->xkb.keymap = _e_input_device_cached_keymap_get(input->dev->xkb_ctx, NULL, 0);
222 if (!edev->xkb.keymap)
224 g_mutex_unlock(&edev->xkb.keymap_mutex);
225 ERR("Failed to create keymap: %m");
229 g_mutex_lock(&edev->xkb.state_mutex);
231 /* create xkb state */
232 if (!(edev->xkb.state = xkb_state_new(edev->xkb.keymap)))
234 g_mutex_unlock(&edev->xkb.state_mutex);
235 g_mutex_unlock(&edev->xkb.keymap_mutex);
236 ERR("Failed to create xkb state: %m");
240 g_mutex_unlock(&edev->xkb.state_mutex);
242 xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_MOD_NAME_CTRL);
243 if (xkb_idx != XKB_MOD_INVALID)
244 edev->xkb.ctrl_mask = 1 << xkb_idx;
246 edev->xkb.ctrl_mask = 0;
248 xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_MOD_NAME_ALT);
249 if (xkb_idx != XKB_MOD_INVALID)
250 edev->xkb.alt_mask = 1 << xkb_idx;
252 edev->xkb.alt_mask = 0;
254 xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_MOD_NAME_SHIFT);
255 if (xkb_idx != XKB_MOD_INVALID)
256 edev->xkb.shift_mask = 1 << xkb_idx;
258 edev->xkb.shift_mask = 0;
260 xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_MOD_NAME_LOGO);
261 if (xkb_idx != XKB_MOD_INVALID)
262 edev->xkb.win_mask = 1 << xkb_idx;
264 edev->xkb.win_mask = 0;
266 xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_LED_NAME_SCROLL);
267 if (xkb_idx != XKB_MOD_INVALID)
268 edev->xkb.scroll_mask = 1 << xkb_idx;
270 edev->xkb.scroll_mask = 0;
272 xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_LED_NAME_NUM);
273 if (xkb_idx != XKB_MOD_INVALID)
274 edev->xkb.num_mask = 1 << xkb_idx;
276 edev->xkb.num_mask = 0;
278 xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_MOD_NAME_CAPS);
279 if (xkb_idx != XKB_MOD_INVALID)
280 edev->xkb.caps_mask = 1 << xkb_idx;
282 edev->xkb.caps_mask = 0;
284 xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, "ISO_Level3_Shift");
285 if (xkb_idx != XKB_MOD_INVALID)
286 edev->xkb.altgr_mask = 1 << xkb_idx;
288 edev->xkb.altgr_mask = 0;
290 g_mutex_unlock(&edev->xkb.keymap_mutex);
294 _device_keysym_translate(xkb_keysym_t keysym, unsigned int modifiers, char *buffer, int bytes)
296 unsigned long hbytes = 0;
299 if (!keysym) return 0;
300 hbytes = (keysym >> 8);
305 (((keysym >= XKB_KEY_BackSpace) && (keysym <= XKB_KEY_Clear)) ||
306 (keysym == XKB_KEY_Return) || (keysym == XKB_KEY_Escape) ||
307 (keysym == XKB_KEY_KP_Space) || (keysym == XKB_KEY_KP_Tab) ||
308 (keysym == XKB_KEY_KP_Enter) ||
309 ((keysym >= XKB_KEY_KP_Multiply) && (keysym <= XKB_KEY_KP_9)) ||
310 (keysym == XKB_KEY_KP_Equal) || (keysym == XKB_KEY_Delete))))))
313 if (keysym == XKB_KEY_KP_Space)
314 c = (XKB_KEY_space & 0x7F);
315 else if (hbytes == 0xFF)
320 if (modifiers & ECORE_EVENT_MODIFIER_CTRL)
322 if (((c >= '@') && (c < '\177')) || c == ' ')
326 else if ((c >= '3') && (c <= '7'))
338 _device_modifiers_update_device(E_Input_Evdev *edev, E_Input_Evdev *from)
342 g_mutex_lock(&from->xkb.state_mutex);
344 edev->xkb.depressed =
345 xkb_state_serialize_mods(from->xkb.state, XKB_STATE_DEPRESSED);
347 xkb_state_serialize_mods(from->xkb.state, XKB_STATE_LATCHED);
349 xkb_state_serialize_mods(from->xkb.state, XKB_STATE_LOCKED);
351 xkb_state_serialize_mods(from->xkb.state, XKB_STATE_EFFECTIVE);
353 g_mutex_unlock(&from->xkb.state_mutex);
355 mask = (edev->xkb.depressed | edev->xkb.latched);
357 if (mask & from->xkb.ctrl_mask)
358 edev->xkb.modifiers |= ECORE_EVENT_MODIFIER_CTRL;
359 if (mask & from->xkb.alt_mask)
360 edev->xkb.modifiers |= ECORE_EVENT_MODIFIER_ALT;
361 if (mask & from->xkb.shift_mask)
362 edev->xkb.modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
363 if (mask & from->xkb.win_mask)
364 edev->xkb.modifiers |= ECORE_EVENT_MODIFIER_WIN;
365 if (mask & from->xkb.scroll_mask)
366 edev->xkb.modifiers |= ECORE_EVENT_LOCK_SCROLL;
367 if (mask & from->xkb.num_mask)
368 edev->xkb.modifiers |= ECORE_EVENT_LOCK_NUM;
369 if (mask & from->xkb.caps_mask)
370 edev->xkb.modifiers |= ECORE_EVENT_LOCK_CAPS;
371 if (mask & from->xkb.altgr_mask)
372 edev->xkb.modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
376 _device_modifiers_update(E_Input_Evdev *edev)
381 edev->xkb.modifiers = 0;
383 if (edev->caps & E_INPUT_SEAT_KEYBOARD)
384 _device_modifiers_update_device(edev, edev);
387 EINA_LIST_FOREACH(edev->seat->devices, l, ed)
389 if (!(ed->caps & E_INPUT_SEAT_KEYBOARD)) continue;
390 _device_modifiers_update_device(edev, ed);
397 _device_remapped_key_get(E_Input_Evdev *edev, int code)
401 EINA_SAFETY_ON_NULL_RETURN_VAL(edev, code);
402 if (!edev->key_remap_enabled) return code;
403 EINA_SAFETY_ON_NULL_RETURN_VAL(edev->key_remap_hash, code);
405 ret = eina_hash_find(edev->key_remap_hash, &code);
407 if (ret) code = (int)(intptr_t)ret;
413 e_input_evdev_get_e_device(const char *path, Ecore_Device_Class clas)
415 const GList *dev_list = NULL;
417 E_Device *dev = NULL;
418 const char *identifier;
420 if (!path) return NULL;
422 dev_list = e_device_list_get();
423 if (!dev_list) return NULL;
430 identifier = e_device_identifier_get(dev);
431 if (!identifier) continue;
432 if ((e_device_class_get(dev) == clas) && !(strcmp(identifier, path)))
441 EINTERN Ecore_Device *
442 e_input_evdev_get_ecore_device(const char *path, Ecore_Device_Class clas)
444 const Eina_List *dev_list = NULL;
446 Ecore_Device *dev = NULL;
447 const char *identifier;
449 if (!path) return NULL;
451 dev_list = ecore_device_list();
452 if (!dev_list) return NULL;
453 EINA_LIST_FOREACH(dev_list, l, dev)
456 identifier = ecore_device_identifier_get(dev);
457 if (!identifier) continue;
458 if ((ecore_device_class_get(dev) == clas) && !(strcmp(identifier, path)))
465 _e_input_event_mouse_move_cb_free(void *data EINA_UNUSED, void *event)
467 Ecore_Event_Mouse_Move *ev = event;
469 if (ev->dev) ecore_device_unref(ev->dev);
475 _e_input_event_mouse_relative_move_cb_free(void *data EINA_UNUSED, void *event)
477 Ecore_Event_Mouse_Relative_Move *ev = event;
479 if (ev->dev) ecore_device_unref(ev->dev);
485 _e_input_event_mouse_wheel_cb_free(void *data EINA_UNUSED, void *event)
487 Ecore_Event_Mouse_Wheel *ev = event;
489 if (ev->dev) ecore_device_unref(ev->dev);
495 _e_input_event_mouse_button_cb_free(void *data EINA_UNUSED, void *event)
497 Ecore_Event_Mouse_Button *ev = event;
499 if (ev->dev) ecore_device_unref(ev->dev);
505 _e_input_event_key_cb_free(void *data EINA_UNUSED, void *event)
507 Ecore_Event_Key *ev = event;
509 if (e_input_thread_mode_get())
511 if (ev->dev) g_object_unref(ev->dev);
515 if (ev->dev) ecore_device_unref(ev->dev);
518 if (ev->data) E_FREE(ev->data);
524 _device_handle_key(struct libinput_device *device, struct libinput_event_keyboard *event)
527 E_Input_Backend *input;
529 uint32_t code, nsyms;
530 const xkb_keysym_t *syms;
531 enum libinput_key_state state;
533 xkb_keysym_t sym = XKB_KEY_NoSymbol;
534 char key[256] = {0, }, keyname[256] = {0, }, compose_buffer[256] = {0, };
536 char *tmp = NULL, *compose = NULL;
537 E_Keyrouter_Event_Data *key_data;
538 Ecore_Device *ecore_dev = NULL, *data;
539 E_Device *e_dev = NULL, *e_dev_data;
540 Eina_List *l = NULL, *l_next = NULL;
542 E_Comp_Config *comp_conf = NULL;
543 int *pressed_keycode = NULL, *idata = NULL;
544 Eina_Bool dup_found = EINA_FALSE;
545 const char *device_name = NULL;
546 Ecore_Device_Subclass device_subclas = ECORE_DEVICE_SUBCLASS_NONE;
548 if (!(edev = libinput_device_get_user_data(device)))
553 if (!(input = edev->seat->input))
558 if (!e_input_thread_mode_get())
560 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
561 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
563 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
565 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_KEYBOARD)
574 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_KEYBOARD);
575 ecore_dev = edev->ecore_dev;
580 ERR("Failed to get source ecore device from event !\n");
584 device_name = ecore_device_name_get(ecore_dev);
585 device_subclas = ecore_device_subclass_get(ecore_dev);
589 if (edev->e_dev) e_dev = edev->e_dev;
590 else if (edev->e_dev_list && g_list_length(edev->e_dev_list) > 0)
592 glist = edev->e_dev_list;
595 e_dev_data = glist->data;
596 if (e_device_class_get(e_dev_data) == ECORE_DEVICE_CLASS_KEYBOARD)
602 glist = g_list_next(glist);
607 edev->e_dev = e_input_evdev_get_e_device(edev->path, ECORE_DEVICE_CLASS_KEYBOARD);
613 ERR("Failed to get source e device from event !\n");
617 device_name = e_device_name_get(e_dev);
618 device_subclas = e_device_subclass_get(e_dev);
621 timestamp = libinput_event_keyboard_get_time(event);
622 code = libinput_event_keyboard_get_key(event);
623 code = _device_remapped_key_get(edev, code + 8);
624 state = libinput_event_keyboard_get_key_state(event);
625 key_count = libinput_event_keyboard_get_seat_key_count(event);
627 if (state == LIBINPUT_KEY_STATE_PRESSED)
629 if ((edev->seat->dev->blocked & E_INPUT_SEAT_KEYBOARD) ||
630 (edev->seat->dev->server_blocked & E_INPUT_SEAT_KEYBOARD))
632 g_rec_mutex_lock(&edev->seat->dev->blocked_client_mutex);
633 ELOGF("Key", "Press (keycode: %d, device: %s) is blocked by %p, server: 0x%x", NULL,
634 code, device_name, edev->seat->dev->blocked_client,
635 edev->seat->dev->server_blocked);
636 g_rec_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
640 /* FIXME: Currently to maintain press/release event pair during input block,
641 * used Eina_List and this is method used in devicemgr module.
642 * But we need to consider which way is better to maintain key press/release pair.
645 EINA_LIST_FOREACH(edev->xkb.pressed_keys, l, idata)
649 dup_found = EINA_TRUE;
655 pressed_keycode = E_NEW(int, 1);
656 EINA_SAFETY_ON_NULL_RETURN(pressed_keycode);
657 *pressed_keycode = code;
659 edev->xkb.pressed_keys = eina_list_append(edev->xkb.pressed_keys, pressed_keycode);
664 dup_found = EINA_FALSE;
665 EINA_LIST_FOREACH_SAFE(edev->xkb.pressed_keys, l, l_next, idata)
669 edev->xkb.pressed_keys = eina_list_remove_list(edev->xkb.pressed_keys, l);
671 dup_found = EINA_TRUE;
677 g_rec_mutex_lock(&edev->seat->dev->blocked_client_mutex);
678 ELOGF("Key", "Release (keycode: %d, device: %s) is blocked by %p", NULL,
679 code, device_name, edev->seat->dev->blocked_client);
680 g_rec_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
685 /* ignore key events that are not seat wide state changes */
686 if (((state == LIBINPUT_KEY_STATE_PRESSED) && (key_count != 1)) ||
687 ((state == LIBINPUT_KEY_STATE_RELEASED) && (key_count != 0)))
692 e_input_keyboard_grab_key_cb func = e_input_keyboard_grab_key_handler_get();
695 if (e_devicemgr_keyboard_grab_subtype_is_grabbed(device_subclas))
697 if (!e_input_thread_mode_get())
698 func(code, state, timestamp, ecore_dev);
700 func(code, state, timestamp, e_dev);
705 g_mutex_lock(&edev->xkb.state_mutex);
706 xkb_state_update_key(edev->xkb.state, code,
707 (state ? XKB_KEY_DOWN : XKB_KEY_UP));
709 /* get the keysym for this code */
710 nsyms = xkb_key_get_syms(edev->xkb.state, code, &syms);
711 g_mutex_unlock(&edev->xkb.state_mutex);
713 if (nsyms == 1) sym = syms[0];
715 /* If no keysym was found, name it "Keycode-NNN" */
716 if (sym == XKB_KEY_NoSymbol)
717 snprintf(key, sizeof(key), "Keycode-%u", code);
720 /* get the keyname for this sym */
721 xkb_keysym_get_name(sym, key, sizeof(key));
726 /* If no keyname was found, name it "Keycode-NNN" */
727 snprintf(keyname, sizeof(keyname), "Keycode-%u", code);
731 memcpy(keyname, key, sizeof(keyname));
734 /* if shift is active, we need to transform the key to lower */
735 g_mutex_lock(&edev->xkb.keymap_mutex);
736 g_mutex_lock(&edev->xkb.state_mutex);
737 if (xkb_state_mod_index_is_active(edev->xkb.state,
738 xkb_map_mod_get_index(edev->xkb.keymap,
740 XKB_STATE_MODS_EFFECTIVE))
742 if (keyname[0] != '\0')
743 keyname[0] = tolower(keyname[0]);
745 g_mutex_unlock(&edev->xkb.keymap_mutex);
746 g_mutex_unlock(&edev->xkb.state_mutex);
748 if (_device_keysym_translate(sym, edev->xkb.modifiers,
749 compose_buffer, sizeof(compose_buffer)))
751 compose = eina_str_convert("ISO8859-1", "UTF-8", compose_buffer);
754 ERR("E Input cannot convert input key string '%s' to UTF-8. "
755 "Is Eina built with iconv support?", compose_buffer);
761 if (!compose) compose = compose_buffer;
763 e = calloc(1, sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
764 ((compose[0] != '\0') ? strlen(compose) : 0) + 3);
770 key_data = E_NEW(E_Keyrouter_Event_Data, 1);
778 e->keyname = (char *)(e + 1);
779 e->key = e->keyname + strlen(keyname) + 1;
780 e->compose = strlen(compose) ? e->key + strlen(key) + 1 : NULL;
781 e->string = e->compose;
783 strncpy((char *)e->keyname, keyname, strlen(keyname));
784 strncpy((char *)e->key, key, strlen(key));
785 if (strlen(compose)) strncpy((char *)e->compose, compose, strlen(compose));
787 e->window = (Ecore_Window)input->dev->window;
788 e->event_window = (Ecore_Window)input->dev->window;
789 e->root_window = (Ecore_Window)input->dev->window;
790 e->timestamp = timestamp;
795 _device_modifiers_update(edev);
797 e->modifiers = edev->xkb.modifiers;
799 comp_conf = e_comp_config_get();
801 if (comp_conf && comp_conf->input_log_enable)
802 ELOGF("Key", "%s (keyname: %s, keycode: %d, timestamp: %u, device: %s)", NULL, state?"Press":"Release", e->keyname, e->keycode, e->timestamp, device_name);
804 if (e_input_thread_mode_get())
806 e->dev = (Eo *)g_object_ref(e_dev);
807 e_input_event_add(input->event_source, state ? ECORE_EVENT_KEY_DOWN : ECORE_EVENT_KEY_UP, e, _e_input_event_key_cb_free, NULL);
811 e->dev = ecore_device_ref(ecore_dev);
812 ecore_event_add(state ? ECORE_EVENT_KEY_DOWN : ECORE_EVENT_KEY_UP, e, _e_input_event_key_cb_free, NULL);
819 _device_pointer_motion(E_Input_Evdev *edev, struct libinput_event_pointer *event)
821 E_Input_Backend *input;
822 Ecore_Event_Mouse_Move *ev;
823 Ecore_Device *ecore_dev = NULL, *data, *detent_data = NULL;
825 int x = 0, y = 0, w = 0, h = 0;
827 if (!(input = edev->seat->input)) return;
829 ecore_thread_main_loop_begin();
831 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
832 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
834 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
836 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_MOUSE)
841 else if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_NONE)
846 if (!ecore_dev && e_devicemgr_detent_is_detent(libinput_device_get_name(edev->device)))
848 ecore_dev = detent_data;
853 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_MOUSE);
854 ecore_dev = edev->ecore_dev;
859 ERR("Failed to get source ecore device from event !\n");
862 else if ((detent_data == ecore_dev) || e_devicemgr_detent_is_detent(ecore_device_name_get(ecore_dev)))
864 /* Do not process detent device's move events. */
868 if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Move)))) return;
870 _device_configured_size_get(edev, &x, &y, &w, &h);
872 if (edev->seat->ptr.ix < x)
873 edev->seat->ptr.dx = edev->seat->ptr.ix = x;
874 else if (edev->seat->ptr.ix >= (x + w))
875 edev->seat->ptr.dx = edev->seat->ptr.ix = (x + w - 1);
877 if (edev->seat->ptr.iy < y)
878 edev->seat->ptr.dy = edev->seat->ptr.iy = y;
879 else if (edev->seat->ptr.iy >= (y + h))
880 edev->seat->ptr.dy = edev->seat->ptr.iy = (y + h - 1);
882 edev->mouse.dx = edev->seat->ptr.dx;
883 edev->mouse.dy = edev->seat->ptr.dy;
885 ev->window = (Ecore_Window)input->dev->window;
886 ev->event_window = (Ecore_Window)input->dev->window;
887 ev->root_window = (Ecore_Window)input->dev->window;
888 if (event) ev->timestamp = libinput_event_pointer_get_time(event);
891 _device_modifiers_update(edev);
892 ev->modifiers = edev->xkb.modifiers;
894 ev->x = edev->seat->ptr.ix;
895 ev->y = edev->seat->ptr.iy;
899 ev->multi.device = edev->mt_slot;
900 ev->multi.radius = 1;
901 ev->multi.radius_x = 1;
902 ev->multi.radius_y = 1;
903 ev->multi.pressure = 1.0;
904 ev->multi.angle = 0.0;
907 ev->multi.root.x = ev->x;
908 ev->multi.root.y = ev->y;
910 ev->dev = ecore_device_ref(ecore_dev);
912 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, _e_input_event_mouse_move_cb_free, NULL);
915 ecore_thread_main_loop_end();
919 _e_input_pointer_motion_post(E_Input_Evdev *edev)
921 _device_pointer_motion(edev, NULL);
925 _device_pointer_relative_motion(E_Input_Evdev *edev, struct libinput_event_pointer *event, double dx[2], double dy[2])
927 E_Input_Backend *input;
928 Ecore_Event_Mouse_Relative_Move *ev;
929 Ecore_Device *ecore_dev = NULL, *data, *detent_data = NULL;
931 E_Comp_Config *comp_conf;
933 if (!(input = edev->seat->input)) return;
935 ecore_thread_main_loop_begin();
937 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
938 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
940 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
942 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_MOUSE)
947 else if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_NONE)
952 if (!ecore_dev && e_devicemgr_detent_is_detent(libinput_device_get_name(edev->device)))
954 ecore_dev = detent_data;
959 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_MOUSE);
960 ecore_dev = edev->ecore_dev;
965 ERR("Failed to get source ecore device from event !\n");
968 else if ((detent_data == ecore_dev) || e_devicemgr_detent_is_detent(ecore_device_name_get(ecore_dev)))
970 /* Do not process detent device's move events. */
974 if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Relative_Move)))) return;
976 ev->window = (Ecore_Window)input->dev->window;
977 ev->event_window = (Ecore_Window)input->dev->window;
978 if (event) ev->timestamp = libinput_event_pointer_get_time(event);
980 ev->modifiers = edev->xkb.modifiers;
984 ev->dx_unaccel = (int)dx[1];
985 ev->dy_unaccel = (int)dy[1];
987 ev->dev = ecore_device_ref(ecore_dev);
989 comp_conf = e_comp_config_get();
990 if (comp_conf && comp_conf->input_log_enable)
991 ELOGF("Mouse", "Relative Move (dx: %d, dy: %d, unaccel(%d, %d) device: %s)", NULL, ev->dx, ev->dx, ev->dx_unaccel, ev->dy_unaccel, ecore_device_name_get(ev->dev));
993 ecore_event_add(ECORE_EVENT_MOUSE_RELATIVE_MOVE, ev, _e_input_event_mouse_relative_move_cb_free, NULL);
996 ecore_thread_main_loop_end();
1000 _device_pointer_motion_send(E_Input_Evdev *edev, struct libinput_event_pointer *event, double dx[2], double dy[2])
1002 e_input_relative_motion_cb func = e_input_relative_motion_handler_get();
1005 //func(dx, dy, time_us);
1006 _device_pointer_relative_motion(edev, event, dx, dy);
1010 double seat_dx, seat_dy, temp;
1011 if (edev->disable_acceleration)
1022 if (edev->seat->ptr.swap)
1028 if (edev->seat->ptr.invert_x)
1030 if (edev->seat->ptr.invert_y)
1033 edev->seat->ptr.dx += seat_dx;
1034 edev->seat->ptr.dy += seat_dy;
1036 edev->mouse.dx = edev->seat->ptr.dx;
1037 edev->mouse.dy = edev->seat->ptr.dy;
1039 if (floor(edev->seat->ptr.dx) == edev->seat->ptr.ix &&
1040 floor(edev->seat->ptr.dy) == edev->seat->ptr.iy)
1045 edev->seat->ptr.ix = edev->seat->ptr.dx;
1046 edev->seat->ptr.iy = edev->seat->ptr.dy;
1048 if ((edev->seat->dev->blocked & E_INPUT_SEAT_POINTER) ||
1049 (edev->seat->dev->server_blocked & E_INPUT_SEAT_POINTER))
1054 _device_pointer_motion(edev, event);
1059 _device_handle_pointer_motion(struct libinput_device *device, struct libinput_event_pointer *event)
1061 E_Input_Evdev *edev;
1062 double delta_x[2]; /* delta_x[0] for accelerated, delta_x[1] for unaccelerated */
1063 double delta_y[2]; /* delta_y[0] for accelerated, delta_y[1] for unaccelerated */
1065 if (!(edev = libinput_device_get_user_data(device)))
1070 delta_x[0] = libinput_event_pointer_get_dx(event);
1071 delta_x[1] = libinput_event_pointer_get_dx_unaccelerated(event);
1072 delta_y[0] = libinput_event_pointer_get_dy(event);
1073 delta_y[1] = libinput_event_pointer_get_dy_unaccelerated(event);
1075 _device_pointer_motion_send(edev, event, &delta_x[0], &delta_y[0]);
1079 _device_handle_pointer_motion_absolute(struct libinput_device *device, struct libinput_event_pointer *event)
1081 E_Input_Evdev *edev;
1084 if (!(edev = libinput_device_get_user_data(device)))
1089 e_output_size_get(e_comp_screen_primary_output_get(e_comp->e_comp_screen), &w, &h);
1091 edev->mouse.dx = edev->seat->ptr.dx =
1092 libinput_event_pointer_get_absolute_x_transformed(event, w);
1093 edev->mouse.dy = edev->seat->ptr.dy =
1094 libinput_event_pointer_get_absolute_y_transformed(event, h);
1096 if (floor(edev->seat->ptr.dx) == edev->seat->ptr.ix &&
1097 floor(edev->seat->ptr.dy) == edev->seat->ptr.iy)
1102 edev->seat->ptr.ix = edev->seat->ptr.dx;
1103 edev->seat->ptr.iy = edev->seat->ptr.dy;
1105 if ((edev->seat->dev->blocked & E_INPUT_SEAT_POINTER) ||
1106 (edev->seat->dev->server_blocked & E_INPUT_SEAT_POINTER))
1111 _device_pointer_motion(edev, event);
1115 _device_handle_button(struct libinput_device *device, struct libinput_event_pointer *event)
1117 E_Input_Evdev *edev;
1118 E_Input_Backend *input;
1119 Ecore_Event_Mouse_Button *ev;
1120 enum libinput_button_state state;
1121 uint32_t button, timestamp;
1122 Ecore_Device *ecore_dev = NULL, *detent_data = NULL, *data;
1124 E_Comp_Config *comp_conf = NULL;
1126 if (!(edev = libinput_device_get_user_data(device)))
1130 if (!(input = edev->seat->input))
1135 ecore_thread_main_loop_begin();
1137 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
1138 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
1140 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
1142 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_MOUSE)
1147 else if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_NONE)
1152 if (!ecore_dev && e_devicemgr_detent_is_detent(libinput_device_get_name(edev->device)))
1154 ecore_dev = detent_data;
1159 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_MOUSE);
1160 ecore_dev = edev->ecore_dev;
1165 ERR("Failed to get source ecore device from event !\n");
1169 state = libinput_event_pointer_get_button_state(event);
1170 button = libinput_event_pointer_get_button(event);
1171 timestamp = libinput_event_pointer_get_time(event);
1173 button = ((button & 0x00F) + 1);
1174 if (button == 3) button = 2;
1175 else if (button == 2) button = 3;
1179 if ((edev->seat->dev->blocked & E_INPUT_SEAT_POINTER) ||
1180 (edev->seat->dev->server_blocked & E_INPUT_SEAT_POINTER))
1182 g_rec_mutex_lock(&edev->seat->dev->blocked_client_mutex);
1183 ELOGF("Mouse", "Button Press (btn: %d, device: %s) is blocked by %p, server: 0x%x", NULL,
1184 button, ecore_device_name_get(ecore_dev), edev->seat->dev->blocked_client,
1185 edev->seat->dev->server_blocked);
1186 g_rec_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
1191 edev->mouse.pressed_button |= (1 << button);
1196 if (!(edev->mouse.pressed_button & (1 << button)))
1198 g_rec_mutex_lock(&edev->seat->dev->blocked_client_mutex);
1199 ELOGF("Mouse", "Button Release (btn: %d, device: %s) is blocked by %p, server: 0x%x", NULL,
1200 button, ecore_device_name_get(ecore_dev), edev->seat->dev->blocked_client,
1201 edev->seat->dev->server_blocked);
1202 g_rec_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
1205 edev->mouse.pressed_button &= ~(1 << button);
1208 if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Button))))
1213 ev->window = (Ecore_Window)input->dev->window;
1214 ev->event_window = (Ecore_Window)input->dev->window;
1215 ev->root_window = (Ecore_Window)input->dev->window;
1216 ev->timestamp = timestamp;
1217 ev->same_screen = 1;
1219 _device_modifiers_update(edev);
1220 ev->modifiers = edev->xkb.modifiers;
1222 ev->x = edev->seat->ptr.ix;
1223 ev->y = edev->seat->ptr.iy;
1227 ev->multi.device = edev->mt_slot;
1228 ev->multi.radius = 1;
1229 ev->multi.radius_x = 1;
1230 ev->multi.radius_y = 1;
1231 ev->multi.pressure = 1.0;
1232 ev->multi.angle = 0.0;
1233 ev->multi.x = ev->x;
1234 ev->multi.y = ev->y;
1235 ev->multi.root.x = ev->x;
1236 ev->multi.root.y = ev->y;
1237 ev->dev = ecore_device_ref(ecore_dev);
1241 unsigned int current;
1243 current = timestamp;
1244 edev->mouse.did_double = EINA_FALSE;
1245 edev->mouse.did_triple = EINA_FALSE;
1247 if (((current - edev->mouse.prev) <= edev->mouse.threshold) &&
1248 (button == edev->mouse.prev_button))
1250 edev->mouse.did_double = EINA_TRUE;
1251 if (((current - edev->mouse.last) <= (2 * edev->mouse.threshold)) &&
1252 (button == edev->mouse.last_button))
1254 edev->mouse.did_triple = EINA_TRUE;
1255 edev->mouse.prev = 0;
1256 edev->mouse.last = 0;
1261 edev->mouse.last = edev->mouse.prev;
1262 edev->mouse.prev = current;
1263 edev->mouse.last_button = edev->mouse.prev_button;
1264 edev->mouse.prev_button = button;
1267 ev->buttons = button;
1269 if (edev->mouse.did_double)
1270 ev->double_click = 1;
1271 if (edev->mouse.did_triple)
1272 ev->triple_click = 1;
1274 comp_conf = e_comp_config_get();
1275 if (comp_conf && comp_conf->input_log_enable)
1276 ELOGF("Mouse", "Button %s (btn: %d, device: %s)", NULL, state?"Press":"Release", button, ecore_device_name_get(ev->dev));
1279 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, _e_input_event_mouse_button_cb_free, NULL);
1281 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, _e_input_event_mouse_button_cb_free, NULL);
1284 ecore_thread_main_loop_end();
1287 #if !LIBINPUT_HAVE_SCROLL_VALUE_V120
1289 _axis_value_get(struct libinput_event_pointer *pointer_event, enum libinput_pointer_axis axis)
1291 enum libinput_pointer_axis_source source;
1292 double value = 0.0, value_discrete = 0.0;
1294 E_Comp_Config *comp_conf = NULL;
1296 comp_conf = e_comp_config_get();
1297 source = libinput_event_pointer_get_axis_source(pointer_event);
1300 case LIBINPUT_POINTER_AXIS_SOURCE_WHEEL:
1301 value_discrete = libinput_event_pointer_get_axis_value_discrete(pointer_event, axis);
1302 value = libinput_event_pointer_get_axis_value(pointer_event, axis);
1303 if (comp_conf && comp_conf->input_log_enable)
1305 ELOGF("Axis", "SOURCE_WHEEL discrete: %lf (cf. value: %lf)", NULL, value_discrete, value);
1307 ret = (int)value_discrete;
1309 case LIBINPUT_POINTER_AXIS_SOURCE_FINGER:
1310 case LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS:
1311 value = libinput_event_pointer_get_axis_value(pointer_event, axis);
1312 if (comp_conf && comp_conf->input_log_enable)
1314 ELOGF("Axis", "SOURCE_FINGER/CONTINUOUS value: %lf", NULL, value);
1316 if (value >= E_INPUT_FINGER_SCROLL_THRESHOLD)
1318 else if (value <= E_INPUT_FINGER_SCROLL_THRESHOLD * (-1))
1331 _device_handle_axis(struct libinput_device *device, struct libinput_event_pointer *event)
1333 E_Input_Evdev *edev;
1334 E_Input_Backend *input;
1335 Ecore_Event_Mouse_Wheel *ev;
1337 enum libinput_pointer_axis axis;
1338 Ecore_Device *ecore_dev = NULL, *detent_data = NULL, *data;
1340 E_Comp_Config *comp_conf = NULL;
1341 int direction = 0, z = 0;
1343 if (!(edev = libinput_device_get_user_data(device)))
1347 if (!(input = edev->seat->input))
1352 ecore_thread_main_loop_begin();
1354 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
1355 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
1357 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
1359 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_MOUSE)
1364 else if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_NONE)
1369 if (!ecore_dev && e_devicemgr_detent_is_detent(libinput_device_get_name(edev->device)))
1371 ecore_dev = detent_data;
1376 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_MOUSE);
1377 ecore_dev = edev->ecore_dev;
1382 ERR("Failed to get source ecore device from event !\n");
1386 axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
1387 if (libinput_event_pointer_has_axis(event, axis))
1388 z = _axis_value_get(event, axis);
1390 axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
1391 if (libinput_event_pointer_has_axis(event, axis))
1394 z = _axis_value_get(event, axis);
1399 ELOGF("Mouse", "Axis event is ignored since it has zero value", NULL);
1403 comp_conf = e_comp_config_get();
1404 if (comp_conf && comp_conf->e_wheel_click_angle)
1406 z = (int)(z * comp_conf->e_wheel_click_angle);
1409 if ((edev->seat->dev->blocked & E_INPUT_SEAT_POINTER) ||
1410 (edev->seat->dev->server_blocked & E_INPUT_SEAT_POINTER))
1412 g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
1415 ELOGF("Mouse", "Detent (direction: %d, value: %d) is blocked by %p, server: 0x%x", NULL,
1416 direction, z, edev->seat->dev->blocked_client, edev->seat->dev->server_blocked);
1418 ELOGF("Mouse", "Wheel (direction: %d, value: %d) is blocked by %p, server: 0x%x", NULL,
1419 direction, z, edev->seat->dev->blocked_client, edev->seat->dev->server_blocked);
1421 g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
1425 if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Wheel))))
1430 timestamp = libinput_event_pointer_get_time(event);
1432 ev->window = (Ecore_Window)input->dev->window;
1433 ev->event_window = (Ecore_Window)input->dev->window;
1434 ev->root_window = (Ecore_Window)input->dev->window;
1435 ev->timestamp = timestamp;
1436 ev->same_screen = 1;
1438 _device_modifiers_update(edev);
1439 ev->modifiers = edev->xkb.modifiers;
1441 ev->x = edev->seat->ptr.ix;
1442 ev->y = edev->seat->ptr.iy;
1446 ev->direction = direction;
1448 if (comp_conf && comp_conf->input_log_enable)
1451 ELOGF("Mouse", "Detent (direction: %d, value: %d)", NULL, ev->direction, ev->z);
1453 ELOGF("Mouse", "Wheel (direction: %d, value: %d)", NULL, ev->direction, ev->z);
1457 ev->dev = ecore_device_ref(ecore_dev);
1458 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, ev, _e_input_event_mouse_wheel_cb_free, NULL);
1461 ecore_thread_main_loop_end();
1465 #if LIBINPUT_HAVE_SCROLL_VALUE_V120
1467 _scroll_value_get(struct libinput_event_pointer *pointer_event, enum libinput_pointer_axis axis, E_Input_Axis_Source source)
1470 double value_v120 = 0.0;
1472 E_Comp_Config *comp_conf = NULL;
1474 comp_conf = e_comp_config_get();
1477 case E_INPUT_AXIS_SOURCE_WHEEL:
1478 value_v120 = libinput_event_pointer_get_scroll_value_v120(pointer_event, axis);
1479 value = libinput_event_pointer_get_scroll_value(pointer_event, axis);
1480 if (comp_conf && comp_conf->input_log_enable)
1482 ELOGF("Scroll", "SOURCE_WHEEL value_v120: %lf (cf. value: %lf)", NULL, value_v120, value);
1484 if (((int)value_v120 % E_INPUT_POINTER_AXIS_DISCRETE_STEP) != 0)
1486 ERR("Wheel movements should be multiples (or fractions) of 120!\n");
1491 ret = value_v120 / E_INPUT_POINTER_AXIS_DISCRETE_STEP;
1494 case E_INPUT_AXIS_SOURCE_FINGER:
1495 case E_INPUT_AXIS_SOURCE_CONTINUOUS:
1496 value = libinput_event_pointer_get_scroll_value(pointer_event, axis);
1497 if (comp_conf && comp_conf->input_log_enable)
1499 ELOGF("Scroll", "SOURCE_FINGER/CONTINUOUS value: %lf", NULL, value);
1501 if (value >= E_INPUT_FINGER_SCROLL_THRESHOLD)
1503 else if (value <= E_INPUT_FINGER_SCROLL_THRESHOLD * (-1))
1516 _device_handle_axis_v120(struct libinput_device *device, struct libinput_event_pointer *event, E_Input_Axis_Source source)
1518 E_Input_Evdev *edev;
1519 E_Input_Backend *input;
1520 Ecore_Event_Mouse_Wheel *ev;
1522 enum libinput_pointer_axis axis;
1523 Ecore_Device *ecore_dev = NULL, *detent_data = NULL, *data;
1525 E_Comp_Config *comp_conf = NULL;
1526 int direction = 0, z = 0;
1528 if (!(edev = libinput_device_get_user_data(device)))
1532 if (!(input = edev->seat->input))
1537 ecore_thread_main_loop_begin();
1539 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
1540 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
1542 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
1544 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_MOUSE)
1549 else if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_NONE)
1554 if (!ecore_dev && e_devicemgr_detent_is_detent(libinput_device_get_name(edev->device)))
1556 ecore_dev = detent_data;
1561 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_MOUSE);
1562 ecore_dev = edev->ecore_dev;
1567 ERR("Failed to get source ecore device from event !\n");
1571 axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
1572 if (libinput_event_pointer_has_axis(event, axis))
1573 z = _scroll_value_get(event, axis, source);
1575 axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
1576 if (libinput_event_pointer_has_axis(event, axis))
1579 z = _scroll_value_get(event, axis, source);
1584 ELOGF("Mouse", "Scroll event is ignored since it has zero value", NULL);
1588 comp_conf = e_comp_config_get();
1589 if (comp_conf && comp_conf->e_wheel_click_angle)
1591 z = (int)(z * comp_conf->e_wheel_click_angle);
1594 if ((edev->seat->dev->blocked & E_INPUT_SEAT_POINTER) ||
1595 (edev->seat->dev->server_blocked & E_INPUT_SEAT_POINTER))
1597 g_rec_mutex_lock(&edev->seat->dev->blocked_client_mutex);
1599 ELOGF("Mouse", "Detent (direction: %d, value: %d) is blocked by %p, server: 0x%x", NULL,
1600 direction, z, edev->seat->dev->blocked_client, edev->seat->dev->server_blocked);
1602 ELOGF("Mouse", "Wheel (direction: %d, value: %d) is blocked by %p, server: 0x%x", NULL,
1603 direction, z, edev->seat->dev->blocked_client, edev->seat->dev->server_blocked);
1605 g_rec_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
1609 if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Wheel))))
1614 timestamp = libinput_event_pointer_get_time(event);
1616 ev->window = (Ecore_Window)input->dev->window;
1617 ev->event_window = (Ecore_Window)input->dev->window;
1618 ev->root_window = (Ecore_Window)input->dev->window;
1619 ev->timestamp = timestamp;
1620 ev->same_screen = 1;
1622 _device_modifiers_update(edev);
1623 ev->modifiers = edev->xkb.modifiers;
1625 ev->x = edev->seat->ptr.ix;
1626 ev->y = edev->seat->ptr.iy;
1630 ev->direction = direction;
1632 if (comp_conf && comp_conf->input_log_enable)
1635 ELOGF("Mouse", "Detent (direction: %d, value: %d)", NULL, ev->direction, ev->z);
1637 ELOGF("Mouse", "Wheel (direction: %d, value: %d)", NULL, ev->direction, ev->z);
1640 ev->dev = ecore_device_ref(ecore_dev);
1641 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, ev, _e_input_event_mouse_wheel_cb_free, NULL);
1644 ecore_thread_main_loop_end();
1649 _device_handle_touch_event_send(E_Input_Evdev *edev, struct libinput_event_touch *event, int state)
1651 E_Input_Backend *input;
1652 Ecore_Event_Mouse_Button *ev;
1653 uint32_t timestamp, button = 0;
1654 Ecore_Device *ecore_dev = NULL, *data;
1658 if (!(input = edev->seat->input)) return;
1660 ecore_thread_main_loop_begin();
1662 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
1663 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
1665 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
1667 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_TOUCH)
1676 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_TOUCH);
1677 ecore_dev = edev->ecore_dev;
1682 ERR("Failed to get source ecore device from event !\n");
1686 if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Button)))) goto end;
1688 timestamp = libinput_event_touch_get_time(event);
1690 ev->window = (Ecore_Window)input->dev->window;
1691 ev->event_window = (Ecore_Window)input->dev->window;
1692 ev->root_window = (Ecore_Window)input->dev->window;
1693 ev->timestamp = timestamp;
1694 ev->same_screen = 1;
1696 _device_modifiers_update(edev);
1697 ev->modifiers = edev->xkb.modifiers;
1699 ev->x = edev->seat->ptr.ix;
1700 ev->y = edev->seat->ptr.iy;
1704 ev->multi.device = edev->mt_slot;
1705 ev->multi.radius = 1;
1706 ev->multi.radius_x = 1;
1707 ev->multi.radius_y = 1;
1708 ev->multi.pressure = 1.0;
1709 ev->multi.angle = 0.0;
1710 #if LIBINPUT_SUPPORT_EXTRA_TOUCH_EVENT
1711 if (libinput_event_get_type(libinput_event_touch_get_base_event(event))
1712 == LIBINPUT_EVENT_TOUCH_DOWN)
1714 if (libinput_event_touch_has_minor(event))
1715 ev->multi.radius_x = libinput_event_touch_get_minor(event);
1716 if (libinput_event_touch_has_major(event))
1717 ev->multi.radius_y = libinput_event_touch_get_major(event);
1718 if (libinput_event_touch_has_pressure(event))
1719 ev->multi.pressure = libinput_event_touch_get_pressure(event);
1720 if (libinput_event_touch_has_orientation(event))
1721 ev->multi.angle = libinput_event_touch_get_orientation(event);
1724 ev->multi.x = ev->x;
1725 ev->multi.y = ev->y;
1726 ev->multi.root.x = ev->x;
1727 ev->multi.root.y = ev->y;
1728 ev->dev = ecore_device_ref(ecore_dev);
1730 if (state == ECORE_EVENT_MOUSE_BUTTON_DOWN)
1732 unsigned int current;
1734 current = timestamp;
1735 edev->mouse.did_double = EINA_FALSE;
1736 edev->mouse.did_triple = EINA_FALSE;
1738 if (((current - edev->mouse.prev) <= edev->mouse.threshold) &&
1739 (button == edev->mouse.prev_button))
1741 edev->mouse.did_double = EINA_TRUE;
1742 if (((current - edev->mouse.last) <= (2 * edev->mouse.threshold)) &&
1743 (button == edev->mouse.last_button))
1745 edev->mouse.did_triple = EINA_TRUE;
1746 edev->mouse.prev = 0;
1747 edev->mouse.last = 0;
1752 edev->mouse.last = edev->mouse.prev;
1753 edev->mouse.prev = current;
1754 edev->mouse.last_button = edev->mouse.prev_button;
1755 edev->mouse.prev_button = button;
1756 edev->touch.pressed |= (1 << ev->multi.device);
1760 edev->touch.pressed &= ~(1 << ev->multi.device);
1763 ev->buttons = ((button & 0x00F) + 1);
1765 if (edev->mouse.did_double)
1766 ev->double_click = 1;
1767 if (edev->mouse.did_triple)
1768 ev->triple_click = 1;
1770 ecore_event_add(state, ev, _e_input_event_mouse_button_cb_free, NULL);
1773 ecore_thread_main_loop_end();
1777 _device_handle_touch_motion_send(E_Input_Evdev *edev, struct libinput_event_touch *event)
1779 E_Input_Backend *input;
1780 Ecore_Event_Mouse_Move *ev;
1781 Ecore_Device *ecore_dev = NULL, *data;
1785 if (!(input = edev->seat->input)) return;
1787 ecore_thread_main_loop_begin();
1789 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
1790 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
1792 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
1794 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_TOUCH)
1803 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_TOUCH);
1804 ecore_dev = edev->ecore_dev;
1809 ERR("Failed to get source ecore device from event !\n");
1813 if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Move)))) goto end;
1815 ev->window = (Ecore_Window)input->dev->window;
1816 ev->event_window = (Ecore_Window)input->dev->window;
1817 ev->root_window = (Ecore_Window)input->dev->window;
1818 ev->timestamp = libinput_event_touch_get_time(event);
1819 ev->same_screen = 1;
1821 _device_modifiers_update(edev);
1822 ev->modifiers = edev->xkb.modifiers;
1824 ev->x = edev->seat->ptr.ix;
1825 ev->y = edev->seat->ptr.iy;
1829 ev->multi.device = edev->mt_slot;
1830 ev->multi.radius = 1;
1831 ev->multi.radius_x = 1;
1832 ev->multi.radius_y = 1;
1833 ev->multi.pressure = 1.0;
1834 ev->multi.angle = 0.0;
1835 #if LIBINPUT_SUPPORT_EXTRA_TOUCH_EVENT
1836 if (libinput_event_touch_has_minor(event))
1837 ev->multi.radius_x = libinput_event_touch_get_minor(event);
1838 if (libinput_event_touch_has_major(event))
1839 ev->multi.radius_y = libinput_event_touch_get_major(event);
1840 if (libinput_event_touch_has_pressure(event))
1841 ev->multi.pressure = libinput_event_touch_get_pressure(event);
1842 if (libinput_event_touch_has_orientation(event))
1843 ev->multi.angle = libinput_event_touch_get_orientation(event);
1845 ev->multi.x = ev->x;
1846 ev->multi.y = ev->y;
1847 ev->multi.root.x = ev->x;
1848 ev->multi.root.y = ev->y;
1849 ev->dev = ecore_device_ref(ecore_dev);
1851 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, _e_input_event_mouse_move_cb_free, NULL);
1854 ecore_thread_main_loop_end();
1858 _device_handle_touch_cancel_send(E_Input_Evdev *edev, struct libinput_event_touch *event)
1860 E_Input_Backend *input;
1861 Ecore_Event_Mouse_Button *ev;
1862 uint32_t timestamp, button = 0;
1863 Ecore_Device *ecore_dev = NULL, *data;
1867 if (!(input = edev->seat->input)) return;
1869 ecore_thread_main_loop_begin();
1871 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
1872 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
1874 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
1876 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_TOUCH)
1885 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_TOUCH);
1886 ecore_dev = edev->ecore_dev;
1891 ERR("Failed to get source ecore device from event !\n");
1895 if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Button)))) goto end;
1897 timestamp = libinput_event_touch_get_time(event);
1899 ev->window = (Ecore_Window)input->dev->window;
1900 ev->event_window = (Ecore_Window)input->dev->window;
1901 ev->root_window = (Ecore_Window)input->dev->window;
1902 ev->timestamp = timestamp;
1903 ev->same_screen = 1;
1905 ev->x = edev->seat->ptr.ix;
1906 ev->y = edev->seat->ptr.iy;
1910 ev->multi.device = edev->mt_slot;
1911 ev->multi.radius = 1;
1912 ev->multi.radius_x = 1;
1913 ev->multi.radius_y = 1;
1914 ev->multi.pressure = 1.0;
1915 ev->multi.angle = 0.0;
1916 ev->multi.x = ev->x;
1917 ev->multi.y = ev->y;
1918 ev->multi.root.x = ev->x;
1919 ev->multi.root.y = ev->y;
1921 edev->touch.pressed &= ~(1 << ev->multi.device);
1923 ev->buttons = ((button & 0x00F) + 1);
1924 ev->dev = ecore_device_ref(ecore_dev);
1926 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_CANCEL, ev, _e_input_event_mouse_button_cb_free, NULL);
1929 ecore_thread_main_loop_end();
1933 _device_configured_size_get(E_Input_Evdev *edev, int *x, int *y, int *w, int *h)
1935 E_Output *output = NULL;
1937 EINA_SAFETY_ON_NULL_RETURN(edev);
1939 if (!edev->output_configured)
1941 if (edev->output_name)
1943 output = e_output_find(edev->output_name);
1946 edev->mouse.minx = output->config.geom.x;
1947 edev->mouse.miny = output->config.geom.y;
1948 edev->mouse.maxw = output->config.geom.w;
1949 edev->mouse.maxh = output->config.geom.h;
1950 if (libinput_device_has_capability(edev->device, LIBINPUT_DEVICE_CAP_POINTER))
1952 edev->seat->ptr.dx = (double)(edev->mouse.maxw / 2);
1953 edev->seat->ptr.dy = (double)(edev->mouse.maxh / 2);
1954 edev->seat->ptr.ix = (int)edev->seat->ptr.dx;
1955 edev->seat->ptr.iy = (int)edev->seat->ptr.dy;
1956 edev->mouse.dx = edev->seat->ptr.dx;
1957 edev->mouse.dy = edev->seat->ptr.dy;
1962 edev->output_configured = EINA_TRUE;
1963 ELOGF("E_INPUT_EVDEV", "Device is configured by output x:%d,y:%d (w:%d, h:%d)",
1964 NULL, edev->mouse.minx, edev->mouse.miny, edev->mouse.maxw, edev->mouse.maxh);
1966 if (x) *x = edev->mouse.minx;
1967 if (y) *y = edev->mouse.miny;
1968 if (w) *w = edev->mouse.maxw;
1969 if (h) *h = edev->mouse.maxh;
1973 _device_handle_touch_down(struct libinput_device *device, struct libinput_event_touch *event)
1975 E_Input_Evdev *edev;
1976 int x = 0, y = 0, w = 0, h = 0;
1977 E_Comp_Config *comp_conf = NULL;
1979 if (!(edev = libinput_device_get_user_data(device)))
1984 _device_configured_size_get(edev, &x, &y, &w, &h);
1986 edev->mouse.dx = edev->seat->ptr.ix = edev->seat->ptr.dx =
1987 x + libinput_event_touch_get_x_transformed(event, w);
1988 edev->mouse.dy = edev->seat->ptr.iy = edev->seat->ptr.dy =
1989 y + libinput_event_touch_get_y_transformed(event, h);
1991 edev->mt_slot = libinput_event_touch_get_slot(event);
1992 if (edev->mt_slot < 0)
1994 /* FIXME: The single touch device return slot id -1
1995 * But currently we have no API to distinguish multi touch or single touch
1996 * After libinput 1.11 version, libinput provides get_touch_count API,
1997 * so we can distinguish multi touch device or single touch device.
1999 if (edev->mt_slot == -1)
2003 WRN("%d slot touch down events are not supported\n", edev->mt_slot);
2008 if (edev->mt_slot < e_input_touch_max_count_get())
2010 edev->touch.coords[edev->mt_slot].x = edev->seat->ptr.ix;
2011 edev->touch.coords[edev->mt_slot].y = edev->seat->ptr.iy;
2014 comp_conf = e_comp_config_get();
2015 if (comp_conf && comp_conf->input_log_enable)
2016 ELOGF("Touch", "Down (id: %d, x: %d, y: %d)", NULL, edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy);
2018 g_rec_mutex_lock(&edev->touch.raw_pressed_mutex);
2019 edev->touch.raw_pressed |= (1 << edev->mt_slot);
2020 g_rec_mutex_unlock(&edev->touch.raw_pressed_mutex);
2022 g_rec_mutex_lock(&edev->touch.blocked_mutex);
2023 if (edev->touch.blocked)
2025 g_rec_mutex_lock(&edev->seat->dev->blocked_client_mutex);
2026 ELOGF("Touch", "Down (id: %d, x: %d, y: %d) is blocked by %p, server: 0x%x", NULL,
2027 edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy, edev->seat->dev->blocked_client,
2028 edev->seat->dev->server_blocked);
2029 g_rec_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
2030 g_rec_mutex_unlock(&edev->touch.blocked_mutex);
2034 g_rec_mutex_unlock(&edev->touch.blocked_mutex);
2036 _device_handle_touch_motion_send(edev, event);
2037 _device_handle_touch_event_send(edev, event, ECORE_EVENT_MOUSE_BUTTON_DOWN);
2041 _device_handle_touch_motion(struct libinput_device *device, struct libinput_event_touch *event)
2043 E_Input_Evdev *edev;
2044 int x = 0, y = 0, w = 0, h = 0;
2046 if (!(edev = libinput_device_get_user_data(device)))
2051 _device_configured_size_get(edev, &x, &y, &w, &h);
2053 edev->mouse.dx = edev->seat->ptr.dx =
2054 x + libinput_event_touch_get_x_transformed(event, w);
2055 edev->mouse.dy = edev->seat->ptr.dy =
2056 y + libinput_event_touch_get_y_transformed(event, h);
2058 if (floor(edev->seat->ptr.dx) == edev->seat->ptr.ix &&
2059 floor(edev->seat->ptr.dy) == edev->seat->ptr.iy)
2064 edev->seat->ptr.ix = edev->seat->ptr.dx;
2065 edev->seat->ptr.iy = edev->seat->ptr.dy;
2067 edev->mt_slot = libinput_event_touch_get_slot(event);
2068 if (edev->mt_slot < 0)
2070 /* FIXME: The single touch device return slot id -1
2071 * But currently we have no API to distinguish multi touch or single touch
2072 * After libinput 1.11 version, libinput provides get_touch_count API,
2073 * so we can distinguish multi touch device or single touch device.
2075 if (edev->mt_slot == -1)
2079 WRN("%d slot touch motion events are not supported\n", edev->mt_slot);
2084 if (edev->mt_slot < e_input_touch_max_count_get())
2086 edev->touch.coords[edev->mt_slot].x = edev->seat->ptr.ix;
2087 edev->touch.coords[edev->mt_slot].y = edev->seat->ptr.iy;
2090 if (!(edev->touch.pressed & (1 << edev->mt_slot)))
2092 g_rec_mutex_lock(&edev->touch.blocked_mutex);
2093 if (edev->touch.blocked)
2095 g_rec_mutex_unlock(&edev->touch.blocked_mutex);
2098 g_rec_mutex_unlock(&edev->touch.blocked_mutex);
2101 _device_handle_touch_motion_send(edev, event);
2105 _device_handle_touch_up(struct libinput_device *device, struct libinput_event_touch *event)
2107 E_Input_Evdev *edev;
2108 E_Comp_Config *comp_conf = NULL;
2110 if (!(edev = libinput_device_get_user_data(device)))
2115 edev->mt_slot = libinput_event_touch_get_slot(event);
2116 if (edev->mt_slot < 0)
2118 /* FIXME: The single touch device return slot id -1
2119 * But currently we have no API to distinguish multi touch or single touch
2120 * After libinput 1.11 version, libinput provides get_touch_count API,
2121 * so we can distinguish multi touch device or single touch device.
2123 if (edev->mt_slot == -1)
2127 WRN("%d slot touch up events are not supported\n", edev->mt_slot);
2132 if (edev->mt_slot < e_input_touch_max_count_get())
2134 edev->mouse.dx = edev->seat->ptr.dx = edev->seat->ptr.ix =
2135 edev->touch.coords[edev->mt_slot].x;
2136 edev->mouse.dy = edev->seat->ptr.dy = edev->seat->ptr.iy =
2137 edev->touch.coords[edev->mt_slot].y;
2140 comp_conf = e_comp_config_get();
2141 if (comp_conf && comp_conf->input_log_enable)
2142 ELOGF("Touch", "Up (id: %d, x: %d, y: %d)", NULL, edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy);
2144 g_rec_mutex_lock(&edev->touch.raw_pressed_mutex);
2145 edev->touch.raw_pressed &= ~(1 << edev->mt_slot);
2146 g_rec_mutex_unlock(&edev->touch.raw_pressed_mutex);
2148 g_rec_mutex_lock(&edev->touch.blocked_mutex);
2149 if (edev->touch.blocked)
2151 if (!(edev->touch.pressed & (1 << edev->mt_slot)))
2153 g_rec_mutex_lock(&edev->seat->dev->blocked_client_mutex);
2154 ELOGF("Touch", "Up (id: %d, x: %d, y: %d) is blocked by %p, server(0x%x)", NULL,
2155 edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy, edev->seat->dev->blocked_client,
2156 edev->seat->dev->server_blocked);
2157 g_rec_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
2159 g_rec_mutex_lock(&edev->touch.raw_pressed_mutex);
2160 if (edev->touch.raw_pressed == 0x0)
2162 edev->touch.blocked = EINA_FALSE;
2164 g_rec_mutex_unlock(&edev->touch.raw_pressed_mutex);
2165 g_rec_mutex_unlock(&edev->touch.blocked_mutex);
2170 g_rec_mutex_unlock(&edev->touch.blocked_mutex);
2171 _device_handle_touch_event_send(edev, event, ECORE_EVENT_MOUSE_BUTTON_UP);
2175 _device_handle_touch_cancel(struct libinput_device *device, struct libinput_event_touch *event)
2177 E_Input_Evdev *edev;
2178 E_Comp_Config *comp_conf = NULL;
2180 if (!(edev = libinput_device_get_user_data(device)))
2185 edev->mt_slot = libinput_event_touch_get_slot(event);
2186 if (edev->mt_slot < 0)
2188 /* FIXME: The single touch device return slot id -1
2189 * But currently we have no API to distinguish multi touch or single touch
2190 * After libinput 1.11 version, libinput provides get_touch_count API,
2191 * so we can distinguish multi touch device or single touch device.
2193 if (edev->mt_slot == -1)
2197 WRN("%d slot touch up events are not supported\n", edev->mt_slot);
2202 comp_conf = e_comp_config_get();
2203 if (comp_conf && comp_conf->input_log_enable)
2204 ELOGF("Touch", "cancel (id: %d, x: %d, y: %d)", NULL, edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy);
2206 _device_handle_touch_cancel_send(edev, event);
2211 _device_handle_touch_frame(struct libinput_device *device EINA_UNUSED, struct libinput_event_touch *event EINA_UNUSED)
2213 /* DBG("Unhandled Touch Frame Event"); */
2217 _e_input_aux_data_event_free(void *user_data EINA_UNUSED, void *ev)
2219 Ecore_Event_Axis_Update *e = (Ecore_Event_Axis_Update *)ev;
2221 if (e->axis) free(e->axis);
2222 if (e->dev) ecore_device_unref(e->dev);
2228 _device_handle_touch_aux_data(struct libinput_device *device, struct libinput_event_touch_aux_data *event)
2230 E_Input_Evdev *edev;
2231 E_Input_Backend *input;
2232 Ecore_Event_Axis_Update *ev;
2234 Ecore_Device *ecore_dev = NULL, *data;
2236 E_Comp_Config *comp_conf;
2238 ecore_thread_main_loop_begin();
2240 if (libinput_event_touch_aux_data_get_type(event) != LIBINPUT_TOUCH_AUX_DATA_TYPE_PALM &&
2241 libinput_event_touch_aux_data_get_value(event) > 0)
2244 if (!(edev = libinput_device_get_user_data(device))) goto end;
2245 if (!(input = edev->seat->input)) goto end;
2247 if (edev->ecore_dev) ecore_dev = edev->ecore_dev;
2248 else if (edev->ecore_dev_list && eina_list_count(edev->ecore_dev_list) > 0)
2250 EINA_LIST_FOREACH(edev->ecore_dev_list, l, data)
2252 if (ecore_device_class_get(data) == ECORE_DEVICE_CLASS_TOUCH)
2261 edev->ecore_dev = e_input_evdev_get_ecore_device(edev->path, ECORE_DEVICE_CLASS_TOUCH);
2262 ecore_dev = edev->ecore_dev;
2267 ERR("Failed to get source ecore device from event !\n");
2271 if (!(ev = calloc(1, sizeof(Ecore_Event_Axis_Update)))) goto end;
2273 ev->window = (Ecore_Window)input->dev->window;
2274 ev->event_window = (Ecore_Window)input->dev->window;
2275 ev->root_window = (Ecore_Window)input->dev->window;
2276 ev->timestamp = libinput_event_touch_aux_data_get_time(event);
2278 axis = (Ecore_Axis *)calloc(1, sizeof(Ecore_Axis));
2281 axis->label = ECORE_AXIS_LABEL_TOUCH_PALM;
2282 axis->value = libinput_event_touch_aux_data_get_value(event);
2287 comp_conf = e_comp_config_get();
2288 if (comp_conf && comp_conf->input_log_enable)
2289 ELOGF("Touch", "Axis (label: %d, value: %lf)", NULL, axis?axis->label:-1, axis?axis->value:0.0);
2291 ev->dev = ecore_device_ref(ecore_dev);
2293 ecore_event_add(ECORE_EVENT_AXIS_UPDATE, ev, _e_input_aux_data_event_free, NULL);
2296 ecore_thread_main_loop_end();
2300 _e_input_evdev_device_create(E_Input_Seat *seat, struct libinput_device *device)
2302 E_Input_Evdev *edev;
2303 E_Input_Backend *b_input;
2304 const char *output_name;
2306 EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
2308 E_Input *e_input = e_input_get();
2310 /* try to allocate space for new evdev */
2311 if (!(edev = calloc(1, sizeof(E_Input_Evdev)))) return NULL;
2314 edev->device = device;
2315 edev->path = eina_stringshare_printf("%s/%s", e_input_base_dir_get(), libinput_device_get_sysname(device));
2317 g_rec_mutex_init(&edev->touch.raw_pressed_mutex);
2318 g_rec_mutex_init(&edev->touch.blocked_mutex);
2321 g_rec_mutex_lock(&e_input->libinput_mutex);
2323 if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD))
2325 edev->caps |= E_INPUT_SEAT_KEYBOARD;
2326 _device_keyboard_setup(edev);
2329 if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER))
2331 edev->caps |= E_INPUT_SEAT_POINTER;
2333 /* TODO: make this configurable */
2334 edev->mouse.threshold = 250;
2336 b_input = seat->input;
2337 if (b_input->left_handed == EINA_TRUE)
2339 if (libinput_device_config_left_handed_set(device, 1) !=
2340 LIBINPUT_CONFIG_STATUS_SUCCESS)
2342 WRN("Failed to set left hand mode about device: %s\n",
2343 libinput_device_get_name(device));
2348 if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH))
2351 edev->caps |= E_INPUT_SEAT_TOUCH;
2352 palm_code = libinput_device_touch_aux_data_get_code(LIBINPUT_TOUCH_AUX_DATA_TYPE_PALM);
2353 if (libinput_device_touch_has_aux_data(device, palm_code))
2355 libinput_device_touch_set_aux_data(device, palm_code);
2358 _device_touch_count_update(edev);
2360 edev->touch.coords = calloc(1, sizeof(E_Input_Coord)*e_input_touch_max_count_get());
2362 if (!edev->touch.coords)
2363 ERR("Failed to allocate memory for touch coords !\n");
2366 output_name = libinput_device_get_output_name(device);
2369 eina_stringshare_replace(&edev->output_name, output_name);
2370 ELOGF("E_INPUT_EVDEV", "Device has output_name:%s", NULL, output_name);
2373 libinput_device_set_user_data(device, edev);
2374 libinput_device_ref(device);
2376 /* configure device */
2377 _device_configure(edev);
2380 g_rec_mutex_unlock(&e_input->libinput_mutex);
2386 _e_input_evdev_device_destroy(E_Input_Evdev *edev)
2389 E_Input *e_input = e_input_get();
2391 EINA_SAFETY_ON_NULL_RETURN(edev);
2393 ecore_thread_main_loop_begin();
2395 if (edev->caps & E_INPUT_SEAT_KEYBOARD)
2397 g_mutex_lock(&edev->xkb.state_mutex);
2398 if (edev->xkb.state) xkb_state_unref(edev->xkb.state);
2399 g_mutex_unlock(&edev->xkb.state_mutex);
2401 g_mutex_lock(&edev->xkb.keymap_mutex);
2402 if (edev->xkb.keymap) xkb_map_unref(edev->xkb.keymap);
2403 g_mutex_unlock(&edev->xkb.keymap_mutex);
2406 if (edev->ecore_dev) ecore_device_del(edev->ecore_dev);
2407 if (edev->ecore_dev_list)
2408 EINA_LIST_FREE(edev->ecore_dev_list, dev)
2410 ecore_device_del(dev);
2413 if (edev->e_dev) g_object_unref(edev->e_dev);
2414 if (edev->e_dev_list)
2416 GList *glist = edev->e_dev_list;
2420 e_dev = glist->data;
2421 g_object_unref(e_dev);
2423 glist = g_list_next(glist);
2426 if (edev->path) eina_stringshare_del(edev->path);
2427 if (e_input) g_rec_mutex_lock(&e_input->libinput_mutex);
2428 if (edev->device) libinput_device_unref(edev->device);
2429 if (e_input) g_rec_mutex_unlock(&e_input->libinput_mutex);
2430 if (edev->key_remap_hash) eina_hash_free(edev->key_remap_hash);
2431 if (edev->touch.coords)
2433 free(edev->touch.coords);
2434 edev->touch.coords = NULL;
2436 g_rec_mutex_clear(&edev->touch.raw_pressed_mutex);
2437 g_rec_mutex_clear(&edev->touch.blocked_mutex);
2438 eina_stringshare_del(edev->output_name);
2440 ecore_thread_main_loop_end();
2446 _e_input_evdev_event_process(struct libinput_event *event)
2448 struct libinput_device *device;
2449 Eina_Bool ret = EINA_TRUE;
2451 device = libinput_event_get_device(event);
2452 switch (libinput_event_get_type(event))
2454 case LIBINPUT_EVENT_KEYBOARD_KEY:
2455 _device_handle_key(device, libinput_event_get_keyboard_event(event));
2457 case LIBINPUT_EVENT_POINTER_MOTION:
2458 _device_handle_pointer_motion(device,
2459 libinput_event_get_pointer_event(event));
2461 case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
2462 _device_handle_pointer_motion_absolute(device,
2463 libinput_event_get_pointer_event(event));
2465 case LIBINPUT_EVENT_POINTER_BUTTON:
2466 _device_handle_button(device, libinput_event_get_pointer_event(event));
2468 case LIBINPUT_EVENT_POINTER_AXIS:
2469 #if !LIBINPUT_HAVE_SCROLL_VALUE_V120
2470 _device_handle_axis(device, libinput_event_get_pointer_event(event));
2473 #if LIBINPUT_HAVE_SCROLL_VALUE_V120
2474 case LIBINPUT_EVENT_POINTER_SCROLL_WHEEL:
2475 _device_handle_axis_v120(device, libinput_event_get_pointer_event(event), E_INPUT_AXIS_SOURCE_WHEEL);
2477 case LIBINPUT_EVENT_POINTER_SCROLL_FINGER:
2478 _device_handle_axis_v120(device, libinput_event_get_pointer_event(event), E_INPUT_AXIS_SOURCE_FINGER);
2480 case LIBINPUT_EVENT_POINTER_SCROLL_CONTINUOUS:
2481 _device_handle_axis_v120(device, libinput_event_get_pointer_event(event), E_INPUT_AXIS_SOURCE_CONTINUOUS);
2484 case LIBINPUT_EVENT_TOUCH_DOWN:
2485 _device_handle_touch_down(device, libinput_event_get_touch_event(event));
2487 case LIBINPUT_EVENT_TOUCH_MOTION:
2488 _device_handle_touch_motion(device,
2489 libinput_event_get_touch_event(event));
2491 case LIBINPUT_EVENT_TOUCH_UP:
2492 _device_handle_touch_up(device, libinput_event_get_touch_event(event));
2494 case LIBINPUT_EVENT_TOUCH_CANCEL:
2495 _device_handle_touch_cancel(device, libinput_event_get_touch_event(event));
2497 case LIBINPUT_EVENT_TOUCH_FRAME:
2498 _device_handle_touch_frame(device, libinput_event_get_touch_event(event));
2500 case LIBINPUT_EVENT_TOUCH_AUX_DATA:
2501 _device_handle_touch_aux_data(device, libinput_event_get_touch_aux_data(event));
2512 * @brief Set the axis size of the given device.
2514 * @param dev The device to set the axis size to.
2515 * @param w The width of the axis.
2516 * @param h The height of the axis.
2518 * This function sets set the width @p w and height @p h of the axis
2519 * of device @p dev. If @p dev is a relative input device, a width and
2520 * height must set for it. If its absolute set the ioctl correctly, if
2521 * not, unsupported device.
2524 e_input_evdev_axis_size_set(E_Input_Evdev *edev, int w, int h)
2526 const char *sysname;
2531 enum libinput_config_status status;
2533 EINA_SAFETY_ON_NULL_RETURN(edev);
2534 EINA_SAFETY_ON_TRUE_RETURN((w == 0) || (h == 0));
2536 if ((!libinput_device_config_calibration_has_matrix(edev->device)) ||
2537 (libinput_device_config_calibration_get_default_matrix(edev->device, cal) != 0))
2540 sysname = libinput_device_get_sysname(edev->device);
2542 devices = eeze_udev_find_by_subsystem_sysname("input", sysname);
2543 if (eina_list_count(devices) < 1) return;
2545 EINA_LIST_FREE(devices, device)
2547 vals = eeze_udev_syspath_get_property(device, "WL_CALIBRATION");
2549 (sscanf(vals, "%f %f %f %f %f %f",
2550 &cal[0], &cal[1], &cal[2], &cal[3], &cal[4], &cal[5]) != 6))
2557 libinput_device_config_calibration_set_matrix(edev->device, cal);
2559 if (status != LIBINPUT_CONFIG_STATUS_SUCCESS)
2560 ERR("Failed to apply calibration");
2563 eina_stringshare_del(device);
2568 EINTERN const char *
2569 e_input_evdev_name_get(E_Input_Evdev *evdev)
2571 EINA_SAFETY_ON_NULL_RETURN_VAL(evdev, NULL);
2572 EINA_SAFETY_ON_NULL_RETURN_VAL(evdev->device, NULL);
2574 return libinput_device_get_name(evdev->device);
2577 EINTERN const char *
2578 e_input_evdev_sysname_get(E_Input_Evdev *evdev)
2580 EINA_SAFETY_ON_NULL_RETURN_VAL(evdev, NULL);
2581 EINA_SAFETY_ON_NULL_RETURN_VAL(evdev->device, NULL);
2583 return libinput_device_get_sysname(evdev->device);
2587 e_input_evdev_key_remap_enable(E_Input_Evdev *edev, Eina_Bool enable)
2589 EINA_SAFETY_ON_NULL_RETURN_VAL(edev, EINA_FALSE);
2590 EINA_SAFETY_ON_NULL_RETURN_VAL(edev->device, EINA_FALSE);
2592 edev->key_remap_enabled = enable;
2594 if (enable == EINA_FALSE && edev->key_remap_hash)
2596 eina_hash_free(edev->key_remap_hash);
2597 edev->key_remap_hash = NULL;
2604 e_input_evdev_key_remap_set(E_Input_Evdev *edev, int *from_keys, int *to_keys, int num)
2608 EINA_SAFETY_ON_NULL_RETURN_VAL(edev, EINA_FALSE);
2609 EINA_SAFETY_ON_NULL_RETURN_VAL(edev->device, EINA_FALSE);
2610 EINA_SAFETY_ON_NULL_RETURN_VAL(from_keys, EINA_FALSE);
2611 EINA_SAFETY_ON_NULL_RETURN_VAL(to_keys, EINA_FALSE);
2612 EINA_SAFETY_ON_TRUE_RETURN_VAL(num <= 0, EINA_FALSE);
2613 EINA_SAFETY_ON_TRUE_RETURN_VAL(!edev->key_remap_enabled, EINA_FALSE);
2615 if (edev->key_remap_hash == NULL)
2616 edev->key_remap_hash = eina_hash_int32_new(NULL);
2618 if (edev->key_remap_hash == NULL)
2620 ERR("Failed to set remap key information : creating a hash is failed.");
2624 for (i = 0; i < num ; i++)
2626 if (!from_keys[i] || !to_keys[i])
2628 ERR("Failed to set remap key information : given arguments are invalid.");
2633 for (i = 0; i < num ; i++)
2635 eina_hash_add(edev->key_remap_hash, &from_keys[i], (void *)(intptr_t)to_keys[i]);
2642 e_input_evdev_wheel_click_angle_get(E_Input_Evdev *dev)
2644 EINA_SAFETY_ON_NULL_RETURN_VAL(dev, -1);
2645 return libinput_device_config_scroll_get_wheel_click_angle(dev->device);
2649 e_input_evdev_touch_calibration_set(E_Input_Evdev *edev, float matrix[6])
2651 EINA_SAFETY_ON_NULL_RETURN_VAL(edev, EINA_FALSE);
2652 EINA_SAFETY_ON_NULL_RETURN_VAL(edev->device, EINA_FALSE);
2654 if (!libinput_device_config_calibration_has_matrix(edev->device) ||
2655 !libinput_device_has_capability(edev->device, LIBINPUT_DEVICE_CAP_TOUCH))
2658 if (libinput_device_config_calibration_set_matrix(edev->device, matrix) !=
2659 LIBINPUT_CONFIG_STATUS_SUCCESS)
2661 WRN("Failed to set input transformation about device: %s\n",
2662 libinput_device_get_name(edev->device));
2670 e_input_evdev_mouse_accel_speed_set(E_Input_Evdev *edev, double speed)
2672 EINA_SAFETY_ON_NULL_RETURN_VAL(edev, EINA_FALSE);
2673 EINA_SAFETY_ON_NULL_RETURN_VAL(edev->device, EINA_FALSE);
2675 if (!libinput_device_has_capability(edev->device, LIBINPUT_DEVICE_CAP_POINTER))
2678 if (!libinput_device_config_accel_is_available(edev->device))
2681 if (libinput_device_config_accel_set_speed(edev->device, speed) !=
2682 LIBINPUT_CONFIG_STATUS_SUCCESS)
2684 WRN("Failed to set mouse accel about device: %s\n",
2685 libinput_device_get_name(edev->device));
2692 EINTERN unsigned int
2693 e_input_evdev_touch_pressed_get(E_Input_Evdev *edev)
2695 EINA_SAFETY_ON_NULL_RETURN_VAL(edev, 0x0);
2697 return edev->touch.pressed;
2701 e_input_evdev_seatname_get(E_Input_Evdev *evdev)
2703 struct libinput_seat *libinput_seat;
2704 EINA_SAFETY_ON_NULL_RETURN_VAL(evdev, NULL);
2705 EINA_SAFETY_ON_NULL_RETURN_VAL(evdev->device, NULL);
2707 libinput_seat = libinput_device_get_seat(evdev->device);
2709 return libinput_seat_get_logical_name(libinput_seat);
2713 e_input_evdev_seatname_set(E_Input_Evdev *evdev, const char *seatname)
2715 Eina_Bool res = EINA_FALSE;
2716 E_Input_Backend *input;
2717 E_Input *e_input = e_input_get();
2719 EINA_SAFETY_ON_NULL_RETURN_VAL(seatname, EINA_FALSE);
2720 EINA_SAFETY_ON_NULL_RETURN_VAL(evdev, EINA_FALSE);
2721 EINA_SAFETY_ON_NULL_RETURN_VAL(evdev->device, EINA_FALSE);
2723 if (libinput_device_set_seat_logical_name(evdev->device, seatname) == 0)
2725 input = evdev->seat->input;
2726 if (!input) return EINA_FALSE;
2729 g_rec_mutex_lock(&e_input->libinput_mutex);
2731 if (libinput_dispatch(input->libinput) != 0)
2733 ERR("Failed to dispatch libinput events: %m");
2736 g_rec_mutex_unlock(&e_input->libinput_mutex);
2742 g_rec_mutex_unlock(&e_input->libinput_mutex);
2744 /* process pending events */
2745 _input_events_process(input);