Marty Oehme
cb5f09c414
Script can be used in a statusbar or otherwise and will return the currently active sxhkd mode. Look into the README for further explanation.
156 lines
3.9 KiB
Bash
Executable file
156 lines
3.9 KiB
Bash
Executable file
#!/usr/bin/env sh
|
|
|
|
# output is to stdout unless explicitly set through -o
|
|
OUTPUTF=""
|
|
|
|
# set fifo input file, according (somewhat) to xdg
|
|
[ -n "$SXHKD_FIFO" ] && FIFO="$SXHKD_FIFO"
|
|
[ ! -e "$FIFO" ] && FIFO="${XDG_RUNTIME_DIR}"/sxhkd_fifo
|
|
[ ! -e "$FIFO" ] && FIFO="${XDG_CACHE_HOME:-$HOME/.cache}"/sxhkd_fifo
|
|
[ ! -e "$FIFO" ] && FIFO="$HOME/.sxhkd_fifo"
|
|
|
|
# set label config file, according (somewhat) to xdg
|
|
[ -n "$SXHKD_LABELCONFIG" ] && LABELCONFIG="$SXHKD_LABELCONFIG"
|
|
[ ! -f "$LABELCONFIG" ] && LABELCONFIG="${XDG_CONFIG_HOME:-$HOME/.config}"/sxhkd/chain-labels.conf
|
|
[ ! -f "$LABELCONFIG" ] && LABELCONFIG="$HOME/.chain-labels.conf"
|
|
|
|
main() {
|
|
while read -r event; do
|
|
detect_event "$event"
|
|
done <"$FIFO"
|
|
}
|
|
|
|
detect_event() {
|
|
ev="$(echo "$1" | sed -e 's/^H.*$/hotkey/;s/^C.*$/command/;s/^BBegin chain.*$/chainstart/;s/^EEnd chain.*$/chainend/;')"
|
|
|
|
case $ev in
|
|
hotkey) ev_hotkey "$(echo "$1" | sed -e 's/^H//')" ;;
|
|
# command) ev_command "$(echo "$1" | sed -e 's/^C//')" ;;
|
|
chainstart) ev_chainstart "$(echo "$1" | sed -e 's/^B//')" ;;
|
|
chainend) ev_chainend "$(echo "$1" | sed -e 's/^E//')" ;;
|
|
*) ;;
|
|
esac
|
|
}
|
|
|
|
send_msg() {
|
|
if [ -n "$OUTPUTF" ]; then
|
|
echo "$1" >"$OUTPUTF"
|
|
else
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
ev_hotkey() {
|
|
LAST_HOTKEY="$1"
|
|
}
|
|
|
|
# compare labels to last hotkey, return mode name
|
|
ev_chainstart() {
|
|
[ -z "$LAST_HOTKEY" ] && return 1
|
|
found=$(echo "$LABELS" | sed -e "/$LAST_HOTKEY/!d;s/^\(.\+\):.*$/\1/")
|
|
send_msg "$found"
|
|
}
|
|
|
|
ev_chainend() {
|
|
send_msg ""
|
|
}
|
|
|
|
# TODO add option to also display last command done in chain
|
|
# ev_command() {
|
|
# send_msg "command: $1"
|
|
# }
|
|
|
|
# read config from file, remove comments (lines starting with #) and empty lines
|
|
read_config() {
|
|
[ -f "$1" ] && LABELS="$(sed -e '/^#/d;/^[[:blank:]]*$/d' <"$1")" || LABELS=""
|
|
}
|
|
|
|
get_help() {
|
|
printf \
|
|
"Usage: sxhkd-chain-labels [-c config file][-o output file][-s input pipe]
|
|
|
|
By default will take the input from the input pipe (at XDG_RUNTIME_DIR/sxhkd_fifo) and
|
|
print the current sxhkd chain mode to stdout. That means, sxhkd needs to be started
|
|
with a fifo pipe running, ideally to the XDG_RUNTIME_DIR:
|
|
|
|
mkfifo \$XDG_RUNTIME_DIR/sxhkd_fifo && sxhkd -s \$XDG_RUNTIME_DIR/sxhkd_fifo
|
|
|
|
When given a key combination which maps to a specific mode, it will print out the name
|
|
of the mode instead. These maps can be passed with -c flag, specifying an options file.
|
|
By default it will look in \$XDG_CONFIG_HOME/sxhkd/sxhkd-chain-labels.conf
|
|
|
|
When passed the -o flag it will replace the contents of the file passed in with the
|
|
current sxhkd chain mode, emptying the file when no mode is active.
|
|
|
|
Default lookup places for files, in descending order:
|
|
:input fifo
|
|
\$SXHKD_FIFO (env variable)
|
|
\$XDG_RUNTIME_DIR/sxhkd_fifo
|
|
\$XDG_CACHE_HOME/sxhkd_fifo
|
|
~/.cache/sxhkd_fifo
|
|
~/.sxhkd_fifo
|
|
|
|
:label configuration
|
|
\$SXHKD_LABELCONFIG (env variable)
|
|
\$XDG_CONFIG_HOME/sxhkd/chain-labels.conf
|
|
~/.config/sxhkd/chain-labels.conf
|
|
~/.chain-labels.conf
|
|
|
|
The label configuration file uses the following format:
|
|
mode-name:chain activation combination
|
|
|
|
Lines beginning with a # will be ignored. Whitespace is
|
|
important, sxhkd will, by default, put a single space
|
|
between any component of the key combination.
|
|
|
|
An example file:
|
|
|
|
media:super + alt + m
|
|
system:super + backspace
|
|
|
|
\n"
|
|
}
|
|
|
|
get_version() {
|
|
printf \
|
|
"%s: 0.1
|
|
|
|
fifo input pipe:
|
|
%s
|
|
label configuration file:
|
|
%s
|
|
output:
|
|
%s \n" \
|
|
"$0" \
|
|
"$FIFO" \
|
|
"$LABELCONFIG" \
|
|
"${OUTPUTF:-stdout}"
|
|
}
|
|
|
|
while getopts "vho:s:c:" opt; do
|
|
case "$opt" in
|
|
\?)
|
|
printf "Usage: sxhkd-chain-labels [-c config file][-o output file][-s input pipe]\n"
|
|
exit 0
|
|
;;
|
|
h)
|
|
get_help
|
|
exit 0
|
|
;;
|
|
v)
|
|
get_version
|
|
exit 0
|
|
;;
|
|
o) OUTPUTF="$OPTARG" ;;
|
|
s) FIFO="$OPTARG" ;;
|
|
c) LABELCONFIG="$OPTARG" ;;
|
|
esac
|
|
done
|
|
shift $((OPTIND - 1))
|
|
|
|
[ "${1:-}" = "--" ] && shift
|
|
|
|
# look for default label config
|
|
[ -z "$LABELS" ] && read_config "$LABELCONFIG"
|
|
|
|
main "$@"
|