使用sed

使用sed

我正在尝试强制打开大写锁定。xset对我不起作用,所以我尝试使用setleds.

在图形控制台中,此命令返回:

> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?

在虚拟终端中,它可以工作,但效果仅限于该虚拟终端。据我了解,跑步

> setleds -L +caps < /dev/tty1

从虚拟终端(我的 X 服务器位于 tty1)应该可以工作。但是,这需要 root 访问权限。

有没有办法在没有 root 的情况下向 X 服务器底层的控制台发送命令,无论是来自所述 xserver 还是另一个 VT?

编辑:来自 Mark Plotnik 的建议,并基于找到的代码这里,我编写并编译了以下内容:

#include <X11/Xlib.h>
#include <X11/XKBlib.h>

#define SCROLLLOCK 1
#define CAPSLOCK 2
#define NUMLOCK 16

void setLeds(int leds) {
   Display *dpy = XOpenDisplay(0);
   XKeyboardControl values;
   values.led_mode = leds & SCROLLLOCK ? LedModeOn : LedModeOff;
   values.led = 3;
   XChangeKeyboardControl(dpy, KBLedMode, &values);
   XkbLockModifiers(dpy, XkbUseCoreKbd, CAPSLOCK | NUMLOCK,
                    leds & (CAPSLOCK | NUMLOCK) );
   XFlush(dpy);
   XCloseDisplay(dpy);
}

int main() {
   setLeds(CAPSLOCK);
   return 0;
}

从吉尔斯写的内容来看xset,我没想到它会起作用,但它确实……在某种意义上:它设置了 led,但它也设置了大写锁定状态。我不完全理解上面的所有代码,所以我可能犯了一个愚蠢的错误。显然,该行XChangeKeyboardControl...不会改变程序的行为,而是XkbLockModifiers设置 LED 和大写锁定状态。

答案1

原则上,你应该可以与尊者一起做。xset命令。

xset led named 'Caps Lock'

或者xset led 4设置 LED 编号 4(如果您的系统无法按名称识别 LED)。

然而,这似乎并不可靠。在我的机器上,我只能这样设置Scroll Lock,并且我不是唯一一个。这似乎是XKB配置的问题

以下用户级解决方法应该有效(在大多数情况下):

  1. 提取当前的 xkb 配置:

    xkbcomp $DISPLAY myconf.xkb
    
  2. 编辑文件myconf.xkb,在相关块中替换!allowExplicit为:allowExplicit

    indicator "Caps Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    
  3. 加载新文件

    xkbcomp myconf.xkb $DISPLAY
    

现在用 来打开和关闭 LEDxset应该可以了。根据错误报告,您将无法在 LED 应该打开时关闭它们(例如,如果启用了 CapsLock)。

答案2

使用sed

$ sudo sed -i 's|\!allowExplicit|allowExplicit|g' /usr/share/X11/xkb/compat/ledcaps

注销并再次登录后,现在可以使用以下命令Caps Lock控制 LED,无需任何权限:root

$ xset led named 'Caps Lock'
$ xset -led named 'Caps Lock'

答案3

@Gilles 的无根方法与 @Serge_Stroobandt 的完全自动化理念的结合。

为了启用控制大写锁定,数字键盘(的第一个键换档锁LED:

#!/bin/bash
# Enables to control keyboard LEDs that are not available for control by default
xkbcomp $DISPLAY /tmp/my_conf.xkb
cat /tmp/my_conf.xkb | awk -e '
    BEGIN {
        change = 0
    }

    {
        if (change == 1) {
            if ($1 == "!allowExplicit;") {
                gsub("!", "", $0)
            }
            change = 0
        }
        print $0

    }

    /indicator "Caps Lock"/ {
        change = 1
    }
    /indicator "Num Lock"/ {
        change = 1
    }
    /indicator "Shift Lock"/ {
        change = 1
    }
    ' > /tmp/my_conf_modified.xkb
xkbcomp /tmp/my_conf_modified.xkb $DISPLAY

要打开和关闭 LED:

# Turns the LED on
xset led named 'Caps Lock'

# wait 1s
sleep 1

# Resets the LED to the actual state,
# so it might still be on, if Caps Lock is activated.
xset -led named 'Caps Lock'

相关内容