scripts/ecran

201 lines
7.0 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /bin/sh
# Description: Manage video output (size, orientation, ...)
# And reload wm configuration
# Vars {{{
[ -z "${DEBUG}" ] && readonly DEBUG=0
## Colors
readonly PURPLE='\033[1;35m'
readonly RED='\033[0;31m'
readonly RESET='\033[0m'
readonly COLOR_DEBUG="${PURPLE}"
## First and primary output (laptop screen, hdmi-1,…)
## It can be forced here or the script will try to discover it's name
#readonly PRIMARY_OUTPUT_NAME="LVDS-1"
## Second output (hdmi-2, dp-1,…)
## It can be forced here or the script will try to discover it's name
#readonly SECOND_OUTPUT_NAME
readonly SECOND_OUTPUT_MODE="--auto"
# }}}
debug_message() { # {{{
local_message="${1}"
## Print message if DEBUG is enable (=0)
[ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG ${PROGNAME}: ${local_message}"
return 0
}
# }}}
define_vars() { # {{{
[ -f "${HOME}/.config/xrandr.conf" ] && \
. "${HOME}/.config/xrandr.conf" && \
printf "%b\n" 'Use local config file.'
## Primary output {{{
### If the primary output wasn't manually defined,
### try to get it's name
if [ -z "${PRIMARY_OUTPUT_NAME}" ]; then
get_primary_output_name
fi
debug_message "define_vars \
The primary output is: ${PRIMARY_OUTPUT_NAME}."
## }}}
## Second output {{{
### If the second output wasn't manually defined,
### try to get it's name
if [ -z "${SECOND_OUTPUT_NAME}" ]; then
SECOND_OUTPUT_NAME=$(xrandr | grep " connected" | grep -v "${PRIMARY_OUTPUT_NAME}" | awk 'NR==1{ print $1 }')
debug_message "define_vars \
The second output is: ${SECOND_OUTPUT_NAME}."
fi
## }}}
## Second output mode {{{
### If second_output_mode wasn't defined (~/.config/xrandr.conf file, var env…)
### Use default value
### Then use ${second_output_mode} variable without "" to be able to use it as xrandr's option
if [ -z "${second_output_mode}" ]; then
second_output_mode=${SECOND_OUTPUT_MODE}
fi
## }}}
}
# }}}
get_primary_output_name() { # {{{
## First, check if an output is already defined as primary
local_primary_output_name=$(xrandr | grep " primary" | grep -v " disconnected" | awk 'NR==1{ print $1 }')
## If the var contains something
if [ -n "${local_primary_output_name}" ]; then
debug_message "get_primary_output_name \
An output is defined as primary: ${local_primary_output_name}".
else
## Then check if an output starting with "LVD" (typically a laptop) is connected
local_primary_output_name=$(xrandr | grep "^LVD" | grep " connected" | awk 'NR==1{ print $1 }')
if [ -n "${local_primary_output_name}" ]; then
debug_message "get_primary_output_name \
The primary output seems to be a laptop screen: ${local_primary_output_name}".
else
## Then check if any output is connected and take the first one
local_primary_output_name=$(xrandr | grep " connected" | awk 'NR==1{ print $1 }')
if [ -n "${local_primary_output_name}" ]; then
debug_message "get_primary_output_name \
Take the first connected output as primary: ${local_primary_output_name}".
else
debug_message "get_primary_output_name \
Unable to get primary output name!
Ensure to have a primary, LVDS or any connected output in xrandr."
exit 2
fi
fi
fi
readonly PRIMARY_OUTPUT_NAME="${local_primary_output_name}"
}
# }}}
is_proc_running() { # {{{
local_proc_pattern="${1}"
local_count_proc_pattern="$(pgrep -f -- "${local_proc_pattern}" | wc -l)"
case "${local_count_proc_pattern}" in
0 ) ## No procs related to this pattern are running
return_proc_running="1"
;;
* ) ## At least one proc seems running
return_proc_running="0"
;;
esac
## Simple debug message to valid current variables
debug_message "is_proc_running \
procs running (with the pattern: ${RED}${local_proc_pattern}${COLOR_DEBUG}) on the current host: ${RED}${local_count_proc_pattern}${COLOR_DEBUG}."
return "${return_proc_running}"
}
# }}}
main() { # {{{
## Update herbstluftwm Window Manager configuration if it's running
is_proc_running "herbstluftwm" \
&& herbstclient detect_monitors \
&& herbstclient reload
}
# }}}
# Define all vars
define_vars
# Manage arguments # {{{
# This code can't be in a function due to arguments
case "${1}" in
primary | off )
## TODO: One command to enable primary screen and a loop to disable all other connected output
if [ -n "${PRIMARY_OUTPUT_MODE}" ]; then
xrandr --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --mode "${PRIMARY_OUTPUT_MODE}"
else
xrandr --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --auto
fi
if [ -n "${SECOND_OUTPUT_NAME}" ]; then xrandr --output "${SECOND_OUTPUT_NAME:=/dev/null}" --off ; fi
printf "%b\n" 'Enable only primary output'
;;
leftof | left-of | ds | dock | dockstation | work )
#xrandr --output VGA-1 --mode 1024x768 --left-of "${PRIMARY_OUTPUT_NAME:=/dev/null}" --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --mode 1366x768
if [ -n "${PRIMARY_OUTPUT_MODE}" ]; then
xrandr --output "${SECOND_OUTPUT_NAME:=/dev/null}" ${second_output_mode} --left-of "${PRIMARY_OUTPUT_NAME:=/dev/null}" --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --mode "${PRIMARY_OUTPUT_MODE}"
else
xrandr --output "${SECOND_OUTPUT_NAME:=/dev/null}" ${second_output_mode} --left-of "${PRIMARY_OUTPUT_NAME:=/dev/null}" --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --auto
fi
printf "%b\n" 'Xrandr for second output left-of primary screen'
;;
rightof | right-of | home )
if [ -n "${PRIMARY_OUTPUT_MODE}" ]; then
xrandr --output "${SECOND_OUTPUT_NAME:=/dev/null}" ${second_output_mode} --right-of "${PRIMARY_OUTPUT_NAME:=/dev/null}" --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --mode "${PRIMARY_OUTPUT_MODE}"
else
xrandr --output "${SECOND_OUTPUT_NAME:=/dev/null}" ${second_output_mode} --right-of "${PRIMARY_OUTPUT_NAME:=/dev/null}" --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --auto
fi
printf "%b\n" 'Xrandr for second output left-of primary screen'
;;
above )
if [ -n "${PRIMARY_OUTPUT_MODE}" ]; then
xrandr --output "${SECOND_OUTPUT_NAME:=/dev/null}" ${second_output_mode} --above "${PRIMARY_OUTPUT_NAME:=/dev/null}" --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --mode "${PRIMARY_OUTPUT_MODE}"
else
xrandr --output "${SECOND_OUTPUT_NAME:=/dev/null}" ${second_output_mode} --above "${PRIMARY_OUTPUT_NAME:=/dev/null}" --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --auto
fi
printf "%b\n" 'Xrandr for second output above primary screen'
;;
out | game | second )
xrandr --output "${SECOND_OUTPUT_NAME:=/dev/null}" ${second_output_mode} --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --off
printf "%b\n" 'Xrandr for second output only'
;;
primary_off | first_off | main_off | laptop_off )
xrandr --output "${PRIMARY_OUTPUT_NAME:=/dev/null}" --off
printf "%b\n" 'Xrandr to disable primary output'
;;
* )
printf "%b\n" 'Bad argument, please use [primary|left-of|right-of|above|second|primary_off|...]'
exit 1
;;
esac
main
# }}}
exit 0