Я работаю с мышью драйвер 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);
return -1;
}
read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << " code : " << ev.code << " value : " << ev.value << std::endl;
close(fd);
return 0;
Но существует проблема для диагонального перемещения, потому что этот файл сохранил только 1 координату в то же время, и X координат имеют приоритет на Y; таким образом, это является довольно раздражающим, когда Вы хотите переместить свою мышь в ось Y
Однако я не нахожу, что любой код использует /dev/input/mouse0
, таким образом, какая информация сохранена в этом файле?
Таким образом, мои вопросы: 1. В какой информации сохраняются /dev/input/mouse0
? 2. Как я могу считать всю информацию о мыши, не открывая 2 файла, и без приоритетной проблемы (колесо, прокручивающее + перемещение оси X/Y)?
Документация API пользовательского пространства Linux Input Subsystem отвечает на ваши вопросы. В общем, все файлы в /dev/input/
предоставляются обработчиками событий , которые распределяют события устройства в пространстве пользователя.
Из введения (важные части выделены мной)
[тысяча сто тридцать два] 1.3.1.3. mousedev
mousedev - это хак, чтобы заставить старые программы, использующие ввод мыши, работать. Он принимает события от мышей или дигитайзеров / планшетов и делает доступным для пользователя пользовательское устройство в стиле PS / 2 (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) кнопки.
blockquote>... это также может быть причиной того, что вы не видите события колесика мыши. Так как это «взлом» для устаревших программ, вы не должны использовать его, если вам не нужно.
Как я могу прочитать всю информацию мыши [...]?
Использовать соответствующий файл
/dev/input/eventX
, предоставленный evdev (обработчик событий, не путать с xorg-драйвер evdev). Именно это и делает ваш второй фрагмент кода.... но как насчет проблемы приоритета?
Нет проблемы приоритета. Согласно 2.2. Коды событий :
SYN_REPORT:
Используется для синхронизации и разделения событий в пакеты изменений входных данных , происходящих в один и тот же момент времени . Например, движение мыши может установить значения REL_X и REL_Y для одного движения, а затем выдать SYN_REPORT. Следующее движение выдаст больше значений REL_X и REL_Y и отправит еще один SYN_REPORT.
blockquote>Поскольку можно считать, что все последовательные события до события
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
для просмотра событий, генерируемых устройством. Вы можете найти его исходный код здесь , если вам интересно, как он работает.