Wie kann ich einen Monitor mit xset im Multi-Monitor-Setup in den Standby-Modus versetzen?

10

Wenn zwei oder mehr Monitore zusammenarbeiten, gibt es eine Möglichkeit, einen einzelnen Monitor in den Standby- / Suspend-Modus zu versetzen, indem Sie einen Befehl wie den folgenden xset dpms force suspendeingeben : ? oder eine Zeit für diesen Zweck festlegen wie: xset dpms 100 0 0Welche funktioniert auf diesen Monitoren separat?

Ich habe zwei Monitore, die zusammen arbeiten, eDP1 (Mein Laptop) und VGA1 (Ein externer Monitor).

Ich möchte, dass jeder von ihnen separat in den Suspend / Standby-Modus wechselt, wenn ich nicht direkt mit ihnen interagiere. Angenommen, ich schaue einen Film auf VGA1 und eDP1 tut anderthalb Stunden lang nichts.

Ich bin nicht daran interessiert, es zu verwenden, xrandor --off --output eDP1weil es nicht schnell genug ist, um damit zu arbeiten.

Ich möchte, dass mein Monitor mit einer einfachen Mausbewegung betriebsbereit ist, damit ich schnell zwischen ihnen wechseln kann.

  • Laufen: Ubuntu 18.04
  • Fenstermanager: OpenBox
Ravexina
quelle
Ist es aus energetischen Gründen oder würde eine visuelle Lösung reichen?
Jacob Vlijm
@Ravexina Frage, wie weit geht Ihre eDP1-Hintergrundbeleuchtung? Schaltet es die Helligkeit vollständig aus? Wenn ja, können Sie bitte die beiden Befehle testen, die ich in der Antwort askubuntu.com/a/814043/295286 hatte ? Vielen Dank im Voraus für die Antwort
Sergiy Kolodyazhnyy
1
@Ravexina fertig, scheint einwandfrei zu funktionieren, wird es aber einen Tag lang laufen lassen, wird es heute Abend spät veröffentlichen. Es wird die Aktivität pro Bildschirm aufzeichnen, aber niemals den Bildschirm dimmen / ausschalten, auf dem sich die Maus gerade befindet, oder?
Jacob Vlijm
1
OK, dann werde ich wahrscheinlich am Wochenende versuchen, Window Tracking zu implementieren. Leider habe ich momentan nicht so viel Zeit, um mich mit diesen Dingen zu befassen.
Sergiy Kolodyazhnyy
1
@ Ravexina, danke. Ich werde wahrscheinlich bald eine andere (vala) Version veröffentlichen, die entweder durch ein aktives Fenster oder (falls es kein gültiges Fenster gibt) durch eine Mausaktion ausgelöst wird . Wir werden auch sehen, ob wir etwas mit Hintergrundbeleuchtung machen können, was wahrscheinlich auch etwas Energie spart. Die Zeit während des Bonus ist einfach zu kurz, aber die Frage ist interessant genug, um ein wenig weiter zu spielen. Fortsetzung folgt. Noch einmal vielen Dank.
Jacob Vlijm

Antworten:

5

Die Steuerung einzelner Monitore ist mit xset (und X11 tatsächlich) nicht möglich.

Wie der Titel schon sagt, ist dies aus Gründen des Aufbaus xset und der verwendeten X11-Funktionen nicht möglich . Wenn wir uns den Quellcode ansehen, xsetruft DPMSForceLevel(dpy,DPMSModeSuspend)( Zeile 557 ) auf, und die Anzeigevariable dpystammt von der XOpenDisplay()Funktion ( Zeile 203 ), und das ist per Definition :

Ein Server wird zusammen mit seinen Bildschirmen und Eingabegeräten als Anzeige bezeichnet.

Mit anderen Worten, werden xsetEinstellungen global auf die gesamte Anzeige angewendet, nicht auf einzelne Bildschirme. Es wäre notwendig, den xsetQuellcode zu ändern , damit dies funktioniert. DPMS-Erweiterungen selbst scheinen meist nur die gesamte Anzeige aufzurufen, nicht einzelne Bildschirme. Daher ist es nicht möglich, mit der X11-Bibliothek benutzerdefinierten Code zu schreiben.

