#c #linux #ioctl
#c #linux #ioctl
Вопрос:
Вот часть кода:
extra_btn_fd = open("/dev/input/by-id/usb-Razer_Razer_Naga_2014-event-mouse", O_RDONLY);
ioctl(extra_btn_fd, EVIOCGRAB, 1);
Проблема в том, что он получает контроль не только над 2 дополнительными кнопками (вперед и назад), но и над кнопками щелчка (и прокрутки, я думаю).
Я пытаюсь получить исключительно контроль над 2 кнопками «Вперед» и «назад», а не над щелчками.
Комментарии:
1. Похоже, что это сделка «все или ничего».
2. Ну, если это так, я хотел бы знать способ перемещать мышь непосредственно из c , не используя больше процессора, чем необходимо.
Ответ №1:
Вы должны фильтровать события в своем коде. Например, как показано ниже
while(1) {
struct input_event event;
read(extra_btn_fd, amp;event, sizeof(event));
if (event.type == EV_KEY amp;amp; (event.code == BTN_FORWARD || event.code == BTN_BACK) {
printf("%d %dn", event.type, event.code);
}
}
Комментарии:
1. Спасибо, у меня уже есть нечто подобное, но проблема в том, что это либо позволяет кнопкам вперед и назад выполнять свои действия во время выполнения моего кода, либо выполнять только мой код, но я не могу щелкнуть правой кнопкой мыши / переместить мышь. Чтобы увидеть полный код, я предлагаю вам перейти по ссылке: github.com/lostallmymoney/Razer_Key_Mapper_Linux/blob/master / … и посмотрите на комментарий «stackoverflow». Я хочу остановить прямые и обратные действия, но не другие (при обнаружении обратного хода все еще).
2. Если невозможно напрямую использовать ioctl только для части входных данных, я бы хотел найти способ выполнить все клавиши, которые я не отфильтровываю, как это обычно делает Linux (например, перемещение мыши и т.д.)
Ответ №2:
Решается с помощью xinput путем включения 2 кнопок в карту кнопок следующим образом :
xinput set-button-map $NAGAID2 1 2 3 4 5 6 7 11 10 8 9 13 14 15 275 276