89 lines
1.8 KiB
C
89 lines
1.8 KiB
C
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <X11/Xlib.h>
|
|
|
|
#include "event.h"
|
|
#include "read_events.h"
|
|
|
|
void write_event(event *new_event, FILE *file)
|
|
{
|
|
fwrite(new_event, sizeof(event), 1, file);
|
|
fflush(file);
|
|
}
|
|
|
|
int listen(FILE *file)
|
|
{
|
|
event *user_event = new_event();
|
|
|
|
Display *display = XOpenDisplay(0);
|
|
Window root_window = DefaultRootWindow(display);
|
|
|
|
XEvent event;
|
|
|
|
int bytes;
|
|
unsigned char data[3];
|
|
const char *pDevice = "/dev/input/mice";
|
|
|
|
int fd = open(pDevice, O_RDWR);
|
|
if (fd == -1)
|
|
{
|
|
printf("ERROR Opening %s\n", pDevice);
|
|
return -1;
|
|
}
|
|
|
|
int left = 0;
|
|
int right = 0;
|
|
int middle = 0;
|
|
signed char x, y;
|
|
|
|
while (!(left && right))
|
|
{
|
|
// Read Mouse
|
|
bytes = read(fd, data, sizeof(data));
|
|
|
|
if (bytes > 0)
|
|
{
|
|
left = data[0] & 0x1;
|
|
right = data[0] & 0x2;
|
|
middle = data[0] & 0x4;
|
|
|
|
XQueryPointer(
|
|
display,
|
|
root_window,
|
|
&event.xbutton.root,
|
|
&event.xbutton.subwindow,
|
|
&event.xbutton.x_root,
|
|
&event.xbutton.y_root,
|
|
&event.xbutton.x,
|
|
&event.xbutton.y,
|
|
&event.xbutton.state
|
|
);
|
|
|
|
//printf("%d - %d\n", event.xmotion.x, event.xmotion.y);
|
|
|
|
if ((left || right) && !(left && right)) {
|
|
mouse_button type_button;
|
|
if (left) type_button = LEFT;
|
|
if (right) type_button = RIGHT;
|
|
if (middle) type_button = MIDDLE;
|
|
|
|
mouse_event_coord(user_event, type_button, event.xmotion.x, event.xmotion.y);
|
|
write_event(user_event, file);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* flush the middle button */
|
|
bytes = read(fd, data, sizeof(data));
|
|
bytes = read(fd, data, sizeof(data));
|
|
|
|
free(user_event);
|
|
close(fd);
|
|
XCloseDisplay(display);
|
|
return 0;
|
|
// TODO on ecoute la souris
|
|
// TODO on repete ce qu'on a entre
|
|
}
|