Externen Bildschirm im laufenden Betrieb an Notebook anstecken

KDE, Gnome, Windowmanager, X11, Grafiktreiber und alles was dazu notwendig ist. Schau auch in den "Tipps und Tricks"-Bereich.
Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 27.11.2018 15:21:34

Die Skripte erstelle ich mit xRandR.
Ich benutze Cinnamon.
Ich werde es mit udev probieren.
Gelten die udev-Regeln global?

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von MartinV » 27.11.2018 15:31:10

udev-Regeln gelten systemweit.
Sie können sehr allgemein für viele Geräte oder sehr speziell für einzelne Geräte definiert werden.
Das Beispiel vom arch Wiki ist sehr allgemein:

Code: Alles auswählen

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/username/.Xauthority", RUN+="/usr/bin/arandr"
Ich bin kein udev-Experte und habe es nur halb verstanden. Aber einfache Regeln bekomme ich hin.
In dieser Regel beschreibt KERNEL=="card0" die Grafikkarte, die überwacht werden soll.

card0 wird wahrscheinlich auch für Deinen Laptop so stimmen, außer er hat zwei Grafikkarten, und der VGA-Anschluß ist an der anderen.

Soweit ich das sehe, reagiert die Regel auf beliebige eingestöpselte Monitore.

RUN+="/usr/bin/arandr" sollte auf Dein xrandr-Skript zeigen.

Ich weiß nicht, ob die Regel auch auf Abstöpseln reagiert, oder ob dafür eine weitere Regel erstellt werden muß.
Probier einfach aus. Falls die Regel auf beides reagiert, kannst Du in Deinem Skript die Ausgabe von xrandr überprüfen, ob jetzt ein zweiter Monitor vorhanden ist oder nicht, und das Skript kann entsprechend reagieren.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 27.11.2018 21:38:26

So, ich hab das mit der udev-Regel jetzt versucht.
Genau genommen habe ich zwei erstellt. Einmal für das einstecken und einmal für das abziehen des Monitors.
Das aktuelle Problem:
Die udev-Regeln werden schlicht nicht geladen. Ich war bis jetzt auf Fehlersuche. Ohne Erfolg.
Einzige Erkenntniss ist, dass die Regel wirklich nicht geladden wurde. Das Skript funktioniert. Das habe ich ausprobiert.
Die Regeln liegen beide in /etc/udec/rules.d

Hat jemand eine Idee?

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von MartinV » 27.11.2018 21:49:43

Kannst Du Deine udev-Regeln und Dein Skript mal hier zeigen?

Es kann auch sein, daß die udev-Regeln zwar geladen und angewendet werden, aber das Skript es nicht schafft, auf den X Server zuzugreifen. Du könntest zur Prüfung DISPLAY und XAUTHORITY von Deinem Skript in eine Datei /tmp/udev.x schreiben und hinterher prüfen, ob die Datei existiert und sinnvollen Inhalt hat.

Auch mußt Du udev oder gleich das ganze System neu starten, damit die udev-Regel gelesen wird.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 27.11.2018 21:59:35

Gestartet habe ich udev neu.
Ich poste die Sachen morgen. Sonst müsste ich jetzt heute den Notebook noch mal hoch fahren.

Das mit der Ausgabe in eine Datei habe ich versucht.
Da ist keine Datei angelegt worden.

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 28.11.2018 10:02:28

Hi,
ich hab hier mal mein Skript und die Regeln.

Code: Alles auswählen

KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="add", NAME="Monitor",  ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/Persönlicher_Ordner/.Xauthority", RUN+="/Pfad_zum_Skript/Skript.sh"
Ich bin mir nicht sicher ob mein VGA-Ausgang auch wirklich card0 ist. Weiß jemand wie ich es herausfinden kann? Die Pfade, welche ich jetzt hier abstrahiert habe stimmen im Original. Das habe ich mehrfach überprüft. Aber mir fällt jetzt nichts mehr ein was sonst noch falsch liegen könnte.
card0 liegt bei mir in /dev noch einmal im Unterverzeichnis dri.
Also /dev/dri/pfad0
Kann das ein Problem sein?
Die Regel zum entfernen poste ich hier auch mal. Die ist aber auf jeden Fall noch ausbaufähig, weil ich gelesen habe, dass das nicht ganz so einfach sein soll.

