Как evdev определяет, стоит ли перемещать курсор x11? - PullRequest
1 голос
/ 04 мая 2019

Я начинаю копаться в API evdev на Linux с целью поиграться с эмуляцией uinput.Я заметил, что между джойстиком и сенсорной панелью есть разные коды событий кнопок / клавиш, чтобы различать нажатия кнопок джойстика и щелчки мыши.Но оба устройства имеют коды событий для оси ABS_X и ABS_Y.

joystick dump:
#   Event type 3 (EV_ABS)
#     Event code 0 (ABS_X)
#       Value      128
#       Min          0
#       Max        255
#       Fuzz         0
#       Flat        15
#       Resolution   0
#     Event code 1 (ABS_Y)
#       Value      103
#       Min          0
#       Max        255
#       Fuzz         0
#       Flat        15
#       Resolution   0

touchpad dump:
#   Event type 3 (EV_ABS)
#     Event code 0 (ABS_X)
#       Value     3909
#       Min       1270
#       Max       5670
#       Fuzz         0
#       Flat         0
#       Resolution  44
#     Event code 1 (ABS_Y)
#       Value     3835
#       Min       1240
#       Max       4746
#       Fuzz         0
#       Flat         0
#       Resolution  66

Так как же x11 узнает, следует ли рассматривать узел '/ dev / input / eventX' как джойстик или мышь для перемещения экранного курсора?Есть ли какой-нибудь ioctl, который я могу использовать, чтобы установить, загружается ли устройство на x11?Что-то еще, что драйвер должен сделать, чтобы указать это?

Я осмотрел некоторые сообщения об ошибках и обнаружил, что были случаи в старых выпусках, когда джойстик перемещал мышь при подключении, но я не мог найти какие-либопатчи, которые указывали бы на то, что они изменили, чтобы обозначить это различие с x11.

Прежде чем кто-то скажет это, я знаю, что использование libevdev, если оно предпочтительнее, чем прямые вызовы uinput на практике, но это только для образовательных целей.И даже там у меня такой же вопрос.

1 Ответ

1 голос
/ 07 мая 2019

Итак, я просмотрел документацию по модулю uinput и пример кода.Я заметил, что в своем примере кода для симуляции мыши они добавили событие для левой кнопки мыши (BTN_LEFT) с помощью вызовов ioctl

ioctl(fd, UI_SET_EVBIT, EV_KEY);
ioctl(fd, UI_SET_KEYBIT, BTN_LEFT);

. Мне показалось странным, что они включили этот тип событий, так какони только перемещают (и не щелкают) мышь в примере кода, и, конечно же, удаление этих ioctl заставило события оси не влиять на указатель x11.

Теперь в своем примере кода они используют события относительной оси (REL_X, REL_Y) для движения мыши, а не для абсолютных событий, о которых я говорил (ABS_X, ABS_Y).Это потому, что они имитируют реальную мышь, а не сенсорную панель.Но это подсказало мне, что x11 ищет определенные типы событий, которые должны быть перечислены в битах устройства, чтобы определить, какое это устройство.

В качестве дальнейшего подтверждения этой теории я обнаружил эту заметку в обнаружениираздел геймпад устройства в той же документации.All gamepads that follow the protocol described here map BTN_GAMEPAD. This is an alias for BTN_SOUTH/BTN_A. It can be used to identify a gamepad as such. Хотя это явно ничего не говорит о мышах или сенсорных панелях, оно поддерживает идею о том, что определенные биты событий, установленные на устройствах ввода, используются для определения того, как x11 обрабатывает ввод с этих устройств.Я обнаружил, что создание устройства геймпада, которое устанавливает бит BTN_GAMEPAD, будет по-прежнему функционировать как мышь, если вы также установите бит BTN_LEFT и биты REL_X REL_Y, так что кажется, что то, что делает x11, просто выглядитдля нескольких ключевых битов, которые будут установлены для обработки чего-либо как мыши.

Хорошо, вернемся к проблеме с сенсорной панелью / джойстиком, я еще не выяснил, как имитировать сенсорную панель, чтобы проверить, какие именно биты необходимоустановить для x11 распознавание устройства в качестве сенсорной панели, хотя я подозреваю, что в этом играет роль событие BTN_TOUCH.Какой бы ни была комбинация битов событий, которая заставляет x11 распознавать устройство как сенсорную панель и перемещать указатель, очевидно, что эта комбинация обычно не встречается на геймпаде, и именно это указывает x11, что джойстик не должен перемещать курсор, несмотря наон имеет оси ABS_X и ABS_Y, как сенсорная панель.Если у меня будет время, я постараюсь выяснить, что такое комбинация, и обновлю это решение.

...