sxhkd: Change chain mode exiting

Changed the way to exit sxhkd chain modes. Instead of using `esc` to get
out of them, now pressing the mode key chain again will also exit out of
the mode (e.g. `alt + m` to get into `media` mode, then `alt + m` once
more to exit it).

This is done since using escape will interfere with many normal-use
scenarios while in a chain-mode, especially if those modes are intended
to be used over somewhat longer periods of time (somewhat like vim-modes
or emacs layers). The key to exit modes has now been moved to `copyright`,
so in the rather improbable case that your keyboard contains a
`copyright` key, be careful of accidentally hitting it when in an sxhkd
chain mode.

Fixed passing arguments to the sxhkd-piped script. It will pass along
any commandline arguments passed now (even `-s`, though then the script
will cease to do anything).

Improved version output of sxhkd-chain-labels a little, invoking
`sxhkd-chain-labels -v` will now show the correct configuration file and
FIFO pipe being used, as well as whether they exist on the file system.
Fixed the versioning of the script to display the correct version.
This commit is contained in:
Marty Oehme 2021-07-10 17:57:08 +02:00
parent c578a1bebc
commit 3d0446de05
Signed by: Marty
GPG key ID: B7538B8F50A1C800
4 changed files with 86 additions and 74 deletions

View file

@ -37,7 +37,9 @@ type unclutter >/dev/null 2>&1 && unclutter &
type picom >/dev/null 2>&1 && picom &
# if sxhkd - the key-binding daemon is installed, start it up
type sxhkd >/dev/null 2>&1 && sxhkd-piped &
# set it to start up a custom fifo-creating version
# and set the chain-mode exiting key to a non existing one (default would be escape)
type sxhkd >/dev/null 2>&1 && sxhkd-piped -a "copyright" &
# if nextcloud-client exists, start it up
type nextcloud >/dev/null 2>&1 && nextcloud --background &

View file

@ -77,6 +77,9 @@ alt + m : shift + {j,k}
# pause/stop player
alt + m : {_,shift} + p
playerctl {play-pause,stop}
# exit mode
alt + m : alt + m
pkill -ALRM sxhkd
# mode:academia:alt + a
# due papers this week
@ -90,3 +93,6 @@ alt + a : F3
# read wallabag articles from the cmdline
alt + a : {r, shift+r}
alacritty --class floating,floating -e wallr {-n,_}
# exit mode
alt + a : alt + a
pkill -ALRM sxhkd

View file