Code: Alles auswählen

KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="remove", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/Persönlicher_Ordner/.Xauthority", RUN+="/Pfad_zum_Skript/Skript.sh"
Hier kommt mein Skript:

Code: Alles auswählen

#!/bin/bash

EXTERNAL_OUTPUT="VGA-0"
INTERNAL_OUTPUT="LVDS"

xrandr | grep $EXTERNAL_OUTPUT | grep " connected "

if [ $? -eq 0 ]
then

xrandr --output $INTERNAL_OUTPUT --off
xrandr --output $INTERNAL_OUTPUT --mode 1440x900
xrandr --output $EXTERNAL_OUTPUT --same-as $INTERNAL_OUTPUT
xrandr --output $EXTERNAL_OUTPUT --mode 1680x1050
xrandr --output $INTERNAL_OUTPUT --panning 1680x1050
xrandr --output $EXTERNAL_OUTPUT --fb 1680x1050
else
xrandr --output $EXTERNAL_OUTPUT --off
xrandr --output $INTERNAL_OUTPUT --mode 1440x900
fi  
Ich habe das in so viele Befehle ausgelagert weil es für die Implementierungsphase einfach für alle Beteiligten übersichtlicher ist.
Das --off ist notwendig, weil der Monitor des öffteren im laufenden Zustand einfach nicht mehr reagiert hat.
Schaltet man ihn ab und startet ihn mit anderen Optionen neu gibt es keine Probleme.

Die Stelle mit dem Anlegen der Datei hab ich der Übersicht halber um zu kürzen auch rausgenommen. Bei mir auf der Platte ist sie aber vorhanden.
Ich bin mir sicher irgendwo habe ich was verbockt und hoffe da auf eure Hilfe.
Selber hatte ich mit udev noch nicht wirklich was am Hut.

Lieben Gruß
Rosenrot

Benutzeravatar
MSfree
Beiträge: 10752
Registriert: 25.09.2007 19:59:30

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von MSfree » 28.11.2018 10:29:05

Rosenrot hat geschrieben: ↑ zum Beitrag ↑
28.11.2018 10:02:28
Hier kommt mein Skript:...
Udev läuft nicht mit deinen Benutzerrechten und weiß nichts über den X-Server, mit dem du gerade eingelogt bist.

1. Problem:
Der Benutzer, unter dem udev läuft, hat keine Berechtigung, um auf deinen X-Server zuzugreifen. Im Home-Verzeichnis des Benutzers, unter dem der X-Server läuft, gibt es die Datei .Xauthority, die du benutzen mußt, um dich gegen den X-Server zu authentisieren.

2. Problem:
xrandr weiß nicht, welches Display er anfassen soll. Das läßt sich jedoch in der Regel einfach dadurch lösen, indem man die Umgebungfsvariable DISPLAY auf ":0" setzt, welches das Hauptdisplay des Rechners ist.

Dein Skript sollte mit folgenden ergänzungen funktionieren:

Code: Alles auswählen

#!/bin/bash
# Debug code, bitte #-Zeichen der nächsten Zeile entfernen.
# echo "udev Skript gestartet" > /tmp/MeinUdevSkript.out
# hier bitte deinen Benutzernamen eintragen
USER=DeinBenutzerName
# notwendige Umgebungsvariablen setzen
export DISPLAY=:0.0
export XAUTHORITY=~$USER/.Xauthority
# es ist immer eine gute Idee, in Skripten absolute Pfade zu verwenden
XRANDR=/usr/bin/xrandr

EXTERNAL_OUTPUT="VGA-0"
INTERNAL_OUTPUT="LVDS"

$XRANDR | grep $EXTERNAL_OUTPUT | grep " connected "

