Skip to content

Instantly share code, notes, and snippets.

@edeustace
Created September 25, 2018 09:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edeustace/25dff3c3aab8d5d468b7ef0983443a31 to your computer and use it in GitHub Desktop.
Save edeustace/25dff3c3aab8d5d468b7ef0983443a31 to your computer and use it in GitHub Desktop.
update-monitor-position for monitors.xml version 2
#!/bin/bash
# -------------------------------------------------
# Get monitors configuration from monitor.xml and apply it for current user session.
# In case of multiple definitions in monitor.xml only first one is used.
#
# See http://bernaerts.dyndns.org/linux/74-ubuntu/309-ubuntu-dual-display-monitor-position-lost
# for instructions
#
# Revision history :
# 19/04/2014, V1.0 - Creation by N. Bernaerts
# 10/07/2014, V1.1 - Wait 5 seconds for X to fully initialize
# 30/07/2014, V1.2 - K. Callenberg added handling of primary monitor setting
# 25/09/2018, V2.0 - Ed Eustace - update for monitors.xml version="2"
# -------------------------------------------------
# get number of declared monitors
NUM=$(xmllint --xpath 'count(//monitors/configuration['1']/logicalmonitor)' $HOME/.config/monitors.xml)
echo "NUM: $NUM"
# loop thru declared monitors to create the command line parameters
for (( i=1; i<=$NUM; i++)); do
# get attributes of current monitor (name and x & y positions)
NAME=$(xmllint --xpath 'string(//monitors/configuration['1']/logicalmonitor['$i']/monitor/monitorspec/connector/text())' $HOME/.config/monitors.xml 2>NULL)
POS_X=$(xmllint --xpath '//monitors/configuration['1']/logicalmonitor['$i']/x/text()' $HOME/.config/monitors.xml 2>NULL)
POS_Y=$(xmllint --xpath '//monitors/configuration['1']/logicalmonitor['$i']/y/text()' $HOME/.config/monitors.xml 2>NULL)
PRIMARY=$(xmllint --xpath '//monitors/configuration['1']/logicalmonitor['$i']/primary/text()' $HOME/.config/monitors.xml 2>NULL)
# if position is defined for current monitor, add its position to command line parameters
if [ "$PRIMARY" == "yes" ] ; then
[ -n "$POS_X" ] && PARAM_ARR=("${PARAM_ARR[@]}" "--output" "$NAME" "--primary" "--pos" "${POS_X}x${POS_Y}")
else
[ -n "$POS_X" ] && PARAM_ARR=("${PARAM_ARR[@]}" "--output" "$NAME" "--pos" "${POS_X}x${POS_Y}")
fi
done
# echo "${PARAM_ARR[@]}"
# wait for 5 seconds (for X to finish initialisation)
sleep 5
# position all monitors
xrandr "${PARAM_ARR[@]}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment