Как подготовить монитор к использованию xset в настройке нескольких мониторов?

10

Имея два или более монитора, работающих вместе, есть ли способ перевести один из них в режим ожидания / приостановки, выполнив команду типа xset dpms force suspend:? или время, установленное для этой цели, например: xset dpms 100 0 0которое работает на этих мониторах отдельно?

У меня работают два монитора, eDP1 (мой ноутбук) и VGA1 (внешний монитор).

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

Я не заинтересован в использовании, xrandor --off --output eDP1потому что он недостаточно быстр для работы.

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

  • Запуск: Ubuntu 18.04
  • Диспетчер окон: OpenBox
Ravexina
источник
Это из-за энергетических соображений, или визуальное решение подойдет?
Джейкоб Влейм
@Ravexina Вопрос, как далеко уходит ваша подсветка eDP1? Это выключает яркость полностью? Если да, не могли бы вы проверить две команды, которые у меня были в ответе askubuntu.com/a/814043/295286 ? Заранее благодарю за ответ
Сергей Колодяжный
1
@Ravexina сделано, кажется, работает безупречно, но будет работать в течение дня, опубликует это поздно вечером. Он будет вести запись активности на экране, но никогда не тускнеет / не выключает экран, где находится мышь, верно?
Джейкоб Влейм
1
Хорошо, тогда я, вероятно, постараюсь реализовать отслеживание окон на выходных. К сожалению, у меня не так много времени, чтобы разобраться с этими вещами прямо сейчас.
Сергей Колодяжный
1
@Ravexina, спасибо. Я, вероятно, скоро опубликую другую (vala) версию, вызванную либо активным окном, либо (если нет действительного окна) действием мыши. Также посмотрим, сможем ли мы что-то сделать с подсветкой, что, вероятно, также сэкономит немного энергии. Время во время бонуса просто слишком мало, но вопрос достаточно интересен, чтобы играть немного дальше. Продолжение следует. Еще раз спасибо.
Джейкоб Влейм

Ответы:

5

Управление отдельными мониторами невозможно с помощью xset (и X11 на самом деле)

Как следует из названия, это невозможно по причинам, связанным со сборкой, xset и из-за функций X11, которые он использует. Если мы посмотрим на исходный код, xsetвызовы DPMSForceLevel(dpy,DPMSModeSuspend)( строка 557 ) и переменную отображения, dpyполученную из XOpenDisplay()функции ( строка 203 ), и это по определению :

Сервер вместе с его экранами и устройствами ввода называется дисплеем.

Другими словами, xsetнастройки применяются глобально ко всему экрану, а не к отдельным экранам. Было бы необходимо изменить xsetисходный код, чтобы это работало. Сами расширения DPMS чаще всего вызывают только весь экран, а не отдельные экраны, поэтому невозможно даже написать собственный код с библиотекой X11.

Ручное управление этим параметром через /sysподсистему также не работает

$ sudo bash -c 'echo Off > /sys/class/drm/card0-VGA-1/dpms'
[sudo] password for admin: 
bash: /sys/class/drm/card0-VGA-1/dpms: Permission denied

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

Альтернативные обходные пути

Лучшая альтернатива (и фактически физически работающее решение) xrandr- это может быть использовано для контроля отдельных «результатов». В частности,

xrandr --output VGA-1 -off

отключит этот выход. Да, вы упомянули, что не хотите использовать это решение, поскольку оно недостаточно быстрое, однако пока оно является лучшим из доступных. У него есть пара преимуществ:

  • невосприимчив к событиям клавиш и мыши
  • самостоятельно контролирует выход в отличие xset

xrandr --output VGA-1 --brightness 0.1Будет раскрасить экран таким образом , что он появляется прочь, даже если --brightnessэто программное решение, так что дисплей не фактически недоступен на аппаратном уровне, и он выключен на аппаратном уровне. Тем не менее, он выполняет работу по очистке экрана и устойчив к событиям нажатия клавиш / мыши.

Я посмотрел исходный код скринсейверов Mate и Budgie, которые являются вилками заставки GNOME, однако в любом случае они кажутся программным решением, поскольку в исходном коде нет упоминания о DPMS.

Сергей Колодяжный
источник
Мне нравятся альтернативы ... +1
Fabby
1
@Fabby Спасибо :) Пока что это лучшая альтернатива
Сергей Колодяжный
Я думаю, что оконные менеджеры делают некоторые трюки и могут предоставить некоторые хуки. Существует сайт обмена стеками, который называется «Разработка программного обеспечения», и это может быть хорошим местом, чтобы выразить мысль о том, что когда в главном окне (например, веб-браузер, но не Conky или время показа верхней панели) нет изменений пикселей в течение, например, 10 минут, весь монитор (только один) начинает тускнеть более 30 секунд, пока не станет полностью черным. Затем при наведении курсора мыши на этот монитор (я обычно использую 3 монитора) постепенно восстанавливается яркость в течение периода от 1 до 5 секунд.
WinEunuuchs2Unix
@ WinEunuuchs2Unix У меня есть идея, и есть несколько вещей, за которыми нужно следить, но это сложно, и да, зависит от рассматриваемого оконного менеджера. Проблема в DPMS. С DPMS либо все тускнеет, либо ничего. Лучший мы можем сделать xrandr --offсейчас
Сергей Kolodyazhnyy
Мои знания DPMS ограничены. Я думаю, что это экономит электроэнергию для стоянки / сна. Существует также HDMI-CEC, который может дать те же результаты, но для меня это еще одна волшебная черная дыра. Я не знаю, xrandr -offвыключит ли даже монитор. Это может быть так же, как brightnessустановить на ноль? Что является еще одной проблемой, у меня есть программа, работающая 24/7, которая устанавливает яркость и гамму отдельно для 3 мониторов, чего не может сделать даже Windows. Не уверен, что это делает ночной свет, красное смещение или поток. В любом случае, эти программы могут быть испорчены xrandr off. Извините за угон вашего ответа с размышлениями :)
WinEunuuchs2Unix
4

В течение многих лет я настраивал свой ноутбук таким образом, чтобы при закрытой крышке ноутбук зависал, а внешние мониторы гасли.

Если вы хотите посмотреть видео на внешнем мониторе в течение 90 минут и оставить экран ноутбука пустым, я изменил параметр закрытия крышки на «Ничего не делать»:

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

Я не использую DPMS для внешних мониторов, но вы можете проверить настройки с помощью xset qкоманды:

$ xset q
Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000002
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    on     02: Scroll Lock: off
    03: Compose:     off    04: Kana:        off    05: Sleep:       off
    06: Suspend:     off    07: Mute:        off    08: Misc:        off
    09: Mail:        off    10: Charging:    off    11: Shift Lock:  off
    12: Group 2:     off    13: Mouse Keys:  off
  auto repeat delay:  500    repeat rate:  33
  auto repeating keys:  00ffffffdffffbbf
                        fadfffefffedffff
                        9fffffffffffffff
                        fff7ffffffffffff
  bell percent:  50    bell pitch:  400    bell duration:  100
Pointer Control:
  acceleration:  5/1    threshold:  5
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  0    cycle:  0
Colors:
  default colormap:  0xb3    BlackPixel:  0x0    WhitePixel:  0xffffff
Font Path:
  /usr/share/fonts/X11/misc,/usr/share/fonts/X11/Type1,built-ins
DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled

Обратите внимание на эти строки:

Screen Saver:
  prefer blanking:  yes
  • Вы, вероятно, захотите prefer blanking: no

Также обратите внимание на эти строки:

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • Вы, вероятно, захотите DPMS is enabledустановить монитор на Standbyкогда это необходимо.

Надеемся, что другие пользователи использовали эти опции и опубликовали подробный ответ для вас.

WinEunuuchs2Unix
источник
4

Как насчет просто закрыть ноутбук?

Почему?

Эти два монитора представляют собой одну область отображения, поэтому при отключении одного из них возникает ряд проблем, таких как перерисовка экрана, перемещение приложений на основной монитор, ...

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

Просто убедитесь, что вы установили эти параметры питания с помощью gsettings set:

org.gnome.settings-daemon.plugins.power lid-close-suspend-with-external-monitor false
org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'
org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'
Fabby
источник
На самом деле, это хорошее решение. Аппаратное обеспечение, плюс это может быть написано в сценарии. Однако OP использует Openbox, что говорит о том, что настройки могут не вступить в силу. В качестве хорошей альтернативы, вы можете включить unix.stackexchange.com/a/52645/85039
Сергей Колодяжный,
4

Временный комментарий

  1. По запросу OP, я сделал скрипт ниже, чтобы выключить экран с помощью xrandr. На более длительном тесте это сработало довольно плохо. Не так много, что отключение не удалось, но при повторной активации экрана, расположение экрана было полностью испорчено. Я был бы рад опубликовать его, чтобы увидеть, работает ли он в вашем случае, но мой совет не использовать его.
    В сценарии я вернулся к установке яркости на ноль вместо этого.
  2. Были некоторые дискуссии о том, следует ли нам определять активный монитор по местоположению мыши или по местоположению активного окна . Последний не будет работать, если нет окна. У нас может не быть окна вообще (кроме самого рабочего стола), и в этом случае выбор окна для затемнения будет случайным (или нарушится, если мы не будем включать исключение). IMO единственный вариант, который имеет смысл - и будет работать предсказуемым образом во всех случаях - это определять активный экран по положению мыши. Кроме того, именно так оконный менеджер решает, где должны появиться новые окна.

Тогда что я изменил в этой версии?
Время простоя теперь определяется как активностью клавиатуры, так и мыши по умолчанию. Пробуждение также совершается любым из них.


Автоматически затемнять неактивный экран

По словам моих коллег-ответчиков, отключение экранов отдельно от cli - это в лучшем случае проблема, и я также не нашел варианта.

То, что я нашел, это способ автоматического затемнения всех экранов, кроме того, на котором находится мышь, по прошествии времени.

