Есть ли способ, чтобы мой двоичный файл реагировал на некоторые глобальные горячие клавиши в Linux?

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

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

Спасибо


person Vhaerun    schedule 16.09.2008    source источник


Ответы (5)


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

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

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

person smoofra    schedule 16.09.2008
comment
Не могли бы вы немного подробнее? - person Vhaerun; 16.09.2008

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

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

person zweiterlinde    schedule 16.09.2008

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

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

person ddaa    schedule 16.09.2008

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

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

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

person Chris AtLee    schedule 16.09.2008
comment
Я думал об этом, но поскольку amarok и другие приложения могут это делать, у меня тоже должен быть способ сделать это. - person Vhaerun; 16.09.2008

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

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

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

man 5 terminfo

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

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

man 3 ncurses

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

person Incident    schedule 16.09.2008