summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Kiddle <okiddle@yahoo.co.uk>2020-06-24 00:10:15 +0200
committerOliver Kiddle <okiddle@yahoo.co.uk>2020-06-26 00:34:36 +0200
commit9ec69989bba6d4590c4c66a5d497d4a16186eae4 (patch)
tree120519da7316397a60d9ecf16e5ef3fb9bafd15a
parenteec1c48a91c3da2e88212cd49e1cd33a3db24048 (diff)
downloadzsh-9ec69989bba6d4590c4c66a5d497d4a16186eae4.tar.gz
zsh-9ec69989bba6d4590c4c66a5d497d4a16186eae4.zip
46105: new xinput completion
-rw-r--r--Completion/X/Command/_xinput140
1 files changed, 140 insertions, 0 deletions
diff --git a/Completion/X/Command/_xinput b/Completion/X/Command/_xinput
new file mode 100644
index 000000000..00a976d5d
--- /dev/null
+++ b/Completion/X/Command/_xinput
@@ -0,0 +1,140 @@
+#compdef xinput
+
+local curcontext="$curcontext" xinput=${words[1]} desc subcmd out ret=1
+local match mbegin mend
+local -a state state_descr line args cmds ids names disp expl
+local -A opt_args
+
+cmds=(
+ 'get-feedbacks:display device feedbacks'
+ 'set-ptr-feedback:change pointer acceleration (or feedback) parameters '
+ 'set-integer-feedback:change value of an integer device feedback'
+ 'get-button-map:get the button mapping of a device'
+ 'set-button-map:change the button mapping of a device'
+ set-pointer
+ "set-mode:set a device's mode"
+ 'list:list input devices or device features'
+ "query-state:query a device's state"
+ 'test:perpetual display of extended events from a device'
+ 'create-master:create a new pair of master devices on an XI2-enabled server'
+ 'remove-master:remove a master and its paired master device'
+ 'reattach:reattach a slave to a master'
+ 'float:remove a slave from its current master device'
+ 'set-cp:set the ClientPointer for the client owning window to master'
+ 'test-xi2:perpetual display of XI2 events'
+ 'map-to-output:restrict movements of the absolute device to an RandR crtc'
+ 'list-props:list properties that can be set for a device'
+ set-int-prop set-float-prop set-atom-prop
+ 'watch-props:perpetual display of property changes'
+ 'delete-prop:delete a property from a device'
+ 'set-prop:set a property to a given value'
+ 'disable:disable a device'
+ 'enable:enable a device'
+ 'help:display usage information'
+ 'version:display version information for program and server'
+)
+
+if (( CURRENT == 2 )); then
+ if [[ -prefix - ]]; then
+ cmds=( --$^cmds )
+ desc=option
+ else
+ desc=command
+ fi
+ _describe -t ${desc}s $desc cmds -M 'r:|-=* r:|=*'
+ return
+fi
+
+subcmd=${words[2]#--}
+curcontext="${curcontext%:*}-$subcmd:"
+
+args=( '1:device:->devices' )
+case $subcmd in
+ (set|delete)-*prop) args+=( '2:property:->properties' ) ;|
+ set-*prop) args+=( '*:value' ) ;|
+ set-ptr-feedback) args+=( '2:threshold' '3:num' '4:denom' ) ;;
+ set-integer-feedback) args+=( '2:feedback id' '3:value' ) ;;
+ set-button-map)
+ args+=( '*:::button mapping:compadd -F words -o numeric {1..12}' )
+ ;;
+ set-pointer) args+=( '2:x index' '3:y index' ) ;;
+ set-mode) args+=( '2:mode:(ABSOLUTE RELATIVE)' ) ;;
+ list) args+=( '(-)--short' '(-)--long' '(-)--name-only' '(-)--id-only' ) ;;
+ test) args+=( '-proximity' ) ;;
+ create-master)
+ args=(
+ '1:prefix'
+ '2:send core events [1]:((0\:false 1\:true))'
+ '3:enable [1]:((0\:false 1\:true))'
+ )
+ ;;
+ remove-master)
+ args=(
+ '1:master:->devices'
+ '2:slave setting:(Floating AttachToMaster)'
+ '3:pointer master:->devices'
+ '4:keyboard master:->devices'
+ )
+ ;;
+ reattach) args=( '1:slave:->devices' '2:master:->devices' ) ;;
+ float) args=( '1:slave:->devices' ) ;;
+ set-cp) args=( '1:window:_x_window' '2:device:->devices' ) ;;
+ test-xi2) args+=( '--root[select events on the root window only]' ) ;;
+ map-to-output) args+=( '2:output:->outputs' ) ;;
+ list-props) args=( '*:device:->devices' ) ;;
+ set-int-prop) args+=( '3:format:compadd -o numeric 8 16 32' ) ;;
+ set-prop)
+ args+=(
+ '--type=-:type:(atom float int)'
+ '--format=-:format:compadd -o numeric 8 16 32'
+ )
+ ;;
+ help|version) _message 'no more arguments'; return 1 ;;
+esac
+
+shift words
+(( CURRENT-- ))
+_arguments -C -A "-*" $args && ret=0
+
+case $state in
+ devices)
+ _description input-devices expl $state_descr
+
+ ids=( ${${(f)"$(_call_program input-devices $xinput list --id-only)"}#? } )
+ names=( ${${(f)"$(_call_program input-devices $xinput list --name-only)"}#? } )
+ disp=( ${(f)"$(_call_program input-devices $xinput list --short)"} )
+
+ if [[ $PREFIX$SUFFIX = [^-]*[^0-9]* ]]; then
+ # match based on the names but insert IDs
+ compadd "$expl[@]" -M 'b:=* m:{[:lower:]}={[:upper:]}' -D ids -a names
+ compadd "$expl[@]" -M 'b:=* m:{[:lower:]}={[:upper:]}' -D disp -a names
+ compadd "$expl[@]" -U -ld disp -a ids && ret=0
+
+ zstyle -s ":completion:${curcontext}:input-devices" insert-ids out || out=menu
+ case "$out" in
+ menu) compstate[insert]=menu ;;
+ single) [[ $#ids -ne 1 && $compstate[insert] != menu ]] &&
+ compstate[insert]= ;;
+ *) [[ ${#:-$PREFIX$SUFFIX} -gt ${#compstate[unambiguous]} ]] &&
+ compstate[insert]=menu ;;
+ esac
+ else
+ compadd "$expl[@]" -M 'B:0=' -o nosort -ld disp -a ids && ret=0
+ fi
+ ;;
+ properties)
+ _description input-properties expl 'property'
+ disp=( ${${${${(M)${(f)"$(_call_program input-properties
+ $xinput list-props $line[1]
+ )"}:#[[:blank:]]*}##[[:blank:]]#}%%:*}:/(#b)(*) \((<->)\)/$match[2]:$match[1]}
+ )
+ _describe -t input-properties $state_descr disp -o numeric && ret=0
+ ;;
+ outputs)
+ _description outputs expl 'output'
+ compadd "$expl[@]" - ${${(M)${(f)"$(_call_program outputs
+ xrandr)"}:#* connected*}%% *} && ret=0
+ ;;
+esac
+
+return ret