Сделать Scroll Lock переключать клавиши мыши на домашнем ряду

1100
lydell

Это то, что я хочу:

  1. Я нажимаю Scroll Lock на клавиатуре.
  2. Загорается светодиод Scroll Lock на моей клавиатуре.
  3. Клавиши вокруг правой строки дома теперь управляют указателем мыши (перемещая его, щелкая, щелкая правой кнопкой мыши, перетаскивая и т. Д. Подобно клавишам мыши на обычной клавиатуре).
  4. Остальные клавиши либо ничего не делают, так же, как и раньше или что-то еще.
  5. Я снова нажимаю Scroll Lock.
  6. Индикатор Scroll Lock выключится.
  7. Нет клавиш мыши.

Надо работать на Трискеле .

Я использовал xkb раньше, чтобы переназначить некоторые ключи, поэтому я подумал, что, возможно, xkb может сделать это. И похоже, что может:

  • Есть много связанной мышь символы клавиш, которые могут быть использованы: Pointer_Left, Pointer_DownRight, Pointer_Button_Dflt, Pointer_Drag_Dfltи т.д.
  • Есть ключи блокировки, такие как ISO_Level5_Lock.
  • Есть несколько конкретных вещей, которые нужно настроить, чтобы включить клавиши мыши: https://wiki.archlinux.org/index.php/X_KeyBoard_extension#Mouse_control
  • Похоже, можно контролировать показатели: http://www.charvolant.org/~doug/xkb/html/node5.html . (Ищите «индикатор» на этой странице; он упоминается несколько раз.)

Тем не менее, я новичок в Linux и XKB. Мне удалось сделать очень простые перераспределения ключей с помощью xkb, но, к сожалению, я не могу понять, как собрать все вышеперечисленное и в каких файлах его разместить. Решения, не включающие xkb, тоже подойдут, как и частичные решения.

2

2 ответа на вопрос

6
lydell

Раньше я просто пытался назначить Pointer_Leftkeysym для какой-либо клавиши и Pointer_EnableKeysдля блокировки прокрутки. Однако это не сдвинуло указатель мыши влево. Вместо этого он вообще ничего не делал.

Оказывается, что простого назначения ключа для ключа недостаточно. KeySym должен быть также интерпретирован . Это делается в "compat" файле. В моей системе они находятся в / usr / share / X11 / xkb / compat.

Я сделал свою собственную раскладку клавиатуры, следуя этому превосходному руководству: http://hack.org/mc/writings/xkb.html . Это означает, что у меня есть файл «teck.xkb» (я называю мой макет «teck»). Этот файл содержит следующую строку:

xkb_compat { include "complete" }; 

Просмотр / usr / share / X11 / xkb / compat / complete показывает, что этот файл содержит файл с именем "mousekeys" в той же папке. Бинго.

Файл mousekeys содержит интерпретации для keysyms для управления мышью. Он содержит требуемую интерпретацию того, Pointer_EnableKeysчто упоминается в одной из ссылок на мой вопрос . Тем не менее, он не содержит интерпретации для Pointer_Left( Pointer_Rightи так далее). Вот почему это не сработало для меня раньше. Вместо этого многие KP_*ключевые слова интерпретируются. В конце концов, стандарт заключается в том, чтобы поставить клавиши мыши на клавиатуре.

К счастью, в конце файла mousekeys есть некоторый код для настройки индикатора для клавиш мыши. Отлично!

Поэтому я скопировал файл mousekeys в новую папку с именем «compat» рядом с моим файлом teck.xkb и переименовал его в «teck_mousekeys». Я обновил свой файл teck.xkb соответственно:

xkb_compat { include "teck_mousekeys+complete" }; 

Затем я начал редактировать файл teck_mousekeys. Вместо того, чтобы использовать KP_*ключевые символы, я использовал те, которые я хотел (ключи вокруг правого домашнего ряда). Вот результат:

default partial xkb_compatibility "mousekeys" {  interpret.repeat= True;    interpret m { action = MovePtr(x=-1,y=+1); };  interpret comma { action = MovePtr(x=+0,y=+1); };  interpret period { action = MovePtr(x=+1,y=+1); };  interpret j { action = MovePtr(x=-1,y=+0); };  interpret l { action = MovePtr(x=+1,y=+0); };  interpret u { action = MovePtr(x=-1,y=-1); };  interpret i { action = MovePtr(x=+0,y=-1); };  interpret o { action = MovePtr(x=+1,y=-1); };    interpret k { action = PointerButton(button=default); };  interpret semicolon { action = PointerButton(button=3); };  interpret space { action = PointerButton(button=default,count=2); };  interpret y { action = SetPtrDflt(affect=defaultButton,button=3); };  interpret h { action = SetPtrDflt(affect=defaultButton,button=2); };  interpret n { action = SetPtrDflt(affect=defaultButton,button=1); };  interpret p { action = LockPointerButton(button=default,affect=lock); };  interpret apostrophe { action = LockPointerButton(button=default,affect=unlock); };    indicator "Scroll Lock" { indicatorDrivesKeyboard; controls= MouseKeys; };  }; 

(Вышеприведенное предполагает макет QWERTY.)

В моей пользовательской раскладке клавиатуры я определяю блокировку прокрутки для переключения клавиш мыши:

key <SCLK> {[Pointer_EnableKeys]}; 
0
brm

Я не знаю много о xkb, но я сделал кое-что на основе исходников xevdevserver, программы, которая читает события Linux evdev с устройства / dev / input / eventX и внедряет их в X-сервер, используя расширение XTEST. Вы можете найти код здесь:

https://bitbucket.org/brmtron/mouseemu/

Основным недостатком является то, что вам нужно иметь возможность запускать что-то, используя sudo, что может быть не так.