|
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 |
}
|