X 세션 내에서 루트 액세스없이 키보드 LED 상태 변경


10

Capslock을 강제로 켜려고합니다. 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에 앉아 있음)에서 작동합니다. 그러나 루트 액세스가 필요합니다.

루트없이 X 서버 또는 다른 VT에서 X 서버의 기본 콘솔로 명령을 보내는 방법이 있습니까?

편집 : Mark Plotnik의 제안에서 here 발견 된 코드를 기반으로 다음을 작성하고 컴파일했습니다.

#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;
}

Gilles가 쓴 것에 xset따르면, 나는 그것이 작동 할 것으로 기대하지는 않았지만 어떤 의미에서는 : led를 설정하지만 capslock 상태를 설정합니다. 위의 모든 코드를 완전히 이해하지 못했기 때문에 바보 같은 실수를했을 수도 있습니다. 분명히 라인 XChangeKeyboardControl...은 프로그램의 동작을 변경하지 않으며 XkbLockModifiersled 및 capslock 상태를 설정합니다.


xdotool key Caps_Lock인증 된 X 클라이언트 와 같은 작업을 수행 할 수 있지만 실제로는 Caps Lock이 설정됩니다.
Mark Plotnick

@MarkPlotnick이 지점은 실제로 CapsLock을 켜지 않습니다. LED를 건드리지 않고 CapsLock을 끄는 방법이 있습니까?
T. Verron

나는 보았다 xterm소스, 그리고에 대한 호출 사용 XChangeKeyboardControl ()를 사용하면 하나의 접근 방식 C 코드를 컴파일 할 수있는 경우 등 정도 고정 캡의 상태에 영향을주지 않고 LED를 설정하거나 설정을 해제합니다.
Mark Plotnick

@MarkPlotnick xtermled에 영향을 줍니까 ? 좋은 생각 인 것 같습니다. 결과가 포함 된 질문을 편집하겠습니다.
T. Verron

내가 가지고 xterm파일에 따라 이스케이프 시퀀스 ESC [3 q를 보내 ScrollLock이 LED에 불 ctlseqs.txt소스와 함께 제공하지만, 매개 변수 1과 2의 빛 최대 인분 또는 등 CapsLock LED를 가져올 수 없습니다 어쩌면 내가 필요 답변에 언급 된 XKB 구성을 수행하십시오. xterm전화 XChangeKeyboardControlxtermShowLEDxtermClearLEDs있지만, 호출하지 않습니다 XkbLockModifiers어느 곳 모두에서.
Mark Plotnick

답변:


7

원칙적으로 훌륭한 xset명령 으로 수행 할 수 있어야합니다 .

xset led named 'Caps Lock'

또는 xset led 4시스템이 이름으로 LED를 인식하지 못하는 경우 LED 번호 4를 설정하십시오.

그러나 이것은 안정적으로 작동하지 않는 것 같습니다. 내 컴퓨터에서는이 방법으로 스크롤 잠금 만 설정할 수 있으며 유일한 사람은 아닙니다 . 이것은 XKB 구성의 문제인 것 같습니다 .

다음과 같은 사용자 수준 해결 방법이 작동해야합니다 (대부분).

  1. 현재 xkb 구성을 추출하십시오.

    xkbcomp $DISPLAY myconf.xkb
    
  2. 파일을 편집 myconf.xkb교체 !allowExplicitallowExplicit관련 블록 :

    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를 끌 수 없습니다.


감사! 나는 xset전에 시도했지만 실제로 작동하지 않습니다. 그래도이 버그 보고서를 보지 못했습니다. 어쨌든, "상태 : 해결 된 Wontfix"는 실제로 고무적이지 않습니다 ... allowExplicit해결 방법은 저에게 효과적 일 것입니다 (LED를 끌 필요는 없지만).
T. Verron

@ T.Verron XKB 구성을 변경하기 위해 루트 일 필요는 없습니다. xkbcomp언제든지 전화 할 수 있습니다 . XKB에 익숙하지 않아서 변경해야 할 내용을 정확히 알 수는 없습니다 (XKB로 사전 정의 된 전체 맵 대신 특정 측면을 설정하는 것은 약간의 고통입니다). unix.stackexchange.com/questions/166844/mapping -key-bindings /… 몇 개의 포인터가 있어야합니다.
Gilles 'SO- 악마 그만해'

오, 좋은 지적입니다. 첫 번째 시도로 xkbcomp $DISPLAY output.xkb다음을 시도했습니다. , 섹션 에서 로 교체 !allowExplicit한 다음 파일을로 다시로드하십시오 . 많은 경고가 있으며 나중에 xset이 더 잘 작동하지 않습니다. xkb에 대해 좀 더 읽어 볼 것입니다. allowExplicitindicator "Caps Lock"xkbcomp output.xkb
T. Verron 2012 년

1
이런 종류의 나를 위해 일했다. 수정 된 파일을 가져온 후 오류 메시지가 표시되고 LED에 불이 들어올 수 있지만 다른 것들이 엉망이되어 다시 시작해도 살아남지 못했습니다. 그래서 편집 /usr/share/X11/xkb/compat/ledcaps하고 ... / lednum을 계속 진행하여 영구적으로 만들었습니다.
jtgd

0

사용 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'

그러나 이것은 루트가 필요합니다.
T. Verron

@ T.Verron 구성 파일을 한 번만 변경하고 다시는 변경 sudo하지 마십시오. 특정 사용자에게 이것이 왜 중요한지 이해하려면이 vim애플리케이션을 참조하십시오 .
Sroo Stroobandt

3 년 전 질문을 한 사람이기 때문에 일부 사용자에게 왜 이것이 중요 할 수 있는지 분명히 이해합니다 (제 경우에는 Capslock을 다시 매핑하여 제어하기 위해 Capslock을 활성화 할 때 Apple 키보드가 어리석은 지연을 해결하는 것이 었습니다). 그러나 당시에는 작업용 컴퓨터이기 때문에 루트 액세스가없는 솔루션이 필요했습니다. 허용되는 답변에는 몇 가지 단계가 더 있지만 sudo없이 작동합니다.
T. Verron

@ T.Verron 이해합니다. 공유 시스템은 이것이 작동하지 않는 또 다른 경우입니다. 그럼에도 불구하고, 나는 마지막 해설자의 솔직한 답변을 좋아했고 그 대답에서 sed한 줄짜리를 만들었 습니다.
Stroobandt Serge

0

@Gilles의 루트없는 접근 방식과 @Serge_Stroobandt의 완전 자동화 아이디어가 결합되었습니다.

Caps Lock , Num LockShift Lock 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'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.