Linux: Запретить включение клавиатуры под X

506
Rena

Я пытаюсь связать ключ (используя xbindkeys), чтобы включить / выключить мои мониторы под X. Пока у меня есть ключ, связанный с этим сценарием:

#!/bin/bash MOUSE="Logitech USB-PS/2 Optical Mouse"  if [[ ! -z $(xset q | grep "Monitor is On") ]]; then logger "Turning off display" xinput disable "$MOUSE" xset s 2 2 xset dpms force off else logger "Turning on display" xinput enable "$MOUSE" xset s 3600 3600 xset dpms force on fi 

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

К сожалению, кажется, что это не работает, когда на самом деле привязан к клавише: он всегда считает, что экран включен. Я подозреваю, что это потому, что нажатие клавиши снова включает их, а затем запускает сценарий, который снова отключает их.

Я не могу найти способ предотвратить автоматическое включение экрана при нажатии клавиш, кроме как полностью отключить клавиатуру (что затруднит повторное включение).

Еще лучшим решением было бы, если бы я мог запустить скрипт в любое время, когда экран включается / выключается; тогда я смогу снова включить экран, нажав любую клавишу, а не только ту, которая привязана к этому сценарию.

4
IIRC X11 предоставляет три события для каждого нажатия клавиши: нажатие клавиши, нажатие клавиши (возможно, повторное) и нажатие клавиши вверх. Убедитесь, что ваш скрипт не вызывается более чем одним из них. a CVn 9 лет назад 0

2 ответа на вопрос

2
holytrousers

Сценарий запускается сразу после нажатия связанной кнопки, но экран снова включается только после отпускания.

Вы можете проверить это, введя

xset dpms force off 

в вашем терминале и удерживая Enter.

Экран остается выключенным до тех пор, пока вы не отпустите клавишу, а затем сразу же снова включится.

Простой обходной путь - добавить небольшую задержку, чтобы запустить xsetкоманду после отпускания ключа (например, с помощью sleepкоманды).

1
Toby Speight

Что-то, что я сделал, это использовал xscreensaver(установил только пустой экран, чтобы не запускать какие-либо графические хаки), а затем просмотрите его, используя xscreensaver-command -watch:

 -watch Prints a line each time the screensaver changes state: when the screen blanks, locks, unblanks, or when the running hack is changed. This option never returns; it is intended for use by shell scripts that want to react to the screensaver in some way. An example of its output would be: BLANK Fri Nov 5 01:57:22 1999 RUN 34 RUN 79 RUN 16 LOCK Fri Nov 5 01:57:22 1999 RUN 76 RUN 12 UNBLANK Fri Nov 5 02:05:59 1999 

Страница man содержит пример, который стоит посмотреть.

К сожалению, фондовая xscreensaverбиржа настаивает на том, чтобы время от времени устанавливать для параметров DPMS свои собственные значения. Я представил патч, чтобы остановить это, но jwz отказался. Вы можете найти этот патч полезным или просто скомпилировать xscreensaver --without-dpms-ext.

В качестве альтернативы может быть полезно изучить xscreensaverкод, чтобы понять, как написать свой собственный наблюдатель.

Похожие вопросы