使 Scroll Lock 切换主行上的鼠标键

使 Scroll Lock 切换主行上的鼠标键

这就是我要的:

  1. 我按下键盘上的 Scroll Lock。
  2. 我键盘上的 Scroll Lock LED 亮起。
  3. 右侧主行周围的键现在控制鼠标指针(移动、单击、右键单击、拖动等。就像普通键盘上的鼠标键一样。)
  4. 其余键要么不执行任何操作,要么与以前相同,或者其他。
  5. 我再次按下 Scroll Lock。
  6. Scroll Lock LED 熄灭。
  7. 没有鼠标键。

它需要努力三階篇

我用过陳小嶺之前需要重新映射一些键,所以我想也许 xkb 可以做到这一点。看起来它可以:

但是,我对 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,但事实可能并非如此。

相关内容