[sxhkd] Add script to show current sxhkd mode
Script can be used in a statusbar or otherwise and will return the currently active sxhkd mode. Look into the README for further explanation.
This commit is contained in:
parent
42379b25eb
commit
cb5f09c414
6 changed files with 244 additions and 1 deletions
156
sxhkd/.local/bin/sxhkd-chain-labels
Executable file
156
sxhkd/.local/bin/sxhkd-chain-labels
Executable file
|
|
@ -0,0 +1,156 @@
|
|||
#!/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 "$@"
|
||||
Loading…
Add table
Add a link
Reference in a new issue