summaryrefslogtreecommitdiff
path: root/evdev.c
blob: c92bc5ae665ad53492ecd297c23c8ce344bce51f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

/*
 * secde -- experimental lightweight Wayland/X11 server
 * Copyright (C) 2019  Samuel Lidén Borell
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#include <sys/ioctl.h>
#include <linux/input.h>
#include <linux/types.h>

#include <stdio.h>

#include "evdev.h"


int input_evdev_init(struct FdInfo *info)
{
	char name[128+1];
	unsigned char props;
	unsigned char relbits;
	int fd = protohnd_getfd(info);
	/* ioctl = 0x80804506 */
	if (ioctl(fd, EVIOCGNAME(128), name) != -1) {
		printf("input device (fd %d) name       : %s\n", fd, name);
	}
	if (ioctl(fd, EVIOCGPROP(sizeof(props)), &props) != -1) {
		printf("input device (fd %d) properties : %x\n", fd, props);
	}
	if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(props)), &relbits) != -1) {
		printf("input device(fd %d) bits(EV_REL): %x\n", fd, relbits);
	}
	if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(props)), &relbits) != -1) {
		printf("input device(fd %d) bits(EV_ABS): %x\n", fd, relbits);
	}
	if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(props)), &relbits) != -1) {
		printf("input device(fd %d) bits(EV_KEY): %x\n", fd, relbits);
	}
	return 1;
}


int input_evdev_handler(struct FdInfo *info, const unsigned char *buff,
                        int len)
{
	int origlen = len;
	const struct input_event *ev = (struct input_event *)buff;

    (void) info;

    while (len >= (int)sizeof(struct input_event)) {
		printf("evdev event. time=%lx, type=%d, code=%d, value=%d\n",
			   ev->time.tv_sec, ev->type, ev->code,
			   ev->value);
		ev++;
		len -= sizeof(*ev);
	}
	return origlen - len;
}