Есть ли способ, чтобы мой двоичный файл реагировал на некоторые глобальные горячие клавиши в Linux?
Вопрос
Можно ли прослушивать определенную горячую клавишу (например:Ctrl-я), а затем выполнить определенное действие?Мое приложение написано на C, работает только в Linux и не имеет графического интерфейса.Есть ли библиотеки, которые помогают с такой задачей?
РЕДАКТИРОВАТЬ:например, в amarok есть глобальные ярлыки, поэтому, например, если вы сопоставляете комбинацию клавиш с действием (скажем, Ctrl-+, Ctrl и +) вы можете выполнить это действие при нажатии клавиш.Если бы я составил карту Ctrl-+ к действию увеличения громкости, каждый раз, когда я нажимаю Ctrl-+ объем должен увеличиться на определенную величину.
Спасибо
Решение
Насколько глобальными должны быть ваши горячие клавиши?Достаточно ли им быть глобальными для X-сессии?В этом случае вы сможете открыть соединение с Xlib и прослушивать нужные вам события.
Обычно события клавиатуры в X доставляются в окно, которое в данный момент находится в фокусе, и распространяются вверх по иерархии, пока не будут обработаны.Очевидно, что это не то, чего мы хотим.Нам нужно обработать событие до того, как к нему сможет добраться любое другое окно.Нам нужно позвонить XGrabKey в корневом окне с помощью кода ключа и модификаторов нашей горячей клавиши для этого.
Я нашел хороший пример здесь.
Другие советы
Я думаю смуфра здесь на правильном пути;вы хотите зарегистрировать глобальную горячую клавишу с помощью X, чтобы можно было перехватывать нажатия клавиш и предпринимать соответствующие действия. Xlib вероятно, это то, что вы хотите, и XGrabKey это функция, я думаю.
Боюсь, этому нелегко научиться;Я нашел этот пример, который кажется полезным: TinyWM.Я также нашел пример использование Java/JNI (доступ к той же базовой функции Xlib).
Вам следует посмотреть исходный код xbindkeys.
Программирование Xlib довольно запутанно, документацию трудно найти, и есть небольшие проблемы с переносимостью.Вам лучше скопировать какой-нибудь закаленный в боях код.
Один из способов сделать это — заставить ваше приложение прослушивать определенный порт или файл сокета на предмет входящих запросов.
Затем вы можете написать небольшое клиентское приложение, которое подключается к этому порту или файлу сокета и отправляет команды работающему приложению.
Затем вы можете настроить свой оконный менеджер для привязки определенных комбинаций клавиш для запуска вашего небольшого клиентского приложения.
В UNIX доступ к оболочке командной строки осуществляется через Терминал.Это восходит к тем временам, когда люди получали доступ к своим большим общим компьютерам буквально через терминалы, подключенные непосредственно к машинам (например,через последовательный кабель).
Фактически, программа «xterm» или любая другая ее производная, которую вы используете в своем компьютере UNIX, правильно называется эмулятор терминала - он ведет себя (как с вашей точки зрения, так и с точки зрения операционной системы) очень похоже на одну из этих старомодных терминальных машин.
Это немного усложняет обработку ввода интересными способами, поскольку существует множество различных типов терминалов, и ваша UNIX-система должна знать о возможностях каждого типа.Эти возможности традиционно хранились в термкап файл, и я думаю, что более современные системы используют термининформация вместо.Пытаться
man 5 terminfo
в системе Linux для получения дополнительной информации.
Хорошая новость заключается в том, что вам не нужно слишком много возиться с возможностями терминала и т. д.иметь приложение командной строки, которое делает интересные вещи с функциями ввода или работы с окнами.Есть библиотека, проклятия, это поможет.Искать
man 3 ncurses
в вашей системе Linux для получения дополнительной информации.Вероятно, вы сможете найти в Интернете достойное руководство по использованию проклятий.