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:
parent
c578a1bebc
commit
3d0446de05
4 changed files with 86 additions and 74 deletions
|
@ -37,7 +37,9 @@ type unclutter >/dev/null 2>&1 && unclutter &
|
||||||
type picom >/dev/null 2>&1 && picom &
|
type picom >/dev/null 2>&1 && picom &
|
||||||
|
|
||||||
# if sxhkd - the key-binding daemon is installed, start it up
|
# 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
|
# if nextcloud-client exists, start it up
|
||||||
type nextcloud >/dev/null 2>&1 && nextcloud --background &
|
type nextcloud >/dev/null 2>&1 && nextcloud --background &
|
||||||
|
|
|
@ -77,6 +77,9 @@ alt + m : shift + {j,k}
|
||||||
# pause/stop player
|
# pause/stop player
|
||||||
alt + m : {_,shift} + p
|
alt + m : {_,shift} + p
|
||||||
playerctl {play-pause,stop}
|
playerctl {play-pause,stop}
|
||||||
|
# exit mode
|
||||||
|
alt + m : alt + m
|
||||||
|
pkill -ALRM sxhkd
|
||||||
|
|
||||||
# mode:academia:alt + a
|
# mode:academia:alt + a
|
||||||
# due papers this week
|
# due papers this week
|
||||||
|
@ -90,3 +93,6 @@ alt + a : F3
|
||||||
# read wallabag articles from the cmdline
|
# read wallabag articles from the cmdline
|
||||||
alt + a : {r, shift+r}
|
alt + a : {r, shift+r}
|
||||||
alacritty --class floating,floating -e wallr {-n,_}
|
alacritty --class floating,floating -e wallr {-n,_}
|
||||||
|
# exit mode
|
||||||
|
alt + a : alt + a
|
||||||
|
pkill -ALRM sxhkd
|
||||||
|
|
|
@ -5,65 +5,65 @@ OUTPUTF="$SXHKD_OUTPUTF"
|
||||||
|
|
||||||
# set fifo input file, according (somewhat) to xdg
|
# set fifo input file, according (somewhat) to xdg
|
||||||
if [ -n "$SXHKD_FIFO" ]; then
|
if [ -n "$SXHKD_FIFO" ]; then
|
||||||
FIFO="$SXHKD_FIFO"
|
FIFO="$SXHKD_FIFO"
|
||||||
elif [ -p "${XDG_RUNTIME_DIR}"/sxhkd_fifo ]; then
|
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
|
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
|
elif [ -p "$HOME/.sxhkd_fifo" ]; then
|
||||||
FIFO="$HOME/.sxhkd_fifo"
|
FIFO="$HOME/.sxhkd_fifo"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# set label config file, according (somewhat) to xdg
|
# set label config file, according (somewhat) to xdg
|
||||||
if [ -n "$SXHKD_LABELCONFIG" ]; then
|
if [ -n "$SXHKD_LABELCONFIG" ]; then
|
||||||
LABELCONFIG="$SXHKD_LABELCONFIG"
|
LABELCONFIG="$SXHKD_LABELCONFIG"
|
||||||
elif [ -f "${XDG_CONFIG_HOME:-$HOME/.config}"/sxhkd/chain-labels.conf ]; then
|
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
|
elif [ -f "$HOME/.chain-labels.conf" ]; then
|
||||||
LABELCONFIG="$HOME/.chain-labels.conf"
|
LABELCONFIG="$HOME/.chain-labels.conf"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
SXHKDRC_FILE="$XDG_CONFIG_HOME"/sxhkd/sxhkdrc
|
SXHKDRC_FILE="$XDG_CONFIG_HOME"/sxhkd/sxhkdrc
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
while read -r event; do
|
while read -r event; do
|
||||||
detect_event "$event"
|
detect_event "$event"
|
||||||
done <"$FIFO"
|
done <"$FIFO"
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_event() {
|
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
|
case $ev in
|
||||||
hotkey) ev_hotkey "$(echo "$1" | sed -e 's/^H//')" ;;
|
hotkey) ev_hotkey "$(echo "$1" | sed -e 's/^H//')" ;;
|
||||||
# command) ev_command "$(echo "$1" | sed -e 's/^C//')" ;;
|
# command) ev_command "$(echo "$1" | sed -e 's/^C//')" ;;
|
||||||
chainstart) ev_chainstart "$(echo "$1" | sed -e 's/^B//')" ;;
|
chainstart) ev_chainstart "$(echo "$1" | sed -e 's/^B//')" ;;
|
||||||
chainend) ev_chainend "$(echo "$1" | sed -e 's/^E//')" ;;
|
chainend) ev_chainend "$(echo "$1" | sed -e 's/^E//')" ;;
|
||||||
*) ;;
|
*) ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
send_msg() {
|
send_msg() {
|
||||||
if [ -n "$OUTPUTF" ]; then
|
if [ -n "$OUTPUTF" ]; then
|
||||||
echo "$1" >"$OUTPUTF"
|
echo "$1" >"$OUTPUTF"
|
||||||
else
|
else
|
||||||
echo "$1"
|
echo "$1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
ev_hotkey() {
|
ev_hotkey() {
|
||||||
LAST_HOTKEY="$1"
|
LAST_HOTKEY="$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
# compare labels to last hotkey, return mode name
|
# compare labels to last hotkey, return mode name
|
||||||
ev_chainstart() {
|
ev_chainstart() {
|
||||||
[ -z "$LAST_HOTKEY" ] && return 1
|
[ -z "$LAST_HOTKEY" ] && return 1
|
||||||
found=$(echo "$LABELS" | sed -e "/$LAST_HOTKEY/!d;s/^\(.\+\):.*$/\1/")
|
found=$(echo "$LABELS" | sed -e "/$LAST_HOTKEY/!d;s/^\(.\+\):.*$/\1/")
|
||||||
send_msg "$found"
|
send_msg "$found"
|
||||||
}
|
}
|
||||||
|
|
||||||
ev_chainend() {
|
ev_chainend() {
|
||||||
send_msg ""
|
send_msg ""
|
||||||
}
|
}
|
||||||
|
|
||||||
# TODO add option to also display last command done in chain
|
# 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 from file, remove comments (lines starting with #) and empty lines
|
||||||
read_config() {
|
read_config() {
|
||||||
[ ! -f "$1" ] && return 1
|
[ ! -f "$1" ] && return 1
|
||||||
|
|
||||||
parse_labels "$(cat "$1")"
|
parse_labels "$(cat "$1")"
|
||||||
}
|
}
|
||||||
|
|
||||||
# parse sxhkdrc for mode compatible comments
|
# parse sxhkdrc for mode compatible comments
|
||||||
read_sxhkdrc() {
|
read_sxhkdrc() {
|
||||||
[ ! -f "$1" ] && return 1
|
[ ! -f "$1" ] && return 1
|
||||||
|
|
||||||
_sxhkdrc_content="$(sed -e '/^# mode:/!d;s/^# mode://' <"$1")"
|
_sxhkdrc_content="$(sed -e '/^# mode:/!d;s/^# mode://' <"$1")"
|
||||||
parse_labels "$_sxhkdrc_content"
|
parse_labels "$_sxhkdrc_content"
|
||||||
}
|
}
|
||||||
|
|
||||||
# append
|
# append
|
||||||
parse_labels() {
|
parse_labels() {
|
||||||
LABELS="${LABELS}$(echo "$1" | sed -e '/^#/d;/^[[:blank:]]*$/d')"
|
LABELS="${LABELS}$(echo "$1" | sed -e '/^#/d;/^[[:blank:]]*$/d')"
|
||||||
}
|
}
|
||||||
|
|
||||||
get_help() {
|
get_help() {
|
||||||
printf \
|
printf \
|
||||||
"Usage: sxhkd-chain-labels [-c config file][-o output file][-s input pipe]
|
"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
|
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
|
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:
|
information into the regular sxhkdrc as comments. They need to follow this exact format:
|
||||||
# mode:mode-name:key-chain
|
# mode:mode-name:key-chain
|
||||||
|
|
||||||
They can occur anywhere in the file. The space before mode is necessary, and # needs to
|
They can occur anywhere in the file. The space between # and mode is necessary, and #
|
||||||
be the first character on the line. The above example file as written into the sxhkdrc:
|
needs to be the first character on the line.
|
||||||
|
The above example file as written into the sxhkdrc:
|
||||||
# mode:media:super + alt + m
|
# mode:media:super + alt + m
|
||||||
# mode:system:super + backspace
|
# mode:system:super + backspace
|
||||||
|
|
||||||
|
@ -148,39 +149,41 @@ get_help() {
|
||||||
}
|
}
|
||||||
|
|
||||||
get_version() {
|
get_version() {
|
||||||
printf \
|
printf \
|
||||||
"%s: 0.1
|
"%s: 0.3
|
||||||
|
|
||||||
fifo input pipe:
|
fifo input pipe:
|
||||||
%s
|
%s %s
|
||||||
label configuration file:
|
label configuration file:
|
||||||
%s
|
%s %s
|
||||||
output:
|
output:
|
||||||
%s \n" \
|
%s \n" \
|
||||||
"$0" \
|
"$0" \
|
||||||
"$FIFO" \
|
"$FIFO" \
|
||||||
"$LABELCONFIG" \
|
"$([ -p "$FIFO" ] && echo "(found)" || echo "(NOT FOUND)")" \
|
||||||
"${OUTPUTF:-stdout}"
|
"${LABELCONFIG:-"$SXHKDRC_FILE"}" \
|
||||||
|
"$([ -f "${LABELCONFIG:-"$SXHKDRC_FILE"}" ] && echo "(found)" || echo "(NOT FOUND)")" \
|
||||||
|
"${OUTPUTF:-stdout}"
|
||||||
}
|
}
|
||||||
|
|
||||||
while getopts "vho:s:c:" opt; do
|
while getopts "vho:s:c:" opt; do
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
\?)
|
\?)
|
||||||
printf "Usage: sxhkd-chain-labels [-c config file][-o output file][-s input pipe]\n"
|
printf "Usage: sxhkd-chain-labels [-c config file][-o output file][-s input pipe]\n"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
h)
|
h)
|
||||||
get_help
|
get_help
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
v)
|
v)
|
||||||
get_version
|
get_version
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
o) OUTPUTF="$OPTARG" ;;
|
o) OUTPUTF="$OPTARG" ;;
|
||||||
s) FIFO="$OPTARG" ;;
|
s) FIFO="$OPTARG" ;;
|
||||||
c) LABELCONFIG="$OPTARG" ;;
|
c) LABELCONFIG="$OPTARG" ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
shift $((OPTIND - 1))
|
shift $((OPTIND - 1))
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#!/usr/bin/env sh
|
#!/usr/bin/env bash
|
||||||
# Starting sxhkd without arguments automatically creates
|
# Starting sxhkd without arguments automatically creates
|
||||||
# a fifo pipe in XDG_RUNTIME_DIR, to enable IPC for sxhkd.
|
# a fifo pipe in XDG_RUNTIME_DIR, to enable IPC for sxhkd.
|
||||||
# Mostly used for sxhkd-chain-labels script.
|
# Mostly used for sxhkd-chain-labels script.
|
||||||
|
|
||||||
type sxhkd >/dev/null 2>&1 || {
|
type sxhkd >/dev/null 2>&1 || {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# get the complete path to sxhkd to avoid
|
# get the complete path to sxhkd to avoid
|
||||||
|
@ -14,18 +14,19 @@ PROG="${PROG##* }"
|
||||||
|
|
||||||
FIFO="$XDG_RUNTIME_DIR"/sxhkd_fifo
|
FIFO="$XDG_RUNTIME_DIR"/sxhkd_fifo
|
||||||
|
|
||||||
|
args="$*"
|
||||||
# create a fifo and start sxhkd with it
|
# create a fifo and start sxhkd with it
|
||||||
sxhkd() {
|
sxhkd() {
|
||||||
exist "$PROG" critical
|
exist "$PROG" critical
|
||||||
|
|
||||||
if [ -n "$1" ]; then
|
if [[ "$args" = *"-s"* ]]; then
|
||||||
"$PROG" "$@"
|
"$PROG" "$@"
|
||||||
else
|
else
|
||||||
[ -e "$FIFO" ] && rm "$FIFO"
|
[ -e "$FIFO" ] && rm "$FIFO"
|
||||||
|
|
||||||
mkfifo "$FIFO"
|
mkfifo "$FIFO"
|
||||||
"$PROG" -s "$FIFO"
|
"$PROG" -s "$FIFO" "$@"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
sxhkd "$@"
|
sxhkd "$@"
|
||||||
|
|
Loading…
Reference in a new issue