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

StackOverflow https://stackoverflow.com/questions/74790

  •  09-06-2019
  •  | 
  •  

Вопрос

Можно ли прослушивать определенную горячую клавишу (например: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 для получения дополнительной информации.Вероятно, вы сможете найти в Интернете достойное руководство по использованию проклятий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top