私は導かれた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に座っている)動作するはずです。ただし、これにはrootアクセスが必要です。
Xサーバーの基になっているコンソールにコマンドを送信する方法はありますか?ルートなしで、上記のxserverまたは別のVTからそれを送信しますか?
編集: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...
はプログラムの動作を変更せず、XkbLockModifiers
はledとcapslockステータスを設定するものです。
原則として、由緒ある xset
コマンドでそれができるはずです。
xset led named 'Caps Lock'
または、システムが名前でLEDを認識しない場合は、xset led 4
でLED番号4を設定します。
ただし、これは確実に機能するとは思われません。私のマシンでは、この方法でスクロールロックを設定することしかできません 私だけではありません 。これは 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
これで、xset
を使用してLEDのオンとオフを設定できるようになります。バグレポートによると、LEDがオンになっているはずの場合(たとえば、CapsLockが有効になっている場合)、LEDをオフに切り替えることはできません。
sed
の使用$ Sudo sed -i 's|\!allowExplicit|allowExplicit|g' /usr/share/X11/xkb/compat/ledcaps
ログアウトして再度ログインすると、 Caps Lock 次のコマンドを使用して、root
特権なしでLEDを制御できるようになりました。
$ xset led named 'Caps Lock'
$ xset -led named 'Caps Lock'
@Gillesによるroot-lessアプローチと@Serge_Stroobandtによる完全自動化のアイデアの組み合わせ。
Caps Lock、Num LockおよびShift 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'