2 #include "e_info_server_input.h"
3 #include "e_info_shared_types.h"
4 #include "e_input_private.h"
6 #include <linux/uinput.h>
8 #ifndef KEY_LIGHTS_TOGGLE
9 #define KEY_LIGHTS_TOGGLE 0x21e
11 #ifndef KEY_ALS_TOGGLE
12 #define KEY_ALS_TOGGLE 0x230
14 #ifndef KEY_ONSCREEN_KEYBOARD
15 #define KEY_ONSCREEN_KEYBOARD 0x278
18 typedef struct _E_Info_Server_Input
22 Eina_Bool virtual_dev;
24 Eina_Stringshare *name;
26 } E_Info_Server_Input;
28 static E_Info_Server_Input _e_info_input =
31 EINA_FALSE, /* virtual_dev */
38 _e_info_input_set_keyboard(struct uinput_user_dev *uinput_dev, int uinput_fd)
42 for (i = KEY_ESC; i <= KEY_MICMUTE; i++)
43 ioctl(uinput_fd, UI_SET_KEYBIT, i);
44 for (i = KEY_OK; i <= KEY_LIGHTS_TOGGLE; i++)
45 ioctl(uinput_fd, UI_SET_KEYBIT, i);
46 for (i = KEY_ALS_TOGGLE; i <= KEY_ONSCREEN_KEYBOARD; i++)
47 ioctl(uinput_fd, UI_SET_KEYBIT, i);
51 _e_info_input_set_touch(struct uinput_user_dev *uinput_dev, int uinput_fd)
55 int max_mt_slot = 9;//set touch max count 10 by default
57 output = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
58 e_output_size_get(output, &w, &h);
60 if ((w <= 0) || (h <= 0))
61 WRN("Failed to get output size for creating touch device in e_info. So set arbitrary output size [%d x %d]\n", w, h);
66 if (e_config->configured_max_touch.use)
68 max_mt_slot = e_config->configured_max_touch.count - 1;
71 max_mt_slot = 9;//set touch max count 10 by default
74 ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS);
76 ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH);
77 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X);
78 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y);
79 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_SLOT);
80 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR);
81 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MINOR);
82 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_WIDTH_MAJOR);
83 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
84 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
85 ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID);
87 uinput_dev->absmin[ABS_X] = 0;
88 uinput_dev->absmax[ABS_X] = w - 1;
89 uinput_dev->absmin[ABS_Y] = 0;
90 uinput_dev->absmax[ABS_Y] = h - 1;
91 uinput_dev->absmin[ABS_MT_SLOT] = 0;
92 uinput_dev->absmax[ABS_MT_SLOT] = max_mt_slot;
93 uinput_dev->absmin[ABS_MT_TOUCH_MAJOR] = 0;
94 uinput_dev->absmax[ABS_MT_TOUCH_MAJOR] = 255;
95 uinput_dev->absmin[ABS_MT_TOUCH_MINOR] = 0;
96 uinput_dev->absmax[ABS_MT_TOUCH_MINOR] = 255;
97 uinput_dev->absmin[ABS_MT_WIDTH_MAJOR] = 0;
98 uinput_dev->absmax[ABS_MT_WIDTH_MAJOR] = 255;
99 uinput_dev->absmin[ABS_MT_POSITION_X] = 0;
100 uinput_dev->absmax[ABS_MT_POSITION_X] = w - 1;
101 uinput_dev->absmin[ABS_MT_POSITION_Y] = 0;
102 uinput_dev->absmax[ABS_MT_POSITION_Y] = h - 1;
103 uinput_dev->absmin[ABS_MT_TRACKING_ID] = 0;
104 uinput_dev->absmax[ABS_MT_TRACKING_ID] = 65535;
105 uinput_dev->absmin[ABS_MT_ORIENTATION] = 0;
106 uinput_dev->absmax[ABS_MT_ORIENTATION] = 2;
110 _e_info_input_set_pointer(struct uinput_user_dev *uinput_dev, int uinput_fd)
114 ioctl(uinput_fd, UI_SET_EVBIT, EV_REL);
116 ioctl(uinput_fd, UI_SET_RELBIT, REL_X);
117 ioctl(uinput_fd, UI_SET_RELBIT, REL_Y);
118 ioctl(uinput_fd, UI_SET_RELBIT, REL_WHEEL);
119 ioctl(uinput_fd, UI_SET_RELBIT, REL_HWHEEL);
121 for (i = BTN_MISC; i <= BTN_TASK; i++)
122 ioctl(uinput_fd, UI_SET_KEYBIT, i);
125 int _e_info_input_create_device(const char *dev_name, unsigned int type)
127 int uinput_fd = -1, nwrite = 0;
128 struct uinput_user_dev uinput_dev = {0, };
130 uinput_fd = open("/dev/uinput", O_WRONLY | O_NDELAY);
131 EINA_SAFETY_ON_FALSE_RETURN_VAL(uinput_fd >= 0, -1);
133 strncpy(uinput_dev.name, dev_name, UINPUT_MAX_NAME_SIZE - 1);
134 uinput_dev.id.version = 4;
135 uinput_dev.id.bustype = BUS_VIRTUAL;
137 ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);
138 ioctl(uinput_fd, UI_SET_EVBIT, EV_SYN);
139 ioctl(uinput_fd, UI_SET_EVBIT, EV_MSC);
140 ioctl(uinput_fd, UI_SET_MSCBIT, MSC_SCAN);
142 if (type & E_INPUT_SEAT_KEYBOARD)
144 _e_info_input_set_keyboard(&uinput_dev, uinput_fd);
146 if (type & E_INPUT_SEAT_TOUCH)
148 _e_info_input_set_touch(&uinput_dev, uinput_fd);
150 if (type & E_INPUT_SEAT_POINTER)
152 _e_info_input_set_pointer(&uinput_dev, uinput_fd);
155 /* Create input device into input sub-system */
156 nwrite = write(uinput_fd, &uinput_dev, sizeof(uinput_dev));
157 if (nwrite < 0) WRN("Failed to write for create device using uinput (err: %m)\n");
159 if (ioctl(uinput_fd, UI_DEV_CREATE))
161 WRN("Failed to create %s device (err: %m)", dev_name);
170 _e_info_input_open_device(char *identifier)
174 fd = open(identifier, O_WRONLY | O_NDELAY);
177 ERR("Failed to open %s node. (err: %m)\n", identifier);
185 _write_event_to_device_node(int type, int code, int value)
188 struct input_event ev;
190 gettimeofday(&ev.time, NULL);
196 nwrite = write(_e_info_input.gen.fd, &ev, sizeof(ev));
202 _key_gen(int keycode, int value)
204 _write_event_to_device_node(EV_KEY, keycode, value);
210 _write_event_to_device_node(EV_SYN, 0, 0);
214 _key_gen_down(int key_code)
216 _key_gen(key_code, 1);
221 _key_gen_up(int key_code)
223 _key_gen(key_code, 0);
228 _touch_gen_mt_slot(int value)
230 _write_event_to_device_node(EV_ABS, ABS_MT_SLOT, value);
234 _touch_gen_mt_tracking_id(int value)
236 _write_event_to_device_node(EV_ABS, ABS_MT_TRACKING_ID, value);
240 _touch_gen_mt_touch_major(int value)
242 _write_event_to_device_node(EV_ABS, ABS_MT_TOUCH_MAJOR, value);
246 _touch_gen_mt_touch_minor(int value)
248 _write_event_to_device_node(EV_ABS, ABS_MT_TOUCH_MINOR, value);
252 _touch_gen_mt_position_x(int value)
254 _write_event_to_device_node(EV_ABS, ABS_MT_POSITION_X, value);
258 _touch_gen_mt_position_y(int value)
260 _write_event_to_device_node(EV_ABS, ABS_MT_POSITION_Y, value);
264 _convert_button(int button)
280 _pointer_gen_x(int value)
282 _write_event_to_device_node(EV_REL, REL_X, value);
286 _pointer_gen_y(int value)
288 _write_event_to_device_node(EV_REL, REL_Y, value);
292 _pointer_gen_button(int button, int value)
294 _write_event_to_device_node(EV_KEY, button, value);
298 _pointer_gen_wheel(int value)
300 _write_event_to_device_node(EV_REL, REL_WHEEL, value);
305 _pointer_gen_hwheel(int value)
307 _write_event_to_device_node(EV_REL, REL_HWHEEL, value);
312 _touch_gen_down(int idx, int x, int y)
314 #define MAX_TRACKING_ID 65535
315 static int tracking_id = 0;
317 _touch_gen_mt_slot(idx);
318 _touch_gen_mt_tracking_id(tracking_id);
320 if (tracking_id > MAX_TRACKING_ID)
323 _touch_gen_mt_touch_major(10);
324 _touch_gen_mt_touch_minor(5);
325 _touch_gen_mt_position_x(x);
326 _touch_gen_mt_position_y(y);
331 _touch_gen_move(int idx, int x, int y)
333 _touch_gen_mt_slot(idx);
334 _touch_gen_mt_position_x(x);
335 _touch_gen_mt_position_y(y);
340 _touch_gen_up(int idx)
342 _touch_gen_mt_slot(idx);
343 _touch_gen_mt_tracking_id(-1);
348 _button_gen_down(int button)
351 button = _convert_button(button);
353 _pointer_gen_button(button, 1);
358 _button_gen_up(int button)
361 button = _convert_button(button);
363 _pointer_gen_button(button, 0);
368 _pointer_gen_move(int x, int y)
370 if (x != 0) _pointer_gen_x(x);
371 if (y != 0) _pointer_gen_y(y);
376 _e_info_input_keygen(int key_code, int key_state)
380 case E_INFO_EVENT_STATE_PRESS:
381 _key_gen_down(key_code);
383 case E_INFO_EVENT_STATE_RELEASE:
384 _key_gen_up(key_code);
386 case E_INFO_EVENT_STATE_ALL:
387 _key_gen_down(key_code);
388 _key_gen_up(key_code);
396 _e_info_input_touchgen(int idx, int x, int y, int touch_state)
400 case E_INFO_EVENT_STATE_PRESS:
401 _touch_gen_down(idx, x, y);
403 case E_INFO_EVENT_STATE_RELEASE:
406 case E_INFO_EVENT_STATE_MOTION:
407 _touch_gen_move(idx, x, y);
409 case E_INFO_EVENT_STATE_ALL:
410 _touch_gen_down(idx, x, y);
411 _touch_gen_move(idx, x, y);
420 _e_info_input_mousegen(int button, int x, int y, int mouse_state)
424 case E_INFO_EVENT_STATE_PRESS:
425 _button_gen_down(button);
427 case E_INFO_EVENT_STATE_RELEASE:
428 _button_gen_up(button);
430 case E_INFO_EVENT_STATE_MOTION:
431 if (button == E_INFO_BUTTON_WHEEL)
433 _pointer_gen_wheel(x);
435 else if (button == E_INFO_BUTTON_HWHEEL)
437 _pointer_gen_hwheel(y);
440 _pointer_gen_move(x, y);
442 case E_INFO_EVENT_STATE_ALL:
443 _button_gen_down(button);
444 _button_gen_up(button);
452 _e_info_input_close_device(void)
456 if (_e_info_input.gen.virtual_dev)
458 ret = ioctl(_e_info_input.gen.fd, UI_DEV_DESTROY, NULL);
459 if (ret) WRN("Failed destroy fd: %d (ret: %d) (err: %m)\n", _e_info_input.gen.fd, ret);
461 close(_e_info_input.gen.fd);
463 _e_info_input.gen.fd = -1;
464 _e_info_input.gen.virtual_dev = EINA_FALSE;
468 e_info_server_input_init_device(unsigned int type, char *name)
471 Eina_List *device_list, *l;
474 if (_e_info_input.gen.fd >=0) return "Already opened device is exist";
477 fd = _e_info_input_create_device(name, type);
478 _e_info_input.gen.virtual_dev = EINA_TRUE;
479 _e_info_input.gen.fd = fd;
480 if (_e_info_input.gen.name)
481 eina_stringshare_del(_e_info_input.gen.name);
482 _e_info_input.gen.name = eina_stringshare_add(name);
486 device_list = (Eina_List *)ecore_device_list();
487 EINA_SAFETY_ON_NULL_RETURN_VAL(device_list, "No Opened device");
489 EINA_LIST_FOREACH(device_list, l, dev)
491 if (!e_util_strcmp(name, ecore_device_identifier_get(dev)))
493 fd = _e_info_input_open_device(name);
494 _e_info_input.gen.virtual_dev = EINA_FALSE;
495 _e_info_input.gen.fd = fd;
496 if (_e_info_input.gen.name)
497 eina_stringshare_del(_e_info_input.gen.name);
498 _e_info_input.gen.name = eina_stringshare_add(name);
505 _e_info_input.gen.virtual_dev = EINA_FALSE;
506 _e_info_input.gen.fd = -1;
507 if (_e_info_input.gen.name)
508 eina_stringshare_del(_e_info_input.gen.name);
509 _e_info_input.gen.name = NULL;
510 return "Failed to open event node or uinput node";
513 return E_INFO_INPUT_RESULT_NONE;
517 e_info_server_input_deinit_device(void)
519 if (_e_info_input.gen.fd < 0) return;
521 if (_e_info_input.gen.virtual_dev)
522 _e_info_input_close_device();
525 close(_e_info_input.gen.fd);
527 _e_info_input.gen.fd = -1;
528 _e_info_input.gen.virtual_dev = EINA_FALSE;
530 if (_e_info_input.gen.name)
531 eina_stringshare_del(_e_info_input.gen.name);
532 _e_info_input.gen.name = NULL;
538 e_info_server_input_keygen(char *name, int code, int state)
540 if (_e_info_input.gen.fd < 0) return "Initialize device first";
542 if (strlen(name) > 0)
544 code = e_comp_wl_input_keymap_keyname_to_keycode(name) - 8;
549 _e_info_input_keygen(code, state);
551 return E_INFO_INPUT_RESULT_NONE;
555 e_info_server_input_touchgen(int idx, int x, int y, int state)
557 if (_e_info_input.gen.fd < 0) return "Initialize device first";
559 _e_info_input_touchgen(idx, x, y, state);
561 return E_INFO_INPUT_RESULT_NONE;
565 e_info_server_input_mousegen(int button, int x, int y, int state)
567 if (_e_info_input.gen.fd < 0) return "Initialize device first";
569 _e_info_input_mousegen(button, x, y, state);
571 return E_INFO_INPUT_RESULT_NONE;
575 e_info_server_input_mouse_accel_set(int state)
577 if (_e_info_input.gen.fd < 0) return "Initialize device first";
579 if (e_input_device_mouse_accel_enable_set(_e_info_input.gen.name, state))
580 return E_INFO_INPUT_RESULT_NONE;
582 return "Failed to set mouse_accel";
586 e_info_server_input_log_enable_set(int state)
590 conf = e_comp_config_get();
591 if (!conf) return "Comp_conf is not valid";
593 if (state == 1 || state == 0)
595 conf->input_log_enable = state;
596 return E_INFO_INPUT_RESULT_NONE;
600 return "Input proper value [1: on][0: off]";