Итак, я просмотрел документацию по модулю 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
, как сенсорная панель.Если у меня будет время, я постараюсь выяснить, что такое комбинация, и обновлю это решение.