Я работаю с USB-драйвером мыши и не знаю, как различать и использовать информацию, отправленную /dev/input/mouse0
и/dev/input/mice
После нескольких поисков в Google я нашел этот код об использовании/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;
Эта программа работает, но не получила никакой информации о колесе прокрутки.
Мне удалось найти программу, которая использует/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;
Но есть проблема с диагональным перемещением, поскольку этот файл сохраняет только одну координату одновременно, а координата X имеет приоритет над Y, поэтому это довольно раздражает, когда вы хотите переместить мышь по оси Y.
Я не нашел никакого кода для использования /dev/input/mouse0
. Какая информация сохраняется в этом файле?
У меня есть вопросы:
- Какая информация сохраняется в
/dev/input/mouse0
? - Как можно прочитать всю информацию о мыши, не открывая 2 файла и не решая проблему приоритета (прокрутка колеса + движение по осям X/Y)?
решение1
TheДокументация API пользовательского пространства Linux Input Subsystemотвечает на ваши вопросы. В общем, все файлы в /dev/input/
предоставленыобработчики событийкоторые распространяют события устройства в пользовательском пространстве.
Что такое /dev/input/mouse0 и /dev/input/mice?
Извведение(важные части выделены мной)
1.3.1.3.мышидев
mousedev — это хак, позволяющий заставить работать устаревшие программы, использующие ввод с помощью мыши. Он принимает события от мышей или дигитайзеров/планшетов и делает мышь в стиле PS/2 (a la /dev/psaux) доступной для пользователя.
Устройства Mousedev в /dev/input (как показано выше):
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
Каждое устройство мыши назначается одной мыши или дигитайзеру, за исключением последнего - мыши. Это односимвольное устройство является общим для всех мышей и дигитайзеров, и даже если ни одно не подключено, устройство присутствует. Это полезно для горячего подключения USB-мышей, так что старые программы, которые не поддерживают горячее подключение, могут открыть устройство, даже если нет мышей. [...]
Mousedev сгенерирует протоколы PS/2, ImPS/2 (Microsoft IntelliMouse) или ExplorerPS/2 (IntelliMouse Explorer), в зависимости от того, что хочет программа, считывающая данные. Вы можете установить GPM и X на любой из них.Вам понадобится ImPS/2, если вы хотите использовать колесико на USB-мыши.и ExplorerPS/2, если вы хотите использовать дополнительные (до 5) кнопок.
...это также может быть причиной того, что вы не видите событий колесика мыши. Поскольку это "хак" для устаревших программ, вам не следует его использовать, если в этом нет необходимости.
Как прочитать всю информацию о мыши [...]?
Используйте соответствующий /dev/input/eventX
файл, предоставленныйевдев(обработчик событий, не путать с xorg-driver evdev). Это то, что, очевидно, делает ваш второй фрагмент кода.
...а как насчет приоритетной проблемы?
Нет проблемы приоритета. Согласно2.2 Коды событий:
SYN_REPORT:
Используется для синхронизации и разделения событий на пакеты изменений входных данных.происходящие в один и тот же момент времени. Например, движение мыши может установить значения REL_X и REL_Y для одного движения, а затем выдать SYN_REPORT. Следующее движение выдаст больше значений REL_X и REL_Y и отправит еще один SYN_REPORT.
Поскольку все последовательные события до определенного SYN_REPORT
события можно считать произошедшими в одно и то же время, порядок, в котором они сообщаются, не имеет значения.
Например (используяэта программаЯ нашел на 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
Как видите, одновременные события не только разделены SYN_REPORT
событиями, но и имеют одинаковую временную метку.
Кстати, вы также можете использовать evtest
для просмотра событий, генерируемых устройством. Вы можете найти его исходный кодздесьесли вам интересно, как это работает.
решение2
В моем случае я попытался выполнить событие мыши ОС. Мой код app.js
был таким:
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);
});
я бегалnode app.js
поэтому он выдает мне следующую ошибку
Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:
так что просто беги с sudo
таким
node app.js
не выдает следующую ошибку
{
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'
}