web-dev-qa-db-ja.com

Caps-Lock切り替え効果を再マッピングまたは無効化せずに防ぐにはどうすればよいですか?

Caps-lockを取得して使用するX11プログラムがあります。問題は、通常のCapsLock切り替えを無効にしたいのですが、そうするとキーが無効になるようです。

したがって、X11がCaps-Lockキーを押すために取得するものは何でも(キーを無効にしたり、他のキーに再マップしたりせずに)取得する必要がありますが、キーをCaps-Toggleに変換するものは何もありません(カーネルレベルにある可能性がありますか? )。

スキャンコードを変更してみましたが、これはキーを再マッピングしただけです。 xmodmapを使用してcapslockエントリも削除しましたが、これによりキャップも無効になりました。

カーネルにcaps-key(通常の機能を書いたもの)を無視し、それでもメッセージをXに渡すように指示するにはどうすればよいですか?

もう少し詳細を追加するだけです:

私が実行しようとしている「プログラム」は、人間化された「enso」です。キーがない場合、「CRITICAL:root:Could n't find quasimode key」というエラーが表示されます。エラーがない場合は、ensoをcapsと一緒に使用できますが、ソファーは、ensoがまだそれを取得できる間にcaps機能を無効にする方法を理解していません。

22
Chris2048

の切り替えを無効にするテクニックがあると思います Capslock キーを完全に無効にしたり、キーボードの別のキーに再マッピングしたりしないでください。

コマンドを使用する場合:

setxkbmap -option caps:none

キーボードは切り替わりません。 Fedora 14を実行している私のラップトップでこれを確認しました。LEDが点灯しなくなり、正常です Capslock 機能はなくなりました。

ただし、xevを使用しても、キーが押されていることがわかります。

$ xev
...
...
KeyPress event, serial 35, synthetic NO, window 0x6800001,
    root 0xb1, subw 0x0, time 261504852, (167,-15), root:(353,268),
    state 0x10, keycode 66 (keysym 0xffffff, VoidSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 35, synthetic NO, window 0x6800001,
    root 0xb1, subw 0x0, time 261504971, (167,-15), root:(353,268),
    state 0x10, keycode 66 (keysym 0xffffff, VoidSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
    ...

したがって、キーが押されているイベントは、他のアプリケーションがそれらを取得できるようにそのまま残されます。

setxkbmap

ファイル /usr/share/X11/xkb/rules/xorg.lstには、setxkbmapに指定できるオプションの完全なリストが含まれています。

「キャップ」のこのファイルをざっと見て、次の行に気づきました。

caps:none            CapsLock is disabled

このファイルには他の値が含まれているので、これがそうでない場合は、代わりにこれらの代替値の1つが適しています。

$ grep cap /usr/share/X11/xkb/rules/xorg.lst
  grp:caps_switch      CapsLock (while pressed), Alt+CapsLock does the original capslock action
  grp:caps_toggle      CapsLock
  grp:shift_caps_toggle Shift+CapsLock
  grp:shift_caps_switch CapsLock (to first layout), Shift+CapsLock (to last layout)
  grp:alt_caps_toggle  Alt+CapsLock
  lv3:caps_switch      CapsLock
  lv3:caps_switch_latch CapsLock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)
  ctrl:nocaps          Make CapsLock an additional Ctrl
  ctrl:swapcaps        Swap Ctrl and CapsLock
  grp_led:caps         CapsLock
  caps                 CapsLock key behavior
  caps:internal        CapsLock uses internal capitalization. Shift "pauses" CapsLock
  caps:internal_nocancel CapsLock uses internal capitalization. Shift doesn't affect CapsLock
  caps:shift           CapsLock acts as Shift with locking. Shift "pauses" CapsLock
  caps:shift_nocancel  CapsLock acts as Shift with locking. Shift doesn't affect CapsLock
  caps:capslock        CapsLock toggles normal capitalization of alphabetic characters
  caps:numlock         Make CapsLock an additional NumLock
  caps:swapescape      Swap ESC and CapsLock
  caps:escape          Make CapsLock an additional ESC
  caps:backspace       Make CapsLock an additional Backspace
  caps:super           Make CapsLock an additional Super
  caps:hyper           Make CapsLock an additional Hyper
  caps:shiftlock       CapsLock toggles Shift so all keys are affected
  caps:none            CapsLock is disabled
  compose:caps         CapsLock
  shift:breaks_caps    Shift cancels CapsLock
  shift:both_capslock  Both Shift-Keys together toggle CapsLock
  shift:both_capslock_cancel Both Shift-Keys together activate CapsLock, one Shift-Key deactivates

参考文献

28
slm

あなたがしたくない場合 Caps Lock キーを押して通常の効果を得るには、Lock修飾子をオフにし、Caps_Lock keysym。

xmodmap -e 'clear Lock'

これは、私が 別の質問 に対して出した答えと非常に似ています。このxkbコードのスニペットでうまくいくはずです。

partial modifier_keys
xkb_symbols "capsoff" {
    key <CAPS> {
        type[Group1] = "ONE_LEVEL",
        symbols[Group1] = [ Caps_Lock ],
        actions[Group1] = [ NoAction() ]
    };
};
0
billyjmc