LINUX.ORG.RU

Эмуляция скролла клавишами на клавиатуре

 , , ,


0

1

Можно как-то такое запилить?

Есть клава Microsoft NEK 4000 с прикольной качелькой посередине, которая по дефолтну работает как PgUp/PgDn, но очень хотелось бы на нее замапить скролл - есть какие-то готовые решения? Все что получается нагуглить относится к проблемам работы готовых колесиков скролла в клавиатурах, но не к эмуляции клавишами.

xev их видит как-то так:

KeyPress event, serial 37, synthetic NO, window 0x4e00001,
    root 0x2b0, subw 0x0, time 19325118, (566,373), root:(2551,425),
    state 0x10, keycode 111 (keysym 0xff52, Up), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x4e00001,
    root 0x2b0, subw 0x0, time 19325223, (566,373), root:(2551,425),
    state 0x10, keycode 111 (keysym 0xff52, Up), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 38, synthetic NO, window 0x4e00001,
    root 0x2b0, subw 0x0, time 19326463, (566,373), root:(2551,425),
    state 0x10, keycode 116 (keysym 0xff54, Down), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x4e00001,
    root 0x2b0, subw 0x0, time 19326567, (566,373), root:(2551,425),
    state 0x10, keycode 116 (keysym 0xff54, Down), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

UPD: Оказывается есть вот такая инструкция - https://lorwiki.org.ru/wiki/Клавиатура_Microsoft_NEK_4000 но она нифига не срабатывает. Да и вообще она для ситуации когда качелька вообще не работает. А в новой Ubuntu она работает как стрелки ввехр/вниз. Какого черта?

★★★★★

Последнее исправление: Suntechnic (всего исправлений: 1)

Можно забиндить команды с помощью xbindkeys

xte 'mouseclick 4' - scroll up xte 'mouseclick 5' - scroll down

reencrypt
()

