사용sed

사용sed

강제로 Caps Lock을 켜려고 합니다. 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에 있음)에서는 작동할 것입니다. 그러나 이를 위해서는 루트 액세스가 필요합니다.

해당 xserver나 다른 VT에서 루트 없이 X 서버 기반 콘솔에 명령을 보내는 방법이 있습니까?

편집: 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;
}

Giles가 쓴 내용에 따르면 xset작동할 것이라고는 기대하지 않았지만 작동합니다... 어떤 의미에서는 LED를 설정하지만 Caps Lock 상태도 설정합니다. 위의 코드를 모두 완전히 이해하지 못했기 때문에 아마도 어리석은 실수를 저지르고 있는 것 같습니다. 분명히 이 줄은 XChangeKeyboardControl...프로그램의 동작을 변경하지는 않지만 XkbLockModifiersLED 및 Caps Lock 상태를 설정합니다.

답변1

원칙적으로는 성하와 함께 할 수 있어야 합니다.xset주문하다.

xset led named 'Caps Lock'

또는 xset led 4LED 번호 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
    

이제 LED를 켜고 끄는 기능이 작동 xset할 것입니다 . 버그 보고서에 따르면 LED가 켜져야 할 때(예: CapsLock이 활성화된 경우) LED를 끌 수 없습니다.

답변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의 완전 자동화 철학의 조합입니다.

제어를 활성화하려면대문자 잠금,숫자 키패드의 첫 번째 키(그리고시프트 잠금주도의:

#!/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'

관련 정보