How To: Externen Monitor beim Andocken aktivieren!

g3eB4Y

New member
Themenstarter
Registriert
7 Nov. 2009
Beiträge
167
Hallo,

heute habe ich mal keine Frage, sondern einen kleinen nützlichen Tipp! Ich glaube es könnte für den ein- oder anderen nützlich sein ;)

Ich wollte eine sehr eigentlich eine einfache Sache haben: wenn ich den Laptop andocke, soll der externe Monitor eingeschaltet werden, beim abdocken vice-versa! Das hörte sich für mich recht einfach an, nahm dann aber trotzdem 1-2 Stündchen in Anspruch. Damit niemand anderes so lang frickeln muss, hier also die meine Lösung!

Alles bezieht sich bei mir auf (K)Ubuntu, es sollte aber theoretisch von der Distribution und auch von der grafischen Oberfläche unabhängig sein, sofern ein X-Server da ist, der umgeschaltet werden kann. Das Script benutzt udev um das Dock-Event abzufangen und xrandr um den Bildschirm umzuschalten. Beide sollten also installiert und lauffähig sein. Unter Ubuntu ist das der Fall!


Die udev Regel fängt das dock-event ab und ruft daraufhin ein Script. Sie liegt unter /lib/udev/rules.d/98-screen-switch.rules und hat folgenden Inhalt:
Code:
# automatic screen switch - udev rule


# handle dock/undock events
ACTION=="change", SUBSYSTEM=="platform", KERNEL=="dock.*", ATTR{type}=="dock_station", RUN+="/bin/su EUER_NUTZERNAME -c /lib/udev/screen-switch-udev"

Die Dateirechte kann man so setzen:
Code:
sudo chmod 644 /lib/udev/rules.d/98-screen-switch.rules

Ihr müsst "EUER_NUTZERNAME" natürlich mit eurem Username ersetzen. Wie ihr seht ruft udev ein Script als Superuser auf. Dieses Script, dass die eigentliche Arbeit ausführt müssen wir jetzt noch unter: /lib/udev/screen-switch-udev anlegen.

Code:
#!/bin/sh


export DISPLAY=:0


# define your external display-adapter here
EXT_DISP=DP1


# this is to ensure that the monitor is available to the system before switching to it
sleep 2


case $EVENT in
    dock) # laptop was docked
    /usr/bin/xrandr --output LVDS1 --off --output $EXT_DISP --auto
        ;;


    undock) # laptop was undocked
        /usr/bin/xrandr --output $EXT_DISP --off --output LVDS1 --auto
        ;;
esac


exit 1

Die Dateirechte müssen hier auch das Executable-bit setzen, deshalb lauten sie wie folgt:
Code:
sudo chmod 755 /lib/udev/screen-switch-udev

An diesem Script kann man nun einige Einstellungen vornehmen, zum Beispiel die Variable EXT_DISP auf den gewünschten externen Displayadapter umstellen, je nach dem wie euer Monitor angeschlossen ist. Möglich sind DP1, HDMI1, VGA1 ... sicherlich bei dem Ein oder Anderen auch andere.. das bekommt Ihr über den Befehl "xrandr" in der Konsole heraus. Des Weiteren können mit xrandr auch mehrere Monitore aktiviert und relativ zueinander positioniert werden. Die Syntax für xrandr ist recht einfach und kann über das Man-File herausgefunden werden. Auch wäre es denkbar noch mehr Befehle auszuführen... je nach Lust und Laune.

Nun denn, ich hoffe es war einigermaßen verständlich und vielleicht auch nützlich....

Hinweise
Das Script wird mit eurem Benutzer ausgeführt, welcher in der udev-Regel hard-coded ist. Sollte es sich also um ein Mehrbenutzersystem handeln, wird diese Lösung nicht funktionieren.
Der sleep Befehl ist vielleicht nicht sehr elegant, er muss aber sein, damit das Subsystem den neuen Ausgang nach dem Docken überhaupt initialisiert hat, bevor wir versuchen, diesen auch einzuschalten.

Wenn jemand Anregungen hat, immer her damit ;) Ich bin kein Profi und sicherlich ist etwas nicht besonders elegant gelöst....

Credits
..gehen an linrunner, denn ich habe sein tlp-rdw script reverse engineered... ich hoffe das ist ok so, dadurch habe ich verstanden wie udev funktioniert. Außerdem habe mich an 2-3 Blogs im Netz bedient, die ich aber leider nicht mehr finden kann :/
 
Lustig. Stand letztens vor genau dem selben Problem.

Mein Script:
Code:
#!/bin/bash
# If an external monitor is connected, place it with xrandr
# External output may be "VGA" or "VGA-0" or "DVI-0" or or or...
# Look in KDE monitor config to find the names of detected screens
EXTERNAL_OUTPUT1="DP2"
EXTERNAL_OUTPUT2="HDMI1" #internal DP
INTERNAL_OUTPUT="LVDS1"
# possible locations
# --left-of --right-of --above --below 

