Есть ли в библиотеке Python evdev привязка к конкретному событию или сквозная передача?

#python #linux #ubuntu #kde #evdev

#python #linux #ubuntu #kde-plasma #evdev

Вопрос:

Устройство python evdev имеет функцию .grab(), которая не позволяет другим процессам получать входные события на устройстве. Есть ли какой-либо способ ограничить это конкретными событиями с устройства?

Для моего примера, если I .grab() устройство ввода с помощью пера, которое имеет чувствительность к нажатию и наклон, и 2 кнопки нажатия сбоку, как бы я «захватил» ТОЛЬКО 2 кнопки нажатия, но позволил остальной части ввода (подсказка, чувствительность к нажатию и наклон) перехватываться остальнымисистемы в обычном режиме?

Одна из моих кнопок пера обычно является событием щелчка правой кнопкой мыши. Я хочу заставить его делать что-то еще, но он по-прежнему появляется в меню правой кнопки мыши, поэтому я пытаюсь выяснить, как это остановить.

Я попытался выполнить захват и отключение при возникновении события. Например, событие> захватить> сделать мои вещи> отменить захват. Но это, очевидно, слишком поздно, и ОС все еще выводит меню.

Я попытался выполнить полный захват, затем в цикле событий, если это нажатие кнопки, выполняйте мои действия, в противном случае создайте внедрение события UInput, просто передав событие обратно в систему. Это был немного запутанный беспорядок. Требуются разрешения. Когда я, наконец, прошел мимо этого, движение было смещено, а давление / наклон не работали… Я думаю, что это как-то связано с драйвером DigiMend, который фактически заставляет этот материал работать, и / или настройками xinput, которые я должен передать для калибровки планшета. Но я не заинтересован в написании всех функций давления / наклона с нуля или чего-то подобного, поэтому мне нужно, чтобы материал DigiMend работал как обычно. Поэтому я пока отказался от этой идеи.

Единственная другая мысль, которая у меня была, это выяснить, почему ОС по умолчанию использует поведение, которое она выполняет, и посмотреть, могу ли я просто вручную отключить действия (т. Е. Почему он думает, что кнопка — это щелчок правой кнопкой мыши, и заставить его думать, что кнопка — это ничто.)

Так что, я думаю, это вопрос 3 уровня.

  1. Могу ли я реализовать функцию захвата для выбранных событий, а не для устройства в целом?
  2. Если идея сквозной передачи была лучше, есть ли способ добиться этого без необходимости вносить какие-либо изменения в разрешения и иметь возможность передавать точное событие (т. Е. Без смещения и такого, что я испытал?)
  3. Если evdev не имеет такой возможности или это было бы проще сделать другим способом, например, каким-то образом отключить настройки по умолчанию для пера в ОС, я открыт для предложений. Я использую Kubuntu 20.04, если это поможет.

Любая помощь будет оценена, дайте мне знать, если потребуется дополнительная информация, заранее спасибо!

Ответ №1:

В итоге я выбрал # 3 и использовал xinput. Решил, что я пока оставлю этот ответ на случай, если другие столкнутся с этим и захотят сделать что-то подобное.

Обходной путь был на самом деле довольно простым. Я просто использую xinput для переназначения 2 кнопок. Таким образом, evdev вообще не нужно захватывать. Просто отключите эти кнопки, и все пойдет нормально, кроме тех, которые я прослушиваю с помощью evdev.

xinput set-button-map {} 1 0 0 4 5 6 7

На моем устройстве 7 кнопок, и они обычно отображаются 1-7. Какие все мыши являются эквивалентами щелчка левой кнопкой мыши, среднего щелчка, щелчка правой кнопкой мыши и т. Д…

Используя эту строку и передавая идентификатор устройства для {} Сначала я просто запускаю это с помощью подпроцесса. И вуаля, больше нет меню правой кнопки мыши. И я могу использовать evdev для сопоставления событий с тем, что я хочу.