以前こちらで書いたように 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