How to read /dev/input/mice more accurately?

I'm writing a program to read /dev/input/mice to get relative x,y positions and get the absolute distance the cursor moves. If I move my mouse at a normal speed starting at the center of the screen, the result is pretty accurate(960). However, if I move my mouse really fast, the absolute distance is not accurate.

#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>

int main() {
    signed char x, y;
    signed char buf[6];
    int fd;
    fd_set readfds;
    int screen_x = 1920;
    int screen_y = 1080;
    int x_total = 0, y_total = 0;

    // Create the file descriptor
    fd = open("/dev/input/mice", O_RDONLY);
    if (fd == -1) {
        printf("Error Opening /dev/input/mice\n");
        return 1;
    }

    printf("sizeof(buf): %d\n", sizeof(buf));

    // Loop that reads relative position in /device/input/mice
    while(1) {
        // Set the file descriptor
        FD_ZERO(&readfds);
        FD_SET(fd,&readfds);
        select(fd+1, &readfds, NULL, NULL, NULL);

        // Check if the fd is set successfully
        if(FD_ISSET(fd,&readfds)) { 
            // Check if reading fails
            if(read(fd, buf, sizeof(buf)) <= 0) {  
                continue;  
            }

            // Relative positions
            x = buf[1];
            y = buf[2];
            printf("x=%d, y=%d\n", x, y);
            // Assume that mouse starts at the center
            x_total += x;
            y_total += y;
            printf("x_total: %d; y_total: %d\n", x_total, y_total);
        }  
    }
    close(fd);
    return 0;
}

I use xdotool mousemove 960 540 to get the cursor at the center and then run the program. Output is something like:

x_total: 309; y_total:0
x= 3, y=2
x_total:312; y_total:2

So if I move the cursor from the center towards the right edge really fast, at the time the cursor reaches the right edge, x_total is going to be somewhere around 500 which should've been 960.



Comments

Popular posts from this blog

Spring Elasticsearch Operations

Object oriented programming concepts (OOPs)

Network Error and Timeout on Authorize.net JS