Режим киоска для приложения Linux Java Swing - PullRequest
2 голосов
/ 20 октября 2011

Как отключить сочетания клавиш на уровне ОС (например, Alt-Tab, Ctrl-Alt-Left / Right и т. Д.) На компьютере [Ubuntu] Linux?Я занимаюсь разработкой полноэкранного приложения на Java Swing и не хочу, чтобы пользователь мог произвольно переключаться с программы.Недостаточно переключить флаг «всегда сверху»;пользователям не должно быть позволено переключать рабочие пространства, переносить фокус или любые другие подобные вещи.Машина должна нормально функционировать до и после выполнения приложения.Google говорит, что для этого потребуется JNI или JNA, но я ищу немного больше рук.

1 Ответ

4 голосов
/ 20 октября 2011

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

Опции для оконных менеджеров, которые могут сделать это, включают KDE или twm-kiosk .

(И если у вас нет контроля над платформой, вы вряд ли сможете заставить ваше приложение перехватывать такие вещи, как ctrl-alt-backspace.)

Edit:

В ответ на уменьшенную версию вопроса, в котором он хочет, чтобы такие вещи, как CTL-Alt-Backspace пойти и просто хочет большинство клавиш, включая Alt-Tab или других аналогичных приложений переключения комбинации клавиш, следующие должны работа:

Вы должны быть в состоянии сделать это, используя метод XLib XGrabKeyboard через JNI. Это руководство по захвату нажатий клавиш Java / XLib JNI должно стать хорошей отправной точкой. Однако он использует XGrabKey, который просто пассивно прослушивает ключи и не мешает другим приложениям получать их. Вместо этого вы будете использовать XGrabKeyboard активно коряги все обычные клавиатуры событий (которые, если посылка это StackOverflow вопрос правильно, включает в себя задачу переключения ключей).

Обратите внимание, что в качестве побочного эффекта, ключ захвата в свинг также, вероятно, перестанет работать, потому что ваши распашные окна будут отделены от окна создаваемого в C. Таким образом, вы, вероятно, придется использовать интерфейс JNI для при необходимости нажимайте клавиши в вашей программе. (Хотя я бы определенно посоветовал сначала протестировать его перед написанием кода.) Вы можете избежать этого, если получите окно, используя собственный интерфейс Java AWT для получения идентификатора окна. (Обратите внимание, что Swing построен поверх AWT, так что это будет работать для Swing.) Однако я не уверен, как это сделать. Похоже, что вы могли бы перемещаться по дереву окон, получив корневое окно с дисплея и перейдя оттуда к своему окну, но все это довольно странно. Было бы неплохо, если бы AWT NI только что сказал вам идентификатор окна, но, похоже, это не так.

В этой предупредительной Напоминание: XGrabKeyboard не интерфейс безопасности примечания, это не делает его невозможным для других программ, чтобы увидеть ключи, но вполне вероятно, что оконные менеджеры не должны использовать XQueryKeyMap так это может предотвратить переключение задач.

...