From e801f5099d1a67915db04ae2b93205353427e1db Mon Sep 17 00:00:00 2001 From: "duna.oh" Date: Fri, 1 Apr 2022 11:15:25 +0900 Subject: [PATCH] e_config: add a config 'input_output_assign_policy' to use a default output-assignment policy Change-Id: Ibdb3a79d0d7b12ef56ea978f7926429a8e58b573 --- src/bin/e_comp_cfdata.c | 3 +++ src/bin/e_comp_cfdata.h | 1 + src/bin/e_info_server.c | 2 +- src/bin/e_input.h | 2 +- src/bin/e_input_device.c | 5 ++--- src/bin/e_input_evdev.c | 57 +++++++++++++++++++++++++++++++++++++++++------ src/bin/e_input_private.h | 2 +- 7 files changed, 59 insertions(+), 13 deletions(-) diff --git a/src/bin/e_comp_cfdata.c b/src/bin/e_comp_cfdata.c index d1c456f..beebbdd 100644 --- a/src/bin/e_comp_cfdata.c +++ b/src/bin/e_comp_cfdata.c @@ -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: diff --git a/src/bin/e_comp_cfdata.h b/src/bin/e_comp_cfdata.h index af2f2b7..3730304 100644 --- a/src/bin/e_comp_cfdata.h +++ b/src/bin/e_comp_cfdata.h @@ -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 diff --git a/src/bin/e_info_server.c b/src/bin/e_info_server.c index 37eba2c..6c551f5 100644 --- a/src/bin/e_info_server.c +++ b/src/bin/e_info_server.c @@ -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); diff --git a/src/bin/e_input.h b/src/bin/e_input.h index 8ed6882..a9bc77b 100644 --- a/src/bin/e_input.h +++ b/src/bin/e_input.h @@ -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 diff --git a/src/bin/e_input_device.c b/src/bin/e_input_device.c index 8e8c218..46aecef 100644 --- a/src/bin/e_input_device.c +++ b/src/bin/e_input_device.c @@ -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; diff --git a/src/bin/e_input_evdev.c b/src/bin/e_input_evdev.c index dcbbdef..1b22f3f 100644 --- a/src/bin/e_input_evdev.c +++ b/src/bin/e_input_evdev.c @@ -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); } diff --git a/src/bin/e_input_private.h b/src/bin/e_input_private.h index c0aa8dc..89b9b8d 100644 --- a/src/bin/e_input_private.h +++ b/src/bin/e_input_private.h @@ -123,7 +123,7 @@ struct _E_Input_Evdev Eina_Bool blocked; } touch; - char *output_name; + const char *output_name; Eina_Bool output_configured; }; -- 2.7.4