3

I'm working with a mouse USB driver and I really don't know how to differenciate and use information send by /dev/input/mouse0 and /dev/input/mice

After few searches on Google, I found this code about using /dev/input/mice

int fd, bytes;
unsigned char data[4];

const char *pDevice = "/dev/input/mice";

// Open Mouse
fd = open(pDevice, O_RDWR);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pDevice);
    return -1;
}

int left, middle, right;
signed char x, y;

// Read Mouse
bytes = read(fd, data, sizeof(data));

if(bytes > 0)
{
    left = data[0] & 0x1;
    right = data[0] & 0x2;
    middle = data[0] & 0x4;

    x = data[1];
    y = data[2];
    printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);

    if(left)
        return left;
    if(right)
        return right;
    if(middle)
        return middle;
}

return 0;

This program works but didn't get any information about the wheel scroll.

I was able to find a program which uses /dev/input/event0

int fd;
struct input_event ev
const char* pFile = "/dev/input/event0";

fd = open(pFile, O_RDONLY);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pFile);are
    return -1;
}

read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << "  code : " << ev.code << "  value : " << ev.value << std::endl;

close(fd);

return 0;

But there is a problem for diagonal movement because this file saved only 1 coordinate at the same time, and the X coordinate has priority over the Y, so it's pretty annoying when you want to move your mouse on Y axis.

I didn't find any code to use /dev/input/mouse0, so what information is saved in this file?

My questions are:

  1. What information is saved in /dev/input/mouse0?
  2. How can I read all mouse information without opening 2 files and without a priority problem (wheel scrolling + X/Y axis movement)?
5
  • Regarding your first snippet: the scroll wheel usually acts like buttons, one for each direction. If the first byte contains button states, you could check the remaining 5 bits. I bet two of them represent the scroll wheel.
    – danzel
    Commented Jun 5, 2018 at 15:04
  • just by using cat /dev/input/mice, there is nothing printed in the terminal when I use the scroll wheel
    – damadam
    Commented Jun 6, 2018 at 6:34
  • i've got nothing with /dev/input/mouse0 too, probably I must use /dev/input/event0 and try to fix my code about the priority of X axis than Y axis
    – damadam
    Commented Jun 6, 2018 at 6:36
  • please consider accepting my answer if it helped you, or tell me why it didn't so I can improve it.
    – danzel
    Commented Jun 8, 2018 at 11:22
  • @danzel I didn't see the notification yesterday, your explaination is really good and do more than answer at my question, thanks
    – damadam
    Commented Jun 8, 2018 at 13:17

2 Answers 2

9

The Linux Input Subsystem userspace API documentation answers your questions. In general, all files in /dev/input/ are provided by event handlers that distribute device events to userspace.

What are /dev/input/mouse0 and /dev/input/mice?

From the introduction (important parts highlighted by me)

1.3.1.3. mousedev

mousedev is a hack to make legacy programs that use mouse input work. It takes events from either mice or digitizers/tablets and makes a PS/2-style (a la /dev/psaux) mouse device available to the userland.

Mousedev devices in /dev/input (as shown above) are:

crw-r--r--   1 root     root      13,  32 Mar 28 22:45 mouse0
crw-r--r--   1 root     root      13,  33 Mar 29 00:41 mouse1
crw-r--r--   1 root     root      13,  34 Mar 29 00:41 mouse2
crw-r--r--   1 root     root      13,  35 Apr  1 10:50 mouse3 ... 
...
crw-r--r--   1 root     root      13,  62 Apr  1 10:50 mouse30
crw-r--r--   1 root     root      13,  63 Apr  1 10:50 mice

Each mouse device is assigned to a single mouse or digitizer, except the last one - mice. This single character device is shared by all mice and digitizers, and even if none are connected, the device is present. This is useful for hotplugging USB mice, so that older programs that do not handle hotplug can open the device even when no mice are present. [...]

Mousedev will generate either PS/2, ImPS/2 (Microsoft IntelliMouse) or ExplorerPS/2 (IntelliMouse Explorer) protocols, depending on what the program reading the data wishes. You can set GPM and X to any of these. You’ll need ImPS/2 if you want to make use of a wheel on a USB mouse and ExplorerPS/2 if you want to use extra (up to 5) buttons.

...this could also be reason why you don't see mouse wheel events. Since it is "a hack" for legacy programs, you shouldn't use it if you don't have to.

How can I read all mouse information [...]?

Use the corresponding /dev/input/eventX file which is provided by evdev (the event handler, not to be confused with the xorg-driver evdev). That's what your second code snippet obviously does.

...but what about the priority problem?

There is no priority problem. According to 2.2. Event codes:

SYN_REPORT:

Used to synchronize and separate events into packets of input data changes occurring at the same moment in time. For example, motion of a mouse may set the REL_X and REL_Y values for one motion, then emit a SYN_REPORT. The next motion will emit more REL_X and REL_Y values and send another SYN_REPORT.

Because all consecutive events until a SYN_REPORT event can be considered to have happened at the same time, the order in which they are reported doesn't matter.

For example (using this program I found on github):

time:1528290186.256449  type:EV_REL     code:REL_X      value:-1
time:1528290186.256449  type:EV_REL     code:REL_Y      value:1
time:1528290186.256449  type:EV_SYN     code:SYN_REPORT value:0
time:1528290186.264460  type:EV_REL     code:REL_Y      value:1
time:1528290186.264460  type:EV_REL     code:REL_WHEEL  value:-1
time:1528290186.264460  type:EV_SYN     code:SYN_REPORT value:0

As you can see, not only are concurrent events separated by SYN_REPORT events, they also have the same time stamp.

By the way, you can also use evtest to see the events generated by a device. You can find its source code here if you are interested in how it works.

0

In my case have try to execute mouse event of OS. my code in app.js was :

var Mouse = require("./node_modules/node-mouse/mouse");
 
var m = new Mouse();
 
m.on("mousedown",function(event) {
    console.log(event);
});
 
m.on("mouseup",function(event) {
    console.log(event);
});
 
// same as mouseup, but fired after
m.on("click",function(event) {
    console.log(event);
});
 
 
m.on("mousemove", function(event) {
    console.log(event);
});

i was running node app.js

so its giving me following error

Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:

so simply run with sudo like that

node app.js

not its giving following error

{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 1,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .