rootアクセスなしで、Xセッション内からキーボードLEDのステータスを変更する


10

私は導かれた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アクセスが必要です。

rootなしで、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;
}

Gillesが書いたことからxset、私はそれが機能することを期待していませんでしたが、それは機能します...ある意味で、それはledを設定しますが、capslockステータスも設定します。上記のすべてのコードを完全に理解しているわけではないので、ばかげた間違いをしたかもしれません。どうやら、行XChangeKeyboardControl...はプログラムの動作を変更せずXkbLockModifiers、ledとcapslockステータスを設定するものです。


xdotool key Caps_Lock許可されたXクライアントから何かを行うことができますが、これにより実際にCaps Lockがオンになります。
マークプロトニック2015年

@MarkPlotnickポイントは確かにCapsLockをオンにしないことです。LEDに触れずにCapsLockをオフにする方法はありますか?
T. Verron、2015年

私はxtermソースを見て、XChangeKeyboardControl()への呼び出しを使用して、Caps Lockなどの状態に影響を与えずにLEDを設定または設定解除します。したがって、Cコードをコンパイルできる場合、それは1つのアプローチです。
マークプロトニック2015年

@MarkPlotnick xtermLEDに影響しますか?それは良い考えのように思えます、私の結果で質問を編集します。
T. Verron、2015年

私が得たxtermファイルごとのように、エスケープシーケンスESC [3 Q、送信することにより、スクロールロックLEDライトアップにctlseqs.txtソースが付属していますが、パラメータ1及び2の光までのNumまたはCapsLockのLEDを得ることができませんでしたたぶん私はする必要があります回答に記載されているXKB構成を行います。xtermとを呼び出しますXChangeKeyboardControlxtermShowLED、どこにxtermClearLEDsも呼び出しませんXkbLockModifiers
Mark Plotnick、2015年

回答:


7

原則として、由緒あるxsetコマンドでそれを行うことができるはずです。

xset led named 'Caps Lock'

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

ただし、これは確実に機能するとは思われません。私のマシンでは、この方法でのみScroll Lockを設定できます。私だけではありません。これはXKB設定の問題のようです。

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

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

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

    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をオフに切り替えることはできません。


ありがとう!私はxset以前に試しましたが、実際には機能しません。私はこのバグ報告を見ていませんでした。とにかく、「Status:Resolved Wontfix」は本当に有望ではありません...回避策allowExplicitはおそらく私にとってはうまくいきますが(LEDをオフにする必要はありません)、それを変更するにはまだrootが必要です。
T.ヴェロン

@ T.Verron XKB構成を変更するためにrootである必要はありません。xkbcompいつでもお電話いただけます。私はXKBを十分に理解していないので、変更する必要があるものを正確に伝えることはできません(XKBで完全に事前定義されたマップではなく特定のアスペクトを設定するのは少し面倒です)が、unix.stackexchange.com / questions / 166844 / mapping -key-bindings /…にはいくつかのポインタが必要です。
Gilles 'SO-邪悪なことをやめなさい'

ああ、良い点。まあ、初めての試みとして、私が試した:xkbcomp $DISPLAY output.xkb、そして置き換えること!allowExplicitによってallowExplicitindicator "Caps Lock"でファイルを再読み込み、その後、セクションxkbcomp output.xkb。多くの警告があり、その後xsetはうまく機能しません。xkbについてもう少し読みます。
T. Verron、2015年

1
この種は私のために働いた。変更したファイルをインポートした後、いくつかのエラーメッセージが表示され、LEDを点灯させることができましたが、他のものがめちゃくちゃになり、再起動しても生き残りませんでした。それで、私は編集さ/usr/share/X11/xkb/compat/ledcapsれた... / lednumを先に進め、これはそれを永続的なものにしました。
jtgd

0

使用する sed

$ sudo sed -i 's|\!allowExplicit|allowExplicit|g' /usr/share/X11/xkb/compat/ledcaps

ログアウトしてから再度ログインすると、Caps LockLEDは次rootのコマンドを使用して特権なしで制御できるようになります。

$ xset led named 'Caps Lock'
$ xset -led named 'Caps Lock'

しかし、これにはルートが必要です。
T. Verron

@ T.Verron一度だけ設定ファイルを変更しsudo、その後は二度と変更しません。これが特定のユーザーにとって非常に重要である理由を理解するには、このvimアプリケーションを参照してください。
Serge Stroobandt

3年前に質問したことで、なぜ一部のユーザーにとってそれが重要であるのかを明確に理解しています(私の場合、capslockを有効にしてから制御するためにcapslockを再マッピングした後、Appleキーボードの愚かな遅延を回避することでした)。しかし当時は、仕事用のコンピューター用だったので、ルートアクセスがまったくないソリューションが特に必要でした。受け入れられた回答には、さらにいくつかの手順が含まれますが、sudoがなくても機能します。
T. Verron

@ T.Verronわかりました。共有システムは、これが機能しない別のケースです。それにも関わらず、私は最後のコメント投稿者が受け入れられた回答を率直に言うのが好きで、それをsed1行にまとめました。
Serge Stroobandt

0

@Gillesによるroot-lessアプローチと@Serge_Stroobandtによる完全自動化のアイデアの組み合わせ。

Caps LockNum LockShift 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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.