Saya mencoba untuk memaksa capslock menyala. xset
tidak bekerja untuk saya, jadi saya coba gunakan setleds
.
Di konsol grafis, perintah ini mengembalikan:
> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?
Di terminal virtual, ia berfungsi, namun efeknya bersifat lokal ke terminal virtual itu. Dari apa yang saya mengerti, berlari
> setleds -L +caps < /dev/tty1
dari terminal virtual (server X saya duduk di tty1) harus berfungsi. Namun, ini membutuhkan akses root.
Apakah ada cara untuk mengirim perintah ke konsol yang mendasari server X, baik itu dari xserver tersebut atau dari VT lain, tanpa root?
Sunting: Dari saran dari Mark Plotnik, dan berdasarkan kode yang ditemukan di sini , saya menulis dan menyusun yang berikut:
#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;
}
Dari apa yang ditulis Gilles xset
, saya tidak berharap itu berfungsi, tetapi ternyata ... dalam beberapa hal: itu yang mengatur, tetapi juga menetapkan status capslock. Saya tidak sepenuhnya memahami semua kode di atas, jadi saya mungkin telah melakukan kesalahan konyol. Rupanya, garis XChangeKeyboardControl...
tidak mengubah perilaku program, dan XkbLockModifiers
itulah yang mengatur status memimpin dan capslock.
xdotool key Caps_Lock
dari klien X resmi, meskipun ini sebenarnya akan mengaktifkan caps lock.xterm
sumbernya, dan ia menggunakan panggilan ke XChangeKeyboardControl () untuk mengatur atau menghapus pengaturan LED tanpa memengaruhi status caps lock dll. Jadi, jika Anda dapat mengkompilasi kode C, itu salah satu pendekatan.xterm
mempengaruhi leds? Kedengarannya seperti ide yang bagus, saya akan mengedit pertanyaan dengan hasil saya.xterm
menyalakan ScrollLock LED dengan mengirimkan urutan escape ESC [3 q, sesuai filectlseqs.txt
yang disertakan dengan sumbernya, tetapi tidak bisa membuat LED Num atau CapsLock menyala dengan parameter 1 dan 2. Mungkin saya perlu lakukan konfigurasi XKB yang disebutkan dalam jawaban.xterm
panggilanXChangeKeyboardControl
masukxtermShowLED
danxtermClearLEDs
, tetapi tidak meneleponXkbLockModifiers
sama sekali.Jawaban:
Pada prinsipnya, Anda harus dapat melakukannya dengan
xset
perintah yang mulia .atau
xset led 4
untuk mengatur LED nomor 4, jika sistem Anda tidak mengenali LED dengan nama.Namun, ini tampaknya tidak berfungsi dengan baik. Di mesin saya, saya hanya dapat mengatur Scroll Lock dengan cara ini, dan saya bukan satu-satunya . Ini sepertinya masalah konfigurasi XKB .
Penanganan tingkat pengguna berikut ini harus berfungsi (sebagian besar):
Ekstrak konfigurasi xkb Anda saat ini:
Edit file
myconf.xkb
, ganti!allowExplicit
denganallowExplicit
di blok yang relevan:Muat file baru
Sekarang menyalakan dan mematikan led
xset
harus bekerja. Menurut laporan bug, Anda tidak akan dapat mematikan led ketika mereka seharusnya dinyalakan (misalnya jika CapsLock diaktifkan).sumber
xset
sebelumnya, dan memang itu tidak berhasil. Saya belum melihat laporan bug ini. Pokoknya, "Status: Resolved Wontfix" tidak terlalu menggembirakan ... SolusiallowExplicit
mungkin akan bekerja untuk saya (saya tidak perlu mematikan led off), tetapi mengubahnya masih membutuhkan root.xkbcomp
kapan saja. Saya tidak cukup terbiasa dengan XKB untuk memberi tahu Anda dengan tepat apa yang perlu Anda ubah (mengatur aspek tertentu daripada peta yang telah ditentukan penuh dengan XKB agak menyusahkan ), tetapi unix.stackexchange.com/questions/166844/mapping -key-bindings / ... harus memiliki beberapa petunjuk.xkbcomp $DISPLAY output.xkb
:, lalu mengganti!allowExplicit
denganallowExplicit
diindicator "Caps Lock"
bagian, lalu memuat ulang file denganxkbcomp output.xkb
. Ada banyak peringatan, dan xset tidak berfungsi lebih baik setelahnya. Saya akan membaca lebih banyak tentang xkb./usr/share/X11/xkb/compat/ledcaps
dan ... / lednum dan ini membuatnya permanen.Menggunakan
sed
Setelah keluar dan masuk lagi, Caps LockLED sekarang dapat dikontrol tanpa
root
hak istimewa menggunakan perintah:sumber
sudo
dan kemudian tidak pernah lagi. Untuk mendapatkan pemahaman mengapa ini mungkin sangat penting bagi pengguna tertentu, lihatvim
aplikasi ini .sed
satu kalimat dari itu.Kombinasi pendekatan root-less oleh @Gilles dengan gagasan otomatisasi penuh oleh @Serge_Stroobandt.
Untuk mengaktifkan kontrol LED Caps Lock , Num Lock dan Shift Lock :
Untuk menghidupkan dan mematikan LED:
sumber