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

Я пытаюсь связать ключ (используя 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 секунды (на случай, если что-то его разбудит) и выключает экран. Если он выключен, он восстанавливает предыдущие настройки и снова включает экран.

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

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

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

2 ответа

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

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

xset dpms force off

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

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

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

Я сделал что-то, чтобы использовать 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 код для подсказок о том, как написать свой собственный наблюдатель.

Другие вопросы по тегам