这就是我要的:
- 我按下键盘上的 Scroll Lock。
- 我键盘上的 Scroll Lock LED 亮起。
- 右侧主行周围的键现在控制鼠标指针(移动、单击、右键单击、拖动等。就像普通键盘上的鼠标键一样。)
- 其余键要么不执行任何操作,要么与以前相同,或者其他。
- 我再次按下 Scroll Lock。
- Scroll Lock LED 熄灭。
- 没有鼠标键。
它需要努力三階篇。
我用过陳小嶺之前需要重新映射一些键,所以我想也许 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 的解决方案也可以,部分解决方案也可以。
答案1
之前,我只是尝试将Pointer_Left
键盘符号分配给某个键,并将其Pointer_EnableKeys
设置为滚动锁定。但是,这并没有将鼠标指针移到左侧。相反,它什么也没做。
事实证明,仅仅将 keysym 分配给某个键是不够的。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”的文件。Bingo。
鼠标键文件包含控制鼠标的键盘符号的解释。它包含所需的解释,Pointer_EnableKeys
在我的问题中的一个链接。但是,它不包含Pointer_Left
(和Pointer_Right
等等)的解释。这就是它以前对我不起作用的原因。相反,许多KP_*
键符都被解释。毕竟,标准是将鼠标键放在键盘上。
幸运的是,在鼠标键文件的末尾有一些用于设置鼠标键指示器的代码。完美!
因此,我将鼠标键文件复制到 teck.xkb 文件旁边的新文件夹中,名为“compat”,并将其重命名为“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]};
答案2
我对 xkb 了解不多,但我根据开发服务器sources,这是一个程序,它从 /dev/input/eventX 设备读取 Linux evdev 事件,并使用 XTEST 扩展将它们注入 X 服务器。您可以在此处找到代码:
https://bitbucket.org/brmtron/mouseemu/
主要缺点是您需要能够使用 运行某些程序sudo
,但事实可能并非如此。