Automatically switch Xfce panel layout when pluggin in a monitor

February 02, 2021 — ~redtrumpet

This is my documentation of this blog post by Colin Robins. I’m quite thankful for his explanation, and really happy that it now works for me. His post is ~5 years old and I found a few things that don’t work exactly the same anymore. I tested everything on Xubuntu 20.04.

Panel configurations

The handy tool Xfce Panel profiles allows you to backup and export your different desired panel configurations. I named mine laptop.tar.bz2 and external-monitor.tar.bz2. You can load a different panel profile from the command line with

xfce4-panel-profiles load <profile>.tar.bz2

udev rule

udev is responsible for starting our service after connecting or disconnecting the external monitor. To use it we have write a udev rule, i.e. put the following into the file /etc/udev/rules.d/95-monitor-hotplug.rules

ACTION=="change", KERNEL=="card0", RUN+="/usr/bin/systemctl start hot_plug.service"

So I’m no expert on udev but AFAIK this tells udev to start the service hot_plug.service whenever there is a “change” concerning the video card output.

systemd service

So now we still have to write the systemd service hot_plug.service. Here are some basics about systemd services. To create our service write the following into the file /etc/systemd/system/hot_plug.service

[Unit]
Description=Monitor hotplug

[Service]
Type=simple
RemainAfterExit=no
User=jonas
ExecStart=/usr/bin/bash /usr/local/bin/hotplug_monitor.sh

[Install]
WantedBy=multi-user.target

Replace jonas by your username. So this service calls a script /usr/local/bin/hotplug_monitor.sh, which will do the actual work. For me this script is

#!/bin/bash

X_USER=jonas
export DISPLAY=:0
export XAUTHORITY=/home/$X_USER/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

function connect()
{
    xfce4-panel-profiles load /home/jonas/.config/xfce4-panel-profiles/external-monitor.tar.bz2
}

function disconnect()
{
    xfce4-panel-profiles load /home/jonas/.config/xfce4-panel-profiles/laptop.tar.bz2
}

if [ $(cat /sys/class/drm/card0-HDMI-A-1/status) == "connected" ] ; then
    connect
elif [ $(cat /sys/class/drm/card0-HDMI-A-1/status) == "disconnected" ] ; then
    disconnect
else
    exit
fi

Things you might want to adapt:

  1. You should change X_USER to your username
  2. I store the panel profiles in /home/jonas/.config/xfce4-panel-profiles/
  3. Check if your external monitor is card0-HDMI-A-1. If you use VGA this might be something different.

Further adaptions

If you want you can add other things that should be done when connecting the external monitor. I mostly use this with my Wacom tablet, so I also want to set the drawing area only on the tablet. So I added the line

# map the tablet input to the tablet's display
xsetwacom --set "Wacom One Pen Display 13 Pen stylus" MapToOutput HDMI-A-0

To change the button on the pen to right click instead of middle click I use

# map the button on the pen to right click
xsetwacom --set "Wacom One Pen Display 13 Pen stylus" Button 2 "button +3"

tags: computers, udev, systemd, xfce