Вот так

#!/usr/bin/env python3
import subprocess
import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk
import time
import sys


def get_idle():
    try:
        return int(subprocess.check_output("xprintidle")) / 1000
    except subprocess.CalledProcessError:
        return 0


def get_monitors():
    screen = Gdk.Screen.get_default()
    n_mons = display.get_n_monitors()
    mons = [screen.get_monitor_plug_name(i) for i in range(n_mons)]
    return mons


def set_mon_dimmed(mon, dim):
    print(mon, dim)
    val = "0.0" if dim else "1"
    try:
        subprocess.Popen(["xrandr", "--output", mon, "--brightness", val])
    except subprocess.CalledProcessError:
        print("oops")


def mousepos():
    # find out mouse location
    return Gdk.get_default_root_window().get_pointer()[1:3]


def get_currmonitor_atpos(x, y, display=None):
    """
    fetch the current monitor (obj) at position. display is optional to save
    fuel if it is already fetched elsewhere
    """
    if not display:
        display = Gdk.Display.get_default()
    return display.get_monitor_at_point(x, y)


display = Gdk.Display.get_default()
wait = int(sys.argv[1])
elapsed = 0
# set intervals to check
res = 2
monitors = [m for m in get_monitors()]
for m in monitors:
    set_mon_dimmed(m, False)

monrecord = {}
for m in monitors:
    monrecord[m] = {"idle": 0, "dimmed": False}

display = Gdk.Display.get_default()
idle1 = 0


while True:
    time.sleep(res)
    curr_mousepos = mousepos()
    activemon = get_currmonitor_atpos(
        curr_mousepos[0], curr_mousepos[1]
    ).get_model()
    idle2 = get_idle()
    if idle2 < idle1:
        monrecord[activemon]["idle"] = 0
        if monrecord[activemon]["dimmed"]:
            set_mon_dimmed(activemon, False)
            monrecord[activemon]["dimmed"] = False

    for m in monrecord.keys():
        curr_idle = monrecord[m]["idle"]
        print(m, curr_idle)
        if all([
            curr_idle > wait,
            monrecord[m]["dimmed"] is not True,
            m != activemon
        ]):
            set_mon_dimmed(m, True)
            monrecord[m]["dimmed"] = True         
        else:
            if m != activemon:
                monrecord[m]["idle"] = curr_idle + res

    idle1 = idle2

Как настроить

Настройка проста:

  1. Убедитесь, что у вас есть python3-giи xprintidleустановлены

    sudo apt install python3-gi xprintidle
    
  2. Скопируйте приведенный выше скрипт в пустой файл, сохраните его как dim_inactiveи сделайте его исполняемым

  3. Запустите его командой:

    /path/to/dim_inactive <idle_time_in_seconds>
    

    пример:

    /path/to/dim_inactive 120
    

    затемнит все экраны, где нет мыши, через две минуты

Дополнительная информация / объяснение

  • Скрипт перечисляет все экраны при запуске
  • Он ведет запись, если время простоя на монитор (возможно, более 2). Если к монитору не обращаются в течение x секунд, он затемняется, за исключением монитора, где находится мышь .
  • Согласно хорошей (но плохой) традиции, Gnome постоянно ломает вещи и постоянно меняет API. В результате, запустив этот скрипт 19.04 и выше, вы получите несколько устаревших предупреждений. В то же время, это не сломается на PEP8. Тем не менее обновится до последних API.
Якоб Влейм
источник
Очень приятно, почти искушение написать что-то подобное. Но я думаю, что это повторяющаяся тема здесь - пока нет ничего лучше, чем затемнение другого дисплея с помощью программных решений, ничего аппаратного
Сергей Колодяжный
@SergiyKolodyazhnyy Нет, только подсветка могла бы что-то добавить, но это все, насколько я вижу сейчас. Думаю, что-то должно быть возможно, но, вероятно, будет холодный старт, как xrandr --offя думаю.
Джейкоб Влейм
@JacobVlijm Да, xrandr --offэто то , что я бы предпочел в этом случае. Тем более что подсветка VGA не может контролироваться программно.
Сергей Колодяжный
Спасибо за все ваши усилия, но я получаю самые странные поступки ... Например: он затемняет мониторы, но не сбрасывает яркость 1при любых обстоятельствах. Когда я взаимодействую с внешним дисплеем с помощью клавиатуры и когда мышь находится на главном дисплее, внешний экран становится черным после простоя. Когда я не взаимодействую с основным дисплеем, а мышь находится там, он ничего не делает, и когда я перемещаю мышь на другой дисплей, основной экран становится черным.
Равексина
@Ravex (1) ваши мониторы зеркально отражены? Если нет, возможно, вы остановили скрипт со вторым экраном. Исправлено это сейчас. (2) Почему определяется активный экран, мои указатели мыши объясняются в [2] временного комментария (3) Также должны быть исправлены изменения в (1) (та же причина) Да, нет, нужно сбросить время простоя, будет делать что позже сегодня.
Джейкоб Влейм