Blame tools/libevdev-events.c

Packit Service b8eee4
/*
Packit Service b8eee4
 * Copyright © 2013 Red Hat, Inc.
Packit Service b8eee4
 *
Packit Service b8eee4
 * Permission to use, copy, modify, distribute, and sell this software and its
Packit Service b8eee4
 * documentation for any purpose is hereby granted without fee, provided that
Packit Service b8eee4
 * the above copyright notice appear in all copies and that both that copyright
Packit Service b8eee4
 * notice and this permission notice appear in supporting documentation, and
Packit Service b8eee4
 * that the name of the copyright holders not be used in advertising or
Packit Service b8eee4
 * publicity pertaining to distribution of the software without specific,
Packit Service b8eee4
 * written prior permission.  The copyright holders make no representations
Packit Service b8eee4
 * about the suitability of this software for any purpose.  It is provided "as
Packit Service b8eee4
 * is" without express or implied warranty.
Packit Service b8eee4
 *
Packit Service b8eee4
 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
Packit Service b8eee4
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
Packit Service b8eee4
 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
Packit Service b8eee4
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
Packit Service b8eee4
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
Packit Service b8eee4
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
Packit Service b8eee4
 * OF THIS SOFTWARE.
Packit Service b8eee4
 */
Packit Service b8eee4
Packit Service b8eee4
#include <config.h>
Packit Service b8eee4
Packit Service b8eee4
#include <stdio.h>
Packit Service b8eee4
#include <string.h>
Packit Service b8eee4
#include <errno.h>
Packit Service b8eee4
#include <sys/types.h>
Packit Service b8eee4
#include <sys/stat.h>
Packit Service b8eee4
#include <fcntl.h>
Packit Service b8eee4
#include <assert.h>
Packit Service b8eee4
#include <linux/input.h>
Packit Service b8eee4
Packit Service b8eee4
#include "libevdev.h"
Packit Service b8eee4
Packit Service b8eee4
static void
Packit Service b8eee4
print_abs_bits(struct libevdev *dev, int axis)
Packit Service b8eee4
{
Packit Service b8eee4
	const struct input_absinfo *abs;
Packit Service b8eee4
Packit Service b8eee4
	if (!libevdev_has_event_code(dev, EV_ABS, axis))
Packit Service b8eee4
		return;
Packit Service b8eee4
Packit Service b8eee4
	abs = libevdev_get_abs_info(dev, axis);
Packit Service b8eee4
Packit Service b8eee4
	printf("	Value	%6d\n", abs->value);
Packit Service b8eee4
	printf("	Min	%6d\n", abs->minimum);
Packit Service b8eee4
	printf("	Max	%6d\n", abs->maximum);
Packit Service b8eee4
	if (abs->fuzz)
Packit Service b8eee4
		printf("	Fuzz	%6d\n", abs->fuzz);
Packit Service b8eee4
	if (abs->flat)
Packit Service b8eee4
		printf("	Flat	%6d\n", abs->flat);
Packit Service b8eee4
	if (abs->resolution)
Packit Service b8eee4
		printf("	Resolution	%6d\n", abs->resolution);
Packit Service b8eee4
}
Packit Service b8eee4
Packit Service b8eee4
static void
Packit Service b8eee4
print_code_bits(struct libevdev *dev, unsigned int type, unsigned int max)
Packit Service b8eee4
{
Packit Service b8eee4
	unsigned int i;
Packit Service b8eee4
	for (i = 0; i <= max; i++) {
Packit Service b8eee4
		if (!libevdev_has_event_code(dev, type, i))
Packit Service b8eee4
			continue;
Packit Service b8eee4
Packit Service b8eee4
		printf("    Event code %i (%s)\n", i, libevdev_event_code_get_name(type, i));
Packit Service b8eee4
		if (type == EV_ABS)
Packit Service b8eee4
			print_abs_bits(dev, i);
Packit Service b8eee4
	}
Packit Service b8eee4
}
Packit Service b8eee4
Packit Service b8eee4
static void
Packit Service b8eee4
print_bits(struct libevdev *dev)
Packit Service b8eee4
{
Packit Service b8eee4
	unsigned int i;
Packit Service b8eee4
	printf("Supported events:\n");
Packit Service b8eee4
Packit Service b8eee4
	for (i = 0; i <= EV_MAX; i++) {
Packit Service b8eee4
		if (libevdev_has_event_type(dev, i))
Packit Service b8eee4
			printf("  Event type %d (%s)\n", i, libevdev_event_type_get_name(i));
Packit Service b8eee4
		switch(i) {
Packit Service b8eee4
			case EV_KEY:
Packit Service b8eee4
				print_code_bits(dev, EV_KEY, KEY_MAX);
Packit Service b8eee4
				break;
Packit Service b8eee4
			case EV_REL:
Packit Service b8eee4
				print_code_bits(dev, EV_REL, REL_MAX);
Packit Service b8eee4
				break;
Packit Service b8eee4
			case EV_ABS:
Packit Service b8eee4
				print_code_bits(dev, EV_ABS, ABS_MAX);
Packit Service b8eee4
				break;
Packit Service b8eee4
			case EV_LED:
Packit Service b8eee4
				print_code_bits(dev, EV_LED, LED_MAX);
Packit Service b8eee4
				break;
Packit Service b8eee4
		}
Packit Service b8eee4
	}
Packit Service b8eee4
}
Packit Service b8eee4
Packit Service b8eee4
static void
Packit Service b8eee4
print_props(struct libevdev *dev)
Packit Service b8eee4
{
Packit Service b8eee4
	unsigned int i;
Packit Service b8eee4
	printf("Properties:\n");
Packit Service b8eee4
Packit Service b8eee4
	for (i = 0; i <= INPUT_PROP_MAX; i++) {
Packit Service b8eee4
		if (libevdev_has_property(dev, i))
Packit Service b8eee4
			printf("  Property type %d (%s)\n", i,
Packit Service b8eee4
					libevdev_property_get_name(i));
Packit Service b8eee4
	}
Packit Service b8eee4
}
Packit Service b8eee4
Packit Service b8eee4
static int
Packit Service b8eee4
print_event(struct input_event *ev)
Packit Service b8eee4
{
Packit Service b8eee4
	if (ev->type == EV_SYN)
Packit Service b8eee4
		printf("Event: time %ld.%06ld, ++++++++++++++++++++ %s +++++++++++++++\n",
Packit Service b8eee4
				ev->input_event_sec,
Packit Service b8eee4
				ev->input_event_usec,
Packit Service b8eee4
				libevdev_event_type_get_name(ev->type));
Packit Service b8eee4
	else
Packit Service b8eee4
		printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %d\n",
Packit Service b8eee4
			ev->input_event_sec,
Packit Service b8eee4
			ev->input_event_usec,
Packit Service b8eee4
			ev->type,
Packit Service b8eee4
			libevdev_event_type_get_name(ev->type),
Packit Service b8eee4
			ev->code,
Packit Service b8eee4
			libevdev_event_code_get_name(ev->type, ev->code),
Packit Service b8eee4
			ev->value);