Странно - сейчас эта качелька работает как стрелки вверхи/вниз - оказывается 111 и 116 - это они. И соотвественно я ломаю стрелки если что-то маплю на эти клавиши. Раньше такого не было :(

Suntechnic ★★★★★
() автор топика

Оказывается есть вот такая инструкция - https://lorwiki.org.ru/wiki/Клавиатура_Microsoft_NEK_4000 но она нифига не срабатывает. Да и вообще она для ситуации когда качелька вообще не работает. А в новой Ubuntu она работает как стрелки ввехр/вниз. Какого черта?

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

Качелька зума генерирует собственные коды, видимо она у тебя просто замаплена на up/down.

Смотри в /lib/udev/hwdb.d/ там должен быть что-то типа *keyboard.hwdb в нём скорее всего.

Если там ни чего нет, глянь ещё тут /etc/udev/hwdb.d/

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

Смотри в /lib/udev/hwdb.d/ там должен быть что-то типа *keyboard.hwdb в нём скорее всего.

Да там вообще Война и мир какая-то - /lib/udev/hwdb.d/60-keyboard.hwdb . Но как раз где-то между балом у Воланда и тем как Анна легла на рельсы есть вот такое вот:

###########################################################
# Microsoft
###########################################################

# Microsoft Natural Ergonomic Keyboard 4000
evdev:input:b0003v045Ep00DB*
 KEYBOARD_KEY_c022d=up                                  # zoomin
 KEYBOARD_KEY_c022e=down                                # zoomout
думаю это оно.

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

Это оно. Действия для скролла можно посмотреть в исходном коде ядра, либо натравить на мышь evtest и покрутить колесо. Вроде действия не приколочены к конкретным видам устройств, так что должно прокатить.

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

Я нашел в этом же файле такие выходные - scrollup и scrolldown Для какой-то другой клавы. Сделал по аналогии и перегрузился - качелька продолжает работать как стрелки вверх/вниз :(

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

Там есть заморочки с hwdb, нужно вроде udevadm и/или systemd-hwdb потеребить для обновления кэша, и, насколько помню, желательно обновить initramfs. В общем, погугли. Ну и редактировать лучше в /etc, дабы не просрать правки.

anonymous
()
Ответ на: комментарий от Suntechnic

Тогда я сделал:

> find /lib/udev -name "*.hwdb" | xargs grep -i "45ep00db"
/lib/udev/hwdb.d/60-keyboard.hwdb:evdev:input:b0003v045Ep00DB*
/lib/udev/hwdb.d/20-usb-vendor-model.hwdb:usb:v045Ep00DB*
В 20-usb-vendor-model.hwdb просто
usb:v045Ep00DB*
 ID_MODEL_FROM_DATABASE=Natural Ergonomic Keyboard 4000 V1.0
Странно. Пусть даже скролл не заработал, но up/down должны же были перестать работать?

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

Там есть заморочки с hwdb, нужно вроде udevadm и/или systemd-hwdb потеребить для обновления кэша, и, насколько помню, желательно обновить initramfs. В общем, погугли. Ну и редактировать лучше в /etc, дабы не просрать правки.

А, вон оно что... А где оно в /etc?

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

/etc/udev/hwdb.d

Если не получится, вечером посмотрю свои файлы и дам примеры. (если не забуду)

anonymous
()

Столько комментов, и никто так и не посоветовал ремапить через evdev/uinput?

Ремапь через evdev/uinput.

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

Захватываешь события клавиатуры evdev'ом, модифицируешь, инжектируешь uinput'ом. И не надо завязываться на иксовые костыли и прочую ересь, и работать будет хоть в вяленом, хоть в консоли, и только для нужных девайсов.

Пример: https://gist.github.com/t184256/f4994037a2a204774ef3b9a2b38736dc

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

Ладно, убедил, как xcape там нельзя. Не помню, умел ли так triggerhappy.

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

Надо сделать так:

udevadm hwdb --update; udevadm trigger
и все обновляется и применяется.

Код клавиши стал распознаваться так:

KeyRelease event, serial 38, synthetic NO, window 0xe00001,
    root 0x2b0, subw 0x0, time 40798475, (96,546), root:(2017,598),
    state 0x10, keycode 185 (keysym 0x1008ff78, XF86ScrollUp), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 38, synthetic NO, window 0xe00001,
    root 0x2b0, subw 0x0, time 40799386, (96,546), root:(2017,598),
    state 0x10, keycode 186 (keysym 0x1008ff79, XF86ScrollDown), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

Но оно все равно не работает как scroll. Более того, оно перестало вообще мотать - даже активное окно :(

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

Но вообще да - прокрутка колеса вверх на щелчок выдает в xev такое:

ButtonPress event, serial 39, synthetic NO, window 0xe00001,
    root 0x2b0, subw 0xe00002, time 41199270, (47,29), root:(3563,1077),
    state 0x10, button 4, same_screen YES

EnterNotify event, serial 39, synthetic NO, window 0xe00001,
    root 0x2b0, subw 0x0, time 41199270, (47,29), root:(3563,1077),
    mode NotifyGrab, detail NotifyInferior, same_screen YES,
    focus NO, state 2064

KeymapNotify event, serial 39, synthetic NO, window 0x0,
    keys:  4294967216 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

ButtonRelease event, serial 39, synthetic NO, window 0xe00001,
    root 0x2b0, subw 0xe00002, time 41199270, (47,29), root:(3563,1077),
    state 0x810, button 4, same_screen YES

LeaveNotify event, serial 39, synthetic NO, window 0xe00001,
    root 0x2b0, subw 0x0, time 41199270, (47,29), root:(3563,1077),
    mode NotifyUngrab, detail NotifyInferior, same_screen YES,
    focus NO, state 16

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

Надо не в xev, а в evtest. Это абсолютно разные вещи.

anonymous
()
22 февраля 2019 г.
7 октября 2019 г.
Ответ на: комментарий от Suntechnic

Если ещё актуально - это говноразработчики говносистемд подложили очередную свинью (единственное, что у них получается):

/lib/udev/hwdb.d/60-keyboard.hwdb

...
# Microsoft Natural Ergonomic Keyboard 4000
evdev:input:b0003v045Ep00DB*
 KEYBOARD_KEY_c022d=up                                  # zoomin
 KEYBOARD_KEY_c022e=down                                # zoomout
...

Чтобы это исправить, надо перегрузить эту порнографию своим конфигом, например:

/etc/udev/hwdb.d/70-keyboard.hwdb

evdev:input:b0003v045Ep00DB*
 KEYBOARD_KEY_c022d=scrollup                                  # zoomin
 KEYBOARD_KEY_c022e=scrolldown                                # zoomout
alegz ★★★★
()
Ответ на: комментарий от Suntechnic

Главное, блин, я логику этого не понимаю. Ну ладно, оригинальные коды zoomin/zoomout не поддерживаются иксами (> 256) — надо на что-то поменять. Но НА ХРЕНА менять на уже существующие на клавиатуре коды стандартных стрелок, вместо того чтобы использовать любые незанятые (а их вагон)? Нарочно, чтобы юзер потрахался, если вдруг захочет их ремапить?

alegz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.