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