1a46c0ec8Sopenharmony_ci#compdef libinput
2a46c0ec8Sopenharmony_ci
3a46c0ec8Sopenharmony_ci(( $+functions[_libinput_commands] )) || _libinput_commands()
4a46c0ec8Sopenharmony_ci{
5a46c0ec8Sopenharmony_ci	local -a commands
6a46c0ec8Sopenharmony_ci	commands=(
7a46c0ec8Sopenharmony_ci		"list-devices:List all devices recognized by libinput"
8a46c0ec8Sopenharmony_ci		"debug-events:Print all events as seen by libinput"
9a46c0ec8Sopenharmony_ci		"debug-gui:Show a GUI to visualize libinput's events"
10a46c0ec8Sopenharmony_ci		"debug-tablet:Show tablet axis and button values"
11a46c0ec8Sopenharmony_ci		"measure:Measure various properties of devices"
12a46c0ec8Sopenharmony_ci		"analyze:Analyze device data"
13a46c0ec8Sopenharmony_ci		"record:Record the events from a device"
14a46c0ec8Sopenharmony_ci		"replay:Replay the events from a device"
15a46c0ec8Sopenharmony_ci	)
16a46c0ec8Sopenharmony_ci
17a46c0ec8Sopenharmony_ci	_describe -t commands 'command' commands
18a46c0ec8Sopenharmony_ci}
19a46c0ec8Sopenharmony_ci
20a46c0ec8Sopenharmony_ci__all_seats()
21a46c0ec8Sopenharmony_ci{
22a46c0ec8Sopenharmony_ci	# Obviously only works with logind
23a46c0ec8Sopenharmony_ci	local -a seats
24a46c0ec8Sopenharmony_ci	seats=${(f)"$(loginctl --no-legend --no-pager list-seats 2>/dev/null)"}
25a46c0ec8Sopenharmony_ci	if [[ -z $seats ]]; then
26a46c0ec8Sopenharmony_ci		# Can always offer seat0, even if we can't enumerate the seats
27a46c0ec8Sopenharmony_ci		compadd "$@" - seat0
28a46c0ec8Sopenharmony_ci	else
29a46c0ec8Sopenharmony_ci		compadd "$@" - $seats
30a46c0ec8Sopenharmony_ci	fi
31a46c0ec8Sopenharmony_ci}
32a46c0ec8Sopenharmony_ci
33a46c0ec8Sopenharmony_ci(( $+functions[_libinput_list-devices] )) || _libinput_list-devices()
34a46c0ec8Sopenharmony_ci{
35a46c0ec8Sopenharmony_ci	_arguments \
36a46c0ec8Sopenharmony_ci		'--help[Show help and exit]' \
37a46c0ec8Sopenharmony_ci		'--version[show version information and exit]'
38a46c0ec8Sopenharmony_ci}
39a46c0ec8Sopenharmony_ci
40a46c0ec8Sopenharmony_ci(( $+functions[_libinput_debug-events] )) || _libinput_debug-events()
41a46c0ec8Sopenharmony_ci{
42a46c0ec8Sopenharmony_ci	_arguments \
43a46c0ec8Sopenharmony_ci		'--help[Show debug-events help and exit]' \
44a46c0ec8Sopenharmony_ci		'--quiet[Only print libinput messages and nothing from this tool]' \
45a46c0ec8Sopenharmony_ci		'--verbose[Use verbose output]' \
46a46c0ec8Sopenharmony_ci		'--show-keycodes[Make all keycodes visible]' \
47a46c0ec8Sopenharmony_ci		'--grab[Exclusively grab all opened devices]' \
48a46c0ec8Sopenharmony_ci		'--device=[Use the given device with the path backend]:device:_files -W /dev/input/ -P /dev/input/' \
49a46c0ec8Sopenharmony_ci		'--udev=[Listen for notifications on the given seat]:seat:__all_seats' \
50a46c0ec8Sopenharmony_ci		'--apply-to=[Apply configuration options where the device name matches the pattern]:pattern' \
51a46c0ec8Sopenharmony_ci		'--disable-sendevents=[Disable send-events option for the devices matching the pattern]:pattern' \
52a46c0ec8Sopenharmony_ci		'--set-click-method=[Set the desired click method]:click-method:(none clickfinger buttonareas)' \
53a46c0ec8Sopenharmony_ci		'--set-scroll-method=[Set the desired scroll method]:scroll-method:(none twofinger edge button)' \
54a46c0ec8Sopenharmony_ci		'--set-scroll-button=[Set the button to the given button code]' \
55a46c0ec8Sopenharmony_ci		'--set-profile=[Set pointer acceleration profile]:accel-profile:(adaptive flat)' \
56a46c0ec8Sopenharmony_ci		'--set-speed=[Set pointer acceleration speed (within range \[-1, 1\])]' \
57a46c0ec8Sopenharmony_ci		'--set-tap-map=[Set button mapping for tapping]:tap-map:((  \
58a46c0ec8Sopenharmony_ci			lrm\:2-fingers\ right-click\ /\ 3-fingers\ middle-click \
59a46c0ec8Sopenharmony_ci			lmr\:2-fingers\ middle-click\ /\ 3-fingers\ right-click \
60a46c0ec8Sopenharmony_ci		))' \
61a46c0ec8Sopenharmony_ci		+ '(tap-to-click)' \
62a46c0ec8Sopenharmony_ci		'--enable-tap[Enable tap-to-click]' \
63a46c0ec8Sopenharmony_ci		'--disable-tap[Disable tap-to-click]' \
64a46c0ec8Sopenharmony_ci		+ '(drag)' \
65a46c0ec8Sopenharmony_ci		'--enable-drag[Enable tap-and-drag]' \
66a46c0ec8Sopenharmony_ci		'--disable-drag[Disable tap-and-drag]' \
67a46c0ec8Sopenharmony_ci		+ '(drag-lock)' \
68a46c0ec8Sopenharmony_ci		'--enable-drag-lock[Enable drag-lock]' \
69a46c0ec8Sopenharmony_ci		'--disable-drag-lock[Disable drag-lock]' \
70a46c0ec8Sopenharmony_ci		+ '(natural-scrolling)' \
71a46c0ec8Sopenharmony_ci		'--enable-natural-scrolling[Enable natural scrolling]' \
72a46c0ec8Sopenharmony_ci		'--disable-natural-scrolling[Disable natural scrolling]' \
73a46c0ec8Sopenharmony_ci		+ '(left-handed)' \
74a46c0ec8Sopenharmony_ci		'--enable-left-handed[Enable left handed button configuration]' \
75a46c0ec8Sopenharmony_ci		'--disable-left-handed[Disable left handed button configuration]' \
76a46c0ec8Sopenharmony_ci		+ '(middlebutton)' \
77a46c0ec8Sopenharmony_ci		'--enable-middlebutton[Enable middle button emulation]' \
78a46c0ec8Sopenharmony_ci		'--disable-middlebutton[Disable middle button emulation]' \
79a46c0ec8Sopenharmony_ci		+ '(dwt)' \
80a46c0ec8Sopenharmony_ci		'--enable-dwt[Enable disable-while-typing]' \
81a46c0ec8Sopenharmony_ci		'--disable-dwt[Disable disable-while-typing]' \
82a46c0ec8Sopenharmony_ci		+ '(dwtp)' \
83a46c0ec8Sopenharmony_ci		'--enable-dwtp[Enable disable-while-trackpointing]' \
84a46c0ec8Sopenharmony_ci		'--disable-dwtp[Disable disable-while-trackpointing]'
85a46c0ec8Sopenharmony_ci}
86a46c0ec8Sopenharmony_ci
87a46c0ec8Sopenharmony_ci(( $+functions[_libinput_debug-gui] )) || _libinput_debug-gui()
88a46c0ec8Sopenharmony_ci{
89a46c0ec8Sopenharmony_ci	_arguments \
90a46c0ec8Sopenharmony_ci		'--help[Show debug-gui help and exit]' \
91a46c0ec8Sopenharmony_ci		'--verbose[Use verbose output]' \
92a46c0ec8Sopenharmony_ci		'--grab[Exclusively grab all opened devices]' \
93a46c0ec8Sopenharmony_ci		'--device=[Use the given device with the path backend]:device:_files -W /dev/input/ -P /dev/input/' \
94a46c0ec8Sopenharmony_ci		'--udev=[Listen for notifications on the given seat]:seat:_libinput_all_seats'
95a46c0ec8Sopenharmony_ci}
96a46c0ec8Sopenharmony_ci
97a46c0ec8Sopenharmony_ci(( $+functions[_libinput_debug-tablet] )) || _libinput_debug-tablet()
98a46c0ec8Sopenharmony_ci{
99a46c0ec8Sopenharmony_ci	_arguments \
100a46c0ec8Sopenharmony_ci		'--help[Show debug-tablet help and exit]' \
101a46c0ec8Sopenharmony_ci		'--device=[Use the given device with the path backend]:device:_files -W /dev/input/ -P /dev/input/' \
102a46c0ec8Sopenharmony_ci		'--udev=[Use the first tablet device on the given seat]:seat:_libinput_all_seats'
103a46c0ec8Sopenharmony_ci}
104a46c0ec8Sopenharmony_ci
105a46c0ec8Sopenharmony_ci
106a46c0ec8Sopenharmony_ci(( $+functions[_libinput_measure] )) || _libinput_measure()
107a46c0ec8Sopenharmony_ci{
108a46c0ec8Sopenharmony_ci	local curcontext=$curcontext state line ret=1
109a46c0ec8Sopenharmony_ci	local features
110a46c0ec8Sopenharmony_ci	features=(
111a46c0ec8Sopenharmony_ci		"fuzz:Measure touch fuzz to avoid pointer jitter"
112a46c0ec8Sopenharmony_ci		"touch-size:Measure touch size and orientation"
113a46c0ec8Sopenharmony_ci		"touchpad-tap:Measure tap-to-click time"
114a46c0ec8Sopenharmony_ci		"touchpad-pressure:Measure touch pressure"
115a46c0ec8Sopenharmony_ci	)
116a46c0ec8Sopenharmony_ci
117a46c0ec8Sopenharmony_ci	_arguments -C \
118a46c0ec8Sopenharmony_ci		'--help[Print help and exit]' \
119a46c0ec8Sopenharmony_ci		':feature:->feature' \
120a46c0ec8Sopenharmony_ci		'*:: :->option-or-argument'
121a46c0ec8Sopenharmony_ci
122a46c0ec8Sopenharmony_ci	case $state in
123a46c0ec8Sopenharmony_ci		(feature)
124a46c0ec8Sopenharmony_ci			_describe -t features 'feature' features
125a46c0ec8Sopenharmony_ci			;;
126a46c0ec8Sopenharmony_ci		(option-or-argument)
127a46c0ec8Sopenharmony_ci			curcontext=${curcontext%:*:*}:libinput-measure-$words[1]:
128a46c0ec8Sopenharmony_ci			if ! _call_function ret _libinput_measure_$words[1]; then
129a46c0ec8Sopenharmony_ci				_message "unknown feature: $words[1]"
130a46c0ec8Sopenharmony_ci			fi
131a46c0ec8Sopenharmony_ci			;;
132a46c0ec8Sopenharmony_ci	esac
133a46c0ec8Sopenharmony_ci	return ret
134a46c0ec8Sopenharmony_ci}
135a46c0ec8Sopenharmony_ci
136a46c0ec8Sopenharmony_ci(( $+functions[_libinput_measure_fuzz] )) || _libinput_measure_fuzz()
137a46c0ec8Sopenharmony_ci{
138a46c0ec8Sopenharmony_ci	_arguments \
139a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
140a46c0ec8Sopenharmony_ci		':device:_files -W /dev/input/ -P /dev/input/'
141a46c0ec8Sopenharmony_ci}
142a46c0ec8Sopenharmony_ci
143a46c0ec8Sopenharmony_ci(( $+functions[_libinput_measure_touch-size] )) || _libinput_measure_touch-size()
144a46c0ec8Sopenharmony_ci{
145a46c0ec8Sopenharmony_ci	_arguments \
146a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
147a46c0ec8Sopenharmony_ci		'--touch-threshold=[Assume a touch pressure threshold of "down:up"]' \
148a46c0ec8Sopenharmony_ci		'--palm-threshold=[Assume a palm threshold of N]' \
149a46c0ec8Sopenharmony_ci		':device:_files -W /dev/input/ -P /dev/input/'
150a46c0ec8Sopenharmony_ci}
151a46c0ec8Sopenharmony_ci
152a46c0ec8Sopenharmony_ci(( $+functions[_libinput_measure_touchpad-pressure] )) || _libinput_measure_touchpad-pressure()
153a46c0ec8Sopenharmony_ci{
154a46c0ec8Sopenharmony_ci	_arguments \
155a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
156a46c0ec8Sopenharmony_ci		'--touch-threshold=[Assume a touch pressure threshold of "down:up"]' \
157a46c0ec8Sopenharmony_ci		'--palm-threshold=[Assume a palm threshold of N]' \
158a46c0ec8Sopenharmony_ci		':device:_files -W /dev/input/ -P /dev/input/'
159a46c0ec8Sopenharmony_ci}
160a46c0ec8Sopenharmony_ci
161a46c0ec8Sopenharmony_ci(( $+functions[_libinput_measure_touchpad-tap] )) || _libinput_measure_touchpad-tap()
162a46c0ec8Sopenharmony_ci{
163a46c0ec8Sopenharmony_ci	_arguments \
164a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
165a46c0ec8Sopenharmony_ci		'--format=dat[Specify the data format to be printed. The default is "summary"]'
166a46c0ec8Sopenharmony_ci		':device:_files -W /dev/input/ -P /dev/input/'
167a46c0ec8Sopenharmony_ci}
168a46c0ec8Sopenharmony_ci
169a46c0ec8Sopenharmony_ci(( $+functions[_libinput_analyze_per-slot-delta] )) || _libinput_analyze_per-slot-delta()
170a46c0ec8Sopenharmony_ci{
171a46c0ec8Sopenharmony_ci	_arguments \
172a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
173a46c0ec8Sopenharmony_ci		':recording:_files'
174a46c0ec8Sopenharmony_ci}
175a46c0ec8Sopenharmony_ci
176a46c0ec8Sopenharmony_ci(( $+functions[_libinput_analyze_touch-down-state] )) || _libinput_analyze_touch-down-state()
177a46c0ec8Sopenharmony_ci{
178a46c0ec8Sopenharmony_ci	_arguments \
179a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
180a46c0ec8Sopenharmony_ci		':recording:_files'
181a46c0ec8Sopenharmony_ci}
182a46c0ec8Sopenharmony_ci
183a46c0ec8Sopenharmony_ci(( $+functions[_libinput_analyze_recording] )) || _libinput_analyze_recording()
184a46c0ec8Sopenharmony_ci{
185a46c0ec8Sopenharmony_ci	_arguments \
186a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
187a46c0ec8Sopenharmony_ci		':recording:_files'
188a46c0ec8Sopenharmony_ci}
189a46c0ec8Sopenharmony_ci
190a46c0ec8Sopenharmony_ci(( $+functions[_libinput_analyze] )) || _libinput_analyze()
191a46c0ec8Sopenharmony_ci{
192a46c0ec8Sopenharmony_ci	local curcontext=$curcontext state line ret=1
193a46c0ec8Sopenharmony_ci	local features
194a46c0ec8Sopenharmony_ci	features=(
195a46c0ec8Sopenharmony_ci		"per-slot-delta:analyze relative movement per touch per slot"
196a46c0ec8Sopenharmony_ci		"recording:analyze a recording by printing a pretty table"
197a46c0ec8Sopenharmony_ci		"touch-down-state:analyze a recording for logical touch down states"
198a46c0ec8Sopenharmony_ci	)
199a46c0ec8Sopenharmony_ci
200a46c0ec8Sopenharmony_ci	_arguments -C \
201a46c0ec8Sopenharmony_ci		'--help[Print help and exit]' \
202a46c0ec8Sopenharmony_ci		':feature:->feature' \
203a46c0ec8Sopenharmony_ci		'*:: :->option-or-argument'
204a46c0ec8Sopenharmony_ci
205a46c0ec8Sopenharmony_ci	case $state in
206a46c0ec8Sopenharmony_ci		(feature)
207a46c0ec8Sopenharmony_ci			_describe -t features 'feature' features
208a46c0ec8Sopenharmony_ci			;;
209a46c0ec8Sopenharmony_ci		(option-or-argument)
210a46c0ec8Sopenharmony_ci			curcontext=${curcontext%:*:*}:libinput-analyze-$words[1]:
211a46c0ec8Sopenharmony_ci			if ! _call_function ret _libinput_analyze_$words[1]; then
212a46c0ec8Sopenharmony_ci				_message "unknown feature: $words[1]"
213a46c0ec8Sopenharmony_ci			fi
214a46c0ec8Sopenharmony_ci			;;
215a46c0ec8Sopenharmony_ci	esac
216a46c0ec8Sopenharmony_ci	return ret
217a46c0ec8Sopenharmony_ci}
218a46c0ec8Sopenharmony_ci
219a46c0ec8Sopenharmony_ci(( $+functions[_libinput_record] )) || _libinput_record()
220a46c0ec8Sopenharmony_ci{
221a46c0ec8Sopenharmony_ci	_arguments \
222a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
223a46c0ec8Sopenharmony_ci		'--all[Record all /dev/input/event* devices available on the system]' \
224a46c0ec8Sopenharmony_ci		'--autorestart=[Terminate the current recording after s seconds of device inactivity]' \
225a46c0ec8Sopenharmony_ci		{-o+,--output=}'[Specify the output file to use]:file:_files -g "*.yml"' \
226a46c0ec8Sopenharmony_ci		'--multiple[Record multiple devices at once]' \
227a46c0ec8Sopenharmony_ci		'--show-keycodes[Show keycodes as-is in the recording]' \
228a46c0ec8Sopenharmony_ci		'--with-libinput[Record libinput events alongside device events]' \
229a46c0ec8Sopenharmony_ci		'--with-hidraw[Record hidraw events alongside device events]' \
230a46c0ec8Sopenharmony_ci		'*::device:_files -W /dev/input/ -P /dev/input/'
231a46c0ec8Sopenharmony_ci}
232a46c0ec8Sopenharmony_ci
233a46c0ec8Sopenharmony_ci(( $+functions[_libinput_replay] )) || _libinput_replay()
234a46c0ec8Sopenharmony_ci{
235a46c0ec8Sopenharmony_ci	_arguments \
236a46c0ec8Sopenharmony_ci		'--help[Show help message and exit]' \
237a46c0ec8Sopenharmony_ci		':recording:_files'
238a46c0ec8Sopenharmony_ci}
239a46c0ec8Sopenharmony_ci
240a46c0ec8Sopenharmony_ci_libinput()
241a46c0ec8Sopenharmony_ci{
242a46c0ec8Sopenharmony_ci	local curcontext=$curcontext state line ret=1
243a46c0ec8Sopenharmony_ci
244a46c0ec8Sopenharmony_ci	_arguments -C \
245a46c0ec8Sopenharmony_ci		{-h,--help}'[Show help message and exit]' \
246a46c0ec8Sopenharmony_ci		'--version[Show version information and exit]' \
247a46c0ec8Sopenharmony_ci		':command:->command' \
248a46c0ec8Sopenharmony_ci		'*:: :->option-or-argument' && return
249a46c0ec8Sopenharmony_ci
250a46c0ec8Sopenharmony_ci	case $state in
251a46c0ec8Sopenharmony_ci		(command)
252a46c0ec8Sopenharmony_ci			_libinput_commands && ret=0
253a46c0ec8Sopenharmony_ci			;;
254a46c0ec8Sopenharmony_ci		(option-or-argument)
255a46c0ec8Sopenharmony_ci			curcontext=${curcontext%:*:*}:libinput-$words[1]:
256a46c0ec8Sopenharmony_ci			if ! _call_function ret _libinput_$words[1]; then
257a46c0ec8Sopenharmony_ci				_message "unknown libinput command: $words[1]"
258a46c0ec8Sopenharmony_ci			fi
259a46c0ec8Sopenharmony_ci			;;
260a46c0ec8Sopenharmony_ci	esac
261a46c0ec8Sopenharmony_ci	return ret
262a46c0ec8Sopenharmony_ci}
263a46c0ec8Sopenharmony_ci
264a46c0ec8Sopenharmony_ci_libinput
265