e_info_server_input: create a device has multiple capability 42/233142/2
authorjeon <jhyuni.kang@samsung.com>
Tue, 12 May 2020 11:25:18 +0000 (20:25 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Wed, 13 May 2020 03:52:08 +0000 (03:52 +0000)
Change-Id: I5965f9cf616e1af54d6102eb1096e08908d28abc

src/bin/e_info_server_input.c

index 1248ae1497a8587a159b760d0243ac8e900e3aa1..74eb6e6355a346bc567b7877553d9fc457a9699f 100644 (file)
@@ -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
      {