Как работают события мыши в Linux?


25

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

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

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

Вопрос в том, как это работает в Linux, существуют ли определенные системные вызовы, библиотеки c и т. Д.?

Ответы:


28

Если вы пишете реальную программу, которая использует мышь в Linux, вы, скорее всего, пишете X-приложение, и в этом случае вам следует запросить X-сервер о событиях мыши. Qt , GTK и libsdl - некоторые популярные библиотеки C, которые предоставляют функции для доступа к мыши, клавиатуре, графике, таймерам и другим функциям, необходимым для написания программ с графическим интерфейсом. Ncurses - похожая библиотека для терминальных приложений.

Но если вы изучаете свою систему или не можете использовать X по какой-либо причине, вот как это работает на интерфейсе ядра.

Основная идея философии UNIX заключается в том, что «все это файл». Более конкретно, как можно больше вещей должно быть доступно через одни и те же системные вызовы, которые вы используете для работы с файлами. И поэтому интерфейс ядра мыши - это файл устройства. Вы можете open(), по желанию, позвонить poll()или select()узнать, есть ли входящие данные, и read()прочитать данные.

Во времена до USB конкретным файлом устройства часто был последовательный порт, например /dev/ttyS0, или порт PS / 2 /dev/psaux. Вы говорили с мышью, используя любой аппаратный протокол, встроенный в мышь. В наши дни /dev/input/*подсистема является предпочтительной, поскольку она обеспечивает унифицированный, независимый от устройства способ обработки множества различных устройств ввода. В частности, /dev/input/miceвам сообщат о событиях от любой мыши, подключенной к вашей системе, а /dev/input/mouseNтакже события от определенной мыши. В большинстве современных дистрибутивов Linux эти файлы создаются динамически, когда вы подключаете мышь.

Для получения дополнительной информации о том, что именно вы будете читать или записывать в файл устройства мыши, вы можете начать с input / input.txt в документации ядра. В частности, посмотрите разделы 3.2.2 (mousedev) и 3.2.4 (evdev), а также разделы 4 и 5.


8

Как правило, информация с аппаратных устройств предоставляется приложениям через файлы устройств . Для мышей в современных системах Linux это устройство /dev/mice(это устройство собирает события от всех подключенных мышей, также есть устройства, соответствующие каждой отдельной мыши).

Когда вы перемещаете или щелкаете мышью, мышь посылает электрический сигнал на компьютер, который вызывает прерывание . Часть кода в ядре Linux, называемая обработчиком прерываний, в свою очередь считывает данные события (например, какая кнопка была нажата) и запускает цепочку уведомлений внутри ядра.

Если есть какое-либо приложение, которое читает файл устройства, соответствующий этому устройству, этому приложению сообщают, что ввод ожидает. Например, если приложение заблокировано в системном вызове , системный вызов возвращается.read

В типичной системе существует один процесс чтения событий мыши: сервер X Window . Эта программа управляет графическим дисплеем и периферийными устройствами ввода. Затем отдельные графические приложения уведомляются о событиях мыши через общий протокол событий X, который переносит другие типы событий, такие как нажатия клавиш, изменения фокуса окна, изменения видимости окна,…

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.