4

Я пытаюсь связать ключ (используя 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 ответа2

2

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

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

xset dpms force off

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

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

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

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .