使用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'

相關內容