2015-06-29 20:39:14 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
# This script attempts to set a known-good mode on a good output
|
|
|
|
|
|
|
|
function contains() {
|
|
|
|
local n=$#
|
|
|
|
local value=${!n}
|
|
|
|
for ((i=1;i < $#;i++)) {
|
|
|
|
if [ "${!i}" == "${value}" ]; then
|
|
|
|
echo "y"
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
echo "n"
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2016-03-24 21:25:56 +00:00
|
|
|
# This function echoes the first element from first argument array, matching a
|
|
|
|
# prefix in the order given by second argument array.
|
|
|
|
function first_by_prefix_order() {
|
|
|
|
local values=${!1}
|
|
|
|
local prefix_order=${!2}
|
|
|
|
for prefix in ${prefix_order[@]} ; do
|
|
|
|
for val in ${values[@]} ; do
|
|
|
|
if [[ $val =~ ^$prefix ]] ; then echo $val ; return ; fi
|
|
|
|
done
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2015-06-29 20:39:14 +00:00
|
|
|
GOODMODES=("1920x1080" "1280x720")
|
|
|
|
GOODRATES=("60.0" "59.9") # CEA modes guarantee or one the other, but not both?
|
|
|
|
|
|
|
|
# First, some logging
|
|
|
|
date
|
|
|
|
xrandr --verbose
|
|
|
|
|
2016-03-24 21:25:56 +00:00
|
|
|
# List connected outputs
|
|
|
|
ALL_OUTPUT_NAMES=$(xrandr | grep ' connected' | cut -f1 -d' ')
|
|
|
|
# Default to first connected output
|
|
|
|
OUTPUT_NAME=$(echo $ALL_OUTPUT_NAMES | cut -f1 -d' ')
|
2015-06-29 20:39:14 +00:00
|
|
|
|
2016-03-24 21:25:56 +00:00
|
|
|
# If any is connected, give priority to HDMI then DP
|
|
|
|
OUTPUT_PRIORITY="HDMI DP"
|
|
|
|
PREFERRED_OUTPUT=$(first_by_prefix_order ALL_OUTPUT_NAMES[@] OUTPUT_PRIORITY[@])
|
|
|
|
if [[ -n "$PREFERRED_OUTPUT" ]] ; then
|
|
|
|
OUTPUT_NAME=$PREFERRED_OUTPUT
|
|
|
|
fi
|
2015-06-29 20:39:14 +00:00
|
|
|
|
2016-03-24 21:25:56 +00:00
|
|
|
# Disable everything but the selected output
|
2015-06-29 20:39:14 +00:00
|
|
|
for i in $ALL_OUTPUT_NAMES; do
|
|
|
|
if [ "$i" != "$OUTPUT_NAME" ]; then
|
|
|
|
xrandr --output "$i" --off
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
CURRENT_MODELINE=`xrandr | grep \* | tr -s ' ' | head -n1`
|
|
|
|
|
|
|
|
CURRENT_MODE=`echo "$CURRENT_MODELINE" | cut -d' ' -f2`
|
|
|
|
CURRENT_RATE=`echo "$CURRENT_MODELINE" | tr ' ' '\n' | grep \* | tr -d \* | tr -d +`
|
|
|
|
|
|
|
|
# If the current mode is already deemed good, we're good, exit
|
|
|
|
if [ $(contains "${GOODMODES[@]}" "$CURRENT_MODE") == "y" ]; then
|
|
|
|
if [ $(contains "${GOODRATES[@]}" "$CURRENT_RATE") == "y" ]; then
|
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Otherwise try to set combinations of good modes/rates until it works
|
|
|
|
for goodmode in "${GOODMODES[@]}"; do
|
|
|
|
for goodrate in "${GOODRATES[@]}"; do
|
|
|
|
xrandr --output "$OUTPUT_NAME" --mode "$goodmode" --refresh "$goodrate"
|
|
|
|
# If good return, we're done
|
|
|
|
if [[ $? -eq 0 ]]; then
|
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
done
|
|
|
|
|
|
|
|
exit 1
|