1a46c0ec8Sopenharmony_ci/*
2a46c0ec8Sopenharmony_ci * Copyright © 2015 Red Hat, Inc.
3a46c0ec8Sopenharmony_ci *
4a46c0ec8Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
5a46c0ec8Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
6a46c0ec8Sopenharmony_ci * to deal in the Software without restriction, including without limitation
7a46c0ec8Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a46c0ec8Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
9a46c0ec8Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
10a46c0ec8Sopenharmony_ci *
11a46c0ec8Sopenharmony_ci * The above copyright notice and this permission notice (including the next
12a46c0ec8Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
13a46c0ec8Sopenharmony_ci * Software.
14a46c0ec8Sopenharmony_ci *
15a46c0ec8Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a46c0ec8Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a46c0ec8Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a46c0ec8Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a46c0ec8Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a46c0ec8Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a46c0ec8Sopenharmony_ci * DEALINGS IN THE SOFTWARE.
22a46c0ec8Sopenharmony_ci */
23a46c0ec8Sopenharmony_ci
24a46c0ec8Sopenharmony_ci#include "config.h"
25a46c0ec8Sopenharmony_ci
26a46c0ec8Sopenharmony_ci#include <errno.h>
27a46c0ec8Sopenharmony_ci#include <stdbool.h>
28a46c0ec8Sopenharmony_ci#include <stdio.h>
29a46c0ec8Sopenharmony_ci#include <string.h>
30a46c0ec8Sopenharmony_ci#include <unistd.h>
31a46c0ec8Sopenharmony_ci#include <libudev.h>
32a46c0ec8Sopenharmony_ci
33a46c0ec8Sopenharmony_ci#include <libinput.h>
34a46c0ec8Sopenharmony_ci#include <libinput-version.h>
35a46c0ec8Sopenharmony_ci#include "util-strings.h"
36a46c0ec8Sopenharmony_ci
37a46c0ec8Sopenharmony_ci#include "shared.h"
38a46c0ec8Sopenharmony_ci
39a46c0ec8Sopenharmony_cistatic const char *
40a46c0ec8Sopenharmony_citap_default(struct libinput_device *device)
41a46c0ec8Sopenharmony_ci{
42a46c0ec8Sopenharmony_ci	if (!libinput_device_config_tap_get_finger_count(device))
43a46c0ec8Sopenharmony_ci		return "n/a";
44a46c0ec8Sopenharmony_ci
45a46c0ec8Sopenharmony_ci	if (libinput_device_config_tap_get_default_enabled(device))
46a46c0ec8Sopenharmony_ci		return "enabled";
47a46c0ec8Sopenharmony_ci
48a46c0ec8Sopenharmony_ci	return "disabled";
49a46c0ec8Sopenharmony_ci}
50a46c0ec8Sopenharmony_ci
51a46c0ec8Sopenharmony_cistatic const char *
52a46c0ec8Sopenharmony_cidrag_default(struct libinput_device *device)
53a46c0ec8Sopenharmony_ci{
54a46c0ec8Sopenharmony_ci	if (!libinput_device_config_tap_get_finger_count(device))
55a46c0ec8Sopenharmony_ci		return "n/a";
56a46c0ec8Sopenharmony_ci
57a46c0ec8Sopenharmony_ci	if (libinput_device_config_tap_get_default_drag_enabled(device))
58a46c0ec8Sopenharmony_ci		return "enabled";
59a46c0ec8Sopenharmony_ci
60a46c0ec8Sopenharmony_ci	return "disabled";
61a46c0ec8Sopenharmony_ci}
62a46c0ec8Sopenharmony_ci
63a46c0ec8Sopenharmony_cistatic const char *
64a46c0ec8Sopenharmony_cidraglock_default(struct libinput_device *device)
65a46c0ec8Sopenharmony_ci{
66a46c0ec8Sopenharmony_ci	if (!libinput_device_config_tap_get_finger_count(device))
67a46c0ec8Sopenharmony_ci		return "n/a";
68a46c0ec8Sopenharmony_ci
69a46c0ec8Sopenharmony_ci	if (libinput_device_config_tap_get_default_drag_lock_enabled(device))
70a46c0ec8Sopenharmony_ci		return "enabled";
71a46c0ec8Sopenharmony_ci
72a46c0ec8Sopenharmony_ci	return "disabled";
73a46c0ec8Sopenharmony_ci}
74a46c0ec8Sopenharmony_ci
75a46c0ec8Sopenharmony_cistatic const char*
76a46c0ec8Sopenharmony_cileft_handed_default(struct libinput_device *device)
77a46c0ec8Sopenharmony_ci{
78a46c0ec8Sopenharmony_ci	if (!libinput_device_config_left_handed_is_available(device))
79a46c0ec8Sopenharmony_ci		return "n/a";
80a46c0ec8Sopenharmony_ci
81a46c0ec8Sopenharmony_ci	if (libinput_device_config_left_handed_get_default(device))
82a46c0ec8Sopenharmony_ci		return "enabled";
83a46c0ec8Sopenharmony_ci
84a46c0ec8Sopenharmony_ci	return "disabled";
85a46c0ec8Sopenharmony_ci}
86a46c0ec8Sopenharmony_ci
87a46c0ec8Sopenharmony_cistatic const char *
88a46c0ec8Sopenharmony_cinat_scroll_default(struct libinput_device *device)
89a46c0ec8Sopenharmony_ci{
90a46c0ec8Sopenharmony_ci	if (!libinput_device_config_scroll_has_natural_scroll(device))
91a46c0ec8Sopenharmony_ci		return "n/a";
92a46c0ec8Sopenharmony_ci
93a46c0ec8Sopenharmony_ci	if (libinput_device_config_scroll_get_default_natural_scroll_enabled(device))
94a46c0ec8Sopenharmony_ci		return "enabled";
95a46c0ec8Sopenharmony_ci
96a46c0ec8Sopenharmony_ci	return "disabled";
97a46c0ec8Sopenharmony_ci}
98a46c0ec8Sopenharmony_ci
99a46c0ec8Sopenharmony_cistatic const char *
100a46c0ec8Sopenharmony_cimiddle_emulation_default(struct libinput_device *device)
101a46c0ec8Sopenharmony_ci{
102a46c0ec8Sopenharmony_ci	if (!libinput_device_config_middle_emulation_is_available(device))
103a46c0ec8Sopenharmony_ci		return "n/a";
104a46c0ec8Sopenharmony_ci
105a46c0ec8Sopenharmony_ci	if (libinput_device_config_middle_emulation_get_default_enabled(device))
106a46c0ec8Sopenharmony_ci		return "enabled";
107a46c0ec8Sopenharmony_ci
108a46c0ec8Sopenharmony_ci	return "disabled";
109a46c0ec8Sopenharmony_ci}
110a46c0ec8Sopenharmony_ci
111a46c0ec8Sopenharmony_cistatic char *
112a46c0ec8Sopenharmony_cicalibration_default(struct libinput_device *device)
113a46c0ec8Sopenharmony_ci{
114a46c0ec8Sopenharmony_ci	char *str;
115a46c0ec8Sopenharmony_ci	float calibration[6];
116a46c0ec8Sopenharmony_ci
117a46c0ec8Sopenharmony_ci	if (!libinput_device_config_calibration_has_matrix(device)) {
118a46c0ec8Sopenharmony_ci		xasprintf(&str, "n/a");
119a46c0ec8Sopenharmony_ci		return str;
120a46c0ec8Sopenharmony_ci	}
121a46c0ec8Sopenharmony_ci
122a46c0ec8Sopenharmony_ci	if (libinput_device_config_calibration_get_default_matrix(device,
123a46c0ec8Sopenharmony_ci						  calibration) == 0) {
124a46c0ec8Sopenharmony_ci		xasprintf(&str, "identity matrix");
125a46c0ec8Sopenharmony_ci		return str;
126a46c0ec8Sopenharmony_ci	}
127a46c0ec8Sopenharmony_ci
128a46c0ec8Sopenharmony_ci	xasprintf(&str,
129a46c0ec8Sopenharmony_ci		 "%.2f %.2f %.2f %.2f %.2f %.2f",
130a46c0ec8Sopenharmony_ci		 calibration[0],
131a46c0ec8Sopenharmony_ci		 calibration[1],
132a46c0ec8Sopenharmony_ci		 calibration[2],
133a46c0ec8Sopenharmony_ci		 calibration[3],
134a46c0ec8Sopenharmony_ci		 calibration[4],
135a46c0ec8Sopenharmony_ci		 calibration[5]);
136a46c0ec8Sopenharmony_ci	return str;
137a46c0ec8Sopenharmony_ci}
138a46c0ec8Sopenharmony_ci
139a46c0ec8Sopenharmony_cistatic char *
140a46c0ec8Sopenharmony_ciscroll_defaults(struct libinput_device *device)
141a46c0ec8Sopenharmony_ci{
142a46c0ec8Sopenharmony_ci	uint32_t scroll_methods;
143a46c0ec8Sopenharmony_ci	char *str;
144a46c0ec8Sopenharmony_ci	enum libinput_config_scroll_method method;
145a46c0ec8Sopenharmony_ci
146a46c0ec8Sopenharmony_ci	scroll_methods = libinput_device_config_scroll_get_methods(device);
147a46c0ec8Sopenharmony_ci	if (scroll_methods == LIBINPUT_CONFIG_SCROLL_NO_SCROLL) {
148a46c0ec8Sopenharmony_ci		xasprintf(&str, "none");
149a46c0ec8Sopenharmony_ci		return str;
150a46c0ec8Sopenharmony_ci	}
151a46c0ec8Sopenharmony_ci
152a46c0ec8Sopenharmony_ci	method = libinput_device_config_scroll_get_default_method(device);
153a46c0ec8Sopenharmony_ci
154a46c0ec8Sopenharmony_ci	xasprintf(&str,
155a46c0ec8Sopenharmony_ci		 "%s%s%s%s%s%s",
156a46c0ec8Sopenharmony_ci		 (method == LIBINPUT_CONFIG_SCROLL_2FG) ? "*" : "",
157a46c0ec8Sopenharmony_ci		 (scroll_methods & LIBINPUT_CONFIG_SCROLL_2FG) ? "two-finger " : "",
158a46c0ec8Sopenharmony_ci		 (method == LIBINPUT_CONFIG_SCROLL_EDGE) ? "*" : "",
159a46c0ec8Sopenharmony_ci		 (scroll_methods & LIBINPUT_CONFIG_SCROLL_EDGE) ? "edge " : "",
160a46c0ec8Sopenharmony_ci		 (method == LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN) ? "*" : "",
161a46c0ec8Sopenharmony_ci		 (scroll_methods & LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN) ? "button" : "");
162a46c0ec8Sopenharmony_ci	return str;
163a46c0ec8Sopenharmony_ci}
164a46c0ec8Sopenharmony_ci
165a46c0ec8Sopenharmony_cistatic char*
166a46c0ec8Sopenharmony_ciclick_defaults(struct libinput_device *device)
167a46c0ec8Sopenharmony_ci{
168a46c0ec8Sopenharmony_ci	uint32_t click_methods;
169a46c0ec8Sopenharmony_ci	char *str;
170a46c0ec8Sopenharmony_ci	enum libinput_config_click_method method;
171a46c0ec8Sopenharmony_ci
172a46c0ec8Sopenharmony_ci	click_methods = libinput_device_config_click_get_methods(device);
173a46c0ec8Sopenharmony_ci	if (click_methods == LIBINPUT_CONFIG_CLICK_METHOD_NONE) {
174a46c0ec8Sopenharmony_ci		xasprintf(&str, "none");
175a46c0ec8Sopenharmony_ci		return str;
176a46c0ec8Sopenharmony_ci	}
177a46c0ec8Sopenharmony_ci
178a46c0ec8Sopenharmony_ci	method = libinput_device_config_click_get_default_method(device);
179a46c0ec8Sopenharmony_ci	xasprintf(&str,
180a46c0ec8Sopenharmony_ci		 "%s%s%s%s",
181a46c0ec8Sopenharmony_ci		 (method == LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS) ? "*" : "",
182a46c0ec8Sopenharmony_ci		 (click_methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS) ? "button-areas " : "",
183a46c0ec8Sopenharmony_ci		 (method == LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER) ? "*" : "",
184a46c0ec8Sopenharmony_ci		 (click_methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER) ? "clickfinger " : "");
185a46c0ec8Sopenharmony_ci	return str;
186a46c0ec8Sopenharmony_ci}
187a46c0ec8Sopenharmony_ci
188a46c0ec8Sopenharmony_cistatic char*
189a46c0ec8Sopenharmony_ciaccel_profiles(struct libinput_device *device)
190a46c0ec8Sopenharmony_ci{
191a46c0ec8Sopenharmony_ci	uint32_t profiles;
192a46c0ec8Sopenharmony_ci	char *str;
193a46c0ec8Sopenharmony_ci	enum libinput_config_accel_profile profile;
194a46c0ec8Sopenharmony_ci
195a46c0ec8Sopenharmony_ci	if (!libinput_device_config_accel_is_available(device)) {
196a46c0ec8Sopenharmony_ci		xasprintf(&str, "n/a");
197a46c0ec8Sopenharmony_ci		return str;
198a46c0ec8Sopenharmony_ci	}
199a46c0ec8Sopenharmony_ci
200a46c0ec8Sopenharmony_ci	profiles = libinput_device_config_accel_get_profiles(device);
201a46c0ec8Sopenharmony_ci	if (profiles == LIBINPUT_CONFIG_ACCEL_PROFILE_NONE) {
202a46c0ec8Sopenharmony_ci		xasprintf(&str, "none");
203a46c0ec8Sopenharmony_ci		return str;
204a46c0ec8Sopenharmony_ci	}
205a46c0ec8Sopenharmony_ci
206a46c0ec8Sopenharmony_ci	profile = libinput_device_config_accel_get_default_profile(device);
207a46c0ec8Sopenharmony_ci	xasprintf(&str,
208a46c0ec8Sopenharmony_ci		  "%s%s %s%s %s%s",
209a46c0ec8Sopenharmony_ci		  (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "*" : "",
210a46c0ec8Sopenharmony_ci		  (profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "flat" : "",
211a46c0ec8Sopenharmony_ci		  (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) ? "*" : "",
212a46c0ec8Sopenharmony_ci		  (profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) ? "adaptive" : "",
213a46c0ec8Sopenharmony_ci		  (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_CUSTOM) ? "*" : "",
214a46c0ec8Sopenharmony_ci		  (profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_CUSTOM) ? "custom" : "");
215a46c0ec8Sopenharmony_ci
216a46c0ec8Sopenharmony_ci	return str;
217a46c0ec8Sopenharmony_ci}
218a46c0ec8Sopenharmony_ci
219a46c0ec8Sopenharmony_cistatic const char *
220a46c0ec8Sopenharmony_cidwt_default(struct libinput_device *device)
221a46c0ec8Sopenharmony_ci{
222a46c0ec8Sopenharmony_ci	if (!libinput_device_config_dwt_is_available(device))
223a46c0ec8Sopenharmony_ci		return "n/a";
224a46c0ec8Sopenharmony_ci
225a46c0ec8Sopenharmony_ci	if (libinput_device_config_dwt_get_default_enabled(device))
226a46c0ec8Sopenharmony_ci		return "enabled";
227a46c0ec8Sopenharmony_ci
228a46c0ec8Sopenharmony_ci	return "disabled";
229a46c0ec8Sopenharmony_ci}
230a46c0ec8Sopenharmony_ci
231a46c0ec8Sopenharmony_cistatic const char *
232a46c0ec8Sopenharmony_cidwtp_default(struct libinput_device *device)
233a46c0ec8Sopenharmony_ci{
234a46c0ec8Sopenharmony_ci	if (!libinput_device_config_dwtp_is_available(device))
235a46c0ec8Sopenharmony_ci		return "n/a";
236a46c0ec8Sopenharmony_ci
237a46c0ec8Sopenharmony_ci	if (libinput_device_config_dwtp_get_default_enabled(device))
238a46c0ec8Sopenharmony_ci		return "enabled";
239a46c0ec8Sopenharmony_ci
240a46c0ec8Sopenharmony_ci	return "disabled";
241a46c0ec8Sopenharmony_ci}
242a46c0ec8Sopenharmony_ci
243a46c0ec8Sopenharmony_cistatic char *
244a46c0ec8Sopenharmony_cirotation_default(struct libinput_device *device)
245a46c0ec8Sopenharmony_ci{
246a46c0ec8Sopenharmony_ci	char *str;
247a46c0ec8Sopenharmony_ci	double angle;
248a46c0ec8Sopenharmony_ci
249a46c0ec8Sopenharmony_ci	if (!libinput_device_config_rotation_is_available(device)) {
250a46c0ec8Sopenharmony_ci		xasprintf(&str, "n/a");
251a46c0ec8Sopenharmony_ci		return str;
252a46c0ec8Sopenharmony_ci	}
253a46c0ec8Sopenharmony_ci
254a46c0ec8Sopenharmony_ci	angle = libinput_device_config_rotation_get_angle(device);
255a46c0ec8Sopenharmony_ci	xasprintf(&str, "%.1f", angle);
256a46c0ec8Sopenharmony_ci	return str;
257a46c0ec8Sopenharmony_ci}
258a46c0ec8Sopenharmony_ci
259a46c0ec8Sopenharmony_cistatic void
260a46c0ec8Sopenharmony_ciprint_pad_info(struct libinput_device *device)
261a46c0ec8Sopenharmony_ci{
262a46c0ec8Sopenharmony_ci	int nbuttons, nrings, nstrips, ngroups, nmodes;
263a46c0ec8Sopenharmony_ci	struct libinput_tablet_pad_mode_group *group;
264a46c0ec8Sopenharmony_ci
265a46c0ec8Sopenharmony_ci	nbuttons = libinput_device_tablet_pad_get_num_buttons(device);
266a46c0ec8Sopenharmony_ci	nrings = libinput_device_tablet_pad_get_num_rings(device);
267a46c0ec8Sopenharmony_ci	nstrips = libinput_device_tablet_pad_get_num_strips(device);
268a46c0ec8Sopenharmony_ci	ngroups = libinput_device_tablet_pad_get_num_mode_groups(device);
269a46c0ec8Sopenharmony_ci
270a46c0ec8Sopenharmony_ci	group = libinput_device_tablet_pad_get_mode_group(device, 0);
271a46c0ec8Sopenharmony_ci	nmodes = libinput_tablet_pad_mode_group_get_num_modes(group);
272a46c0ec8Sopenharmony_ci
273a46c0ec8Sopenharmony_ci	printf("Pad:\n");
274a46c0ec8Sopenharmony_ci	printf("	Rings:   %d\n", nrings);
275a46c0ec8Sopenharmony_ci	printf("	Strips:  %d\n", nstrips);
276a46c0ec8Sopenharmony_ci	printf("	Buttons: %d\n", nbuttons);
277a46c0ec8Sopenharmony_ci	printf("	Mode groups: %d (%d modes)\n", ngroups, nmodes);
278a46c0ec8Sopenharmony_ci
279a46c0ec8Sopenharmony_ci}
280a46c0ec8Sopenharmony_ci
281a46c0ec8Sopenharmony_cistatic void
282a46c0ec8Sopenharmony_ciprint_device_notify(struct libinput_event *ev)
283a46c0ec8Sopenharmony_ci{
284a46c0ec8Sopenharmony_ci	struct libinput_device *dev = libinput_event_get_device(ev);
285a46c0ec8Sopenharmony_ci	struct libinput_seat *seat = libinput_device_get_seat(dev);
286a46c0ec8Sopenharmony_ci	struct libinput_device_group *group;
287a46c0ec8Sopenharmony_ci	struct udev_device *udev_device;
288a46c0ec8Sopenharmony_ci	double w, h;
289a46c0ec8Sopenharmony_ci	static int next_group_id = 0;
290a46c0ec8Sopenharmony_ci	intptr_t group_id;
291a46c0ec8Sopenharmony_ci	const char *devnode;
292a46c0ec8Sopenharmony_ci	char *str;
293a46c0ec8Sopenharmony_ci
294a46c0ec8Sopenharmony_ci	group = libinput_device_get_device_group(dev);
295a46c0ec8Sopenharmony_ci	group_id = (intptr_t)libinput_device_group_get_user_data(group);
296a46c0ec8Sopenharmony_ci	if (!group_id) {
297a46c0ec8Sopenharmony_ci		group_id = ++next_group_id;
298a46c0ec8Sopenharmony_ci		libinput_device_group_set_user_data(group, (void*)group_id);
299a46c0ec8Sopenharmony_ci	}
300a46c0ec8Sopenharmony_ci
301a46c0ec8Sopenharmony_ci	udev_device = libinput_device_get_udev_device(dev);
302a46c0ec8Sopenharmony_ci	devnode = udev_device_get_devnode(udev_device);
303a46c0ec8Sopenharmony_ci
304a46c0ec8Sopenharmony_ci	printf("Device:           %s\n"
305a46c0ec8Sopenharmony_ci	       "Kernel:           %s\n"
306a46c0ec8Sopenharmony_ci	       "Group:            %d\n"
307a46c0ec8Sopenharmony_ci	       "Seat:             %s, %s\n",
308a46c0ec8Sopenharmony_ci	       libinput_device_get_name(dev),
309a46c0ec8Sopenharmony_ci	       devnode,
310a46c0ec8Sopenharmony_ci	       (int)group_id,
311a46c0ec8Sopenharmony_ci	       libinput_seat_get_physical_name(seat),
312a46c0ec8Sopenharmony_ci	       libinput_seat_get_logical_name(seat));
313a46c0ec8Sopenharmony_ci
314a46c0ec8Sopenharmony_ci	udev_device_unref(udev_device);
315a46c0ec8Sopenharmony_ci
316a46c0ec8Sopenharmony_ci	if (libinput_device_get_size(dev, &w, &h) == 0)
317a46c0ec8Sopenharmony_ci		printf("Size:             %.fx%.fmm\n", w, h);
318a46c0ec8Sopenharmony_ci	printf("Capabilities:     ");
319a46c0ec8Sopenharmony_ci	if (libinput_device_has_capability(dev,
320a46c0ec8Sopenharmony_ci					   LIBINPUT_DEVICE_CAP_KEYBOARD))
321a46c0ec8Sopenharmony_ci		printf("keyboard ");
322a46c0ec8Sopenharmony_ci	if (libinput_device_has_capability(dev,
323a46c0ec8Sopenharmony_ci					   LIBINPUT_DEVICE_CAP_POINTER))
324a46c0ec8Sopenharmony_ci		printf("pointer ");
325a46c0ec8Sopenharmony_ci	if (libinput_device_has_capability(dev,
326a46c0ec8Sopenharmony_ci					   LIBINPUT_DEVICE_CAP_TOUCH))
327a46c0ec8Sopenharmony_ci		printf("touch ");
328a46c0ec8Sopenharmony_ci	if (libinput_device_has_capability(dev,
329a46c0ec8Sopenharmony_ci					   LIBINPUT_DEVICE_CAP_TABLET_TOOL))
330a46c0ec8Sopenharmony_ci		printf("tablet ");
331a46c0ec8Sopenharmony_ci	if (libinput_device_has_capability(dev,
332a46c0ec8Sopenharmony_ci					   LIBINPUT_DEVICE_CAP_TABLET_PAD))
333a46c0ec8Sopenharmony_ci		printf("tablet-pad");
334a46c0ec8Sopenharmony_ci	if (libinput_device_has_capability(dev,
335a46c0ec8Sopenharmony_ci					   LIBINPUT_DEVICE_CAP_GESTURE))
336a46c0ec8Sopenharmony_ci		printf("gesture");
337a46c0ec8Sopenharmony_ci	if (libinput_device_has_capability(dev,
338a46c0ec8Sopenharmony_ci					   LIBINPUT_DEVICE_CAP_SWITCH))
339a46c0ec8Sopenharmony_ci		printf("switch");
340a46c0ec8Sopenharmony_ci	printf("\n");
341a46c0ec8Sopenharmony_ci
342a46c0ec8Sopenharmony_ci	printf("Tap-to-click:     %s\n", tap_default(dev));
343a46c0ec8Sopenharmony_ci	printf("Tap-and-drag:     %s\n",  drag_default(dev));
344a46c0ec8Sopenharmony_ci	printf("Tap drag lock:    %s\n", draglock_default(dev));
345a46c0ec8Sopenharmony_ci	printf("Left-handed:      %s\n", left_handed_default(dev));
346a46c0ec8Sopenharmony_ci	printf("Nat.scrolling:    %s\n", nat_scroll_default(dev));
347a46c0ec8Sopenharmony_ci	printf("Middle emulation: %s\n", middle_emulation_default(dev));
348a46c0ec8Sopenharmony_ci	str = calibration_default(dev);
349a46c0ec8Sopenharmony_ci	printf("Calibration:      %s\n", str);
350a46c0ec8Sopenharmony_ci	free(str);
351a46c0ec8Sopenharmony_ci
352a46c0ec8Sopenharmony_ci	str = scroll_defaults(dev);
353a46c0ec8Sopenharmony_ci	printf("Scroll methods:   %s\n", str);
354a46c0ec8Sopenharmony_ci	free(str);
355a46c0ec8Sopenharmony_ci
356a46c0ec8Sopenharmony_ci	str = click_defaults(dev);
357a46c0ec8Sopenharmony_ci	printf("Click methods:    %s\n", str);
358a46c0ec8Sopenharmony_ci	free(str);
359a46c0ec8Sopenharmony_ci
360a46c0ec8Sopenharmony_ci	printf("Disable-w-typing: %s\n", dwt_default(dev));
361a46c0ec8Sopenharmony_ci	printf("Disable-w-trackpointing: %s\n", dwtp_default(dev));
362a46c0ec8Sopenharmony_ci
363a46c0ec8Sopenharmony_ci	str = accel_profiles(dev);
364a46c0ec8Sopenharmony_ci	printf("Accel profiles:   %s\n", str);
365a46c0ec8Sopenharmony_ci	free(str);
366a46c0ec8Sopenharmony_ci
367a46c0ec8Sopenharmony_ci	str = rotation_default(dev);
368a46c0ec8Sopenharmony_ci	printf("Rotation:         %s\n", str);
369a46c0ec8Sopenharmony_ci	free(str);
370a46c0ec8Sopenharmony_ci
371a46c0ec8Sopenharmony_ci	if (libinput_device_has_capability(dev,
372a46c0ec8Sopenharmony_ci					   LIBINPUT_DEVICE_CAP_TABLET_PAD))
373a46c0ec8Sopenharmony_ci		print_pad_info(dev);
374a46c0ec8Sopenharmony_ci
375a46c0ec8Sopenharmony_ci	printf("\n");
376a46c0ec8Sopenharmony_ci}
377a46c0ec8Sopenharmony_ci
378a46c0ec8Sopenharmony_cistatic inline void
379a46c0ec8Sopenharmony_ciusage(void)
380a46c0ec8Sopenharmony_ci{
381a46c0ec8Sopenharmony_ci	printf("Usage: libinput list-devices [--help|--version]\n");
382a46c0ec8Sopenharmony_ci	printf("\n"
383a46c0ec8Sopenharmony_ci	       "--help ...... show this help and exit\n"
384a46c0ec8Sopenharmony_ci	       "--version ... show version information and exit\n"
385a46c0ec8Sopenharmony_ci	       "\n");
386a46c0ec8Sopenharmony_ci}
387a46c0ec8Sopenharmony_ci
388a46c0ec8Sopenharmony_ciint
389a46c0ec8Sopenharmony_cimain(int argc, char **argv)
390a46c0ec8Sopenharmony_ci{
391a46c0ec8Sopenharmony_ci	struct libinput *li;
392a46c0ec8Sopenharmony_ci	struct libinput_event *ev;
393a46c0ec8Sopenharmony_ci	bool grab = false;
394a46c0ec8Sopenharmony_ci	const char *seat[2] = {"seat0", NULL};
395a46c0ec8Sopenharmony_ci
396a46c0ec8Sopenharmony_ci	/* This is kept for backwards-compatibility with the old
397a46c0ec8Sopenharmony_ci	   libinput-list-devices */
398a46c0ec8Sopenharmony_ci	if (argc > 1) {
399a46c0ec8Sopenharmony_ci		if (streq(argv[1], "--help")) {
400a46c0ec8Sopenharmony_ci			usage();
401a46c0ec8Sopenharmony_ci			return 0;
402a46c0ec8Sopenharmony_ci		}
403a46c0ec8Sopenharmony_ci
404a46c0ec8Sopenharmony_ci		if (streq(argv[1], "--version")) {
405a46c0ec8Sopenharmony_ci			printf("%s\n", LIBINPUT_VERSION);
406a46c0ec8Sopenharmony_ci			return 0;
407a46c0ec8Sopenharmony_ci		}
408a46c0ec8Sopenharmony_ci
409a46c0ec8Sopenharmony_ci		usage();
410a46c0ec8Sopenharmony_ci		return EXIT_INVALID_USAGE;
411a46c0ec8Sopenharmony_ci	}
412a46c0ec8Sopenharmony_ci
413a46c0ec8Sopenharmony_ci	li = tools_open_backend(BACKEND_UDEV, seat, false, &grab);
414a46c0ec8Sopenharmony_ci	if (!li)
415a46c0ec8Sopenharmony_ci		return 1;
416a46c0ec8Sopenharmony_ci
417a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
418a46c0ec8Sopenharmony_ci	while ((ev = libinput_get_event(li))) {
419a46c0ec8Sopenharmony_ci
420a46c0ec8Sopenharmony_ci		if (libinput_event_get_type(ev) == LIBINPUT_EVENT_DEVICE_ADDED)
421a46c0ec8Sopenharmony_ci			print_device_notify(ev);
422a46c0ec8Sopenharmony_ci
423a46c0ec8Sopenharmony_ci		libinput_event_destroy(ev);
424a46c0ec8Sopenharmony_ci		libinput_dispatch(li);
425a46c0ec8Sopenharmony_ci	}
426a46c0ec8Sopenharmony_ci
427a46c0ec8Sopenharmony_ci	libinput_unref(li);
428a46c0ec8Sopenharmony_ci
429a46c0ec8Sopenharmony_ci	return EXIT_SUCCESS;
430a46c0ec8Sopenharmony_ci}
431