xrandr |grep $EXTERNAL_OUTPUT1 | grep " connected "
if [ $? -eq 0 ]; then
        # If DP2 is connected then activate external monitor and turn off internal, set $EXTERNAL_OUTPUT1 to primary monitor
        xrandr --output $EXTERNAL_OUTPUT1 --auto --primary --output $INTERNAL_OUTPUT --off #--output $EXTERNAL_OUTPUT2 --auto --right-of $EXTERNAL_OUTPUT1
else
        xrandr |grep $EXTERNAL_OUTPUT2 | grep " connected "
        if [ $? -eq 0 ]; then
                # If DP1 is connected then activate external monitor and turn off internal, set $EXTERNAL_OUTPUT2 to primary monitor
                xrandr --output $EXTERNAL_OUTPUT2 --auto --primary --output $INTERNAL_OUTPUT --off
        else
                # Didn't see External connected, so turn off both external monitors and turn on the internal one.
                xrandr --output $INTERNAL_OUTPUT --auto --primary --output $EXTERNAL_OUTPUT1 --off --output $EXTERNAL_OUTPUT2 --off
                battery=`cat /sys/devices/platform/smapi/BAT0/state`
                # running on battery = backlight 25%, else 60%
                if [ $battery = discharging ]; then
                  xbacklight -set 25
                else
                  xbacklight -set 60
                fi
        fi

fi
Dieses wird in der Energieverwaltung (unter KDE) eingebunden: Bei wechsel von ac zu dc (und umgekehrt) wirds ausgeführt.
 
Zuletzt bearbeitet:
Lustig. Stand letztens vor genau dem selben Problem.

Mein Script:
Code:
#!/bin/bash
# If an external monitor is connected, place it with xrandr
# External output may be "VGA" or "VGA-0" or "DVI-0" or or or...
# Look in KDE monitor config to find the names of detected screens
EXTERNAL_OUTPUT1="DP2"
EXTERNAL_OUTPUT2="HDMI1" #internal DP
INTERNAL_OUTPUT="LVDS1"
# possible locations
# --left-of --right-of --above --below 

xrandr |grep $EXTERNAL_OUTPUT1 | grep " connected "
if [ $? -eq 0 ]; then
        # If DP2 is connected then activate external monitor and turn off internal, set $EXTERNAL_OUTPUT1 to primary monitor
        xrandr --output $EXTERNAL_OUTPUT1 --auto --primary --output $INTERNAL_OUTPUT --off #--output $EXTERNAL_OUTPUT2 --auto --right-of $EXTERNAL_OUTPUT1
else
        xrandr |grep $EXTERNAL_OUTPUT2 | grep " connected "
        if [ $? -eq 0 ]; then
                # If DP1 is connected then activate external monitor and turn off internal, set $EXTERNAL_OUTPUT2 to primary monitor
                xrandr --output $EXTERNAL_OUTPUT2 --auto --primary --output $INTERNAL_OUTPUT --off
        else
                # Didn't see External connected, so turn off both external monitors and turn on the internal one. Set backlight to 25.
                xrandr --output $INTERNAL_OUTPUT --auto --primary --output $EXTERNAL_OUTPUT1 --off --output $EXTERNAL_OUTPUT2 --off
                battery=`cat /sys/devices/platform/smapi/BAT0/state`
                # running on battery = backlight 25%, else 60%
                if [ $battery = discharging ]; then
                  xbacklight -set 25
                else
                  xbacklight -set 60
                fi
        fi

fi
Dieses wird in der Energieverwaltung (unter KDE) eingebunden: Bei wechsel von ac zu dc (und umgekehrt) wirds ausgeführt.

schau an, eigentlich sogar noch besser :) ... hmmm dann sollte ich meine Lösung wieder revidieren!
 
Naja, habs mir ja auch nur zusammengeklaut... :rolleyes:
Weitere Monitore lassen sich nach dem Schema einpflegen.

case/else-if ist sicherlich schöner. Dazu muss ich mich aber erst mal einarbeiten^^
 
Zuletzt bearbeitet:
Naja, habs mir ja auch nur zusammengeklaut... :rolleyes:
.. das tun wir doch irgendwie alle... aber deine Lösung gefällt mir um einiges besser, sie ist weniger invasiv und generischer, außerdem auf Nutzerebene... und überhaupt und sowieso :P
 
Leider poppt immer noch jedes mal die Abfrage auf, ob der neu erkannte Monitor konfiguriert werden soll. Keine Ahnung, ob man das im Script unterdrücken kann.
 
