Отличительные кнопки мыши / указателя на macOS - PullRequest
0 голосов
/ 17 апреля 2020

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...