なぜか私のノートパソコンはCaps Lockで止まってしまいます。 xmodmapでCaps Lock</kbd> キーを
hyper_lにマッピングしているので、それをオフにするための
caps_lock` キーがありません。 コマンドラインでそれをオフにする方法はありますか? 特に今後の参考のために、コンピュータをリセットすることなくロック状態をリセットできればいいのですが。 以前にもこのようなことがありましたが、今回は正しく行う方法を今知りたいのです。
Ubuntuでは、そのためのコマンドラインツールを知りません'。(Num Lock については、numlockx ] があります。)ターミナルウィンドウにコピーペーストできるワンライナーはこちらです。
python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'
ここでもう一度、より拡大した形で示します。Python](https://help.ubuntu.com/community/PythonRecipes) ctypes library を使って X library から C の関数を直接呼び出しています。関数 XkbLockModifiers
はキーボードロックの状態を変更します。コアキーボード (XkbUseCoreKbd
= 0x0100) では、Caps Lock (2) に影響を与え、0 (off) にセットしています。
#!/usr/bin/env python
from ctypes import *
X11 = cdll.LoadLibrary("libX11.so.6")
display = X11.XOpenDisplay(None)
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)
スタックモディファイアがある場合、2をオフにしたいモディファイアのマスクに変更します。修飾子は1=Shift, 2=Lock (Caps Lock), 4=Control, 8=Mod1、16=Mod2、32=Mod3、64=Mod4、128=Mod5です。xmodmap -pmを実行すると、Mod1 から Mod5 が何に対応するかを見ることができます。例えば、すべてのモディファイアをオフにするには、
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0))を呼び出します。Mod2 にある Num Lock をオンにし、同時に Caps Lock をオフにするには、
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16))` をコールしてください。
Pythonを呼び出す代わりに小さなバイナリを作りたい場合のCバージョンはこちらです。gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11でコンパイルします。パッケージ
build-essentialsと
libx11-dev` はインストールされています。
#include <stdio.h>
#include <X11/X.h>
#include <X11/XKBlib.h>
int main()
{
Display *display = XOpenDisplay(NULL);
if (display == NULL) {
fprintf(stderr, "Couldn't open display\n");
return 2;
}
Bool sent = XkbLockModifiers(display, XkbUseCoreKbd, LockMask, 0);
if (!sent) {
fprintf(stderr, "Couldn't send LatchLockState\n");
return 1;
}
#ifdef REPORT_STATE
XkbStateRec xkb_state;
Status status = XkbGetState(display, XkbUseCoreKbd, &xkb_state);
if (status) {
fprintf(stderr, "XkbGetState returned %d\n", status);
return 1;
}
printf("state.group=%02x\n", xkb_state.group);
printf("state.locked_group=%02x\n", xkb_state.locked_group);
printf("state.base_group=%02x\n", xkb_state.base_group);
printf("state.latched_group=%02x\n", xkb_state.latched_group);
printf("state.mods=%02x\n", xkb_state.mods);
printf("state.base_mods=%02x\n", xkb_state.base_mods);
printf("state.latched_mods=%02x\n", xkb_state.latched_mods);
printf("state.locked_mods=%02x\n", xkb_state.locked_mods);
printf("state.compat_state=%02x\n", xkb_state.compat_state);
printf("state.grab_mods=%02x\n", xkb_state.grab_mods);
printf("state.compat_grab_mods=%02x\n", xkb_state.compat_grab_mods);
printf("state.lookup_mods=%02x\n", xkb_state.lookup_mods);
printf("state.compat_lookup_mods=%02x\n", xkb_state.compat_lookup_mods);
printf("state.ptr_buttons=%02x\n", xkb_state.ptr_buttons);
#endif
int err = XCloseDisplay(display);
if (err) {
fprintf(stderr, "XCloseDisplay returned %d\n", err);
return 1;
}
return 0;
}
また、Caps Lockを一時的に無視する方法も興味深いかもしれません。
xkbset nullify lock
この後、xkbset nullify -lock
で有効にするまで、Caps Lock は実質的に永久にオフになります。
必要なキーイベントを送信するために、X automation ツールを使用することができます。
注意事項:
本ソリューションを初めて使用する場合、新しいツールをインストールするために正しいパスワードを入力する必要があります。 CAPSは現在有効です。
- 小文字を入力するために SHIFT キーを使用します。
- アクセシビリティを有効にし、仮想キーボードをオーバーレイします。 外付けキーボードを挿し直す。(chris455]1に感謝します)。 office writerを開き、そこにパスワードを書き込む。 大文字小文字を変えてコピーし、パスワードダイアログに貼り付ける。
gt;これまでの方法がすべて不可能、もしくはうまくいかない場合は、 Gilles' answer / python script で行ってください。これは、追加のツールをインストールする必要はなく、プリインストールされている
python
&libX11
共有ライブラリのみを使用します。
xdotool`** を使用する。
1.インストール
sudo apt-get インストール xdotool
1.CAPSのダウン/アップイベントを送信する
xdotool キー Caps_Lock
もう一つのツールは xte
です。
1.インストールする
sudo apt-get install xautomationをインストールします。
1.CAPSロックダウン/アップイベントの送信
xte "キー Caps_Lock"
参考文献:
man xdotool
です。