Knowledge Base

Preserving for the future: Shell scripts, AoC, and more

switch-monitors-trayicon.sh (Source)

#!/usr/bin/env sh
# File: switch-monitors-trayicon.sh
# Location: /usr/local/bin
# Author: bgstack15
# SPDX-License-Identifier: GPL-3.0
# Startdate: 2023-12-05-3 16:29
# Title: Trayicon for switching monitor config
# Purpose: Provide easy drop-down for pcb-009 for monitor control
# History:
# Usage:
# Reference:
#    Heavily ripped keyboard-leds-trayicons
# Improve:
#    There is no loop, so manually touching the kill file does not stop the process like it should.
# Dependencies:
#    raw: mktrayicon, awk, switch-monitors.sh
#    devuan: mktrayicon, mawk | gawk, x11-xserver-utils
# CONFIG FILES
test -z "${SWITCH_MONITORS_CONF}" && SWITCH_MONITORS_CONF="${HOME}/.config/switch-monitors.conf"
# FUNCTIONS
get_conf() {
   # Ripped from framework.sh
   # call: get_conf "${conffile}"
   local _infile="$1"
   local _tmpfile1="$( mktemp )"
   sed -e 's/^\s*//;s/\s*$//;/^[#$]/d;s/\s*[^\]#.*$//;' "${_infile}" | grep -viE "^$" | while read _line ;
   do
      local _left="$( echo "${_line}" | cut -d'=' -f1 )"
      eval "_thisval=\"\${${_left}}\""
      test -z "${_thisval}" && echo "${_line}" >> "${_tmpfile1}"
   done
   test -f "${_tmpfile1}" && { . "${_tmpfile1}" 1>/dev/null 2>&1 ; }
   /bin/rm -rf "${_tmpfile1}" 1>/dev/null 2>&1
}
clean_switch_monitors_trayicon() {
   { test -e "${switch_monitors_icon}" && echo "q" > "${switch_monitors_icon}" ; } 1>/dev/null 2>&1 &
   sleep 1 && rm -f "${switch_monitors_icon}" "${SMT_KILLFILE}"
}
# LOAD CONFIGS
# order is important! The last one called gets precedence.
# instead of simply dot-sourcing the conf file, pass it to get_conf which only applies new values, so this process's environment is preserved
for thisconf in "${SMT_CONF}" "${SMT_USER_CONF}" "${SMT_GLOBAL_CONF}" ;
do
   test -r "${thisconf}" && get_conf "${thisconf}"
done
# DEFAULTS in case configs did not have these values
test -z "${SMT_ICON}" && SMT_ICON=display
test -z "${SMT_KILLFILE}" && SMT_KILLFILE="/tmp/kill-all-switch-monitors-trayicons"
# INITIALIZATION
switch_monitors_icon="/var/run/user/$( id -u )/${$}.switch_monitors.icon"
mkfifo "${switch_monitors_icon}"
mktrayicon "${switch_monitors_icon}" &
{
   echo "i ${SMT_ICON}"
   echo "t pcb-009 easy display settings"
   echo "m right,switch-monitors.sh right|both,switch-monitors.sh both|-----|quit,echo 'q' > ${switch_monitors_icon} ; touch "${SMT_KILLFILE}""
} > "${switch_monitors_icon}"
rm -f "${SMT_KILLFILE}"
trap 'trap "" 2 ; touch "${SMT_KILLFILE}" '  2 # CTRL-C
wait %1
# safety shutoff
clean_switch_monitors_trayicon