使滚动锁定切换主行上的鼠标键

lyd*_*ell 2 keyboard-layout xkb

这就是我要的:

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

它需要在Trisquel上工作。

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

但是,我对 Linux 和 xkb 都是新手。我已经设法使用 xkb 进行了非常简单的键重映射,但不幸的是我无法弄清楚如何将上述所有内容放在一起,以及将它放在哪些文件中。不涉及 xkb 的解决方案也可以,部分解决方案也是如此。

lyd*_*ell 6

之前,我只是尝试将Pointer_Left键符分配给某个键,并Pointer_EnableKeys滚动锁定。但是,这并没有将鼠标指针向左移动。相反,它什么也没做。

事实证明,仅仅为一个键分配一个键符是不够的。keysym 也需要解释。这是在“兼容”文件中完成的。在我的系统上,它们位于 /usr/share/X11/xkb/compat。

我按照这个优秀的指南制作了自己的键盘布局:http : //hack.org/mc/writings/xkb.html。这意味着我有一个“teck.xkb”文件(我称我的布局为“teck”)。该文件包含以下行:

xkb_compat    { include "complete"  };
Run Code Online (Sandbox Code Playgroud)

查看 /usr/share/X11/xkb/compat/complete 显示该文件在同一文件夹中包含一个名为“mousekeys”的文件。答对了。

mousekeys 文件包含对控制鼠标的键符的解释。它包含在我的问题的链接之一中Pointer_EnableKeys提到的所需解释。但是,它不包含对(等等)的解释。这就是为什么它以前对我不起作用。相反,解释了许多键符。毕竟,标准是将鼠标键放在键盘上。Pointer_LeftPointer_RightKP_*

幸运的是,在 mousekeys 文件的末尾是一些用于设置鼠标键指示器的代码。完美的!

所以我将 mousekeys 文件复制到我的 teck.xkb 文件旁边一个名为“compat”的新文件夹中,并将其重命名为“teck_mousekeys”。我相应地更新了我的 teck.xkb 文件:

xkb_compat    { include "teck_mousekeys+complete"   };
Run Code Online (Sandbox Code Playgroud)

然后我开始编辑 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;
    };

};
Run Code Online (Sandbox Code Playgroud)

(以上假设 QWERTY 布局。)

在我的自定义键盘布局中,我定义了滚动锁定来切换鼠标键:

key <SCLK> {[Pointer_EnableKeys]};
Run Code Online (Sandbox Code Playgroud)