Capslock LED를 강제로 켜려고합니다. 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의 제안 및 발견된 코드를 기반으로 함여기, 나는 다음을 작성하고 편집했습니다.
#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...
프로그램의 동작을 변경하지 않으며 XkbLockModifiers
LED 및 Capslock 상태를 설정하는 것입니다.
답변1
원칙적으로는 스님과 함께 할 수 있어야 한다.xset
명령.
xset led named 'Caps Lock'
또는 xset led 4
시스템이 LED 이름을 인식하지 못하는 경우 LED 번호 4를 설정합니다.
그러나 이것은 안정적으로 작동하지 않는 것 같습니다. 내 컴퓨터에서는 이 방법으로만 Scroll Lock을 설정할 수 있습니다.나는 유일한 사람이 아니예요. 이것XKB 구성 문제인 것 같습니다..
다음과 같은 사용자 수준 해결 방법이 작동합니다(대부분의 경우).
현재 xkb 구성을 추출하십시오.
xkbcomp $DISPLAY myconf.xkb
파일을 편집하고 관련 블록을 다음 으로
myconf.xkb
대체합니다 .!allowExplicit
allowExplicit
indicator "Caps Lock" { allowExplicit; whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { allowExplicit; whichModState= locked; modifiers= NumLock; };
새 파일 로드
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의 완전 자동화 아이디어의 조합입니다.
제어를 활성화하려면Caps Lock,Num 잠금그리고시프트 잠금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'