diff --git a/X/.config/xresources/xinitrc b/X/.config/xresources/xinitrc index 3b55347..6152ecd 100644 --- a/X/.config/xresources/xinitrc +++ b/X/.config/xresources/xinitrc @@ -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 & diff --git a/sxhkd/.config/sxhkd/sxhkdrc b/sxhkd/.config/sxhkd/sxhkdrc index 942a6b7..b011193 100644 --- a/sxhkd/.config/sxhkd/sxhkdrc +++ b/sxhkd/.config/sxhkd/sxhkdrc @@ -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 diff --git a/sxhkd/.local/bin/sxhkd-chain-labels b/sxhkd/.local/bin/sxhkd-chain-labels index 8272a93..103a497 100755 --- a/sxhkd/.local/bin/sxhkd-chain-labels +++ b/sxhkd/.local/bin/sxhkd-chain-labels @@ -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)) diff --git a/sxhkd/.local/bin/sxhkd-piped b/sxhkd/.local/bin/sxhkd-piped index e1ee4a0..7c555b4 100755 --- a/sxhkd/.local/bin/sxhkd-piped +++ b/sxhkd/.local/bin/sxhkd-piped @@ -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 "$@"