Получение событий на определенных клавишах с X11 в Linux - PullRequest
3 голосов
/ 27 декабря 2010

Я пишу программу на C ++ для реализации функции подсветки клавиатуры из OS X на MacBook Pro с дистрибутивом Linux.До сих пор он включает подсветку, при загрузке, и если в течение 20 секунд не регистрируются события клавиатуры и мыши, он выключает его и, конечно, снова включает, когда регистрируется событие.Следующее, что мне нужно, чтобы программа сделала, это захватывать нажатия клавиш на клавишах подсветки клавиатуры вверх / вниз, но я не уверен, как к этому подойти.время событий клавиатуры и мыши, так что метод с использованием API X11 будет в порядке.Я много гуглил, но так и не нашел пути, по которому я был уверен в этом.Проблема, которую я вижу со многими методами, которые я обнаружил, состоит в том, что они используют код ключа для идентификации ключа, но я не думаю, что это было бы жизнеспособным решением, поскольку программа должна работать для любой доступной раскладки клавиатуры.

Любая идея метода и API, я должен пойти с?Что будет работать лучше?

С уважением,

Ответы [ 2 ]

2 голосов
/ 28 декабря 2010

Обычный способ сделать это с помощью XGrabKey ().Он использует коды клавиш, но вы бы не жестко закодировали его, вы бы получили его с помощью XKeysymToKeycode ().Чтобы быть более точным, вы также захотите повторить захват, когда получите MappingNotify (XMappingEvent).(Обратите внимание, MappingNotify, not MapNotify.) Если для этих ключей не существует keysym - вероятно, их нет в старых версиях X, но, надеюсь, в более новых версиях X.org они есть - тогда у вас просто естьжестко связать код ключа.Который не будет очень надежным или переносимым, но, вероятно, будет работать для всех в Linux с той же аппаратной моделью.

Будьте готовы к тому, что захваты клавиш являются глобальными, поэтому, если вы попытаетесь использовать XGrabKey (), а что-то еще уже захваченоэтот ключ, вы получите ошибку X - по умолчанию, которая выходит из программы.Еще одна особенность XGrabKey () заключается в том, что он захватывает ключ с точным набором модификаторов.Например, чтобы справиться как с NumLock, так и без него, вам нужно захватить его дважды.См. Глобальная горячая клавиша с X11 / Xlib

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

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

2 голосов
/ 28 декабря 2010

Если вы еще этого не сделали, ознакомьтесь с xev.Запустите его, наведите фокус и нажмите клавиши, чтобы увидеть, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...