I have a laptop (LVDS display) and an external monitor (VGA-0 display). When I am working with many windows and I really need to see them in parallel (and the laptop's screen width is too small for that) I am using the external monitor too.
This suppose to set up a dual monitor using the xrandr (x11-apps/xrandr), something like:
#!/bin/bash MONITOR_LIST="VGA-0,LVDS" # from left to right, exactly as they are physically positioned on your desk MONITOR_TO_SWITCH="VGA-0" # comma-delimited list of monitors you want to switch off/on #XRANDR_INFO=`xrandr -q` # query the xrandr about monitor status; store the result into variable, we'll use it multiple times # return monitor name if is on, otherwise nothing function is_monitor_on() { xrandr -q|awk '{if (index($0," connected")>0) mon=$1; if (mon!="" "" index($0,"*")>0) print mon}'|awk '/'$1'/' } # return the xrandr option required to switch ON the monitor(s) that are switched OFF function monitor_output_str() { result="" prev_monitor="" for m in $(echo $MONITOR_LIST|awk 'BEGIN {RS=","} {print}');do result="$result --output $m --auto" if [ "$prev_monitor" != "" ];then result="$result --right-of $prev_monitor" fi prev_monitor=$m done echo $result } # loop through each monitor to be switched and turn it on (if is off) or vice-versa for m in $(echo $MONITOR_TO_SWITCH|awk 'BEGIN {RS=","} {print}');do result=$(is_monitor_on $m) if [ "$result" = "$m" ];then xrandr --output $m --off ICON="network-transmit.png" STATE="off" else $(xrandr $(monitor_output_str)) ICON="network-transmit-receive.png" STATE="auto" fi notify-send -i "/usr/share/icons/Tango/48x48/status/$ICON" "Monitor switch" "Monitor $m was switched $STATE" done
Note: don't forget to set the script as executable (eg chmod +x dualmon)
The script will also print-out a balloon notification (via libnotify) so we'll be informed about which monitor was turned on/off:
For another workstation where I use also a multi-monitor setup, I've adapted the above script as following:
- when I press the Win+F1 key combination I want 1st monitor turned off
- when I press the Win+F2 key combination I want  1st monitor turned on
- when I press the Win+F3 key combination I want 2nd monitor turned off
- when I press the Win+F4 key combination I want  2nd monitor turned on
- when I press the Win+F5 key combination I want all monitors turned off
- when I press the Win+F6 key combination I want all monitors turned on, on a specified order from left to right
The script looks like the one bellow:
#!/bin/bash # DP1=HP monitor; is positioned on the left # VGA1=DELL monitor; is positioned on the right MONITOR_SETUP="DP1,VGA1" # from left to right, exactly as they are physically positioned on your desk ICON_RES="scalable" ICON_EXT=".svg" # Print the script help syntax function print_syntax() { echo -e "Usage : $0 [OPTION]...nStarts|stops the "$MONITOR_SETUP" multi-monitor setup or just turn on|off a specified display.n" echo -e "Mandatory arguments to long options are mandatory for short options too.n" echo -e " -ctturn on|off either the predefined multi-monitor setup or when -d is used then the specified display" echo -e " -d tspecify the display to start|stop (run xrandr -q to see the display names);nttttwhen -d is not used then the multi-monitor setup "$MONITOR_SETUP" is used instedn" echo "Report bugs to " } # Check for sufficent args if [ $# -lt 2 ] ; then print_syntax; exit 1; fi # Read the options/arguments from command-line while getopts c:d: flag; do case $flag in c|command) COMMAND=$OPTARG ;; d|display) MONITOR=$OPTARG ;; ?) echo "Invalid option: $flag"; print_syntax; exit 2; ;; :) echo "Option -$flag requires an argument."; print_syntax; exit 3; ;; h) print_syntax; exit 0; ;; *) print_syntax; exit 2; ;; esac done case $COMMAND in auto|off) STATE=$COMMAND ;; *) print_syntax; exit 4; ;; esac function set_monitor_state() { m=$1 # 1st arg. indicates the monitor name MONITOR_STATE=$2 # 2nd arg. indicates the requested monitor state (auto|off) OPTIONS=$3 CMD="xrandr --output $m --$MONITOR_STATE" MSG="Monitor $m was switched $MONITOR_STATE" if [ -n "$OPTIONS" ];then CMD="$CMD --right-of $OPTIONS" MSG="$MSG on right of $OPTIONS" fi $($CMD) case $MONITOR_STATE in auto) ICON="network-transmit-receive${ICON_EXT}" ;; off) ICON="network-transmit${ICON_EXT}" ;; esac notify-send -i "/usr/share/icons/Tango/${ICON_RES}/status/$ICON" "Monitor switch" "$MSG" } # if the monitor has been specified then set its required state if [ -n "$MONITOR" ];then set_monitor_state $MONITOR $STATE else prev="" # if no monitor was specified then loop throughout monitor list and start|stop them for m in $(echo "$MONITOR_SETUP"|awk 'BEGIN {RS=","} {print}');do if [ -n "$m" ];then set_monitor_state $m $STATE $prev; if [ $STATE = "auto" ];then prev=$m fi fi done fi
All I had to do in order to switch multi monitor was to define 6 keyboard combination for commands like:
- dualmon -c off VGA0
- dualmon -c auto VGA0
- dualmon -c off DP1
- dualmon -c auto DP1
- dualmon -c off
- dualmon -c auto
Now, if you think that this article was interesting don't forget to rate it. It shows me that you care and thus I will continue write about these things.
Eugen Mihailescu
Latest posts by Eugen Mihailescu (see all)
- Dual monitor setup in Xfce - January 9, 2019
- Gentoo AMD Ryzen stabilizator - April 29, 2018
- Symfony Compile Error Failed opening required Proxies - January 22, 2018