Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах

Как принимать события одновременно от несколько устройств?

Добрый день!

Преамбула: купил трекбол, на котором нет колёсика скроллинга, но это, пожалуй, единственный его недостаток. Через xorg.conf можно настроить так, чтобы, удерживая одну из кнопок, скроллить шариком. Но, как назло, нужная мне (самая удобная) кнопка для этого не подошла.
Пишу небольшой скрипт на Питоне (под убунту), который, анализируя поток событий от устройств ввода, сам при наступлении определённых условий посылает в систему сообщения, будто я скроллю.
Ну например "если 0.5 секунды я водил очень медленно (delta_x и delta_y не более 1-2), то далее скроллить, пока сильно не поведу шариком", или "если левая кнопка мыши была нажата не менее 0.5 секунды, и шарик при этом не двигался, то скроллить, пока не дёрну шариком"
Кое-какие годные результаты есть, но всё равно что-то не то.
Хочу поэкспериментировать совместно с клавиатурой. Подозреваю, что будет гораздо удобнее, если удерживать какую-нибудь, не особо нужную в линуксе клавишу (например win), и при этом эмулировать скроллинг через движения шарика.
Вот как я слушаю устройство:
from evdev.device import InputDevice
input_device = InputDevice('/dev/input/event12')
for event in input_device.read_loop():
  # обрабатываем поступающие события
  pass

Я так понимаю, read_loop() - генератор, в бесконечном цикле возвращающий (или не возвращающий события от устройства ввода). Если я пытаюсь подключиться ещё к одному устройству (к клавиатуре), то мне надо в том же цикле принимать события еще и от него. Таким образом, имею уже 2 бесконечных генератора, которые я пока безуспешно пытаюсь объединить, примерно так:
input_device = InputDevice('/dev/input/event12')
input_device2 = InputDevice('/dev/input/event3')
for event in itertools.chain(input_device.read_loop(), input_device2.read_loop()):
  # сюда попадают события только от того генератора, что указан первым
  pass


Есть ли какой-нибудь способ объединить эти 2 генератора? Или, есть ли более кошерный способ слушать (и принимать) события сразу от нескольких устройств ввода в linux?
  • Вопрос задан
  • 2707 просмотров
Решения вопроса 1
itertools.izip объединяет два итератора так как вы хотите, но вероятно вам нужно не это, ведь события из разных файлов устройств могут идти с разной частотой. Лучше посмотрите в сторону select.

UPDATE: даже пример имеется python-evdev.readthedocs.org/en/latest/tutorial.ht...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
qmax
@qmax
программер
itertools.zip ?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы