You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.4 KiB
Bash

#!/bin/bash
# setdisplay
# A simple script to configure X and PulseAudio with predefined profiles.
### Usage
# setdisplay [PROFILE]
# Configure X with the specified profile, but don't change the audio profile.
# setdisplay -a [PROFILE]
# Configure X with the specified profile and change the audio profile to match it.
function call_xrandr() {
xrandr_opts=''
for display in "${!display_configurations[@]}"; do
echo "Setting ${display} to ${display_configurations[$display]}"
xrandr_opts="${xrandr_opts} --output ${display} ${display_configurations[$display]}"
done
# Word splitting here is important, so it's not in quotes.
xrandr $xrandr_opts
}
function display_config() {
display_name="$1"
display_config="$2"
if [[ ${display_configurations[$display_name]} = '' ]]; then
echo "Tried to configure invalid display ${display_name}."
exit 1
fi
if [[ ${connected_displays[$display_name]} != 'yes' ]]; then
echo "Tried to configure disconnected display ${display_name}."
exit 1
fi
display_configurations[$display_name]="$display_config"
}
function guess_output_from_class() {
display_class="$1"
canonical_display_name=''
for display in "${!display_configurations[@]}"; do
if [[ ( $display == ${display_class}* ) && \
( "${connected_displays[$display]}" == 'yes' ) ]]; then
if [[ $canonical_display_name == '' ]]; then
canonical_display_name="$display"
else
echo "Multiple displays of class ${display_class} are connected. Quitting."
exit 1
fi
fi
done
if [[ $canonical_display_name == '' ]]; then
echo "No displays of class ${display_class} found. Quitting."
exit 1
fi
echo "$canonical_display_name"
}
declare -A display_configurations
declare -A connected_displays
if [ "$1" = '-a' ]; then
switch_audio='yes'
display_profile="$2"
else
display_profile="$1"
fi
while read -r display_line; do
display_name="$(echo "$display_line" | cut -d " " -f 1)"
if [[ "$(echo "$display_line" | cut -d " " -f 2)" = 'connected' ]]; then
connected_displays[$display_name]='yes'
else
connected_displays[$display_name]='no'
fi
display_configurations[$display_name]=' --off'
done <<< "$(xrandr | grep connected)"
# TODO: These cases can probably just be read from input now.
case $display_profile in
'lvds-hdmi')
hdmi_display="$(guess_output_from_class "HDMI")"
display_config 'LVDS1' '--primary --mode 1366x768'
display_config "$hdmi_display" '--mode 1280x720 --above LVDS1'
audio_profile='output:hdmi-stereo'
;;
'hdmi')
hdmi_display="$(guess_output_from_class "HDMI")"
display_config "$hdmi_display" '--primary --mode 1280x720'
audio_profile='output:hdmi-stereo'
;;
'lvds')
display_config 'LVDS1' '--primary --mode 1366x768'
audio_profile='output:analog-stereo'
;;
# This is intended to be a quick rescue mode.
'')
display_config 'LVDS1' '--primary --mode 1366x768'
audio_profile='output:analog-stereo'
;;
*)
echo "No profile ${display_profile} has been defined."
exit 1
;;
esac
call_xrandr
if [ "$switch_audio" = 'yes' ]; then
# TODO: Figure out how to remove this dependency.
ponymix -c 0 set-profile "${audio_profile}"
fi