From 6a0360e4876c7d3fd31935f6a9f0cc0e1230c07f Mon Sep 17 00:00:00 2001 From: jeon Date: Tue, 12 May 2020 20:25:18 +0900 Subject: [PATCH] e_info_server_input: create a device has multiple capability Change-Id: I5965f9cf616e1af54d6102eb1096e08908d28abc --- src/bin/e_info_server_input.c | 225 +++++++++++++--------------------- 1 file changed, 88 insertions(+), 137 deletions(-) diff --git a/src/bin/e_info_server_input.c b/src/bin/e_info_server_input.c index 1248ae1497..74eb6e6355 100644 --- a/src/bin/e_info_server_input.c +++ b/src/bin/e_info_server_input.c @@ -32,161 +32,127 @@ static E_Info_Server_Input _e_info_input = }; -static int -_e_info_input_create_keyboard_device(const char *dev_name) +static void +_e_info_input_set_keyboard(struct uinput_user_dev *uinput_dev, int uinput_fd) { - int fd_uinput = -1, nwrite = 0, i; - struct uinput_user_dev dev_uinput = {0, }; - - fd_uinput = open("/dev/uinput", O_WRONLY | O_NDELAY); - EINA_SAFETY_ON_FALSE_RETURN_VAL(fd_uinput >= 0, -1); - - strncpy(dev_uinput.name, dev_name, UINPUT_MAX_NAME_SIZE - 1); - dev_uinput.id.version = 4; - dev_uinput.id.bustype = BUS_VIRTUAL; - - ioctl(fd_uinput, UI_SET_EVBIT, EV_KEY); - ioctl(fd_uinput, UI_SET_EVBIT, EV_SYN); - ioctl(fd_uinput, UI_SET_EVBIT, EV_MSC); + int i; for (i = KEY_ESC; i <= KEY_MICMUTE; i++) - ioctl(fd_uinput, UI_SET_KEYBIT, i); + ioctl(uinput_fd, UI_SET_KEYBIT, i); for (i = KEY_OK; i <= KEY_LIGHTS_TOGGLE; i++) - ioctl(fd_uinput, UI_SET_KEYBIT, i); + ioctl(uinput_fd, UI_SET_KEYBIT, i); for (i = KEY_ALS_TOGGLE; i <= KEY_ONSCREEN_KEYBOARD; i++) - ioctl(fd_uinput, UI_SET_KEYBIT, i); - - ioctl(fd_uinput, UI_SET_MSCBIT, MSC_SCAN); - - /* Create input device into input sub-system */ - nwrite = write(fd_uinput, &dev_uinput, sizeof(dev_uinput)); - if (nwrite < 0) WRN("Failed to write for create device using uinput (err: %m)\n"); - - if (ioctl(fd_uinput, UI_DEV_CREATE)) - { - WRN("Failed to create %s device (err: %m)", dev_name); - close (fd_uinput); - return -1; - } - - return fd_uinput; + ioctl(uinput_fd, UI_SET_KEYBIT, i); } -static int -_e_info_input_create_touch_device(const char *dev_name) +static void +_e_info_input_set_touch(struct uinput_user_dev *uinput_dev, int uinput_fd) { - int fd_uinput = -1, nwrite = 0; - struct uinput_user_dev dev_uinput = {0, }; E_Output *output; int w = 0, h = 0; - fd_uinput = open("/dev/uinput", O_WRONLY | O_NDELAY); - EINA_SAFETY_ON_FALSE_RETURN_VAL(fd_uinput >= 0, -1); - output = e_comp_screen_primary_output_get(e_comp->e_comp_screen); e_output_size_get(output, &w, &h); + if ((w <= 0) || (h <= 0)) + WRN("Failed to get output size for creating touch device in e_info. So set arbitrary output size [%d x %d]\n", w, h); + if (w <= 0) w = 4096; if (h <= 0) h = 4096; - WRN("Failed to get output size for creating touch device in e_info. So set arbitrary output size [%d x %d]\n", w, h); - - strncpy(dev_uinput.name, dev_name, UINPUT_MAX_NAME_SIZE - 1); - dev_uinput.id.version = 4; - dev_uinput.id.bustype = BUS_VIRTUAL; - - ioctl(fd_uinput, UI_SET_EVBIT, EV_KEY); - ioctl(fd_uinput, UI_SET_EVBIT, EV_SYN); - ioctl(fd_uinput, UI_SET_EVBIT, EV_MSC); - ioctl(fd_uinput, UI_SET_EVBIT, EV_ABS); - - ioctl(fd_uinput, UI_SET_KEYBIT, BTN_TOUCH); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_X); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_Y); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_MT_SLOT); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_MT_TOUCH_MINOR); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_MT_WIDTH_MAJOR); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_MT_POSITION_X); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_MT_POSITION_Y); - ioctl(fd_uinput, UI_SET_ABSBIT, ABS_MT_TRACKING_ID); - ioctl(fd_uinput, UI_SET_MSCBIT, MSC_SCAN); - - dev_uinput.absmin[ABS_X] = 0; - dev_uinput.absmax[ABS_X] = w - 1; - dev_uinput.absmin[ABS_Y] = 0; - dev_uinput.absmax[ABS_Y] = h - 1; - dev_uinput.absmin[ABS_MT_SLOT] = 0; - dev_uinput.absmax[ABS_MT_SLOT] = 9; - dev_uinput.absmin[ABS_MT_TOUCH_MAJOR] = 0; - dev_uinput.absmax[ABS_MT_TOUCH_MAJOR] = 255; - dev_uinput.absmin[ABS_MT_TOUCH_MINOR] = 0; - dev_uinput.absmax[ABS_MT_TOUCH_MINOR] = 255; - dev_uinput.absmin[ABS_MT_WIDTH_MAJOR] = 0; - dev_uinput.absmax[ABS_MT_WIDTH_MAJOR] = 255; - dev_uinput.absmin[ABS_MT_POSITION_X] = 0; - dev_uinput.absmax[ABS_MT_POSITION_X] = w - 1; - dev_uinput.absmin[ABS_MT_POSITION_Y] = 0; - dev_uinput.absmax[ABS_MT_POSITION_Y] = h - 1; - dev_uinput.absmin[ABS_MT_TRACKING_ID] = 0; - dev_uinput.absmax[ABS_MT_TRACKING_ID] = 65535; - dev_uinput.absmin[ABS_MT_ORIENTATION] = 0; - dev_uinput.absmax[ABS_MT_ORIENTATION] = 2; + ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS); + + ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_SLOT); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MINOR); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_WIDTH_MAJOR); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_POSITION_X); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y); + ioctl(uinput_fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID); + + uinput_dev->absmin[ABS_X] = 0; + uinput_dev->absmax[ABS_X] = w - 1; + uinput_dev->absmin[ABS_Y] = 0; + uinput_dev->absmax[ABS_Y] = h - 1; + uinput_dev->absmin[ABS_MT_SLOT] = 0; + uinput_dev->absmax[ABS_MT_SLOT] = 9; + uinput_dev->absmin[ABS_MT_TOUCH_MAJOR] = 0; + uinput_dev->absmax[ABS_MT_TOUCH_MAJOR] = 255; + uinput_dev->absmin[ABS_MT_TOUCH_MINOR] = 0; + uinput_dev->absmax[ABS_MT_TOUCH_MINOR] = 255; + uinput_dev->absmin[ABS_MT_WIDTH_MAJOR] = 0; + uinput_dev->absmax[ABS_MT_WIDTH_MAJOR] = 255; + uinput_dev->absmin[ABS_MT_POSITION_X] = 0; + uinput_dev->absmax[ABS_MT_POSITION_X] = w - 1; + uinput_dev->absmin[ABS_MT_POSITION_Y] = 0; + uinput_dev->absmax[ABS_MT_POSITION_Y] = h - 1; + uinput_dev->absmin[ABS_MT_TRACKING_ID] = 0; + uinput_dev->absmax[ABS_MT_TRACKING_ID] = 65535; + uinput_dev->absmin[ABS_MT_ORIENTATION] = 0; + uinput_dev->absmax[ABS_MT_ORIENTATION] = 2; +} - /* Create input device into input sub-system */ - nwrite = write(fd_uinput, &dev_uinput, sizeof(dev_uinput)); - if (nwrite < 0) WRN("Failed to write for create device using uinput (err: %m)\n"); +static void +_e_info_input_set_pointer(struct uinput_user_dev *uinput_dev, int uinput_fd) +{ + int i; - if (ioctl(fd_uinput, UI_DEV_CREATE)) - { - WRN("Failed to create %s device (err: %m)", dev_name); - close (fd_uinput); - return -1; - } + ioctl(uinput_fd, UI_SET_EVBIT, EV_REL); + + ioctl(uinput_fd, UI_SET_RELBIT, REL_X); + ioctl(uinput_fd, UI_SET_RELBIT, REL_Y); + ioctl(uinput_fd, UI_SET_RELBIT, REL_WHEEL); + ioctl(uinput_fd, UI_SET_RELBIT, REL_HWHEEL); - return fd_uinput; + for (i = BTN_MISC; i <= BTN_TASK; i++) + ioctl(uinput_fd, UI_SET_KEYBIT, i); } -static int -_e_info_input_create_pointer_device(const char *dev_name) +int _e_info_input_create_device(const char *dev_name, unsigned int type) { - int fd_uinput = -1, nwrite = 0, i; - struct uinput_user_dev dev_uinput = {0, }; - - fd_uinput = open("/dev/uinput", O_WRONLY | O_NDELAY); - EINA_SAFETY_ON_FALSE_RETURN_VAL(fd_uinput >= 0, -1); + int uinput_fd = -1, nwrite = 0; + struct uinput_user_dev uinput_dev = {0, }; - strncpy(dev_uinput.name, dev_name, UINPUT_MAX_NAME_SIZE - 1); - dev_uinput.id.version = 4; - dev_uinput.id.bustype = BUS_VIRTUAL; + uinput_fd = open("/dev/uinput", O_WRONLY | O_NDELAY); + EINA_SAFETY_ON_FALSE_RETURN_VAL(uinput_fd >= 0, -1); - ioctl(fd_uinput, UI_SET_EVBIT, EV_KEY); - ioctl(fd_uinput, UI_SET_EVBIT, EV_REL); - ioctl(fd_uinput, UI_SET_EVBIT, EV_SYN); - ioctl(fd_uinput, UI_SET_EVBIT, EV_MSC); + strncpy(uinput_dev.name, dev_name, UINPUT_MAX_NAME_SIZE - 1); + uinput_dev.id.version = 4; + uinput_dev.id.bustype = BUS_VIRTUAL; - ioctl(fd_uinput, UI_SET_RELBIT, REL_X); - ioctl(fd_uinput, UI_SET_RELBIT, REL_Y); - ioctl(fd_uinput, UI_SET_RELBIT, REL_WHEEL); - ioctl(fd_uinput, UI_SET_RELBIT, REL_HWHEEL); + ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY); + ioctl(uinput_fd, UI_SET_EVBIT, EV_SYN); + ioctl(uinput_fd, UI_SET_EVBIT, EV_MSC); + ioctl(uinput_fd, UI_SET_MSCBIT, MSC_SCAN); - for (i = BTN_MISC; i <= BTN_TASK; i++) - ioctl(fd_uinput, UI_SET_KEYBIT, i); - - ioctl(fd_uinput, UI_SET_MSCBIT, MSC_SCAN); + if (type & E_INPUT_SEAT_KEYBOARD) + { + _e_info_input_set_keyboard(&uinput_dev, uinput_fd); + } + if (type & E_INPUT_SEAT_TOUCH) + { + _e_info_input_set_touch(&uinput_dev, uinput_fd); + } + if (type & E_INPUT_SEAT_POINTER) + { + _e_info_input_set_pointer(&uinput_dev, uinput_fd); + } /* Create input device into input sub-system */ - nwrite = write(fd_uinput, &dev_uinput, sizeof(dev_uinput)); + nwrite = write(uinput_fd, &uinput_dev, sizeof(uinput_dev)); if (nwrite < 0) WRN("Failed to write for create device using uinput (err: %m)\n"); - if (ioctl(fd_uinput, UI_DEV_CREATE)) + if (ioctl(uinput_fd, UI_DEV_CREATE)) { WRN("Failed to create %s device (err: %m)", dev_name); - close (fd_uinput); + close (uinput_fd); return -1; } - return fd_uinput; + return uinput_fd; } static int @@ -497,24 +463,9 @@ e_info_server_input_init_device(unsigned int type, char *name) if (_e_info_input.gen.fd >=0) return "Already opened device is exist"; if (type) { - if (type & E_INPUT_SEAT_KEYBOARD) - { - fd = _e_info_input_create_keyboard_device(name); - _e_info_input.gen.virtual_dev = EINA_TRUE; - _e_info_input.gen.fd = fd; - } - if (type & E_INPUT_SEAT_TOUCH) - { - fd = _e_info_input_create_touch_device(name); - _e_info_input.gen.virtual_dev = EINA_TRUE; - _e_info_input.gen.fd = fd; - } - if (type & E_INPUT_SEAT_POINTER) - { - fd = _e_info_input_create_pointer_device(name); - _e_info_input.gen.virtual_dev = EINA_TRUE; - _e_info_input.gen.fd = fd; - } + fd = _e_info_input_create_device(name, type); + _e_info_input.gen.virtual_dev = EINA_TRUE; + _e_info_input.gen.fd = fd; } else { -- 2.34.1