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
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)
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);
}
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;
{
E_Input_Evdev *edev;
E_Input_Backend *b_input;
+ const char *output_name;
EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
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);
free(edev->touch.coords);
edev->touch.coords = NULL;
}
- E_FREE(edev->output_name);
+ eina_stringshare_del(edev->output_name);
free(edev);
}