Как захватить необработанный ввод мыши в X11? - PullRequest
4 голосов
/ 15 января 2011

Для версии моего приложения для Windows я использую WM_INPUT и регистрирую устройство мыши напрямую, чтобы получить наиболее точные движения. Как мне поступить так в X11?

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Есть несколько способов сделать это, в зависимости от используемой платформы.

Если вы собираетесь сделать это с помощью «Xlib», самого основного способа программирования для X11, вам следует взглянуть на Руководство по Xlib , уделяя особое внимание XInput. Более подробную информацию можно получить с помощью XI2 (версия XInput 2)

Другие структуры более высокого уровня могут упростить задачу. Посмотрите на Qt . Это один из лучших API GUI, который я когда-либо видел.

Скажите нам, если вам нужно больше.

1 голос
/ 06 июня 2014

Вот одиннадцать ссылок, которые предоставляют справочную информацию, советы и два разных подхода для получения необработанных движений мыши в Linux. Ссылка № 2 (Python) показывает традиционный способ чтения устройства мыши и # 1 (C) , # 3 (Python) и # 4 (C) показать путь событий. Протокол ps / 2 описан в link # 5 . Ссылка # 6 - пример командной строки.

Каждый из двух подходов обходит X (Xlib), получая из файла драйвера устройства поток дельт в направлениях x и y. Вместо дельт, Xlib традиционно предоставляет только положение окна (или экрана), поэтому вы должны продолжать перемещать указатель от края окна, если хотите продолжать получать показания в определенном направлении. [См. ссылка # 8 для быстрого обсуждения взлома «деформации по центру», используемого многими программами с X.] Однако новое расширение XInput 2.0 ( ссылка # 10 ), однако, предлагает X API для получения дельт (вам может понадобиться связать как минимум -lX11 и -lXi).

Суть любого из двух подходов к устройству заключается в следующем:

1: открыть для чтения чего-то вроде устройства "/ dev / input / mouse0" или чего-то подобного (это зависит от имени вашего дистрибутива, а также от того, какой метод вы хотите использовать, / dev / input / event4 для другого подхода) ).

2: читать из него. Каждые так много байтов представляют движение мыши. Например, для метода необработанного протокола ps / 2, например, открыв mouse [n], как описано выше, вы в основном хотите только 2-й и 3-й байты каждой 3-байтовой последовательности, если вам нужно только движение x, y. Второй байт представляет X. Третий представляет Y. Каждый из двух байтов представляет собой одно значение int8_t (8 бит со знаком). Положительный X, кажется, справа, нет проблем; однако положительный Y кажется восходящим (как в большинстве учебников по математике), в то время как на экране положительный Y обычно считается идущим вниз от верхнего левого угла экрана (по сравнению с повышением от нижнего левого угла в качестве источника в типичной Декартова система координат).

Другие примечания: Вы можете использовать open / read вместо fopen / getc, если вы используете X (см. ссылка # 7 и код в других ссылках). Если вы хотите состояние кнопки мыши для первых 3 кнопок или хотите подтвердить подпись x или y, посмотрите также на первый байт. [Я сомневаюсь, что переполнение является проблемой в обычном «потоковом» использовании, но эти биты тоже есть.] Вы можете заметить, если вы экспериментируете с командной строкой Linux, например, быстрое «cat» to «less», что большинство движений всего 1 единица (много ^ A ^ @ и ). Это может зависеть от того, как настроена мышь и насколько она способна. Ссылка # 5 охватывает простой протокол и даже охватывает стандартное расширение Microsoft intellimouse для кнопок 4 и 5 и колесико мыши. Ссылка # 11 охватывает конфигурацию микросхем / логики контроллера для мыши или клавиатуры ps / 2. Это объясняет, как мышь настраивается этим интерфейсом. Существует инструмент ( ссылка № 9, xdotool ), который имитирует щелчки мыши, чтобы помочь автоматизировать задачи управления окнами. Наконец, вам может потребоваться быть пользователем root для чтения непосредственно с этих устройств (зависит от вашего дистрибутива).

...