web-dev-qa-db-ja.com

X /コンソールにとらわれない方法でコンソール(tty)とXの両方のキーボードレイアウト/マッピングを変更しますか?

X Window System~/.Xmodmapを使用して実行されているときに、キーボードのレイアウト/マッピングを変更できました(そして Xプロトコル)を使用して行うこともできると思います 直接、たとえば libxcb をXプロトコル呼び出しのラッパーとして使用)。

loadkeysを使用して、コンソール/ ttyで(つまり、Xが実行されていないときに)同じことを(ある程度)行うことができました。

同様にキーボードレイアウトをカスタマイズする方法はありますが、単一のソースから、Xとコンソールの両方に影響を与えるような方法で、つまり「Xとコンソールにとらわれない」方法で?

(私が考えることができる唯一の方法は、カーネルの入力インターフェースevdevとやり取りし、必要な入力を(uinput?を介して)送信する「キーボードドライバ」、または何かを書くことです、でもこれが理にかなっているのか、もっと簡単な方法があるのか​​はわかりません。)

4

はい、方法があります。これが、Debianのconsole-setupパッケージが実際に行う方法です。

  • キーボードレイアウトは、管理者がkeyboard、通常は/etc/default/keyboardという名前のファイルでXKB用語(モデル、レイアウト、バリアント、オプション)で指定します。これは単一のソースです。テキストエディタで編集できます。
  • setxkbmapプログラムには、これらと同じXKB設定が与えられ、それに応じてX11サーバーが構成されます。
    • キーボード設定パッケージのインストール後のメンテナスクリプトは、X [11]ディスプレイでそれ自体が見つかった場合、/etc/default/keyboard設定でsetxkbmapを直接実行します。したがって、X11 GUI端末エミュレータからdpkg-reconfigure keyboard-configurationを実行すると、X11キーボードレイアウトに影響します。
  • setupconスクリプトはこれらのXKB設定を受け取り、それらをckbcompユーティリティに渡してキーボードマップを生成し、そのキーボードマップをloadkeys/kbdcontrol。を使用してカーネル仮想端末にロードします。
    • このスクリプトは、サービスによってシステムbootstrapで実行されます。
    • それ以外の場合は手動で実行することもできます。

他のsystemdオペレーティングシステムは動作が異なりますが、ソースも1つです。

  • XKBレイアウト、バリアント、およびオプションは/etc/X11/xorg.conf.d/00-keyboard.confに格納されます。これは単一のソースです。
    • このファイルは、起動時にX11サーバーによって直接読み取られ、X11キーボードマップを直接設定します。
    • このファイルは、起動時にsystemd-localedによって解析されます。 systemd-localedの実行中は、サービスがそのメモリ内の情報で穏やかにファイルを上書きするため、ファイルをテキストエディタで効果的に編集することはできません。
    • XKB情報を変更するには、localectlを実行します。これは、systemd-localedと通信する別のサーバーと通信します。
  • systemd-localedは、/usr/share/systemd/kbd-model-mapのマッピングを使用してXKB設定を仮想端末のキーボードマップ名に変換し、/etc/vconsole.confに書き込みます。 Debianシステムとは異なり、XKB情報からオンザフライでマップを生成せず、マップファイルにリストされている事前に提供された静的マップのみを選択します。
  • systemd-vconsole-setupはブートストラップで実行され、/etc/vconsole.confを読み取り、loadkeysを実行してキーボードマップをカーネル仮想端末にロードします。

参考文献

10
JdeBP