Die manuelle Steuerung dieser Einstellung über das /sysSubsystem scheint ebenfalls nicht zu funktionieren

$ 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

Bildschirme werden auch aus dem DPMS-Modus entfernt, wenn Tasten- oder Mausereignisse auftreten. Wenn Sie also Ihre Maus bewegen oder die Tastatur verwenden möchten, führt eine dieser Aktionen dazu, dass der Monitor den DPMS-Modus verlässt.

Alternative Problemumgehungen

Die beste Alternative (und tatsächlich physisch funktionierende Lösung) ist xrandr- sie könnte verwendet werden, um die einzelnen "Ausgänge" zu steuern. Im Speziellen,

xrandr --output VGA-1 -off

schaltet diesen Ausgang aus. Ja, Sie haben erwähnt, dass Sie diese Lösung nicht verwenden möchten, da sie nicht schnell genug ist. Bisher ist sie jedoch die beste auf dem Markt. Es hat einige Vorteile:

  • immun gegen Schlüssel- und Mausereignisse
  • steuert im Gegensatz zu Outpus unabhängig xset

Das xrandr --output VGA-1 --brightness 0.1wird der Bildschirm in einer solchen Art und Weise einfärben , dass es scheint, aber sich selbst --brightnesseine Software - Lösung ist, so dass die Anzeige tatsächlich nicht auf Hardware - Ebene gedimmt, noch ist es auf Hardware - Ebene aus. Es macht jedoch die Aufgabe, einen Bildschirm auszublenden, und ist auch resistent gegen Schlüssel- / Mausereignisse.

Ich habe mir den Quellcode von Mate- und Budgie-Bildschirmschonern angesehen, die beide Gabeln von GNOME-Bildschirmschonern sind. In beiden Fällen scheinen sie jedoch eine Softwarelösung zu sein, da DPMS im Quellcode nicht erwähnt wird.

Sergiy Kolodyazhnyy
quelle
Ich mag die Alternativen ... +1
Fabby
1
@ Fabby Danke :) Bisher sind das die besten verfügbaren Alternativen
Sergiy Kolodyazhnyy
Ich denke, die Fenstermanager machen einige Tricks und könnten einige Haken liefern. Es gibt eine Stack-Exchange-Site namens "Software Design", und es könnte ein guter Ort sein, um die Idee zu schweben, dass ein Hauptfenster (wie ein Webbrowser, aber nicht Conky oder die Anzeigezeit in der oberen Leiste) über beispielsweise 10 Minuten keine Pixeländerungen aufweist Der gesamte Monitor (nur ein einziger) wird innerhalb von 30 Sekunden dunkler, bis er vollständig schwarz ist. Wenn Sie dann mit der Maus über diesen Monitor navigieren (normalerweise verwende ich 3 Monitore), wird die Helligkeit schrittweise über einen Zeitraum von 1 bis 5 Sekunden wiederhergestellt.
WinEunuuchs2Unix
@ WinEunuuchs2Unix Ich habe eine Idee und es gibt ein paar Dinge zu beachten, aber es ist schwierig, und ja, hängt vom fraglichen Fenstermanager ab. Problem ist das DPMS. Mit DPMS wird entweder alles oder nichts gedimmt. Beste , was wir tun können , ist xrandr --offfür jetzt
Sergiy Kolodyazhnyy
Meine DPMS-Kenntnisse sind begrenzt. Ich denke, es ist eine stromsparende Sache für Standy / Sleep. Es gibt auch HDMI-CEC, die vielleicht die gleichen Ergebnisse liefern, aber das ist für mich noch mehr ein schwarzes Loch der Magie. Ich weiß nicht, ob xrandr -offder Monitor überhaupt ausgeschaltet wird. Es könnte dasselbe sein wie brightnessauf Null gesetzt? Was ein weiteres Problem ist Ich habe ein Programm, das rund um die Uhr läuft und Helligkeit und Gamma für 3 Monitore individuell einstellt, was selbst Windows nicht kann. Ich bin mir nicht sicher, ob Nachtlicht, Rotverschiebung oder Fluss es tun. Auf jeden Fall könnten diese Programme von xrandr off durcheinander gebracht werden. Entschuldigen Sie, dass Sie Ihre Antwort mit Spekulationen entführt haben :)
WinEunuuchs2Unix
4

