TL; DR : Как отличить guish первичную кнопку от нажатия вторичной кнопки на macOS с помощью IOKit?
Я работаю над библиотекой, предназначенной для игровые разработчики, которые обрабатывают необработанные события ввода, полученные от клавиатур и мышей (или трекпадов).
В macOS я в основном реализовал все, используя IOKit, с пользовательским обратным вызовом для IOHIDManagerRegisterInputValueCallback
. Обратный вызов различает kHIDUsage_GD_X
& kHIDUsage_GD_Y
для движения и kHIDUsage_GD_Pointer
для нажатия кнопок.
Нажатие на трекпад приводит к событию, указывающему, что нажата основная кнопка (использование: 0x01
), независимо от сколько пальцев я использую. Кроме того, в документации HID (стр. 67) указано, что в macOS есть только основная кнопка.
Кнопка 1, Основная кнопка. Используется для выбора объекта, перетаскивания и активации двойного щелчка. На MacOS это единственная кнопка. Операционные системы Microsoft называют это логической левой кнопкой, потому что она не обязательно физически расположена слева от указательного устройства.
Так как я могу отличить guish нажатие основной кнопки от вторичное нажатие кнопки? Кроме того, как я могу различить guish между нажатием и отпусканием кнопки?
Мой обратный вызов зарегистрирован для IOHIDManagerRegisterInputValueCallback
для справки:
static void fn_imp_mb_cb(
void* ctx,
IOReturn res,
void* sender,
IOHIDValueRef value) {
IOHIDElementRef element = IOHIDValueGetElement(value);
const uint32_t usage_page = IOHIDElementGetUsagePage(element);
const uint32_t usage = IOHIDElementGetUsage(element);
const CFIndex val = IOHIDValueGetIntegerValue(value);
struct fn_event ev = {0};
if(usage == kHIDUsage_GD_X || usage == kHIDUsage_GD_Y) {
ev.type = fn_event_type_mouse_moved;
if(usage == kHIDUsage_GD_X) ev.mouse.dx = val;
else ev.mouse.dy = val;
fn_imp_push_event(&ev);
}
if(usage_page == 0x09)
printf("0x09; U: %u\n", usage);
}