zsh-workers
 help / color / Atom feed
* PATCH: new xinput completion
       [not found] <93726-1592949068.225836.ref@YntL.qgxH.BU1M>
@ 2020-06-23 21:51 ` Oliver Kiddle
  0 siblings, 0 replies; only message in thread
From: Oliver Kiddle @ 2020-06-23 21:51 UTC (permalink / raw)
  To: Zsh workers

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <93726-1592949068.225836.ref@YntL.qgxH.BU1M>
2020-06-23 21:51 ` PATCH: new xinput completion Oliver Kiddle

zsh-workers

Archives are clonable: git clone --mirror http://inbox.vuxu.org/zsh-workers

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.zsh.workers


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git