if [ $? -eq 0 ]
then
  $XRANDR --output $INTERNAL_OUTPUT --off
  $XRANDR --output $INTERNAL_OUTPUT --mode 1440x900
  $XRANDR --output $EXTERNAL_OUTPUT --same-as $INTERNAL_OUTPUT
  $XRANDR --output $EXTERNAL_OUTPUT --mode 1680x1050
  $XRANDR --output $INTERNAL_OUTPUT --panning 1680x1050
  $XRANDR --output $EXTERNAL_OUTPUT --fb 1680x1050
else
  $XRANDR --output $EXTERNAL_OUTPUT --off
  $XRANDR --output $INTERNAL_OUTPUT --mode 1440x900
fi

# Debug code, bitte #-Zeichen der nächsten Zeile entfernen.
# echo "udev Skript beendet" >> /tmp/MeinUdevSkript.out
Mit dem Debugcode sollte unter /tmp die Datei MeinUdevSkript.out entstehen, um zu prüfen, ob des Skript üebrhaupt aktiviert wird.

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 28.11.2018 10:40:22

Danke dir für deinn Hilfe.
Kurze Frage dazu:
Athentifiziere ich mich nicht bereits in der udev-Regel bei X?
Ich dachte das Skript wird dann einfach unter meinem Nutzer ausgeführt?
Oder liegt es daran, dass die udev-Regeln systemweit gelten?
Also müsste ein anderer Nutzer auch auf das Skript zugreifen können.
Das geht aber momentan nicht so wie ich das gemacht habe.

Bitte nicht missverstehen. Ich zweifle das nicht an. Ich lerne einfach sehr viel durch fragen und danach tun. :D

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 28.11.2018 11:16:35

Ich hab das Skript ausprobiert und es läuft schon besser als mein altes.
Beim einstecken des Monitors wird das Skript aufgerufen. Die Regel, welche beim ausstecken des externen Monitors greifen soll tut gar nichts.
Leider führen die Einstellungen im Skript, wenn es in der udev-Regel aufgerufen wird zu etwas vollkommen anderem als wenn ich es manuell aufrufe.
Rufe ich es manuell auf ist alles wie gewünscht.
Bei udev sucht er sich die irrwitzigsten Einstellungen aus. Durchaus dann auch mal mit Abwechslung.
Liegt es vielleicht daran, dass der Monitor beim abziehen nicht richtig "abgemeldet wird" und die alten Einstellungen noch gelten?

Ich denke es liegt daran, dass irgendwo vom System auch noch mal Einstellungen vorgenommen werden.
Und zwar NACHDEM mein Skript aufgerufen wird.
Darauf aufbauend kommt dann halt Mist raus.

Benutzeravatar
MSfree
Beiträge: 10752
Registriert: 25.09.2007 19:59:30

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von MSfree » 28.11.2018 11:23:55

Rosenrot hat geschrieben: ↑ zum Beitrag ↑
28.11.2018 10:40:22
Athentifiziere ich mich nicht bereits in der udev-Regel bei X?
Der udev-Dienst ist ein systemweiter Dienst, der von systemd gestartet wird. Von irgendwelchen Logins bekommt der erstmal nichts mit.
Ich dachte das Skript wird dann einfach unter meinem Nutzer ausgeführt?
Das Skript wird unter dem Benutzer ausgeführt, unter dem der udevd läuft. Bei meinem Jessie-Server ist das root.
Also müsste ein anderer Nutzer auch auf das Skript zugreifen können.
Wie gesagt, udev weiß nicht, wer gerade eingelogt ist. Es bekommt lediglich die Information, daß sich die Hardwarekonfiguration geändert hat, (z.B. USB-Sticks eingestöpselt, Monitor angeschlossen,...) Welcher Benutzer dafüt verantwortlich ist, weiß udevd nicht.

Allerdings können sich Desktopumgebungen wie KDE und Gnome mit dem udevd verbinden und sich benachrichtigen lassen, wenn udevd ein Ereignis mitbekommt. Das wäre dann aber eine Indirektion weiter, also system-udevd benachrichtigt den Desktopmanager und der führt dann Aktionen aus.
Das geht aber momentan nicht so wie ich das gemacht habe.
Richtig, das klappt so erstmal nur mit dem Benutzer, den du in das Skript einträgst.

Du kannst natürlich auch einfach mal den Debugcode aktivieren und in der Zeile hinter:

