LINUX.ORG.RU

xmodmap и xinput не блокируют прокрутку колёсиком мыши

 ,


0

3

Нужно отключить прокрутку колёсиком мыши. Делал и

xmodmap "pointer = 1 2 3 0 0"
и
xinput set-button-map 12 1 2 3 0 0
Прокрутка как работала так и работает.

Кнопки 1 2 3 отключаются как надо.

Gentoo, ядро 5.14.

★★★★★

У меня была такая же проблема на FreeBSD с другими кнопками, победить не смог.
Подпишусь.

mord0d ★★★★★ ()

Не уверен, но, вроде как прокрутка передавалась как нажатие кнопок в протколе xinput версии 1. В xinput версии 2 событие прокрутки передаётся через Valuator, и там в одном событии передаются и координаты мыши и скрол колёс.

Так что в сторону переназначения кнопок копать смысла нет, раньше работало и до сих пор работает в xterm и прочем «старом» софте. Может кто раскажет подробнее...

mky ★★★★★ ()
Ответ на: комментарий от burato

Подписался.

ИМХО, на скролл должна влиять prop ″libinput Scrolling Pixel Distance (304)″, но у меня как-то не работает, плюс её нельзя установить меньше 10 или больше 50.

mky ★★★★★ ()
Ответ на: комментарий от mky

Немного погуглил, но ещё не проверял. Получается, что от ядра (из файла /dev/input/eventX) прокрутка идёт отдельным событием EV_REL, REL_WHEEL.

Если включить в ядре uinput, то можно из user-space программы создать псевдо-устройство ввода и генерить события. Читать события из нужного устройства, захватив его ioctl(fd, EVIOCGRAB, GRAB) или отключив в X-ах через ″xinput disable″. И все события, кроме REL_WHEEL, выводить в псевдо-устройство.

Есть готовая программа (на rust) https://github.com/KarsMulder/evsieve, можно писать свою https://stackoverflow.com/questions/66073488/how-to-capture-and-modify-mouse-... на питоне используя python-evdev. Можно писать на Cи как-то так https://gist.github.com/CyberShadow/ae30a8d9f86c170c2451c3dd7edb649c .

И это, получается, единственный способ заблокировать колесо мыши, не считая редактирования кода драйвера в ядре или libinput...

mky ★★★★★ ()
Ответ на: комментарий от mky

Поковырял. Действительно, если читать /dev/input/eventX, соотв. мыши, то на прокрутку колеса приходят события (EV_REL, REL_WHEEL).

Включил в ядре CONFIG_INPUT_UINPUT, написал код на Си (125 строк), который захватывает заданное устройство (через EVIOCGRAB) и транслирует дальше (через /dev/uinput) всё, кроме (EV_REL, REL_WHEEL). Проверил, прокрутки нет.

Если кому надо, могу сюда запостить. Полуфабрикат, по хорошему, нужно добавить циклический поиск нужного файла устройства по модели/идентификатору мыши, чтобы переподключение мыши не требовало презапуска.

Обнаружил, что есть такой ioctl EVIOCSMASK, который позволяет задать маску для событий из /dev/input/eventX. Сначала подумал, что он глобальный, но оказалось, что маска только для того процесса, который этот ioctl вызывал. Если будет время, посмотрю, можно ли через трассировку вызвать этот ioctl из процесса X-сервер...

Но мне EVIOCSMASK не особо нужно, я смотрел uinput чтобы сделать себе эмуляцию средней кнопки мыши по клавише клавиатуры. Купил себе радио клаву/тачпад mini i8, а там нет клавиши Insert и две кнопки мыши, зато ненужных клавиш типа «почта», «браузер» полно.

mky ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей