The libinput API documentation has a sample program on the main page but it doesn't compile as given.
This revision of it does compile and run:
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <libinput.h>
#include <libudev.h>
#include <stdio.h>
#define ANSI_HIGHLIGHT "\x1B[0;1;39m"
#define ANSI_RED "\x1B[0;31m"
#define ANSI_GREEN "\x1B[0;32m"
#define ANSI_YELLOW "\x1B[0;33m"
#define ANSI_BLUE "\x1B[0;34m"
#define ANSI_MAGENTA "\x1B[0;35m"
#define ANSI_CYAN "\x1B[0;36m"
#define ANSI_BRIGHT_RED "\x1B[0;31;1m"
#define ANSI_BRIGHT_GREEN "\x1B[0;32;1m"
#define ANSI_BRIGHT_YELLOW "\x1B[0;33;1m"
#define ANSI_BRIGHT_BLUE "\x1B[0;34;1m"
#define ANSI_BRIGHT_MAGENTA "\x1B[0;35;1m"
#define ANSI_BRIGHT_CYAN "\x1B[0;36;1m"
#define ANSI_NORMAL "\x1B[0m"
static int open_restricted(const char *path, int flags, void *user_data)
{
int fd = open(path, flags);
return fd < 0 ? -errno : fd;
}
static void close_restricted(int fd, void *user_data)
{
close(fd);
}
const static struct libinput_interface interface = {
.open_restricted = open_restricted,
.close_restricted = close_restricted,
};
static void
log_handler(struct libinput *li,
enum libinput_log_priority priority,
const char *format,
va_list args)
{
static int is_tty = -1;
if (is_tty == -1)
is_tty = isatty(STDOUT_FILENO);
if (is_tty) {
if (priority >= LIBINPUT_LOG_PRIORITY_ERROR)
printf(ANSI_RED);
else if (priority >= LIBINPUT_LOG_PRIORITY_INFO)
printf(ANSI_HIGHLIGHT);
}
vprintf(format, args);
if (is_tty && priority >= LIBINPUT_LOG_PRIORITY_INFO)
printf(ANSI_NORMAL);
}
int main(void) {
fprintf(stderr, "start main\n");
struct libinput *li;
struct libinput_event *event;
struct udev *udev = udev_new();
if (!udev) {
fprintf(stderr, "Failed to initialize udev\n");
return -1;
}
fprintf(stderr, "create libinput context for udev\n");
li = libinput_udev_create_context(&interface, NULL, udev);
if (!li) {
fprintf(stderr, "Failed to create libinput context\n");
return -1;
}
libinput_log_set_handler(li, log_handler);
libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_DEBUG);
if (libinput_udev_assign_seat(li, "seat0")) {
fprintf(stderr, "Failed to assign seat\n");
libinput_unref(li);
li = NULL;
udev_unref(udev);
return -1;
}
libinput_dispatch(li);
while ((event = libinput_get_event(li)) != NULL) {
// handle the event here
fprintf(stderr, "in the event loop\n");
libinput_event_destroy(event);
libinput_dispatch(li);
}
fprintf(stderr, "unreference libinput context\n");
libinput_unref(li);
return 0;
}
This can be compiled with:
$ gcc -o sample sample.c `pkg-config --cflags --libs libinput` -ludev
No comments:
Post a Comment