Режим киоска для приложения Linux Java Swing

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


person Hollis Waite    schedule 20.10.2011    source источник


Ответы (1)


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

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

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

Редактировать:

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

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

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

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

person Keith Irwin    schedule 20.10.2011
comment
У установщика приложения будет аутентификация на уровне администратора, но это предел моего контроля над системой. Вы говорите, что мне нужно заставить ОС использовать определенный оконный менеджер перед запуском моего Java-приложения? Это параметр, который я могу автоматически переключать при запуске приложения и возвращать его после завершения выполнения (изящно или иначе)? Нужны ли мне права суперпользователя, чтобы сделать что-то подобное? Я всегда представлял себе, что видеоигры для Linux каким-то образом управляют враждебным захватом произвольно сконфигурированных машин. Возможно, я смогу использовать любую библиотеку, которую они используют. - person Hollis Waite; 20.10.2011
comment
Я был бы очень удивлен, если бы очень многие игры для Linux использовали такие комбинации, как ctrl-alt-backspace и подобные. Они не пытаются заблокировать пользователя от ОС, просто избегают случайного переключения. Это гораздо более легкая проблема. - person Keith Irwin; 20.10.2011
comment
Некоторые гуглы выдают разные мнения о том, возможно ли это. Эта тема: fixunix .com/xwindows/ утверждает, что VMWare удается захватить эти вводы с клавиатуры, когда она перехватывает ввод с клавиатуры, и предполагает, что она каким-то образом использует для этого DRI. Часто задаваемые вопросы по xscreensaver: jwz.org/xscreensaver/faq.html #no-ctl-alt-bs, с другой стороны, говорит, что это невозможно. Возможно, раньше это было возможно, но сейчас это невозможно. Однако одно я могу гарантировать: если это возможно, это боль. - person Keith Irwin; 20.10.2011
comment
Что, если я откажусь от некоторых более амбициозных требований? Я могу жить с пользователями, которые могут убить приложение или выйти из системы. Хочу сделать максимально неудобным использование других приложений, пока мое активно. Если надежное решение нетривиально, я бы согласился отключить Alt-Tab, Ctrl-Alt-Right/Left и другие сочетания клавиш для переключения задач, где это возможно. Может быть, создать пустое окно всегда в верхнем окне на каждой из рабочих областей пользователя. Если дело дойдет до драки, я также могу отключить приложение для оконных менеджеров, отличных от Gnome. По сути, я хотел бы реализовать все контрмеры, которые можно квалифицировать как гораздо более легкую проблему. - person Hollis Waite; 21.10.2011
comment
Я обновил ответ выше, чтобы ответить на более простую версию проблемы, насколько это возможно. Я удалил комментарий, который был здесь раньше, потому что все детали из него были перенесены в этот ответ, а также немного больше. Кстати, спасибо за прием. - person Keith Irwin; 21.10.2011