@ -5,65 +5,65 @@ OUTPUTF="$SXHKD_OUTPUTF"
# set fifo input file, according (somewhat) to xdg
if [ -n "$SXHKD_FIFO" ]; then
FIFO="$SXHKD_FIFO"
FIFO="$SXHKD_FIFO"
elif [ -p "${XDG_RUNTIME_DIR}"/sxhkd_fifo ]; then
FIFO="${XDG_RUNTIME_DIR}"/sxhkd_fifo
FIFO="${XDG_RUNTIME_DIR}"/sxhkd_fifo
elif [ -p "${XDG_CACHE_HOME:-$HOME/.cache}"/sxhkd_fifo ]; then
FIFO="${XDG_CACHE_HOME:-$HOME/.cache}"/sxhkd_fifo
FIFO="${XDG_CACHE_HOME:-$HOME/.cache}"/sxhkd_fifo
elif [ -p "$HOME/.sxhkd_fifo" ]; then
FIFO="$HOME/.sxhkd_fifo"
FIFO="$HOME/.sxhkd_fifo"
fi
# set label config file, according (somewhat) to xdg
if [ -n "$SXHKD_LABELCONFIG" ]; then
LABELCONFIG="$SXHKD_LABELCONFIG"
LABELCONFIG="$SXHKD_LABELCONFIG"
elif [ -f "${XDG_CONFIG_HOME:-$HOME/.config}"/sxhkd/chain-labels.conf ]; then
LABELCONFIG="${XDG_CONFIG_HOME:-$HOME/.config}"/sxhkd/chain-labels.conf
LABELCONFIG="${XDG_CONFIG_HOME:-$HOME/.config}"/sxhkd/chain-labels.conf
elif [ -f "$HOME/.chain-labels.conf" ]; then
LABELCONFIG="$HOME/.chain-labels.conf"
LABELCONFIG="$HOME/.chain-labels.conf"
fi
SXHKDRC_FILE="$XDG_CONFIG_HOME"/sxhkd/sxhkdrc
main() {
while read -r event; do
detect_event "$event"
done <"$FIFO"
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/;')"
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
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
if [ -n "$OUTPUTF" ]; then
echo "$1" >"$OUTPUTF"
else
echo "$1"
fi
}
ev_hotkey() {
LAST_HOTKEY="$1"
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"
[ -z "$LAST_HOTKEY" ] && return 1
found=$(echo "$LABELS" | sed -e "/$LAST_HOTKEY/!d;s/^\(.\+\):.*$/\1/")
send_msg "$found"
}
ev_chainend() {
send_msg ""
send_msg ""
}
# TODO add option to also display last command done in chain
@ -73,27 +73,27 @@ ev_chainend() {
# read config from file, remove comments (lines starting with #) and empty lines
read_config() {
[ ! -f "$1" ] && return 1
[ ! -f "$1" ] && return 1
parse_labels "$(cat "$1")"
parse_labels "$(cat "$1")"
}
# parse sxhkdrc for mode compatible comments
read_sxhkdrc() {
[ ! -f "$1" ] && return 1
[ ! -f "$1" ] && return 1
_sxhkdrc_content="$(sed -e '/^# mode:/!d;s/^# mode://' <"$1")"
parse_labels "$_sxhkdrc_content"
_sxhkdrc_content="$(sed -e '/^# mode:/!d;s/^# mode://' <"$1")"
parse_labels "$_sxhkdrc_content"
}
# append
parse_labels() {
LABELS="${LABELS}$(echo "$1" | sed -e '/^#/d;/^[[:blank:]]*$/d')"
LABELS="${LABELS}$(echo "$1" | sed -e '/^#/d;/^[[:blank:]]*$/d')"
}
get_help() {
printf \
"Usage: sxhkd-chain-labels [-c config file][-o output file][-s input pipe]
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
@ -137,8 +137,9 @@ get_help() {
information into the regular sxhkdrc as comments. They need to follow this exact format:
# mode:mode-name:key-chain
They can occur anywhere in the file. The space before mode is necessary, and # needs to
be the first character on the line. The above example file as written into the sxhkdrc:
They can occur anywhere in the file. The space between # and mode is necessary, and #
needs to be the first character on the line.
The above example file as written into the sxhkdrc:
# mode:media:super + alt + m
# mode:system:super + backspace
@ -148,39 +149,41 @@ get_help() {
}
get_version() {
printf \
"%s: 0.1
printf \
"%s: 0.3
fifo input pipe:
%s
%s %s
label configuration file:
%s
%s %s
output:
%s \n" \
"$0" \
"$FIFO" \
"$LABELCONFIG" \
"${OUTPUTF:-stdout}"
"$0" \
"$FIFO" \
"$([ -p "$FIFO" ] && echo "(found)" || echo "(NOT FOUND)")" \
"${LABELCONFIG:-"$SXHKDRC_FILE"}" \
"$([ -f "${LABELCONFIG:-"$SXHKDRC_FILE"}" ] && echo "(found)" || echo "(NOT FOUND)")" \
"${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
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))

View file

@ -1,10 +1,10 @@
#!/usr/bin/env sh
#!/usr/bin/env bash
# Starting sxhkd without arguments automatically creates
# a fifo pipe in XDG_RUNTIME_DIR, to enable IPC for sxhkd.
# Mostly used for sxhkd-chain-labels script.
type sxhkd >/dev/null 2>&1 || {
return 1
return 1
}
# get the complete path to sxhkd to avoid
@ -14,18 +14,19 @@ PROG="${PROG##* }"
FIFO="$XDG_RUNTIME_DIR"/sxhkd_fifo
args="$*"
# create a fifo and start sxhkd with it
sxhkd() {
exist "$PROG" critical
exist "$PROG" critical
if [ -n "$1" ]; then
"$PROG" "$@"
else
[ -e "$FIFO" ] && rm "$FIFO"
if [[ "$args" = *"-s"* ]]; then
"$PROG" "$@"
else
[ -e "$FIFO" ] && rm "$FIFO"
mkfifo "$FIFO"
"$PROG" -s "$FIFO"
fi
mkfifo "$FIFO"
"$PROG" -s "$FIFO" "$@"
fi
}
sxhkd "$@"