Jahrelang hatte ich meinen Laptop so eingerichtet, dass bei geschlossenem Deckel der Laptop hängen blieb und externe Monitore leer waren.

Aus dem Grund, dass Sie ein Video 90 Minuten lang auf einem externen Monitor ansehen und den Laptop-Bildschirm leer lassen möchten, habe ich die Option zum Schließen des Deckels auf "Nichts tun" geändert:

  • Vorteil: Wenn ich den Laptopdeckel schließe, werden alle Laptop-Fenster unter dem Vollbildvideo angezeigt.
  • Vorteil: Wenn ich den Laptopdeckel öffne, werden die Fenster wiederhergestellt und befinden sich nicht mehr unter dem Vollbildvideo.
  • Nachteil: Ich muss das Video nicht im Vollbildmodus anzeigen, um auf das Menü in der oberen Leiste zuzugreifen und Suspend aus dem Gangmenü auszuwählen.
  • Vorteil: Wenn das System über ein Menü auf einem externen Monitor angehalten wird, wird durch Öffnen des Laptopdeckels das System fortgesetzt.

Ich verwende DPMS nicht für externe Monitore, aber Sie können Ihre Einstellungen mit dem folgenden xset qBefehl überprüfen :

$ 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

Beachten Sie diese Zeilen:

Screen Saver:
  prefer blanking:  yes
  • Sie würden wahrscheinlich wollen prefer blanking: no

Beachten Sie auch diese Zeilen:

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • Sie möchten DPMS is enabledden Monitor wahrscheinlich auf Wunsch einstellen Standby.

Hoffentlich haben andere Benutzer diese Optionen verwendet und eine detaillierte Antwort für Sie veröffentlicht.

WinEunuuchs2Unix
quelle
4

Wie wäre es einfach den Laptop zu schließen?

Warum?

Diese beiden Monitore bilden einen Anzeigebereich. Wenn Sie also einen ausschalten, treten eine Reihe von Problemen auf, z. B. das Neuzeichnen des Bildschirms, das Verschieben von Anwendungen auf den Hauptmonitor, ...

(Ich bin diesen Weg vor ein paar Jahren gegangen und die einzige zuverlässige Möglichkeit, das zu tun, was Sie tun möchten, besteht darin, den Knopf auf dem externen Monitor zu drücken oder den Laptop zu schließen.)

Stellen Sie einfach sicher, dass Sie diese Energieeinstellungen einstellen mit 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
quelle
Eigentlich ist das eine schöne Lösung. Hardware und dies kann per Skript ausgeführt werden. OP verwendet jedoch Openbox, was darauf hindeutet, dass gsettings möglicherweise nicht wirksam werden. Für eine gute Alternative möchten Sie vielleicht unix.stackexchange.com/a/52645/85039
Sergiy Kolodyazhnyy
4

Temporärer Kommentar

  1. Auf Anfrage von OP habe ich das folgende Skript dazu gebracht , den Bildschirm mittels auszuschaltenxrandr . Bei einem längeren Test hat das ziemlich schlecht geklappt. Nicht so sehr schlug das Ausschalten fehl, aber bei der Reaktivierung des Bildschirms war das Bildschirmlayout völlig durcheinander. Ich würde es gerne posten, um zu sehen, ob es in Ihrem Fall funktioniert, aber mein Rat ist, es nicht zu verwenden.
    Im Skript habe ich stattdessen wieder die Helligkeit auf Null gesetzt.
  2. Es gab einige Diskussionen darüber, ob wir den aktiven Monitor nach Mausposition oder nach Position des aktiven Fensters definieren sollten . Letzteres funktioniert nicht, wenn kein Fenster vorhanden ist. Möglicherweise haben wir überhaupt kein Fenster (außer dem Desktop selbst). In diesem Fall ist die Auswahl des Fensters zum Verdunkeln zufällig (oder es wird unterbrochen, wenn die Ausnahme nicht berücksichtigt wird). IMO ist die einzige Option, die Sinn macht - und in allen Fällen vorhersehbar funktionieren würde -, den aktiven Bildschirm per Mausposition zu definieren. Auf diese Weise entscheidet der Fenstermanager auch, wo neue Fenster angezeigt werden sollen.

Was habe ich dann in dieser Version geändert?
Die Leerlaufzeit wird jetzt standardmäßig sowohl durch Tastatur- als auch durch Mausaktivität definiert. Das Aufwachen wird auch von beiden gemacht.


Inaktiven Bildschirm automatisch dimmen

Wie meine Kollegen sagten, ist es eine Herausforderung, die Bildschirme separat von cli auszuschalten, und ich habe auch keine Option gefunden.

Was ich gefunden habe, ist eine Möglichkeit, alle Bildschirme außer dem, auf dem sich die Maus befindet, nach x Zeit automatisch zu dimmen .

Auf geht's

#!/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

Wie stellt man das ein

Die Einrichtung ist unkompliziert:

  1. Stellen Sie sicher , haben Sie beide python3-giund xprintidleinstalliert

    sudo apt install python3-gi xprintidle
    
  2. Kopieren Sie das obige Skript in eine leere Datei, speichern Sie es als dim_inactiveund machen Sie es ausführbar

  3. Führen Sie es mit dem folgenden Befehl aus:

    /path/to/dim_inactive <idle_time_in_seconds>
    

    ein Beispiel:

    /path/to/dim_inactive 120
    

    Dimmt alle Bildschirme ab, auf denen sich die Maus nach zwei Minuten nicht befindet

Zusätzliche Informationen / Erklärung

  • Das Skript listet alle Bildschirme beim Start auf
  • Es zeichnet auf, ob pro Monitor Leerlaufzeit (möglicherweise mehr als 2). Wenn ein Monitor x Sekunden lang nicht aufgerufen wird, ist er bis auf den Monitor, auf dem sich die Maus befindet, schwarz .
  • Nach einer guten (aber schlechten) Tradition bricht Gnome immer wieder Dinge und ändert ständig die APIs. Wenn Sie dieses Skript am 19.04 und höher ausführen, erhalten Sie daher einige veraltete Warnungen. Gleichzeitig bricht es auf PEP8 nicht. Wird trotzdem auf die neuesten APIs aktualisiert.
Jacob Vlijm
quelle
Sehr nett, fast versucht, so etwas auch zu schreiben. Aber ich denke, das ist das wiederholte Thema hier - bisher gibt es nichts Besseres als das Dimmen des anderen Displays über Softwarelösungen, nichts Hardware-ish
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Nein, nur die Hintergrundbeleuchtung würde etwas hinzufügen, aber das ist es, soweit ich jetzt sehen kann. Denke, etwas sollte möglich sein, wird aber wahrscheinlich einen Kaltstart haben, genau wie xrandr --offich denke.
Jacob Vlijm
@JacobVlijm Ja, xrandr --offdas würde ich in diesem Fall bevorzugen. Zumal die VGA-Hintergrundbeleuchtung nicht softwaregesteuert werden kann.
Sergiy Kolodyazhnyy
Vielen Dank für all Ihre Bemühungen, aber ich bekomme die seltsamsten Verhaltensweisen ... Zum Beispiel: Es dimmt die Monitore, setzt aber die Helligkeit 1unter keinen Umständen zurück. Wenn ich über die Tastatur mit dem externen Display interagiere und sich die Maus im Hauptdisplay befindet, wird das externe Display nach der Leerlaufzeit schwarz. Wenn ich keine Interaktion mit der Hauptanzeige habe, aber die Maus da ist, tut sie dort nichts und wenn ich die Maus auf eine andere Hauptanzeige bewege, wird eine unmittelbar schwarz.
Ravexina
@Ravex (1) Sind Ihre Monitore gespiegelt? Wenn nicht, haben Sie möglicherweise das Skript mit dem zweiten Bildschirm gestoppt. Das wurde jetzt behoben. (2) Warum der aktive Bildschirm definiert ist, wird in [2] des temporären Kommentars erläutert. (3) Sollte auch mit den Änderungen in (1) behoben werden (gleiche Ursache). Huh, nein, die Leerlaufzeit muss zurückgesetzt werden das später heute.
Jacob Vlijm