Есть ли способ для моего двоичного файла реагировать на некоторые глобальные горячие клавиши в Linux? - PullRequest
2 голосов
/ 16 сентября 2008

Можно ли прослушать определенную горячую клавишу (например, Ctrl - I ) и затем выполнить определенное действие? Мое приложение написано на C, будет работать только в Linux и не имеет графического интерфейса. Существуют ли какие-либо библиотеки, которые могут помочь с такой задачей?

РЕДАКТИРОВАТЬ: например, amarok имеет глобальные сочетания клавиш, например, если вы сопоставляете комбинацию клавиш с действием (скажем, Ctrl - + , Ctrl и + ) вы можете выполнить это действие при нажатии клавиш. Если бы я сопоставил Ctrl - + с действием увеличения громкости, каждый раз, когда я нажимаю ctrl - + громкость должна увеличиться на определенную величину.

Спасибо

Ответы [ 5 ]

4 голосов
/ 16 сентября 2008

Насколько глобальными должны быть ваши горячие клавиши? Достаточно ли им быть глобальным для X-сессии? В этом случае вы сможете открыть соединение Xlib и прослушать нужные вам события.

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

Я нашел хороший пример здесь .

3 голосов
/ 16 сентября 2008

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

Боюсь, нелегко учиться; Я нашел этот пример, который кажется полезным: TinyWM . Я также нашел пример с использованием Java / JNI (доступ к той же базовой функции Xlib).

2 голосов
/ 16 сентября 2008

Вы должны посмотреть на исходный код xbindkeys .

Программирование на Xlib довольно загадочно, трудно найти документацию и есть тонкие проблемы с переносимостью. Вам лучше скопировать какой-нибудь закаленный в битве код.

1 голос
/ 16 сентября 2008

Один из способов сделать это - заставить ваше приложение прослушивать определенный порт или файл сокета для входящих запросов.

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

Затем вы можете настроить свой оконный менеджер для привязки определенных комбинаций клавиш для запуска вашего небольшого клиентского приложения.

0 голосов
/ 16 сентября 2008

В UNIX ваш доступ к оболочке командной строки осуществляется через терминал . Это восходит к тем дням, когда люди обращались к своим большим общим компьютерам буквально через терминалы, подключенные напрямую к машинам (например, через последовательный кабель).

На самом деле, программа 'xterm' или любая другая производная, которую вы используете в своей UNIX-системе, правильно называется эмулятором терминала - она ​​ведет себя (как с вашей, так и с операционной точки зрения ) так же, как одна из тех старомодных терминальных машин.

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

man 5 terminfo

в системе Linux для получения дополнительной информации.

Теперь, хорошая новость заключается в том, что вам не нужно слишком много возиться с возможностями терминала и т. Д., Чтобы иметь приложение командной строки, которое делает интересные вещи с функциями ввода или управления окнами. Есть библиотека, curses , которая поможет. Lookup

man 3 ncurses

в вашей системе Linux для получения дополнительной информации. Вы, вероятно, сможете найти достойное руководство по использованию проклятий онлайн.

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