1a46c0ec8Sopenharmony_ci/**
2a46c0ec8Sopenharmony_ci@mainpage
3a46c0ec8Sopenharmony_ci
4a46c0ec8Sopenharmony_ciThis is the libinput API reference.
5a46c0ec8Sopenharmony_ci
6a46c0ec8Sopenharmony_ciThis documentation is aimed at developers of Wayland compositors. User
7a46c0ec8Sopenharmony_cidocumentation is available
8a46c0ec8Sopenharmony_ci[here](https://wayland.freedesktop.org/libinput/doc/latest).
9a46c0ec8Sopenharmony_ci
10a46c0ec8Sopenharmony_ci@section concepts Concepts
11a46c0ec8Sopenharmony_ci
12a46c0ec8Sopenharmony_ci@subsection concepts_initialization Initialization of a libinput context
13a46c0ec8Sopenharmony_ci
14a46c0ec8Sopenharmony_cilibinput provides two different backends:
15a46c0ec8Sopenharmony_ci- a @ref libinput_udev_create_context "udev backend" where notifications
16a46c0ec8Sopenharmony_ci  about new and removed devices are provided by udev, and
17a46c0ec8Sopenharmony_ci- a @ref libinput_path_create_context "path backend" where
18a46c0ec8Sopenharmony_ci  @ref libinput_path_add_device "device addition" and
19a46c0ec8Sopenharmony_ci  @ref libinput_path_remove_device "device removal" need to be handled by
20a46c0ec8Sopenharmony_ci  the caller.
21a46c0ec8Sopenharmony_ci
22a46c0ec8Sopenharmony_ciSee section @ref base for information about initializing a libinput context.
23a46c0ec8Sopenharmony_ci
24a46c0ec8Sopenharmony_ci@subsection concepts_events Monitoring for events
25a46c0ec8Sopenharmony_ci
26a46c0ec8Sopenharmony_cilibinput exposes a single @ref libinput_get_fd "file descriptor" to the
27a46c0ec8Sopenharmony_cicaller. This file descriptor should be monitored by the caller, whenever
28a46c0ec8Sopenharmony_cidata is available the caller **must** immediately call libinput_dispatch().
29a46c0ec8Sopenharmony_ciFailure to do so will result in erroneous behavior.
30a46c0ec8Sopenharmony_ci
31a46c0ec8Sopenharmony_cilibinput_dispatch() may result in one or more events being available to the
32a46c0ec8Sopenharmony_cicaller. After libinput_dispatch() a caller **should** call
33a46c0ec8Sopenharmony_cilibinput_get_event() to retrieve and process this event. Whenever
34a46c0ec8Sopenharmony_cilibinput_get_event() returns `NULL`, no further events are available.
35a46c0ec8Sopenharmony_ci
36a46c0ec8Sopenharmony_ciSee section @ref event for more information about events.
37a46c0ec8Sopenharmony_ci
38a46c0ec8Sopenharmony_ci@subsection concepts_seats Device grouping into seats
39a46c0ec8Sopenharmony_ci
40a46c0ec8Sopenharmony_ciAll devices are grouped into physical and logical seats. Button and key
41a46c0ec8Sopenharmony_cistates are available per-device and per-seat. See @ref seat for more
42a46c0ec8Sopenharmony_ciinformation.
43a46c0ec8Sopenharmony_ci
44a46c0ec8Sopenharmony_ci@subsection concepts_devices Device capabilities
45a46c0ec8Sopenharmony_ci
46a46c0ec8Sopenharmony_cilibinput does not use device types. All devices have @ref
47a46c0ec8Sopenharmony_cilibinput_device_has_capability "capabilities" that define which events may
48a46c0ec8Sopenharmony_cibe generated. See @ref device for more information about devices.
49a46c0ec8Sopenharmony_ci
50a46c0ec8Sopenharmony_ciSpecific event types include:
51a46c0ec8Sopenharmony_ci- @ref event_keyboard
52a46c0ec8Sopenharmony_ci- @ref event_pointer
53a46c0ec8Sopenharmony_ci- @ref event_touch
54a46c0ec8Sopenharmony_ci- @ref event_gesture
55a46c0ec8Sopenharmony_ci- @ref event_tablet
56a46c0ec8Sopenharmony_ci- @ref event_tablet_pad
57a46c0ec8Sopenharmony_ci- @ref event_switch
58a46c0ec8Sopenharmony_ci
59a46c0ec8Sopenharmony_ci
60a46c0ec8Sopenharmony_ci@subsection concepts_configuration Device configuration
61a46c0ec8Sopenharmony_ci
62a46c0ec8Sopenharmony_cilibinput relies on the caller for device configuration. See
63a46c0ec8Sopenharmony_ci@ref config for more information.
64a46c0ec8Sopenharmony_ci
65a46c0ec8Sopenharmony_ci@subsection example An example libinput program
66a46c0ec8Sopenharmony_ci
67a46c0ec8Sopenharmony_ciThe simplest libinput program looks like this:
68a46c0ec8Sopenharmony_ci
69a46c0ec8Sopenharmony_ci@code
70a46c0ec8Sopenharmony_cistatic int open_restricted(const char *path, int flags, void *user_data)
71a46c0ec8Sopenharmony_ci{
72a46c0ec8Sopenharmony_ci	int fd = open(path, flags);
73a46c0ec8Sopenharmony_ci	return fd < 0 ? -errno : fd;
74a46c0ec8Sopenharmony_ci}
75a46c0ec8Sopenharmony_ci
76a46c0ec8Sopenharmony_cistatic void close_restricted(int fd, void *user_data)
77a46c0ec8Sopenharmony_ci{
78a46c0ec8Sopenharmony_ci	close(fd);
79a46c0ec8Sopenharmony_ci}
80a46c0ec8Sopenharmony_ci
81a46c0ec8Sopenharmony_ciconst static struct libinput_interface interface = {
82a46c0ec8Sopenharmony_ci	.open_restricted = open_restricted,
83a46c0ec8Sopenharmony_ci	.close_restricted = close_restricted,
84a46c0ec8Sopenharmony_ci};
85a46c0ec8Sopenharmony_ci
86a46c0ec8Sopenharmony_ci
87a46c0ec8Sopenharmony_ciint main(void) {
88a46c0ec8Sopenharmony_ci	struct libinput *li;
89a46c0ec8Sopenharmony_ci	struct libinput_event *event;
90a46c0ec8Sopenharmony_ci
91a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&interface, NULL, udev);
92a46c0ec8Sopenharmony_ci	libinput_udev_assign_seat(li, "seat0");
93a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
94a46c0ec8Sopenharmony_ci
95a46c0ec8Sopenharmony_ci	while ((event = libinput_get_event(li)) != NULL) {
96a46c0ec8Sopenharmony_ci
97a46c0ec8Sopenharmony_ci		// handle the event here
98a46c0ec8Sopenharmony_ci
99a46c0ec8Sopenharmony_ci		libinput_event_destroy(event);
100a46c0ec8Sopenharmony_ci		libinput_dispatch(li);
101a46c0ec8Sopenharmony_ci	}
102a46c0ec8Sopenharmony_ci
103a46c0ec8Sopenharmony_ci	libinput_unref(li);
104a46c0ec8Sopenharmony_ci
105a46c0ec8Sopenharmony_ci	return 0;
106a46c0ec8Sopenharmony_ci}
107a46c0ec8Sopenharmony_ci
108a46c0ec8Sopenharmony_ci@endcode
109a46c0ec8Sopenharmony_ci
110a46c0ec8Sopenharmony_ci@section building_against Building against libinput
111a46c0ec8Sopenharmony_ci
112a46c0ec8Sopenharmony_cilibinput provides a
113a46c0ec8Sopenharmony_ci[pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/) file.
114a46c0ec8Sopenharmony_ciSoftware that uses libinput should use pkg-config and the
115a46c0ec8Sopenharmony_ci`PKG_CHECK_MODULES` autoconf macro.
116a46c0ec8Sopenharmony_ciOtherwise, the most rudimentary way to compile and link a program against
117a46c0ec8Sopenharmony_cilibinput is:
118a46c0ec8Sopenharmony_ci
119a46c0ec8Sopenharmony_ci@verbatim
120a46c0ec8Sopenharmony_ci    gcc -o myprogram myprogram.c `pkg-config --cflags --libs libinput`
121a46c0ec8Sopenharmony_ci@endverbatim
122a46c0ec8Sopenharmony_ci
123a46c0ec8Sopenharmony_ciFor further information on using pkgconfig see the pkg-config documentation.
124a46c0ec8Sopenharmony_ci
125a46c0ec8Sopenharmony_ci@section stability Backwards-compatibility
126a46c0ec8Sopenharmony_ci
127a46c0ec8Sopenharmony_cilibinput promises backwards-compatibility across all the 1.x.y version. An
128a46c0ec8Sopenharmony_ciapplication built against libinput 1.x.y will work with any future 1.*.*
129a46c0ec8Sopenharmony_cirelease.
130a46c0ec8Sopenharmony_ci
131a46c0ec8Sopenharmony_ci@section About
132a46c0ec8Sopenharmony_ci
133a46c0ec8Sopenharmony_ciDocumentation generated from git commit [__GIT_VERSION__](https://gitlab.freedesktop.org/libinput/libinput/commit/__GIT_VERSION__)
134a46c0ec8Sopenharmony_ci
135a46c0ec8Sopenharmony_ci*/
136