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

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

У меня есть два монитора, работающие друг вдоль друга, eDP1 (Мой Ноутбук) и VGA1 (Внешний монитор).

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

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

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

  • Выполнение: Ubuntu 18.04
  • Менеджер окон: OpenBox
10
задан 23 March 2019 в 13:31

5 ответов

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

По Вашей причине желания посмотреть видео в течение 90 минут на внешнем мониторе и иметь экран ноутбука идут пробел, я изменил крышку близкая опция Ничего "не Сделать":

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

Я не использую 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 при желании.

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

4
ответ дан 23 November 2019 в 04:24

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

Почему?

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

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

Просто удостоверьтесь установку этих параметров питания с 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'
4
ответ дан 23 November 2019 в 04:24

Управление отдельными мониторами не возможно с 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

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

  • неуязвимый для ключевых событий и событий от нажатия мыши
  • независимо средства управления outpus, в отличие от этого, xset

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

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

5
ответ дан 23 November 2019 в 04:24

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

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

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


Автоматически потускнейте неактивный экран

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

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

Здесь мы идем

#!/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.
4
ответ дан 23 November 2019 в 04:24

Если на мониторе есть ddc, который может работать - это тоже относительно медленно, но это единственный способ снизить энергопотребление в мониторе с подсветкой ccfl без xrandr. К сожалению, только половина моих мониторов реализует это.

$ ddccontrol dev:/dev/i2c-4
...
        > Power control
                > id=dpms, name=DPMS Control, address=0xd6, delay=-1ms, type=2
                  Possible values:
                        > id=on - name=On, value=1
                        > id=standby - name=Standby, value=4
...

Вы можете легко подключить шины i2c к выходам, просматривая каталоги /sys/class/drm/card*, упомянутые Сергеем выше (т. е. их подкаталоги i2c*).

Итак, "ddccontrol dev:/dev/i2c-4 -r 0xd6 -w 4" устанавливает его в режим ожидания, "ddccontrol dev:/dev/i2c-4 -r 0xd6 -w 1" снова устанавливает его в состояние On.

У меня настроены cronjobs, включая getIdle из https://github.com/IonicaBizau/screensaver/blob/master/getIdle.c, что дает время простоя X в мс.

Вероятно, вам следует добавить своего пользователя в группу i2c или иным образом разрешить доступ к шинам ddc.

Еще одна странность: хотя элемент управления ddc помечен как «Питание», по крайней мере, на моем мониторе я не могу использовать его для определения фактического состояния питания — если я выключаю монитор вручную, он все еще показывает «Вкл.» и Не могу включить через i2c.

0
ответ дан 7 May 2020 в 09:00

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

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