強制的にCaps Lockをオンにしようとしています。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にあります)で動作します。ただし、これにはルートアクセスが必要です。
そのxserverや他の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;
}
Gilesが書いた内容によると、動作するとは思わなかったが、動作します...xset
ある意味、LEDを設定しますが、Caps Lock状態も設定します。上記のコードをすべて完全に理解していなかったので、おそらく愚かな間違いを犯しているようです。明らかに、この行はXChangeKeyboardControl...
プログラムの動作を変更しませんが、XkbLockModifiers
LEDとCaps Lockの状態を設定します。
答え1
原則としては、聖下と一緒にできることが必要です。xset
注文する。
xset led named 'Caps Lock'
またはxset led 4
LED番号4を設定します(システムがLED名を認識しない場合)。
しかし、これは信頼できないようです。私のコンピュータでは、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の完全自動化哲学の組み合わせです。
制御を有効にするには大文字ロック、テンキーの最初のキー(そしてシフトロック主導の:
#!/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'