Добрый день!
Преамбула: купил трекбол, на котором нет колёсика скроллинга, но это, пожалуй, единственный его недостаток. Через 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?