Как заставить ioctl в c управлять только 2 из 4 кнопок, которые есть у моей мыши?

#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