Code: Alles auswählen

echo "udev Skript gestartet" > /tmp/MeinUdevSkript.out
ein

Code: Alles auswählen

echo $USER >> /tmp/MeinUdevSkript.out
einbauen, also bevor

Code: Alles auswählen

USER=DeinBenutzerName
gesetzt wird. Mit ein wenig Glück ist da schon dein Benutzer aktiv, dann erübrigt sich das Setzen der USER-Variable.

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 28.11.2018 21:01:10

Ich denke inzwischen, dass die Einstellungen von Cinnamon vorgenommen werden.
Wo Cinnamon aber die Konfiguration dafür hernimmt kann ich nicht finden.
Es würde ja schon reichen diese Konfiguration entsprechend anzupassen.
Kann mir jemand in dieser Hinsicht helfen, der schon einige Erfahrung diesbezüglich hat?

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von MartinV » 29.11.2018 00:19:29

Rosenrot hat geschrieben: ↑ zum Beitrag ↑
28.11.2018 11:16:35
Leider führen die Einstellungen im Skript, wenn es in der udev-Regel aufgerufen wird zu etwas vollkommen anderem als wenn ich es manuell aufrufe.
Rufe ich es manuell auf ist alles wie gewünscht.
Bei udev sucht er sich die irrwitzigsten Einstellungen aus. Durchaus dann auch mal mit Abwechslung.
Liegt es vielleicht daran, dass der Monitor beim abziehen nicht richtig "abgemeldet wird" und die alten Einstellungen noch gelten?
Rosenrot hat geschrieben: ↑ zum Beitrag ↑
28.11.2018 11:16:35
Ich denke es liegt daran, dass irgendwo vom System auch noch mal Einstellungen vorgenommen werden.
Und zwar NACHDEM mein Skript aufgerufen wird.
Darauf aufbauend kommt dann halt Mist raus.
Rosenrot hat geschrieben: ↑ zum Beitrag ↑
28.11.2018 21:01:10
Ich denke inzwischen, dass die Einstellungen von Cinnamon vorgenommen werden.
Wenn das Skript direkt aufgerufen richtig funktioniert, aber über udev seltsame und unterschiedliche Ergebnisse herauskommen, könnte es sein, daß Dein Skript und Cinnamon gleichzeitig versuchen, den neuen Monitor zu konfigurieren.
Du könntest einfach eine kleine Pause in das Skript einfügen, damit es erst nach der automatischen Konfiguration von Cinnamon die xrandr-Befehle ausführt. Ein "sleep 1" oder "sleep 2" vor dem ersten xrandr könnte schon genügen.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 29.11.2018 13:11:23

Hi,
ich hab das gerade mal ausprobiert.
Die Änderung hat keinen Einfluss.
Ich denke es liegt wirklich daran, dass Cinnamon beginnt nachdem udev fertig ist.

Außerdem ist mir aufgefallen, dass der Sperrbildschirm falsch angezeigt wird.
Auch nachdem das Skript manuell gestartet wurde.
Beim zweiten mal manuell starten nachdem der externe Bildschirm abgezogen war ist aber alles wieder gut.

Gibt es eventuell vorgefertigte udev-Regeln für den VGA-Ausgang?

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von MartinV » 29.11.2018 16:05:19

Rosenrot hat geschrieben: ↑ zum Beitrag ↑
29.11.2018 13:11:23
Ich denke es liegt wirklich daran, dass Cinnamon beginnt nachdem udev fertig ist.
Falls es tatsächlich daran liegt, läßt es sich vielleicht austricksen.
Die xrandr-Prozesse abkoppeln/im Hintergund laufen lassen und erst nach 5 Sekunden Verzögerung ausführen:

Code: Alles auswählen

#!/bin/bash
# Debug code, bitte #-Zeichen der nächsten Zeile entfernen.
# echo "udev Skript gestartet" > /tmp/MeinUdevSkript.out
# hier bitte deinen Benutzernamen eintragen
USER=DeinBenutzerName
# notwendige Umgebungsvariablen setzen
export DISPLAY=:0.0
export XAUTHORITY=~$USER/.Xauthority
# es ist immer eine gute Idee, in Skripten absolute Pfade zu verwenden
XRANDR=/usr/bin/xrandr

