diff --git a/completion/zsh/_libinput b/completion/zsh/_libinput new file mode 100644 index 000000000..49179dca2 --- /dev/null +++ b/completion/zsh/_libinput @@ -0,0 +1,199 @@ +#compdef libinput + +(( $+functions[_libinput_commands] )) || _libinput_commands() +{ + local -a commands + commands=( + "list-devices:List all devices recognized by libinput" + "debug-events:Print all events as seen by libinput" + "debug-gui:Show a GUI to visualize libinput's events" + "measure:Measure various properties of devices" + "record:Record the events from a device" + "replay:Replay the events from a device" + ) + + _describe -t commands 'command' commands +} + +__all_seats() +{ + # Obviously only works with logind + local -a seats + seats=${(f)"$(loginctl --no-legend --no-pager list-seats 2>/dev/null)"} + if [[ -z $seats ]]; then + # Can always offer seat0, even if we can't enumerate the seats + compadd "$@" - seat0 + else + compadd "$@" - $seats + fi +} + +(( $+functions[_libinput_list-devices] )) || _libinput_list-devices() +{ + _arguments \ + '--help[Show help and exit]' \ + '--version[show version information and exit]' +} + +(( $+functions[_libinput_debug-events] )) || _libinput_debug-events() +{ + _arguments \ + '--help[Show debug-events help and exit]' \ + '--quiet[Only print libinput messages and nothing from this tool]' \ + '--verbose[Use verbose output]' \ + '--show-keycodes[Make all keycodes visible]' \ + '--grab[Exclusively grab all opened devices]' \ + '--device=[Use the given device with the path backend]:device:_files -W /dev/input/ -P /dev/input/' \ + '--udev=[Listen for notifications on the given seat]:seat:__all_seats' \ + '--apply-to=[Apply configuration options where the device name matches the pattern]:pattern' \ + '--disable-sendevents=[Disable send-events option for the devices matching the pattern]:pattern' \ + '--set-click-method=[Set the desired click method]:click-method:(none clickfinger buttonareas)' \ + '--set-scroll-method=[Set the desired scroll method]:scroll-method:(none twofinger edge button)' \ + '--set-scroll-button=[Set the button to the given button code]' \ + '--set-profile=[Set pointer acceleration profile]:accel-profile:(adaptive flat)' \ + '--set-speed=[Set pointer acceleration speed (within range \[-1, 1\])]' \ + '--set-tap-map=[Set button mapping for tapping]:tap-map:(( \ + lrm\:2-fingers\ right-click\ /\ 3-fingers\ middle-click \ + lmr\:2-fingers\ middle-click\ /\ 3-fingers\ right-click \ + ))' \ + + '(tap-to-click)' \ + '--enable-tap[Enable tap-to-click]' \ + '--disable-tap[Disable tap-to-click]' \ + + '(drag)' \ + '--enable-drag[Enable tap-and-drag]' \ + '--disable-drag[Disable tap-and-drag]' \ + + '(drag-lock)' \ + '--enable-drag-lock[Enable drag-lock]' \ + '--disable-drag-lock[Disable drag-lock]' \ + + '(natural-scrolling)' \ + '--enable-natural-scrolling[Enable natural scrolling]' \ + '--disable-natural-scrolling[Disable natural scrolling]' \ + + '(left-handed)' \ + '--enable-left-handed[Enable left handed button configuration]' \ + '--disable-left-handed[Disable left handed button configuration]' \ + + '(middlebutton)' \ + '--enable-middlebutton[Enable middle button emulation]' \ + '--disable-middlebutton[Disable middle button emulation]' \ + + '(dwt)' \ + '--enable-dwt[Enable disable-while-typing]' \ + '--disable-dwt[Disable enable-while-typing]' +} + +(( $+functions[_libinput_debug-gui] )) || _libinput_debug-gui() +{ + _arguments \ + '--help[Show debug-gui help and exit]' \ + '--verbose[Use verbose output]' \ + '--grab[Exclusively grab all opened devices]' \ + '--device=[Use the given device with the path backend]:device:_files -W /dev/input/ -P /dev/input/' \ + '--udev=[Listen for notifications on the given seat]:seat:_libinput_all_seats' +} + +(( $+functions[_libinput_measure] )) || _libinput_measure() +{ + local curcontext=$curcontext state line ret=1 + local features + features=( + "fuzz:Measure touch fuzz to avoid pointer jitter" + "touch-size:Measure touch size and orientation" + "touchpad-tap:Measure tap-to-click time" + "touchpad-pressure:Measure touch pressure" + ) + + _arguments -C \ + '--help[Print help and exit]' \ + ':feature:->feature' \ + '*:: :->option-or-argument' + + case $state in + (feature) + _describe -t features 'feature' features + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:libinput-measure-$words[1]: + if ! _call_function ret _libinput_measure_$words[1]; then + _message "unknown feature: $words[1]" + fi + ;; + esac + return ret +} + +(( $+functions[_libinput_measure_fuzz] )) || _libinput_measure_fuzz() +{ + _arguments \ + '--help[Show help message and exit]' \ + ':device:_files -W /dev/input/ -P /dev/input/' +} + +(( $+functions[_libinput_measure_touch-size] )) || _libinput_measure_touch-size() +{ + _arguments \ + '--help[Show help message and exit]' \ + '--touch-threshold=[Assume a touch pressure threshold of "down:up"]' \ + '--palm-threshold=[Assume a palm threshold of N]' \ + ':device:_files -W /dev/input/ -P /dev/input/' +} + +(( $+functions[_libinput_measure_touchpad-pressure] )) || _libinput_measure_touchpad-pressure() +{ + _arguments \ + '--help[Show help message and exit]' \ + '--touch-threshold=[Assume a touch pressure threshold of "down:up"]' \ + '--palm-threshold=[Assume a palm threshold of N]' \ + ':device:_files -W /dev/input/ -P /dev/input/' +} + +(( $+functions[_libinput_measure_touchpad-tap] )) || _libinput_measure_touchpad-tap() +{ + _arguments \ + '--help[Show help message and exit]' \ + '--format=dat[Specify the data format to be printed. The default is "summary"]' + ':device:_files -W /dev/input/ -P /dev/input/' +} + +(( $+functions[_libinput_record] )) || _libinput_record() +{ + _arguments \ + '--help[Show help message and exit]' \ + '--all[Record all /dev/input/event* devices available on the system]' \ + '--autorestart=[Terminate the current recording after s seconds of device inactivity]' \ + {-o+,--output=}'[Speficy the output file to use]:file:_files -g "*.yml"' \ + '--multiple[Record multiple devices at once]' \ + '--show-keycodes[Show keycodes as-is in the recording]' \ + '--with-libinput[Record libinput events alongside device events]' \ + '*::device:_files -W /dev/input/ -P /dev/input/' +} + +(( $+functions[_libinput_replay] )) || _libinput_replay() +{ + _arguments \ + '--help[Show help message and exit]' \ + ':recording:_files' +} + +_libinput() +{ + local curcontext=$curcontext state line ret=1 + + _arguments -C \ + {-h,--help}'[Show help message and exit]' \ + '--version[Show version information and exit]' \ + ':command:->command' \ + '*:: :->option-or-argument' && return + + case $state in + (command) + _libinput_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:libinput-$words[1]: + if ! _call_function ret _libinput_$words[1]; then + _message "unknown libinput command: $words[1]" + fi + ;; + esac + return ret +} + +_libinput diff --git a/completion/zsh/meson.build b/completion/zsh/meson.build new file mode 100644 index 000000000..2d4edcdc5 --- /dev/null +++ b/completion/zsh/meson.build @@ -0,0 +1,12 @@ +zshcompletiondir = get_option('zshcompletiondir') +if zshcompletiondir == '' + zshcompletiondir = join_paths(get_option('datadir'), 'zsh', 'site-functions') +endif + +if zshcompletiondir != 'no' + install_data( + '_libinput', + install_dir: zshcompletiondir, + install_mode: 'rw-r--r--', + ) +endif diff --git a/meson.build b/meson.build index da29dc642..d48a85a36 100644 --- a/meson.build +++ b/meson.build @@ -405,6 +405,10 @@ if get_option('documentation') subdir('doc/user') endif +############ shell completion ######### + +subdir('completion/zsh') + ############ tools ############ libinput_tool_path = dir_libexec config_h.set_quoted('LIBINPUT_TOOL_PATH', libinput_tool_path) diff --git a/meson_options.txt b/meson_options.txt index 6d5026375..7819449c9 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -30,3 +30,7 @@ option('coverity', type: 'boolean', value: false, description: 'Enable coverity build fixes, see meson.build for details [default=false]') +option('zshcompletiondir', + type: 'string', + value: '', + description: 'Directory for zsh completion scripts ["no" disables]')