Leider poppt immer noch jedes mal die Abfrage auf, ob der neu erkannte Monitor konfiguriert werden soll. Keine Ahnung, ob man das im Script unterdrücken kann.
aus unerklärlichen gründen ist das bei mir seit geraumer Zeit gar nicht mehr der Fall - auch kann ich über die Systemeinstellungen keinen Monitor mehr konfigurieren unter KDE... ich hab keinen Schimmer, was da passiert ist?!
 
Alles bezieht sich bei mir auf (K)Ubuntu, es sollte aber theoretisch von der Distribution und auch von der grafischen Oberfläche unabhängig sein,
Einspruch Euer Ehren: Unity kann das ootb. Einmal den gewünschten Zustand im Dock per Monitordialog einstellen, danach passiert alles automatisch.

Credits ..gehen an linrunner, denn ich habe sein tlp-rdw script reverse engineered... ich hoffe das ist ok so, dadurch habe ich verstanden wie udev funktioniert.
Danke für die Blumen :). Das ist das Schöne an Open Source. Ich bin auch durch Abschauen auf meine udev-Implementierung gekommen.
 
der vollständigkeit halber: unter gnome3 funktioniert das mit den monitoren übrigens auch ootb. der verwendete dialog ist derselbe wie unter unity (naja, eigentlich andersrum) ;)
bislang war lediglich kde dahingehend etwas rückständig.
 
ich habs noch nicht getestet, aber deinem Link zufolge kann auch KDE das ootb, sofern man das kscreen paket installiert hat... auch wenn das how-to nun etwas hinfällig ist, ich bin happy :)
 
Diskutiert das mal schön weiter. Ich denke, dass die Details, die hier zu Wort kamen (z.B. kscreen installieren/verwenden), u.a. im Wiki besonderer Erwähnung bedürften. :thumbup:
 
kscreen funktioniert soweit.
Sieht dann so aus:
Bildschirmfoto4.png
Die Abfrage, ob der erkannte Monitor konfiguriert werden soll, kommt auch nicht mehr :thumbup:

Die Bildschirmhelligkeit wird jedoch weiter nicht geregtl. Wenn ich abdocke, ist es immer auf 0 gestellt.
Das regel ich dann weiter wie gehabt:
Code:
#!/bin/bash
battery=`cat /sys/devices/platform/smapi/BAT0/state`
# running on battery = backlight 25%, else 60%
if [ $battery = discharging ]; then
  xbacklight -set 25
else
  xbacklight -set 60
fi
 
Zuletzt bearbeitet:
Ich sah mich gezwungen Kscreen wieder zu entfernen. Zum zweiten Mal wurde mir auf meinem ext. Display nur 1/4 (oben links; rechts bleibt schwarz) der Fläche angezeigt und ich konnte nichts mehr machen, außer in dem grade aktiven Fenster (natürlich abgeschnitten) zu klicken. So kann man dort halbwegs navigieren, auf Eingaben wie Datei -> Beenden wird nicht reagiert. Ebenso wenig konnte man die Arbeitsfläche oder die Aktivität wechseln. Abdocken brauchte auch nichts.
Einmal erschien mir der Fehler bei abgedocktem Pc (standby) -> andocken -> starten, und einmal bei deaktiviertem ext. Display und wechseln der Aktivität.

Ich kehre daher zu meinem Script zurück. Nun meine eigentliche Frage:
Habe ich die Module richtig de- bzw. reaktiviert?

Code:
qdbus org.kde.kded /kded org.kde.kded.unloadModule kscreen
qdbus org.kde.kded /kded org.kde.kded.setModuleAutoloading randrmonitor true
qdbus org.kde.kded /kded org.kde.kded.loadModule randrmonitor

Anschließend kscreen via pacman entfernt.
 
Zuletzt bearbeitet:
Ich muss hier nochmal posten:
Den Fehler, den ich beschrieb, trat nur 2x auf. Bis dato lief Kscreen auf 2 Kde's problemlos.

Grade installierte ich Kscreen auf meinem T440s. Nach der Installation wird man wie üblich aufgefordert die drei qdbus Zeilen auszuführen. qdbus ist jedoch nicht mehr vorhanden. Ein kurzer Blick auf ein anderes System mit KDE bestätigt die Erfahrung: auch dort ist qdbus nicht mehr bekannt
Code:
bash: qdbus: Kommando nicht gefunden.

Was mache ich denn da :confused:
 
bau mal die kscreen-git ausm AUR.

Vermutlich ist das kscreen im Repo noch nicht aufs neue kde geupdatet .. bzw ohne qdbus gebaut.

Beim bauen der git-version sieht er das kein qdbus mehr da ist und baut ohne.

kscreen-konsole führt bei mir 1A aus :) Zudem ist es nun in den Settings anders.

Die qdbus-Befehle hab ich gar nich ausgeführt

Grüße
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben