it-swarm.com.de

Ein Tool zum automatischen Anwenden der RandR-Konfiguration, wenn eine externe Anzeige angeschlossen ist

gibt es ein Werkzeug, mit dem man:

  • merken Sie sich die aktuelle RandR-Konfiguration (Position, Ausrichtung, Auflösung usw.) pro Monitor.
  • wenden Sie automatisch die letzte bekannte gute Konfiguration an, sobald das Display angeschlossen ist, ohne mit Applets oder xrandr (1) herumspielen zu müssen.

Die Konfigurationen müssten pro Benutzer und Anzeige angewendet werden.

Wenn es in freier Wildbahn kein solches Tool gibt, würde ich gerne selbst eines zusammenwerfen, aber soweit ich sehen kann, kann ich nicht feststellen, dass ein Monitor angeschlossen ist. Muss ich mit xrandr -q abfragen? Hin und wieder herauszufinden, ob ein Ausgang verbunden oder getrennt wurde, oder gibt es eine effizientere Möglichkeit, dies zu tun? Kann udev genau darauf eingestellt werden?

58

Ich verwende dieses einfache (hausgemachte) Skript, das RandR ständig abfragt und zwischen LVDS1 und VGA1 wechselt, wenn VGA verbunden/getrennt wird. (Ändern Sie für [~ # ~] hdmi [~ # ~] Ausgaben in der folgenden Skriptdatei alle VGA1 bis HDMI1)

Es ist eine schmutzige Lösung, aber es funktioniert gut.

Es ist für mein Setup angepasst: Sie müssen höchstwahrscheinlich die RandR-Ausgabenamen ändern (LVDS1 und VGA1) und im Gegensatz zu mir Ihr RandR-Standardmodus für VGA wird Ihnen wahrscheinlich recht sein.

#!/bin/bash

# setting up new mode for my VGA
xrandr --newmode "1920x1080" 148.5 1920 2008 2052 2200 1080 1089 1095 1125 +hsync +vsync
xrandr --addmode VGA1 1920x1080

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to VGA and vice versa
function ActivateVGA {
    echo "Switching to VGA1"
    xrandr --output VGA1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    MONITOR=VGA1
}
function DeactivateVGA {
    echo "Switching to LVDS1"
    xrandr --output VGA1 --off --output LVDS1 --auto
    MONITOR=LVDS1
}

# functions to check if VGA is connected and in use
function VGAActive {
    [ $MONITOR = "VGA1" ]
}
function VGAConnected {
    ! xrandr | grep "^VGA1" | grep disconnected
}

# actual script
while true
do
    if ! VGAActive && VGAConnected
    then
        ActivateVGA
    fi

    if VGAActive && ! VGAConnected
    then
        DeactivateVGA
    fi

    sleep 1s
done

Volle Schritte:

  1. Setzen Sie das obige Skript (homemadeMonitor.sh) in Ihr bevorzugtes Verzeichnis

  2. Machen Sie die .sh-Datei ausführbar, indem Sie den folgenden Befehl in das Terminal eingeben

    chmod +x homemadeMonitor.sh

  3. Führen Sie die .sh-Datei aus

    ./homemadeMonitor.sh

20
peoro

Antwort auf die Frage "[a], um festzustellen, ob ein Monitor angeschlossen ist":

Die Unterstützung ist immer noch sehr unterschiedlich, aber mit den neuesten Kerneln gibt es eine gewisse Unterstützung für das Generieren von udev-Ereignissen, wenn ein Display-Hotplug auftritt. Mit Kernel 2.6.38 und ATI X1400-Hardware erhalte ich ein Ereignis, wenn ich zum ersten Mal ein VGA-Display anschließe, aber keine Ereignisse bei nachfolgenden Trennungen oder erneuten Verbindungen des Displays. Intel-Hardware unterstützt möglicherweise besser. Der proprietäre NVIDIA-Treiber unterstützt derzeit kein KMS. Ich habe nicht versucht, nach Hotplug-Ereignissen auf NVIDIA-Hardware zu suchen, aber ich bezweifle, dass dies funktionieren würde.

Wenn Sie mit udev experimentieren möchten, können Sie die folgenden Schritte ausführen:

  • update auf den neuesten Kernel
  • stellen Sie sicher, dass die Kernelmoduseinstellung (KMS) aktiviert ist. Wenn aktiviert, sollte dies in Ihrer Kernelausgabe gemeldet werden. Meins sagt [drm] radeon kernel modesetting enabled und [drm] initializing kernel modesetting
  • lauf udevadm monitor --property und prüfen Sie, ob Ereignisse gemeldet werden, wenn Sie die Anzeige (trennen)

Wenn udev-Ereignisse auf dem Display Hotplug angezeigt werden, können Sie ein Skript mit einer udev-Regel wie der folgenden auslösen:

ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"

Hinweis: Dies funktioniert nicht, wenn Sie eine nVIDIA-GPU mit dem proprietären Binärtreiber verwenden, da diese nicht verwendet wird KMS. Sie werden nicht udev-Ereignisse erhalten.

21
Andy

In Bezug auf ein Tool, das Monitorkonfigurationsprofile pro Benutzer und pro Anzeige speichern kann, wird autorandr genau das tun.

Mein Laptop hat eine NVIDIA-Karte, daher verwende ich das Disper-Backend anstelle von xrandr. Autorandr verwendet disper als Backend, um Ihre Monitore zu verwalten, wenn Sie es als autodisper bezeichnen. Für den Rest dieses Beitrags werde ich ihn aus Gründen der Konsistenz als autorandr bezeichnen.

Sie können Profile mit autorandr --save profile_name Speichern. Wenn Sie autorandr alleine ausführen, erhalten Sie eine Liste der Profile und identifizieren, welches als aktuelle Konfiguration erkannt wird.

Zum Beispiel:

$ autorandr
laptop
syncmaster19 (detected)

Sie können festlegen, dass das entsprechende Profil für die aktuelle Konfiguration automatisch mit autorandr --change Geladen werden soll. Dieser Befehl, gepaart mit einer udev-Regel, um ihn auszuführen, wenn er mit dem Hotplugged verbunden ist, würde das tun, was Sie angefordert haben.

Als zusätzliche Vorsichtsmaßnahme habe ich --default laptop An diesen Befehl angehängt, wodurch er standardmäßig auf dem Display des Laptops angezeigt wird, wenn kein gespeichertes Profil vorhanden ist, das der aktuellen Konfiguration entspricht. Der vollständige Befehl zum Wechseln der Anzeigen lautet also:

autorandr --change --default laptop

Leider gibt mein Computer beim Hotplug meines Monitors keine udev-Ausgabe aus. Ich verwende die proprietären NVIDIA-Treiber, daher ist das nicht überraschend. Also habe ich es vorerst an die XF68Display-Taste (Fn-F8) gebunden, was fast genauso gut ist.

19
Jack Senechal

Ich habe die oben vorgeschlagene udev-Regel zusammen mit einem Shell-Skript verwendet, das aussieht

#!/bin/sh

dmode="$(cat /sys/class/drm/card0-VGA-1/status)"
export DISPLAY=:0
export XAUTHORITY=/home/yourusername/.Xauthority

if [ "${dmode}" = disconnected ]; then
     /usr/bin/xrandr --auto
Elif [ "${dmode}" = connected ];then
     /usr/bin/xrandr --output VGA1 --auto --right-of LVDS1
else /usr/bin/xrandr --auto
fi

Der Xauthority-Teil ist ebenso wichtig wie der Export DISPLAY. Sie können echo $DISPLAY Verwenden, um zu sehen, welcher Zahl er entspricht. Verwenden Sie xrandr -q, Um Ihre externen Monitore anzuzeigen. Die letzte andere Aussage soll nur sicherstellen, dass Sie nie ohne Anzeige stecken bleiben.

7
Cappie

Ein kleines Programm, das darauf wartet, dass der X-Server ihn über die geänderte Monitorkonfiguration benachrichtigt und dann einen bestimmten Befehl ausführt (z. B. das in einer anderen Antwort erwähnte autorandr), ist verfügbar unter: https: // bitbucket .org/portix/srandrd/Übersicht

Dies scheint eine sauberere Lösung zu sein, die udev verwendet (wo Sie sich Sorgen machen müssen, den richtigen X-Server zu finden usw.)

6

Wenn die Anzeige beim Anschließen automatisch erkannt werden muss, ist es anscheinend die sauberste Lösung, eine UDEV-Regel hinzuzufügen, um ein Skript mit Ihren xrandr-Befehlen auszuführen. Hier ist ein Beispiel aus der Lösung eines Benutzers 1 :

Überwachen (Ausgeben) von UDEV-Ereignissen mit udevadm
Dieser Schritt ist für jeden Benutzer am wichtigsten. Lauf udevadm monitor --environment --udev. Schließen Sie dann Ihr HDMI-Kabel an.

UDEV-Regel
Basierend auf der Ausgabe des obigen Befehls hat der Benutzer diese UDEV-Regel unter /etc/udev/rules.d/95-monitor-hotplug.rules.

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/dan/.Xauthority", RUN+="/usr/local/bin/hotplug_monitor.sh"

Beachten Sie die Umgebungsvariablen, die verwendet werden, damit xrandr unter dem Benutzerprofil ausgeführt wird.

xrandr script hotplug_monitor.sh

Möglicherweise möchten Sie die xrandr-Optionen an Ihre Bedürfnisse anpassen.

#! /usr/bin/bash

export DISPLAY=:0
export XAUTHORITY=/home/dan/.Xauthority

function connect(){
    xrandr --output HDMI1 --right-of LVDS1 --preferred --primary --output LVDS1 --preferred 
}

function disconnect(){
      xrandr --output HDMI1 --off
}

xrandr | grep "HDMI1 connected" &> /dev/null && connect || disconnect
5
iyrin

Für diejenigen, die aus irgendeinem Grund nicht den Hotplug-Weg einschlagen möchten, ist es immer noch möglich, mit inotifywait nicht innerhalb eines Skripts abzufragen:

 #!/Bin/bash 
 
 SCREEN_LEFT = DP2 
 SCREEN_RIGHT = eDP1 
 START_DELAY = 5 
 
 renice +19 $$>/dev/null 
 
 sleep $ START_DELAY 
 
 OLD_DUAL = "Dummy" 
 
 während [ 1]; do 
 DUAL = $ (cat /sys/class/drm/card0-DP-2/status)[.____.‹
 if ["$ OLD_DUAL"! = "$ DUAL"]; dann 
 wenn ["$ DUAL" == "verbunden"]; dann 
 echo 'Dual Monitor Setup' 
 xrandr --output $ SCREEN_LEFT --auto --rotate normal --pos 0x0 --output $ SCREEN_RIGHT --auto --rotate normal --below $ SCREEN_LEFT 
 Sonst 
 Echo 'Einzelmonitor-Setup' 
 Xrandr --auto 
 Fi 
 
 OLD_DUAL = "$ DUAL" 
 fi 
 
 inotifywait -q -e close/sys/class/drm/card0-DP-2/status>/dev/null 
 erledigt 
 

Das Abfragen mit xrandr führte zu ernsthaften Problemen mit der Benutzerfreundlichkeit meines brandneuen Laptops (die Maus blieb regelmäßig stehen).

3
Balzola

Um dies beispielsweise in Xfce zu vereinfachen, installieren Sie bitte "arandr", das in Ihren Distributionspaketen verfügbar sein sollte. Konfigurieren Sie Ihre Anzeige mit "arandr" und speichern Sie sie beispielsweise als "displayLayout". Arandr sollte für Sie die Erweiterung ".sh" hinzufügen, damit sie direkt in "function connect ()" verwendet werden kann, wie im oben von iyrin erwähnten Skript "hotplug_monitor.sh" geschrieben, zum Beispiel:

function connect(){
 /path/to/displayLayout.sh
}

Um den Trennmechanismus zu verwenden, fügen Sie oben im Skript direkt unter "#!/Bin/bash" Folgendes hinzu:

#!/bin/bash
#
PLUGGED_EXTERNAL=`xrandr | awk /"connected [0-9]"/'{print $1}'`

xrandr erkennt die Anzeige und übergibt die Ausgabe an awk, wodurch sie basierend auf dem regulären Ausdruck "verbunden" gefiltert wird, gefolgt von einer Ziffer, die im Wesentlichen das ist, was wir wollen. Meiner Meinung nach ist es nicht erforderlich, die genaue Auflösung im regulären Ausdruck anzupassen, da die primäre Anzeige als "verbundene primäre" gefolgt von der Zahl, d. H. Der Auflösung, gemeldet wird. Dann druckt awk "print $ 1" nur die erste Spalte, die in diesem Fall der Name des externen Monitors ist, und diese wird in der Variablen PLUGGED_EXTERNAL gespeichert. Als nächstes kann anstelle des festen Anzeigenamens "HDMI1" im Skript $ PLUGGED_EXTERNAL wie folgt verwendet werden:

function disconnect(){
  xrandr --output $PLUGGED_EXTERNAL --off
}

xrandr | grep "$PLUGGED_EXTERNAL connected" &> /dev/null && connect || disconnect
1
user180381

Ich denke, die Leute, die sich mit dieser Frage befassen, sind nicht diejenigen, die GNOME verwenden möchten, und diejenigen, die GNOME verwenden, müssten sich diese Frage nicht ansehen, sondern der Vollständigkeit halber:

In GNOME ist diese Funktionalität integriert. Wenn Sie das Setup über gnome-control-center ändern, merkt sich gnome-settings-daemon das (in .config/monitors.xml) und wendet es automatisch an, wenn ein Monitor ein- oder ausgeschaltet wird.

Leider ist die Konfiguration in der Datei monitors.xml nicht gut dokumentiert. Siehe Frage hier . Das Gnome-Display-Tool bietet auch keine Möglichkeit, das Schwenken und Skalieren pro Monitor einzurichten, und es wird nicht verkleinert. Da viele Benutzer einen HiDPI-Laptop-Bildschirm zusammen mit einem normalen DPI-Bildschirm verwenden, reichen die Tools nicht aus, um eine funktionsfähige Lösung zu erhalten.

Ich habe dies gesehen als Roadmap-Element für Wayland erwähnt obwohl, wenn es endlich kommt, könnten wir eine Lösung für die genannten Probleme sehen. Bis dahin führe ich auf Gnome nach einer Verzögerung nur ein Startskript aus, um xrandr manuell einzurichten.

1

Bei der Verwendung von Peoros Lösung habe ich eine zusätzliche Ausgabe von xrandr erhalten, daher habe ich die Option -c für grep verwendet, die die Anzahl der Übereinstimmungen zählt. Ich habe es für HDMI angepasst und auch einen Audio-Schalter hinzugefügt:

#!/bin/bash
# adapted from http://unix.stackexchange.com/questions/4489/

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to HDMI1
function ActivateHDMI {
    xrandr --output HDMI1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    pactl set-card-profile 0 output:hdmi-stereo-extra1
    MONITOR=HDMI1
}
function DeactivateHDMI {
    xrandr --output HDMI1 --off --output LVDS1 --auto
    pactl set-card-profile 0 output:analog-stereo
    MONITOR=LVDS1
}

# functions to check if HDMI is connected and in use
function HDMIActive {
    [ $MONITOR = "HDMI1" ]
}
function HDMIConnected {
    [[ `xrandr | grep "^HDMI1" | grep -c disconnected` -eq 0 ]]
}

# actual script
while true
do
    if ! HDMIActive && HDMIConnected
    then
        ActivateHDMI
    fi

    if HDMIActive && ! HDMIConnected
    then
        DeactivateHDMI
    fi

    sleep 1s
done
1
Aaros

Bearbeiten meiner Antwort, um die Einrichtung zu vereinfachen.

Installieren Sie autorandr, um das Bildschirmlayout in xrandr zu automatisieren, holen Sie sich die neueste .deb von https://github.com/nalipaz/autorandr/releases und führen Sie Folgendes aus:

dpkg -i [file]

Richten Sie autorandr mit gespeicherten Bildschirmlayouts ein

autorandr --save [docked|mobile|home|etc]

Als Beispiel habe ich auf meinem Laptop ohne angeschlossene Monitore arandr so eingerichtet, wie ich es möchte, und dann ausgeführt:

autorandr --save mobile

Dann steckte ich meine HDMI ein und konfigurierte arandr neu, dann lief:

autorandr --save docked

Nachdem Sie jedes Ihrer Layouts eingerichtet haben, können Sie es ausführen (ersetzen Sie 'mobile' durch den vorherigen bevorzugten Namen, ich habe mobile verwendet):

autorandr --default mobile

Nachdem autorandr vollständig eingerichtet ist, können Sie den Prozess automatisieren, indem Sie ein Paket installieren, das nach verbundenen Anzeigen fragt und bei Erkennung autorandr --change Ausführt. Ja, ich weiß über udev Bescheid und Sie können das einrichten, wenn es für Sie funktioniert, aber in meinen Tests hat udev für mein HDMI nicht konsequent funktioniert. Es funktionierte nur 1 von 20 Steckern/Steckern oder so, und manchmal hörte es einfach ganz auf.

Laden Sie die neueste .deb von hier herunter: https://github.com/nalipaz/poll-xrandr/releases/ und installieren Sie sie mit

dpkg -i [file]

Es ist höchstwahrscheinlich erforderlich, dass Sie nach Abschluss von autorandr --change Weitere Aufgaben ausführen. Autorandr ermöglicht das Einfügen dieser Befehle in eine Datei mit dem Namen ~/.autorandr/postswitch. Gehen Sie wie folgt vor:

cd ~/.autorandr/ && touch postswitch && chmod +x postswitch

Bearbeiten Sie nun die Postswitch-Datei, um Folgendes zu erhalten:

#!/bin/bash
if pidof conky > /dev/null 2>&1; then
  killall conky
fi
(sleep 2s && xrandr-adjust-brightness restore -q) &
(sleep 2s && nitrogen --restore) &
(sleep 3s && conky -q) &

Darüber hinaus möchten Sie Ihren Startups wahrscheinlich autorandr und poll-xrandr hinzufügen, etwa die folgenden zwei Befehle:

autorandr --change &
poll-xrandr &

Ziehen Sie einen Monitor heraus oder schließen Sie ihn an und beobachten Sie die Magie!

0
nicholas.alipaz