From c399f3d72bf1831738189455c4107d6eb0b1f8c9 Mon Sep 17 00:00:00 2001 From: Rico Tiongson Date: Sat, 2 May 2020 00:22:13 +0800 Subject: [PATCH] Improve command line --- CHANGELOG | 3 + README.md | 99 ++++++++++++++---- comfortable-swipe | 207 ++++++++++++++++++++++++++----------- comfortable-swipe-main.cpp | 1 - install | 4 +- 5 files changed, 229 insertions(+), 85 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 601e2be..9059fc9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +v1.2.0 (2020-04-20) +* Simplified source files + v1.1.0 (2020-04-18) * Add mouse hold gestures * Add experimental `hold3` configuration diff --git a/README.md b/README.md index 1d90e51..fbd8404 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,6 @@ Comfortable, seamless, and fast 3-finger (and 4-finger) touchpad swipe gestures ``` comfortable-swipe start comfortable-swipe stop - comfortable-swipe restart comfortable-swipe status ``` @@ -95,35 +94,95 @@ Comfortable, seamless, and fast 3-finger (and 4-finger) touchpad swipe gestures 1. Configurations ```bash - # configuration value + comfortable-swipe config list comfortable-swipe config get comfortable-swipe config set [=] - - # list all configurations - comfortable-swipe config list [] - - # remove configuration value comfortable-swipe config delete - ``` -1. Configuration extras - + Get config: ```bash - # show all possible configuration keys - comfortable-swipe config keys - - # show path to config - comfortable-swipe config path - - # open config file with editor - comfortable-swipe config edit + $> comfortable-swipe config get left3 + ctrl+alt+Right ``` -1. (Advanced) Run program buffer + Set config (whitespace ignored): + ```bash + $> comfortable-swipe config set up4 super+Up + up4 = super+Up + + $> comfortable-swipe config set left3 = super+Right + left3 = super+Right + + $> comfortable-swipe config set right3 = super + Left + alt + right3 = super+Left+alt + ``` + + Delete config: + ```bash + $> comfortable-swipe config delete mouse3 + ``` + + List all cofigurations + ```bash + $> comfortable-swipe config list + threshold = 1.0 + left4 = ctrl+super+shift+Right + right3 = ctrl+super+Left + right4 = ctrl+super+shift+Left + up3 = ctrl+F12 + up4 = super+d + down3 = ctrl+F12 + down4 = super+d + mouse4 = button1 + left3 = ctrl+super+Right + ``` + + Show all possible keys: + ```bash + $> comfortable-swipe config keys + left3 + left4 + right3 + right4 + up3 + up4 + down3 + down4 + threshold + mouse3 + mouse4 + ``` + + Show path to config file: + ```bash + $> comfortable-swipe config path + /home/hikari9/.config/comfortable-swipe.conf + ``` + +1. (Advanced) Invoke program buffer with `comfortable-swipe buffer` ```bash - ./my-custom-runner | comfortable-swipe buffer + cat <<"EOF" | comfortable-swipe buffer + -event7 GESTURE_SWIPE_BEGIN +0.45s 3 + event7 GESTURE_SWIPE_UPDATE +0.45s 3 8.81/-2.34 (32.48/-8.62 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.46s 3 15.54/-3.88 (41.99/-10.50 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.46s 3 18.09/-4.16 (48.88/-11.25 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.47s 3 19.67/-3.61 (53.15/-9.75 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.48s 3 19.79/-3.19 (53.48/-8.62 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.49s 3 17.72/-2.36 (47.90/-6.37 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.49s 3 15.66/-2.36 (42.32/-6.37 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.50s 3 13.35/-2.08 (36.09/-5.62 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.51s 3 10.80/-1.94 (29.20/-5.25 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.52s 3 8.38/-1.53 (22.64/-4.12 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.53s 3 6.43/-1.25 (17.39/-3.37 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.53s 3 4.86/-0.83 (13.12/-2.25 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.54s 3 3.76/-0.55 (10.17/-1.50 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.55s 3 2.67/-0.28 ( 7.22/-0.75 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.56s 3 1.70/ 0.28 ( 4.59/ 0.75 unaccelerated) + event7 GESTURE_SWIPE_UPDATE +0.56s 3 1.09/ 0.14 ( 2.95/ 0.37 unaccelerated) + event7 GESTURE_SWIPE_END +0.59s 3 + EOF ``` ## Configuring Swipe Gestures diff --git a/comfortable-swipe b/comfortable-swipe index 28d6e4a..f0a6227 100755 --- a/comfortable-swipe +++ b/comfortable-swipe @@ -11,9 +11,13 @@ KEYS="left3|left4|right3|right4|up3|up4|down3|down4|threshold|mouse3|mouse4" DEPRECATED="hold3|hold4" +######### +# USAGE # +######### + function usage { cat <] +Usage: $BASENAME [--help|--version] [start|stop|config|autostart|buffer|debug|status] [] Configuration: @@ -33,25 +37,23 @@ Global Options: -v, --version print the program version Commands: - start - starts 3/4-finger gesture service + start [--attach] + starts 3/4-finger gesture service in a detached process + flag '--attach' to attach the output in the console stop stops 3/4-finger gesture service - restart - restarts 3/4-finger gesture service - edit edits the configuration file with gedit - autostart <[on|off|toggle|status|path]> + autostart [on|off|toggle|status|path] toggle to automatically run on startup automatically run on startup (toggleable) buffer parses output of libinput debug-events - config <[get|set|delete|list|properties|path]> [...] + config [get|set|delete|list|properties|path] [...] shows the location of the config file debug @@ -65,17 +67,67 @@ EOF } +#################### +# COMMAND OPTIONS # +#################### + + +for i in "$@"; do +case $i in + -h | --help) # eagerly show help + help + exit 0 + ;; + -v | --version) # eagerly print version + echo "comfortable-swipe $VERSION" + exit 0 + ;; + --attach) + if [[ "$1" != start ]]; then + echo "Unknown option: $i" >&2 + exit 1 + fi + ;; + *) + # unknown option + if [[ "$i" == -* ]]; then + echo "Unknown option: $i" >&2 + exit 1 + fi + ;; +esac +done + + +######### +# START # +######### + + # start comfortable-swipe # internally pipes debug text to the buffer function start { - debug | buffer + stop > /dev/null 2>&1 + if [[ "$1" == "--attach" ]]; then + # attach the buffered output + debug | buffer + else + # detach buffered output + nohup "$BASENAME" debug &1 | "$BASENAME" buffer >/dev/null 2>&1 & + echo "Comfortable swipe is RUNNING in the background" + fi } +######## +# STOP # +######## + + # stop running comfortable-swipe commands (except self) function stop { function stop_prop { - pgrep -f "${1:?}" | fgrep -v $$ | xargs kill -- + pgrep -f "${1:?}" | fgrep -v $$ | xargs -I{} kill -- "{}" } stop_prop "$BASENAME" stop_prop "$(which comfortable-swipe)" @@ -83,26 +135,29 @@ function stop { } -# restart comfortable swipe -function restart { - stop > /dev/null 2>&1 - # restart the server in the background - nohup "$BASENAME" start 0<&- &>/dev/null & -} +######### +# DEBUG # +######### # show debug text # internally just calls libinput debug-events function debug { if command -v libinput-debug-events > /dev/null 2>&1; then - local DEBUGEVENTS="libinput-debug-events" + # compat for old Ubuntu + local COMMAND="libinput-debug-events" else - local DEBUGEVENTS="libinput debug-events" + local COMMAND="libinput debug-events" fi - stdbuf -oL -e0 $DEBUGEVENTS 2> >(fgrep -v 'double tracking') + stdbuf -oL -e0 $COMMAND 2> >(fgrep -v 'double tracking') } +########## +# BUFFER # +########## + + # parse input from a buffer # internally calls comfortable-swipe-main.cpp, which is # installed as: /usr/local/bin/ comfortable-swipe-buffer @@ -111,6 +166,11 @@ function buffer { } +########## +# STATUS # +########## + + # verbosely show comfortable-swipe status function status { # TODO: show configuration status as well @@ -122,22 +182,30 @@ function status { fi } + +########## +# CONFIG # +########## + + # get location of configuration file function config { local CONFIG="$HOME/.config/comfortable-swipe.conf" + + ############ + # show usage function usage { - echo "Usage: $BASENAME config [get|set|delete|list|keys|edit|path]..." + echo "Usage: $BASENAME config [get|set|delete|list|keys|edit|path] ..." } + + ##################### # show path to config function path { echo "$CONFIG" } - # eit configuration with gedit - function edit { - gedit "$CONFIG" - } - # get all keys from config, without comments - # and show only last among duplicates + + ############################################## + # list config, show only last among duplicates function list { # dispatch subcommands if [[ $# -eq 0 ]]; then @@ -159,16 +227,18 @@ function config { list | egrep "($pattern)[^=]* =" fi } + + ############################################ # get a list of all valid keys, one per line function keys { echo "$KEYS" | sed 's/|/\n/g' } + + ################################## # Get a specific key in the config - # Usage: comfortable-swipe config get function get { - # helper function to print usage function usage { - echo "Usage: $BASENAME config get " + echo "Usage: $BASENAME config get " echo -n "Props: " echo "$KEYS" | sed 's/|/, /g' } @@ -180,20 +250,22 @@ function config { local KEY="$1" # check if key is valid if ! [[ "$KEY" =~ ^($KEYS|$DEPRECATED)$ ]]; then - echo "'$KEY' is an invalid property" >&2 - echo >&2 + # echo "'$KEY' is an invalid property" >&2 + # echo >&2 usage >&2 echo >&2 - echo "If you want to filter properties, you can instead try:" >&2 + echo "If you want to list down properties, you can instead try:" >&2 echo >&2 - echo " $BASENAME config list $@" >&2 + echo " $BASENAME config list" >&2 echo >&2 exit 1 fi # get key from config file list | fgrep -m1 "$KEY =" | sed -E "s/^$KEY = //" } - # Deletes a key in the config + + ############################ + # delete a key in the config function delete { # helper function to print usage function usage { @@ -217,17 +289,23 @@ function config { local RESULT="$(egrep -v "^\\s*($(echo "$DELETE" | awk '{print $1}' | paste -s -d '|'))\\s*=" "$CONFIG")" echo "$RESULT" > "$CONFIG" # restart comfortable-swipe - restart + start fi } - # Set a specific key in the config - # Usage: comfortable-swipe config get + + ################################## + # set a specific key in the config function set { # helper function to print usage function usage { echo "Usage: $BASENAME config set [=] " echo -n "Valid properties: " echo "$KEYS" | sed 's/|/, /g' + echo + echo "Example:" + echo + echo " $BASENAME config set left3 = ctrl+super+Right" + echo } # no next argument: show help if [[ $# -eq 0 ]]; then @@ -294,12 +372,18 @@ function config { fi # show newly set value echo "$KEY = $(get "$KEY")" - restart + start } + + ###################### # dispatch subcommands if [[ $# -eq 0 ]]; then # no options; just show usage usage + echo "Try:" + echo + echo " $BASENAME config list" + echo elif declare -f "$1" >/dev/null 2>&1; then # invoke subcommand function, passing arguments through # TODO: unset all nonlocal functions @@ -311,17 +395,23 @@ function config { fi } +############# +# AUTOSTART # +############# # enable or disable autostart -# you can also set manually by running: gnome-session-properties function autostart { # path to autostart files local AUTOSTART="$HOME/.config/autostart/comfortable-swipe.desktop" local ENABLED="X-GNOME-Autostart-enabled" + + ########################## # show autostart file path function path { echo "$AUTOSTART" } + + ################################################## # echo autostart status: ON, OFF, MISSING, INVALID function status { if [[ ! -f "$AUTOSTART" ]]; then @@ -334,20 +424,28 @@ function autostart { echo "INVALID" fi } + + ################## # enable autostart function on { sed -i "s/$ENABLED=false/$ENABLED=true/" "$AUTOSTART" echo "Autostart switched on" } + + ################### # disable autostart function off { sed -i "s/$ENABLED=true/$ENABLED=false/" "$AUTOSTART" echo "Autostart switched off" } + + ##################################### # toggle to opposite autostart status function toggle { [[ $(status) = ON ]] && off || on } + + ###################### # dispatch subcommands if [[ $# -eq 0 ]]; then # default behavior is to toggle @@ -364,27 +462,10 @@ function autostart { } -#################### -# COMMAND OPTIONS # -#################### -for i in "$@"; do -case $i in - -h | --help) # eagerly show help - help - exit 0 - ;; - -v | --version) # eagerly print version - echo "comfortable-swipe $VERSION" - exit 0 - ;; - *) # unknown option - if [[ "$i" == -* ]]; then - echo "Unknown option: $i" >&2 - exit 1 - fi - ;; -esac -done +############ +# DISPATCH # +############ + # dispatch subcommands if [[ $# -eq 0 ]]; then @@ -396,8 +477,8 @@ elif declare -f "$1" >/dev/null 2>&1; then "$@" # same as "$1" "$2" "$3" ... for full argument list else function abort { - echo "Error: $1 not recognized" >&2 - echo >&2 + # echo "Error: $1 not recognized" >&2 + # echo >&2 usage >&2 echo -n "Valid props: " >&2 echo "$KEYS" | sed 's/|/, /g' >&2 @@ -408,6 +489,6 @@ else "$BASENAME" config get "$1" || abort else # multiple arguments, use shorthand set - config set "$@" 2> /dev/null || abort + "$BASENAME" config set "$@" 2> /dev/null || abort fi fi diff --git a/comfortable-swipe-main.cpp b/comfortable-swipe-main.cpp index 84752f3..4938d43 100644 --- a/comfortable-swipe-main.cpp +++ b/comfortable-swipe-main.cpp @@ -60,7 +60,6 @@ int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); - cout.flush(); // get configuration file map config; if (ini_parse(COMFORTABLE_SWIPE_CONFIG, parse_config, &config) < 0) { diff --git a/install b/install index b869c30..ed2cdbb 100755 --- a/install +++ b/install @@ -175,5 +175,7 @@ cat <