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