I've read the answers to this question but I don't have ACPI, the /sys/class/drm/card0-socket/status method does not work and the xrandr method chokes my CPU. udevadm monitor shows nothing when (un)plugging the monitor.

I've got a circa 2013 Lenovo ThinkPad w530 with nVidia quadro something. I'm running Lubuntu 18.04 with the nouveau driver. The monitor is a 27" Philips 271S. I'm using a VGA cable.

How do I do detect monitor (un)plugging?

  • 1
    Are you running nvidia or nouveau? Depending on that, you may also get "files" with EDID entries under /sys or /proc. Also, it's interesting that xrandr "chokes your CPU', while read-edid, which calls the BIOS and has to do some extremely complicated things to do that, does not. xrandr really should just call the X server, which should already have this information. Unless nvidia/nouveau decides that's a good time to test for connected monitors again, with all the time-outs that usually involves. – dirkt Nov 15 '18 at 8:06
  • I'm running nouveau. I have the EDID in /sys/class/drm/card0-VGA-1/edid but cat /path/edid gives the same result both with the monitor plugged and unplugged. Maybe the chocking could be avoided with some nice trick, I didn't try that route. About "just calling the X server", maybe that's what srandr does, but I'm not at ease with compiling C. – White_Rabbit Nov 15 '18 at 8:49
  • Which call did you use? Just xrandr -q? If this results in monitor probing with long timeouts each time it's called (check /var/log/Xorg.0.log for hints if it really does that), I'd consider a bugreport with the nouveau developers. Possibly there's also a way to set shorter timeouts or to just probe card0-VGA-1, so I'd ask them. It seems to work via get-edid, after all. – dirkt Nov 15 '18 at 9:07
  • I use xrandr --display :0 --query. I can't interpret the log. #Last line before call [ 15674.053] (II) event7 - ThinkPad Extra Buttons: device is a keyboard # I call xrandr [ 17548.848] (II) NOUVEAU(0): EDID vendor "PHL", prod id 2314 # [ many lines ] # [ last line of /var/log/Xorg.0.log] [ 17548.849] (II) NOUVEAU(0): Modeline "1280x720"x60.0 74.48 1280 1336 1472 1664 720 721 724 746 -hsync +vsync (44.8 kHz e) – White_Rabbit Nov 15 '18 at 9:15

I resorted to polling for the external screen EDID. I installed the read-edid package, added a line in visudo

%sudo  ALL=(ALL:ALL) NOPASSWD:/usr/bin/get-edid

to allow passwordless get-edid and used the following loop:

# edid_based_automatic_display_loop.sh

while :
    sleep 1
    sudo get-edid 2>/dev/null|parse-edid 2>/dev/null|grep "PHL 271S7Q">/dev/null
    _DISCONNECTED=`echo $?`
    if [ $_DISCONNECTED = "0" -a $NEW_CONNECTION = "1" ] ; then
        export NEW_DISCONNECTION=1;
        export NEW_CONNECTION=0;
        bash /home/bruno/.screenlayout/only_external.sh
    elif [ $_DISCONNECTED = "1" -a $NEW_DISCONNECTION = "1" ] ; then
        export NEW_DISCONNECTION=0;
        export NEW_CONNECTION=1;
        bash /home/bruno/.screenlayout/only_laptop.sh

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.