Раньше я просто пытался назначить Pointer_Left
keysym для какой-либо клавиши и 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]};