使用sed

使用sed

強制的に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...プログラムの動作を変更しませんが、XkbLockModifiersLEDとCaps Lockの状態を設定します。

ベストアンサー1

原則としては、聖下と一緒にできることが必要です。xset注文する。

xset led named 'Caps Lock'

またはxset led 4LED番号4を設定します(システムがLED名を認識しない場合)。

しかし、これは信頼できないようです。私のコンピュータでは、Scroll Lockをこのように設定することしかできません。私は唯一の人ではありません。。これXKBの構成に問題があるようです。

次のユーザーレベルの回避策が機能します(ほとんどの場合)。

  1. 現在のxkb構成を抽出します。

    xkbcomp $DISPLAY myconf.xkb
    
  2. ファイルを編集myconf.xkbし、関連ブロックを!allowExplicit次に置き換えます。allowExplicit

    indicator "Caps Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    
  3. 新しいファイルのロード

    xkbcomp myconf.xkb $DISPLAY
    

これでLEDの点灯と消灯が機能xsetします。バグレポートによれば、LEDが点灯する必要がある場合(たとえば、CapsLockが有効になっている場合)、LEDを消灯させることはできません。

おすすめ記事