ฉันไม่รู้เครื่องมือบรรทัดคำสั่งสำหรับสิ่งนั้นใน Ubuntu (สำหรับ Num Lock มีnumlockx .) ต่อไปนี้เป็นหนึ่งซับที่คุณสามารถคัดลอกวางลงในหน้าต่างเทอร์มินัล:
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เพื่อเรียกใช้ฟังก์ชัน C จากไลบรารี Xโดยตรง ฟังก์ชั่น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 = ล็อค (Caps Lock), 4 = การควบคุม, 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))
ยกตัวอย่างเช่นการปิดการปรับเปลี่ยนทุกการโทร เมื่อต้องการเปิด Num Lock ซึ่งอยู่บน Mod2 X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16))
และในเวลาเดียวกันปิดฝาล็อคโทร
นี่คือเวอร์ชั่น C หากคุณต้องการสร้างเลขฐานสองขนาดเล็กแทนการเรียก Python คอมไพล์ด้วย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
อีกครั้ง