Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: new xinput completion



The display strings are somewhat unconventional with this for the input
device list. The output is taken as-is which should be less fragile than
trying to parse it and will work provided the output is one line per
device. For device numbers, it will match strings similarly to process
IDs.

Oliver

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



Messages sorted by: Reverse Date, Date, Thread, Author