私は導かれた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ステータスを設定するものです。
xtermソースを見て、XChangeKeyboardControl()への呼び出しを使用して、Caps Lockなどの状態に影響を与えずにLEDを設定または設定解除します。したがって、Cコードをコンパイルできる場合、それは1つのアプローチです。
xtermLEDに影響しますか?それは良い考えのように思えます、私の結果で質問を編集します。
xtermファイルごとのように、エスケープシーケンスESC [3 Q、送信することにより、スクロールロックLEDライトアップにctlseqs.txtソースが付属していますが、パラメータ1及び2の光までのNumまたはCapsLockのLEDを得ることができませんでしたたぶん私はする必要があります回答に記載されているXKB構成を行います。xtermとを呼び出しますXChangeKeyboardControlがxtermShowLED、どこにxtermClearLEDsも呼び出しませんXkbLockModifiers。
xdotool key Caps_Lock許可されたXクライアントから何かを行うことができますが、これにより実際にCaps Lockがオンになります。