about summary refs log tree commit diff
path: root/Completion
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 /Completion
parenteec1c48a91c3da2e88212cd49e1cd33a3db24048 (diff)
downloadzsh-9ec69989bba6d4590c4c66a5d497d4a16186eae4.tar.gz
zsh-9ec69989bba6d4590c4c66a5d497d4a16186eae4.tar.xz
zsh-9ec69989bba6d4590c4c66a5d497d4a16186eae4.zip
46105: new xinput completion
Diffstat (limited to '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