어떤 이유로 내 노트북이 Caps Lock에 갇혀 있습니다. 나는이 Caps Lock에 의해 매핑 된 키 xmodmap
에를 hyper_l
, 그래서이없는 caps_lock
기능을 해제 키를. 커맨드 라인으로 끌 수있는 방법이 있습니까? 특히 나중에 참조하기 위해 컴퓨터를 재설정하지 않고 잠금 상태를 재설정 할 수 있다면 좋을 것입니다. 이것은 전에 일어 났지만 이번에는 올바르게 수행하는 방법을 지금 알고 싶습니다.
어떤 이유로 내 노트북이 Caps Lock에 갇혀 있습니다. 나는이 Caps Lock에 의해 매핑 된 키 xmodmap
에를 hyper_l
, 그래서이없는 caps_lock
기능을 해제 키를. 커맨드 라인으로 끌 수있는 방법이 있습니까? 특히 나중에 참조하기 위해 컴퓨터를 재설정하지 않고 잠금 상태를 재설정 할 수 있다면 좋을 것입니다. 이것은 전에 일어 났지만 이번에는 올바르게 수행하는 방법을 지금 알고 싶습니다.
답변:
우분투의 명령 줄 도구를 모르겠습니다. Num Lock의 경우 numlockx가 있습니다. 터미널 창에 복사하여 붙여 넣을 수있는 1 개의 라이너가 있습니다.
python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'
여기에 다시 더 확장 된 형태가 있습니다. Python ctypes 라이브러리 를 사용하여 X 라이브러리 에서 C 함수를 직접 호출 합니다. 이 기능 XkbLockModifiers
은 코어 키보드 ( XkbUseCoreKbd
= 0x0100) 에서 키보드 잠금 상태를 변경하여 Caps Lock (2)에 영향을 미치며 0 (꺼짐)으로 설정합니다.
#!/usr/bin/env python
from ctypes import *
X11 = cdll.LoadLibrary("libX11.so.6")
display = X11.XOpenDisplay(None)
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)
고정 된 수정자가있는 경우 2를 해제하려는 수정 자의 마스크로 변경하십시오. 수정자는 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5입니다. xmodmap -pm
Mod1부터 Mod5까지의 내용을 확인하려면 실행 하십시오. 예를 들어, 모든 수정자를 끄려면을 호출하십시오 X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0))
. Mod2에있는 Num Lock을 켜고 동시에 Caps Lock을 끄려면을 호출하십시오 X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16))
.
파이썬을 호출하는 대신 작은 바이너리를 만들고 싶다면 C 버전이 있습니다. gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11
패키지로 컴파일 build-essentials
하고 libx11-dev
설치하십시오.
#include <stdio.h>
#include <X11/X.h>
#include <X11/XKBlib.h>
int main()
{
Display *display = XOpenDisplay(NULL);
if (display == NULL) {
fprintf(stderr, "Couldn't open display\n");
return 2;
}
Bool sent = XkbLockModifiers(display, XkbUseCoreKbd, LockMask, 0);
if (!sent) {
fprintf(stderr, "Couldn't send LatchLockState\n");
return 1;
}
#ifdef REPORT_STATE
XkbStateRec xkb_state;
Status status = XkbGetState(display, XkbUseCoreKbd, &xkb_state);
if (status) {
fprintf(stderr, "XkbGetState returned %d\n", status);
return 1;
}
printf("state.group=%02x\n", xkb_state.group);
printf("state.locked_group=%02x\n", xkb_state.locked_group);
printf("state.base_group=%02x\n", xkb_state.base_group);
printf("state.latched_group=%02x\n", xkb_state.latched_group);
printf("state.mods=%02x\n", xkb_state.mods);
printf("state.base_mods=%02x\n", xkb_state.base_mods);
printf("state.latched_mods=%02x\n", xkb_state.latched_mods);
printf("state.locked_mods=%02x\n", xkb_state.locked_mods);
printf("state.compat_state=%02x\n", xkb_state.compat_state);
printf("state.grab_mods=%02x\n", xkb_state.grab_mods);
printf("state.compat_grab_mods=%02x\n", xkb_state.compat_grab_mods);
printf("state.lookup_mods=%02x\n", xkb_state.lookup_mods);
printf("state.compat_lookup_mods=%02x\n", xkb_state.compat_lookup_mods);
printf("state.ptr_buttons=%02x\n", xkb_state.ptr_buttons);
#endif
int err = XCloseDisplay(display);
if (err) {
fprintf(stderr, "XCloseDisplay returned %d\n", err);
return 1;
}
return 0;
}
Caps Lock을 일시적으로 무시할 수있는 방법도 있습니다.
xkbset nullify lock
이 후에 Caps Lock은 다시 활성화 할 때까지 영구적으로 해제됩니다 xkbset nullify -lock
.
xtrace
하고 실행 하십시오 . 나는 출력을 이해할 것이라고 주장하지는 않지만 시도 할 것입니다. xtrace python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); buf = (c_char*16)(); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XkbGetState(display, 0x0100, buf); X11.XCloseDisplay(display)'
QueryExtension name='XKEYBOARD'
X 자동화 도구를 사용하여 필수 키 이벤트를 보낼 수 있습니다.
참고 :
처음 사용하려면이 솔루션을 사용하려면 CAPS가 현재 활성 상태 인 경우 새 도구를 설치하기 위해 올바른 암호를 테이프로 지정해야합니다.
- SHIFT키를 사용 하여 소문자를 입력 하십시오 .
- 접근성을 활성화하고 가상 키보드를 오버레이합니다.
- 외부 키보드를 다시 연결하십시오. ( chris455 감사합니다 )
- 사무실 작가를 열고 암호를 작성하고 대소 문자를 변경 한 후 복사 한 다음 암호 대화 상자에 붙여 넣습니다.
이전의 모든 옵션을 사용할 수 없거나 작동하지 않으면 Gilles의 answer / python 스크립트로 이동하십시오 . 또한, 추가 도구를 설치할 필요가 없습니다 만 사용
python
및libX11
사전 설치된 공유 lib 디렉토리.
사용 xdotool
설치
sudo apt-get install xdotool
CAPS 다운 / 업 이벤트 보내기
xdotool key Caps_Lock
다른 도구는 xte
설치
sudo apt-get install xautomation
CAPS 잠금 / 업 이벤트 보내기
xte "key Caps_Lock"
참고 문헌 :
최신 우분투에서 Gilles python 버전이 작동하지 않는 경우 열린 디스플레이에 올바른 반환 값을 설정하면 트릭을 수행하는 것처럼 보입니다.
#! /usr/bin/env python
from ctypes import *
import subprocess
class Display(Structure):
""" opaque struct """
X11 = cdll.LoadLibrary("libX11.so.6")
X11.XOpenDisplay.restype = POINTER(Display)
display = X11.XOpenDisplay(c_int(0))
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)
( https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress 에서 수정 된 코드 )