以前こちらで書いたように Android 9.0 Pie 以降は、外付けキーボード利用時に Control + SPACE のキー入力ができなくなっています。「キーボードレイアウトの切り替え」操作に割り当てられているためです。
ソフトウエアによっては Ctrl + SPACE を使いたい場合も多いので、無理やり使えるようにしてみました。
Ctrl + [SPACE] を乗っ取っているのは Android なので、Android 側で Ctrl を利用頻度の低いキーと交換してしまいます。例えば [F12] など。ただし入れ替えは UserLAnd + Linux (xmodmap) で識別可能なキーに限ります。本当は Caps が使えればよかったのですが Linux 側でうまく識別できませんでした。
もちろん Android 側では Ctrl キーが [F12] に置き換わってしまうため、ハードウエアキーボードで Ctrl を使った操作が困難になります。また xmodmap を使ったキー入れ替えは VNC/XSDL のみ有効で UserLAnd の SSH では使えません。
Step 1 : Android 側の入れ替え (kcm)
[Ctrl] ←→ [F12]
・Android 側の「キーボードレイアウト切り替え操作」 は [F12]+[SPACE] になります。
Step 2 : UserLAnd Linux 側の入れ替え (xmodmap)
[F12] ←→ [Ctrl]
・[F12] に偽装した本来の [Ctrl] キーを Ctrl として使えるようになります。
● (1) kcm キーレイアウト作成
Android 側でキー入れ替えを行うには kcm ファイルを作成し、新しいキーボードレイアウトを登録します。今回は下記 nakajit さんの code を利用させていただきました。
・GitHub: nakajit/InputDevices4J
InputDevices4J/res/raw/keyboard_layout_japanese_ime_cc_ek.kcm を下記のように書き換えました。(Caps ←→ Ctrl, ESC ←→ 半全 が不要な場合は他のファイルを使用してください)
~ map key 58 CTRL_LEFT # CAPS_LOCK ~
↓ 該当部分を下記のように修正
~ map key 58 F12 # CAPS_LOCK map key 88 CTRL_LEFT # F12 ~
● (2) 書き換えたプロジェクトを apk にビルドしてインストールします
● (3) 設定からレイアウトを選択
設定→システム→言語と入力→物理キーボード→キーボードレイアウトの設定
keyboard_layout_japanese_ime_cc_ek.kcm の場合は「日本語 106/109 (IME用, C-C, E-H/Z)」を選びます。
選択すると Caps キーが [F12] に置き換わるので注意。
● (4) xmodmap での設定
UserLAnd から VNC を起動して xmodmap ファイルを作ります。
remove Control = Control_L keysym Control_L = F12 keysym F12 = Control_L add Control = Control_L
↑この内容を仮に .Xmodmap-F12 で保存したら
$ xmodmap .Xmodmap-F12
を実行します。
これで Android 9.0 でも UserLAnd (X11) 上で [Ctrl]+[SPACE] が使えるようになりました。
同じように、[半角/全角] キーや [変換] キーなども [F11], [F10] とか割り当ててしまえばおそらく UserLAnd 上で使用できるようになると思われます。
関連エントリ
・Android Termux で日本語入力を行う / UserLAnd との併用
・Android 9.0 と Bluetooth Keyboard による日本語入力
・Android で動く Linux 環境 UserLAnd が XServer XSDL に対応
・Oculus Go を文章書き&開発マシンにする
・UserLAnd とブラウザ
・Android 上の開発環境と UserLAnd
・OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
・ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd