mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +00:00
hid: support absolute positions
This commit is contained in:
@@ -643,14 +643,12 @@ static void hid_emit_event_keyboard_keypad(hid_application_t *application, hid_i
|
|||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t hid_generic_desktop_to_input_rel(uint32_t usage);
|
static uint16_t hid_generic_desktop_to_input_rel(uint32_t usage);
|
||||||
|
static uint16_t hid_generic_desktop_to_input_abs(uint32_t usage);
|
||||||
|
|
||||||
static void hid_emit_event_generic_desktop(hid_input_t *input, hid_usage_t *usage, size_t idx, uint64_t value, input_event_t *events, size_t *events_emitted) {
|
static void hid_emit_event_generic_desktop(hid_input_t *input, hid_usage_t *usage, size_t idx, uint64_t value, input_event_t *events, size_t *events_emitted) {
|
||||||
if (input->flags & HID_INPUT_CONSTANT)
|
if (input->flags & HID_INPUT_CONSTANT)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((input->flags & HID_INPUT_RELATIVE) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32_t hid_usage = USAGE(usage->usage);
|
uint32_t hid_usage = USAGE(usage->usage);
|
||||||
if (usage->minimum || usage->maximum) {
|
if (usage->minimum || usage->maximum) {
|
||||||
hid_usage = usage->minimum + idx;
|
hid_usage = usage->minimum + idx;
|
||||||
@@ -658,18 +656,30 @@ static void hid_emit_event_generic_desktop(hid_input_t *input, hid_usage_t *usag
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t signed_value = hid_input_value_signed(input, value);
|
||||||
|
|
||||||
|
input_event_t event = {0};
|
||||||
|
event.value = signed_value;
|
||||||
|
|
||||||
|
if (input->flags & HID_INPUT_RELATIVE) {
|
||||||
|
if (signed_value == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
uint16_t code = hid_generic_desktop_to_input_rel(hid_usage);
|
uint16_t code = hid_generic_desktop_to_input_rel(hid_usage);
|
||||||
if (code > INPUT_REL_MAX)
|
if (code > INPUT_REL_MAX)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int64_t signed_value = hid_input_value_signed(input, value);
|
|
||||||
if (signed_value == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
input_event_t event = {0};
|
|
||||||
event.type = INPUT_EV_REL;
|
event.type = INPUT_EV_REL;
|
||||||
event.code = code;
|
event.code = code;
|
||||||
event.value = signed_value;
|
} else {
|
||||||
|
uint16_t code = hid_generic_desktop_to_input_abs(hid_usage);
|
||||||
|
if (code > INPUT_ABS_MAX)
|
||||||
|
return;
|
||||||
|
|
||||||
|
event.type = INPUT_EV_ABS;
|
||||||
|
event.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
push_event(event, events, events_emitted);
|
push_event(event, events, events_emitted);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -914,27 +924,63 @@ static uint16_t hid_generic_desktop_to_input_rel(uint32_t usage) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint16_t hid_generic_desktop_to_input_abs(uint32_t usage) {
|
||||||
|
switch (usage) {
|
||||||
|
case HID_GD_X:
|
||||||
|
return INPUT_ABS_X;
|
||||||
|
case HID_GD_Y:
|
||||||
|
return INPUT_ABS_Y;
|
||||||
|
default:
|
||||||
|
return INPUT_ABS_MAX + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t hid_abs_initial_value(hid_input_t *input) {
|
||||||
|
if (input->logical_minimum > 0)
|
||||||
|
return input->logical_minimum;
|
||||||
|
if (input->logical_maximum < 0)
|
||||||
|
return input->logical_maximum;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hid_advertise_abs(input_device_t *device, hid_input_t *input, uint16_t code) {
|
||||||
|
if (code > INPUT_ABS_MAX)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bitmap_set(&device->ev_bits, INPUT_EV_ABS, 1);
|
||||||
|
bitmap_set(&device->abs_bits, code, 1);
|
||||||
|
device->abs_info[code].value = hid_abs_initial_value(input);
|
||||||
|
device->abs_info[code].min = input->logical_minimum;
|
||||||
|
device->abs_info[code].max = input->logical_maximum;
|
||||||
|
}
|
||||||
|
|
||||||
static void hid_advertise_generic_desktop(input_device_t *device, hid_input_t *input, hid_usage_t *usage) {
|
static void hid_advertise_generic_desktop(input_device_t *device, hid_input_t *input, hid_usage_t *usage) {
|
||||||
if (input->flags & HID_INPUT_CONSTANT)
|
if (input->flags & HID_INPUT_CONSTANT)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((input->flags & HID_INPUT_RELATIVE) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (usage->minimum == 0 && usage->maximum == 0) {
|
if (usage->minimum == 0 && usage->maximum == 0) {
|
||||||
uint16_t code = hid_generic_desktop_to_input_rel(USAGE(usage->usage));
|
uint32_t hid_usage = USAGE(usage->usage);
|
||||||
if (code <= INPUT_REL_MAX) {
|
if (input->flags & HID_INPUT_RELATIVE) {
|
||||||
bitmap_set(&device->ev_bits, INPUT_EV_REL, 1);
|
|
||||||
bitmap_set(&device->rel_bits, code, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32_t hid_usage = usage->minimum; hid_usage <= usage->maximum && hid_usage <= HID_GD_WHEEL; ++hid_usage) {
|
|
||||||
uint16_t code = hid_generic_desktop_to_input_rel(hid_usage);
|
uint16_t code = hid_generic_desktop_to_input_rel(hid_usage);
|
||||||
if (code <= INPUT_REL_MAX) {
|
if (code <= INPUT_REL_MAX) {
|
||||||
bitmap_set(&device->ev_bits, INPUT_EV_REL, 1);
|
bitmap_set(&device->ev_bits, INPUT_EV_REL, 1);
|
||||||
bitmap_set(&device->rel_bits, code, 1);
|
bitmap_set(&device->rel_bits, code, 1);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
hid_advertise_abs(device, input, hid_generic_desktop_to_input_abs(hid_usage));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t hid_usage = usage->minimum; hid_usage <= usage->maximum && hid_usage <= HID_GD_WHEEL; ++hid_usage) {
|
||||||
|
if (input->flags & HID_INPUT_RELATIVE) {
|
||||||
|
uint16_t code = hid_generic_desktop_to_input_rel(hid_usage);
|
||||||
|
if (code <= INPUT_REL_MAX) {
|
||||||
|
bitmap_set(&device->ev_bits, INPUT_EV_REL, 1);
|
||||||
|
bitmap_set(&device->rel_bits, code, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hid_advertise_abs(device, input, hid_generic_desktop_to_input_abs(hid_usage));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user