EXTERNAL_OUTPUT="VGA-0"
INTERNAL_OUTPUT="LVDS"

$XRANDR | grep $EXTERNAL_OUTPUT | grep " connected "

{
  sleep 5 # darauf warten, daß Cinnamon fertig ist
  
  if [ $? -eq 0 ]
  then
    $XRANDR --output $INTERNAL_OUTPUT --off
    $XRANDR --output $INTERNAL_OUTPUT --mode 1440x900
    $XRANDR --output $EXTERNAL_OUTPUT --same-as $INTERNAL_OUTPUT
    $XRANDR --output $EXTERNAL_OUTPUT --mode 1680x1050
    $XRANDR --output $INTERNAL_OUTPUT --panning 1680x1050
    $XRANDR --output $EXTERNAL_OUTPUT --fb 1680x1050
  else
    $XRANDR --output $EXTERNAL_OUTPUT --off
    $XRANDR --output $INTERNAL_OUTPUT --mode 1440x900
  fi
} & # im Hintergrund laufen lassen, damit Cinnamon glaubt, udev sei fertig.

# Debug code, bitte #-Zeichen der nächsten Zeile entfernen.
# echo "udev Skript beendet" >> /tmp/MeinUdevSkript.out
Es wäre auch einen Versuch wert, mal z.B. openbox statt Cinnamon zu starten und das Verhalten zu vergleichen.
Rosenrot hat geschrieben: ↑ zum Beitrag ↑
29.11.2018 13:11:23
Gibt es eventuell vorgefertigte udev-Regeln für den VGA-Ausgang?
Ich verstehe Deine Frage nicht.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 29.11.2018 18:36:07

Hallo,
auch das hat leider keinen Unterschied gebracht.
Langsam weiß ich echt nicht mehr.

Mit den systemeigenen udev-Regeln meine ich diese, welche in /lib/udev/rules.d liegen.

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von MartinV » 01.12.2018 13:03:39

In Sachen udev weiß ich hier auch nicht weiter. :(
Vielleicht ist es das Beste, einfach einen Starter für Dein Skript in das Cinnamon-Panel zu legen.
Der Mausklick wird weniger Zeit kosten als weitere Forschung. :wink:

Edit: Es wäre noch interessant, das Verhalten mit anderen Desktops with xfce oder openbox zu vergleichen.
Wenn die Konfusion nur bei Cinnamon auftritt, könnte man in einem Cinnamon-Forum oder bei den Cinnamon-Entwicklern nachfragen.
Zuletzt geändert von MartinV am 01.12.2018 15:06:05, insgesamt 1-mal geändert.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von rendegast » 01.12.2018 13:56:15

Debiandisper?
Anzeigeumschalter für einfaches Hinzufügen und Entfernen von Anzeigegeräten

Nie mehr Kopfschmerzen kurz vor Ihrer Präsentation. Mithilfe von Disper ist es möglich Anzeigegeräte mit einem Knopfdruck hinzuzufügen oder auch zu entfernen. Disper erkennt alle momentan angeschlossenen Anzeigegeräte und konfiguriert die Ausgabe automatisch. Hierbei kann man spezifizieren ob die aktuelle Bildschirmausgabe auf weitere Anzeigegeräte geklont werden soll, oder ob der Desktop auf diese erweitert werden soll.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Rosenrot
Beiträge: 39
Registriert: 24.07.2017 20:24:54

Re: Externen Bildschirm im laufenden Betrieb an Notebook anstecken

Beitrag von Rosenrot » 07.12.2018 16:33:03

Hallo zusammen,

also ich hab jetzt die letzten Tage noch einmal ein wenig intensiver nach einer Lösung gesucht.
Da war aber nichts zu machen.
Ich habe jetzt tatsächlich den Fenstermanager gewechselt und bin auf Awesome umgestiegen.
Das erfordert zwar mehr Konfigurationsaufwand aber das ist es mir wert.

Gruß
Rosenrot

Antworten