e_config: add a config 'input_output_assign_policy' to use a default output-assignmen... 41/273441/1 submit/tizen/20220406.012242
authorduna.oh <duna.oh@samsung.com>
Fri, 1 Apr 2022 02:15:25 +0000 (11:15 +0900)
committerduna.oh <duna.oh@samsung.com>
Wed, 6 Apr 2022 00:26:52 +0000 (09:26 +0900)
Change-Id: Ibdb3a79d0d7b12ef56ea978f7926429a8e58b573

src/bin/e_comp_cfdata.c
src/bin/e_comp_cfdata.h
src/bin/e_info_server.c
src/bin/e_input.h
src/bin/e_input_device.c
src/bin/e_input_evdev.c
src/bin/e_input_private.h

index d1c456f..beebbdd 100644 (file)
@@ -95,6 +95,7 @@ e_comp_cfdata_edd_init(E_Config_DD **conf_edd, E_Config_DD **match_edd)
    E_CONFIG_VAL(D, T, commit_handler_timer.use, UCHAR);
    E_CONFIG_VAL(D, T, commit_handler_timer.interval, DOUBLE);
    E_CONFIG_VAL(D, T, e_wheel_click_angle, INT);
+   E_CONFIG_VAL(D, T, input_output_assign_policy, INT);
 }
 
 E_API E_Comp_Config *
@@ -266,6 +267,8 @@ e_comp_cfdata_config_new(void)
 
    cfg->e_wheel_click_angle = 1;
 
+   cfg->input_output_assign_policy = 0;
+
    return cfg;
 
 error:
index af2f2b7..3730304 100644 (file)
@@ -83,6 +83,7 @@ struct _E_Comp_Config
    } commit_handler_timer;
 
    int e_wheel_click_angle;
+   int input_output_assign_policy;
 };
 
 struct _E_Comp_Match
index 37eba2c..6c551f5 100644 (file)
@@ -878,7 +878,7 @@ _input_msg_clients_append(Eldbus_Message_Iter *iter)
    Eldbus_Message_Iter *array_of_input;
    Eina_List *l;
    E_Devicemgr_Input_Device *dev;
-   char *output_name;
+   const char *output_name = NULL;
 
    eldbus_message_iter_arguments_append(iter, "a("VALUE_TYPE_FOR_INPUTDEV")", &array_of_input);
 
index 8ed6882..a9bc77b 100644 (file)
@@ -117,7 +117,7 @@ E_API void e_input_touch_max_count_set(unsigned int max_count);
 EINTERN Eina_Bool e_input_device_block(E_Input_Device *dev, unsigned int type, void *client);
 EINTERN Eina_Bool e_input_device_unblock(E_Input_Device *dev, void *client);
 EINTERN Eina_Bool e_input_device_output_name_set(E_Input_Device *dev, const char *input, const char *output);
-EINTERN char *e_input_device_output_name_get(E_Input_Device *dev, const char *input);
+EINTERN const char *e_input_device_output_name_get(E_Input_Device *dev, const char *input);
 
 EINTERN Eina_Bool e_input_device_seat_name_set(E_Input_Device *dev, const char *input, const char *seat_name);
 #endif
index 8e8c218..46aecef 100644 (file)
@@ -1385,8 +1385,7 @@ e_input_device_output_name_set(E_Input_Device *dev, const char *input, const cha
    if (e_output_find(output))
      {
         INF("output device found: %s", output);
-        E_FREE(edev->output_name);
-        edev->output_name = strdup(output);
+        eina_stringshare_replace(&edev->output_name, output);
         edev->output_configured = EINA_FALSE;
         return EINA_TRUE;
      }
@@ -1396,7 +1395,7 @@ e_input_device_output_name_set(E_Input_Device *dev, const char *input, const cha
    return EINA_FALSE;
 }
 
-EINTERN char *
+EINTERN const char *
 e_input_device_output_name_get(E_Input_Device *dev, const char *input)
 {
    E_Input_Seat *seat;
index dcbbdef..1b22f3f 100644 (file)
@@ -3,6 +3,7 @@
 
 static void  _device_modifiers_update(E_Input_Evdev *edev);
 static void  _device_configured_size_get(E_Input_Evdev *edev, int *x, int *y, int *w, int *h);
+static void  _device_output_assign(E_Input_Evdev *edev, E_Input_Seat_Capabilities cap);
 
 void
 _device_calibration_set(E_Input_Evdev *edev)
@@ -10,14 +11,16 @@ _device_calibration_set(E_Input_Evdev *edev)
    E_Output *output;
    int w = 0, h = 0;
    int temp;
-   const char *output_name;
+   E_Comp_Config *comp_conf;
 
-   output_name = libinput_device_get_output_name(edev->device);
-   if (output_name)
+   if (e_comp->e_comp_screen->num_outputs > 1) //multiple outputs
      {
-        E_FREE(edev->output_name);
-        edev->output_name = strdup(output_name);
-        ELOGF("E_INPUT_EVDEV", "Device has output_name:%s", NULL, output_name);
+        comp_conf = e_comp_config_get();
+        if (comp_conf && (comp_conf->input_output_assign_policy == 1)) //use output-assignment policy
+          {
+             _device_output_assign(edev, E_INPUT_SEAT_POINTER);
+             _device_output_assign(edev, E_INPUT_SEAT_TOUCH);
+          }
      }
 
    output = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
@@ -98,6 +101,38 @@ cont:
 }
 
 static void
+_device_output_assign(E_Input_Evdev *edev, E_Input_Seat_Capabilities cap)
+{
+   int last_output_idx;
+   E_Input_Evdev *ed;
+   Eina_List *l;
+   Eina_Bool need_assign_output = EINA_FALSE;
+   const char *output_name;
+
+   if (!(edev->caps & cap)) return;
+   if (edev->output_name) return; //already assigned
+   if (e_comp->e_comp_screen->num_outputs <= 1) return;
+
+   last_output_idx = e_comp->e_comp_screen->num_outputs - 1;
+   EINA_LIST_FOREACH(edev->seat->devices, l, ed)
+     {
+        if (!(ed->caps & cap)) continue;
+        if ((ed != edev) && (ed->output_name))
+          {
+             need_assign_output = EINA_FALSE;
+             break;
+          }
+          need_assign_output = EINA_TRUE;
+     }
+   if (need_assign_output)
+     {
+        output_name = e_output_output_id_get(e_output_find_by_index(last_output_idx));
+        if (output_name) edev->output_name = eina_stringshare_add(output_name);
+        ELOGF("E_INPUT_EVDEV", "Device is assigned to output:%s", NULL, output_name);
+     }
+}
+
+static void
 _device_touch_count_update(E_Input_Evdev *edev)
 {
    unsigned int device_touch_count = 0;
@@ -1717,6 +1752,7 @@ _e_input_evdev_device_create(E_Input_Seat *seat, struct libinput_device *device)
 {
    E_Input_Evdev *edev;
    E_Input_Backend *b_input;
+   const char *output_name;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
 
@@ -1770,6 +1806,13 @@ _e_input_evdev_device_create(E_Input_Seat *seat, struct libinput_device *device)
           ERR("Failed to allocate memory for touch coords !\n");
      }
 
+   output_name = libinput_device_get_output_name(device);
+   if (output_name)
+     {
+        eina_stringshare_replace(&edev->output_name, output_name);
+        ELOGF("E_INPUT_EVDEV", "Device has output_name:%s", NULL, output_name);
+     }
+
    libinput_device_set_user_data(device, edev);
    libinput_device_ref(device);
 
@@ -1806,7 +1849,7 @@ _e_input_evdev_device_destroy(E_Input_Evdev *edev)
         free(edev->touch.coords);
         edev->touch.coords = NULL;
      }
-   E_FREE(edev->output_name);
+   eina_stringshare_del(edev->output_name);
 
    free(edev);
 }
index c0aa8dc..89b9b8d 100644 (file)
@@ -123,7 +123,7 @@ struct _E_Input_Evdev
         Eina_Bool blocked;
      } touch;
 
-   char *output_name;
+   const char *output_name;
    Eina_Bool output_configured;
 };