xpra icon
Bug tracker and wiki

This bug tracker and wiki are being discontinued
please use https://github.com/Xpra-org/xpra instead.


Ticket #173: main_v2.c

File main_v2.c, 4.7 KB (added by Antoine Martin, 4 years ago)

uinput example

Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <unistd.h>
5#include <fcntl.h>
6#include <errno.h>
7#include <linux/input.h>
8#include <linux/uinput.h>
9#include <sys/time.h>
10#include <sys/ioctl.h>
11#include <sys/types.h>
12#include <linux/types.h>
13
14#define die(str, args...) do { \
15        perror(str); \
16        exit(EXIT_FAILURE); \
17    } while(0)
18
19typedef struct
20{
21    __u16 type;
22    __u16 code;
23        __s32 value;
24    char* description;
25}TEventData;
26
27int main(int argc, char* argv[])
28{
29    if( argc < 2 ) {
30        printf("Requires one parameter..");
31
32        return 0;
33    }
34
35    int productId = atoi(argv[1]);
36
37
38    int                    fd;
39    struct uinput_user_dev virtual_touch_device;
40    struct input_event     ev;
41    int                    i;
42
43
44    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
45    if(fd < 0)
46        die("error: open");
47
48    if(ioctl(fd, UI_SET_EVBIT, EV_SYN) < 0)
49        die("error: ioctl");
50
51    if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)
52        die("error: ioctl");
53    if(ioctl(fd, UI_SET_KEYBIT, BTN_TOUCH) < 0)
54        die("error: ioctl");
55
56    if(ioctl(fd, UI_SET_EVBIT, EV_ABS) < 0)
57        die("error: ioctl");
58
59    if(ioctl(fd, UI_SET_ABSBIT, ABS_X) < 0)
60        die("error: ioctl");
61    if(ioctl(fd, UI_SET_ABSBIT, ABS_Y) < 0)
62        die("error: ioctl");
63    if(ioctl(fd, UI_SET_ABSBIT, ABS_MT_SLOT) < 0)
64        die("error: ioctl");
65    if(ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_X) < 0)
66        die("error: ioctl");
67    if(ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y) < 0)
68        die("error: ioctl");
69    if(ioctl(fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID) < 0)
70        die("error: ioctl");
71    if(ioctl(fd, UI_SET_PROPBIT, INPUT_PROP_DIRECT) < 0)
72        die("error: ioctl");
73
74    memset(&virtual_touch_device, 0, sizeof(virtual_touch_device));
75    snprintf(virtual_touch_device.name, UINPUT_MAX_NAME_SIZE, "Virtual Touch Device - %#x", productId);
76    virtual_touch_device.id.bustype = BUS_VIRTUAL;
77    virtual_touch_device.id.vendor  = 0x453;
78    virtual_touch_device.id.product = productId;
79    virtual_touch_device.id.version = 1;
80
81    virtual_touch_device.absmin[ABS_X] = 0;
82    virtual_touch_device.absmax[ABS_X] = 32767;
83    virtual_touch_device.absmin[ABS_Y] = 0;
84    virtual_touch_device.absmax[ABS_Y] = 32767;
85    virtual_touch_device.absmin[ABS_MT_SLOT] = 0;
86    virtual_touch_device.absmax[ABS_MT_SLOT] = 9;
87    virtual_touch_device.absmin[ABS_MT_POSITION_X] = 0;
88    virtual_touch_device.absmax[ABS_MT_POSITION_X] = 32767;
89    virtual_touch_device.absmin[ABS_MT_POSITION_Y] = 0;
90    virtual_touch_device.absmax[ABS_MT_POSITION_Y] = 32767;
91    virtual_touch_device.absmin[ABS_MT_TRACKING_ID] = 0;
92    virtual_touch_device.absmax[ABS_MT_TRACKING_ID] = 65535;
93
94
95    if(write(fd, &virtual_touch_device, sizeof(virtual_touch_device)) < 0)
96        die("error: write");
97
98    if(ioctl(fd, UI_DEV_CREATE) < 0)
99        die("error: ioctl");
100
101    printf("virtual touch device created [%s]...\r\n", virtual_touch_device.name);
102
103    scanf("%d", &i);
104
105    TEventData eventData[10] = { { EV_ABS,  ABS_MT_TRACKING_ID    ,160 , "EV_ABS-ABS_MT_TRACKING_ID"} ,
106                                 { EV_ABS,  ABS_MT_POSITION_X     ,1721, "EV_ABS-ABS_MT_POSITION_X"} ,
107                                 { EV_ABS,  ABS_MT_POSITION_Y     ,5035, "EV_ABS-ABS_MT_POSITION_Y" } ,
108                                 { EV_KEY,  BTN_TOUCH             ,1, "EV_KEY-BTN_TOUCH" } ,
109                                 { EV_ABS,  ABS_X                 ,1721, "EV_ABS-ABS_X" } ,
110                                 { EV_ABS,  ABS_Y                 ,5035, "EV_ABS-ABS_Y" } ,
111                                 { EV_SYN,  0                 ,0, "EV_SYN" } ,
112                                 { EV_ABS,  ABS_MT_TRACKING_ID    ,-1, "EV_ABS-ABS_MT_TRACKING_ID"  } ,
113                                 { EV_KEY,  BTN_TOUCH             ,0, "EV_KEY-BTN_TOUCH" },
114                                 { EV_SYN,  0                 ,0, "EV_SYN" }
115                              };
116
117
118
119    char j;
120    printf("press any key to start sending events....");
121    scanf("%c", &j);
122
123    for(i = 0; i < 10; i++) {
124
125         memset(&ev, 0, sizeof(struct input_event));
126            ev.type = eventData[i].type;
127            ev.code = eventData[i].code;
128            ev.value = eventData[i].value;
129
130            if(write(fd, &ev, sizeof(struct input_event)) < 0)
131            {
132                printf("failed %s =>" , eventData[i].description);
133                die( "error: write ");
134                printf("\r\n");
135            }else{
136                printf("success %s \r\n" , eventData[i].description);
137            }
138    }
139
140    printf("simulation complete...Press any key to destory..\r\n");
141
142    scanf("%c", &j);
143
144    if(ioctl(fd, UI_DEV_DESTROY) < 0)
145        die("error: ioctl");
146
147    close(fd);
148
149    printf("destroyed...\r\n");
150
151    return 0;
152}