Packit Service b8eee4
	return 0;
Packit Service b8eee4
}
Packit Service b8eee4
Packit Service b8eee4
static int
Packit Service b8eee4
print_sync_event(struct input_event *ev)
Packit Service b8eee4
{
Packit Service b8eee4
	printf("SYNC: ");
Packit Service b8eee4
	print_event(ev);
Packit Service b8eee4
	return 0;
Packit Service b8eee4
}
Packit Service b8eee4
Packit Service b8eee4
int
Packit Service b8eee4
main(int argc, char **argv)
Packit Service b8eee4
{
Packit Service b8eee4
	struct libevdev *dev = NULL;
Packit Service b8eee4
	const char *file;
Packit Service b8eee4
	int fd;
Packit Service b8eee4
	int rc = 1;
Packit Service b8eee4
Packit Service b8eee4
	if (argc < 2)
Packit Service b8eee4
		goto out;
Packit Service b8eee4
Packit Service b8eee4
	file = argv[1];
Packit Service b8eee4
	fd = open(file, O_RDONLY);
Packit Service b8eee4
	if (fd < 0) {
Packit Service b8eee4
		perror("Failed to open device");
Packit Service b8eee4
		goto out;
Packit Service b8eee4
	}
Packit Service b8eee4
Packit Service b8eee4
	rc = libevdev_new_from_fd(fd, &dev;;
Packit Service b8eee4
	if (rc < 0) {
Packit Service b8eee4
		fprintf(stderr, "Failed to init libevdev (%s)\n", strerror(-rc));
Packit Service b8eee4
		goto out;
Packit Service b8eee4
	}
Packit Service b8eee4
Packit Service b8eee4
	printf("Input device ID: bus %#x vendor %#x product %#x\n",
Packit Service b8eee4
			libevdev_get_id_bustype(dev),
Packit Service b8eee4
			libevdev_get_id_vendor(dev),
Packit Service b8eee4
			libevdev_get_id_product(dev));
Packit Service b8eee4
	printf("Evdev version: %x\n", libevdev_get_driver_version(dev));
Packit Service b8eee4
	printf("Input device name: \"%s\"\n", libevdev_get_name(dev));
Packit Service b8eee4
	printf("Phys location: %s\n", libevdev_get_phys(dev));
Packit Service b8eee4
	printf("Uniq identifier: %s\n", libevdev_get_uniq(dev));
Packit Service b8eee4
	print_bits(dev);
Packit Service b8eee4
	print_props(dev);
Packit Service b8eee4
Packit Service b8eee4
	do {
Packit Service b8eee4
		struct input_event ev;
Packit Service b8eee4
		rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL|LIBEVDEV_READ_FLAG_BLOCKING, &ev;;
Packit Service b8eee4
		if (rc == LIBEVDEV_READ_STATUS_SYNC) {
Packit Service b8eee4
			printf("::::::::::::::::::::: dropped ::::::::::::::::::::::\n");
Packit Service b8eee4
			while (rc == LIBEVDEV_READ_STATUS_SYNC) {
Packit Service b8eee4
				print_sync_event(&ev;;
Packit Service b8eee4
				rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev;;
Packit Service b8eee4
			}
Packit Service b8eee4
			printf("::::::::::::::::::::: re-synced ::::::::::::::::::::::\n");
Packit Service b8eee4
		} else if (rc == LIBEVDEV_READ_STATUS_SUCCESS)
Packit Service b8eee4
			print_event(&ev;;
Packit Service b8eee4
	} while (rc == LIBEVDEV_READ_STATUS_SYNC || rc == LIBEVDEV_READ_STATUS_SUCCESS || rc == -EAGAIN);
Packit Service b8eee4
Packit Service b8eee4
	if (rc != LIBEVDEV_READ_STATUS_SUCCESS && rc != -EAGAIN)
Packit Service b8eee4
		fprintf(stderr, "Failed to handle events: %s\n", strerror(-rc));
Packit Service b8eee4
Packit Service b8eee4
	rc = 0;
Packit Service b8eee4
out:
Packit Service b8eee4
	libevdev_free(dev);
Packit Service b8eee4
Packit Service b8eee4
	return rc;
Packit Service b8eee4
}