Waydroidで英語のときだけテンキーが効かない原因を、AndroidとWaydroidのソースから調べた

LinuxでAndroidを動かすWaydroidの中で、テンキーの数字が打てなくなった。キーボードをGboardの「日本語」にすると打てて、「English (US)」にすると打てない。上段の数字キーは、どちらでも打てる。ホスト(Arch Linux、sway)でテンキーを打つと、数字が出る。 swayの設定に input * xkb_numlock enabled を足したが、直らなかった。なぜ効かないのかを、ソースと実測で調べた。 先に結論 ホストのNumLockの状態は、Waydroidの中のAndroidに渡らない。swayの設定は、Waydroidには効かない。 AndroidのNumLockは、Waydroidの中で、入った直後に消されている可能性が高い。ソースの読みと実測が合っているが、消す判定の値そのものは、見ていない。 Androidのアプリで、テンキーを数字に割り当てるキーレイアウトを足したら、英語のままテンキーが打てた。 ソースで分かったこと 読んだのは、WaydroidのHWC(android_hardware_waydroidのhwcomposer/wayland-hwc.cpp)と、Android 13(android13-release)の入力まわり、Waydroidが当てるパッチ(android_vendor_waydroid)。 1. ホストのキーは、キーコードのまま渡される。修飾キーの状態は渡されない。 HWCは、Waydroidのウィンドウに入ったキー入力を、キーコードの形で、Android側のパイプ(/dev/input/wl_keyboard_events)に書く。Waylandの修飾キーの状態を受け取る関数 keyboard_handle_modifiers は、中身が空になっている。ホストのNumLockがオンでも、Androidはそれを知らない。 2. テンキーの数字は、AndroidのNumLockがオンのときだけ出る。 Android 13の Generic.kcm では、NUMPAD_1 は、base: fallback MOVE_END、numlock: '1' と定義されている。NumLockがオフなら、Endキーになる。 3. NumLockの状態は、キーを離したときに切り替わる。 Keyboard.cpp の toggleLockedMetaState は、キーを押したときは何もせず、離したときに、状態を反転する。 4. Waydroidが作る入力機器は、出せるキーを2つしか登録していない。 WaydroidのEventHubのパッチ(Android 13用の 0004-EventHub-Add-wayland-inputs-support.patch)は、wayland_keyboard の keyBitmask に、BTN_MISC と KEY_OK だけを登録する。 AndroidのEventHubの markSupportedKeyCodes は、キーレイアウトにそのキーがあっても、この登録に無いキーは、「機器に無いキー」と判定する。KeyboardInputMapper::updateLedState は、NumLockのキーが無い機器について、NumLockの状態を消す。 NumLock(コード69)は、この登録に入っていない。 実測 dumpsys input で、入力機器の状態を取った。キー入力の履歴を含まない部分だけを、次のように取り出せる。 sudo waydroid shell dumpsys input | sed -n '/Input Reader State/,/Input Dispatcher State/p' > out-1.txt Copy wayland_keyboard の項目の、MetaState(修飾キーとロックの状態)と、DownTime(最後にキーが押された時刻)を、見た。 ...

Street Fighter 6 (Proton) で日本語入力ができない問題は /etc/environment のIME環境変数で解決した

訂正 (2026-08-08) この記事の当初の結論「ユーザー側の設定では解消できない」は 誤りでした。 /etc/environment にIME環境変数を設定することで、Ctrl+Space での直接入力が動作するようになりました。 結論だけ必要な方は 追記: 解決した へ。 以下の調査記録は、当時どう考えて誤った結論に至ったかの記録として、そのまま残します。 事象 Street Fighter 6のチャット欄でCtrl+Space(fcitx5のトリガーキー)を押しても、日本語入力(Mozc)に 切り替わらない。ローマ字のまま反応しない。 項目 値 OS Arch Linux WM Sway (swayfx) IME fcitx5 + fcitx5-mozc ゲーム Street Fighter 6 (Steam, AppID 1364780) Proton Proton Experimental / GE-Proton11-3 当時の結論(誤り) Proton公式ビルドは意図的にXIMを無効化しており、加えてWineの新しいIME実装がキー入力を XIMサーバーまで橋渡ししていない。この二つが重なっているため、レジストリでXIMを 再有効化しても効果が出ない。Street Fighter 6固有の不具合ではなく、Wine/Proton全体に 共通する構造的な制約であり、ユーザー側の設定では解消できない。 ——これが誤りだった。 実際には環境変数がゲームの起動経路まで届いていなかっただけの可能性が高い。 詳細は末尾の追記を参照。 当時の根拠 以下は2026-08-06時点で実際に観測した内容。観測自体は正しいが、そこから導いた結論が誤っていた。 Sway/fcitx5の設定は正常 — Ctrl+Spaceに該当するbindsymはなし、GTK_IM_MODULE/ QT_IM_MODULE/XMODIFIERSはenvironment.dで正しく設定済み、fcitx5のトリガーキーも Control+spaceのままでXIMアドオンも無効化されていない。 後から振り返ると、ここが見落としの核心だった。 「environment.dで設定済み」であることは確認したが、 その変数がSteam経由で起動されるゲームプロセスまで届いているか は確認していなかった。 Protonは意図的にXIMを無効化している — Proton公式リポジトリのIssueに記載がある。 XIM is disabled for working around a X11 issue ...

Waydroid Binder/BinderFS

Waydroidが起動しない原因とBinder/BinderFSの仕組み

概要 Arch Linux で Waydroid を動かそうとした際、 「Can't open /dev/anbox-binder: No such device or address」というエラーが発生した。 原因は カーネルが BinderFS を正しくマウントしていなかったことにあった。 ここでは、Binder/BinderFS の役割と、実際に動作させるまでの手順をまとめる。 1. Binder と BinderFS の違い Android のアプリ間通信(IPC)は Binder ドライバで実現されている。 Linux でこれを再現するためには、カーネルモジュールと特別な仮想ファイルシステムが必要になる。 名称 説明 /dev/binder Android のプロセス間通信 (IPC) のコアデバイス /dev/hwbinder ハードウェア抽象層 (HAL) 用 Binder /dev/vndbinder ベンダーサービス用 Binder BinderFS これらのデバイスノードを動的に管理するためのファイルシステム 昔の環境では /dev/binder を直接作っていたが、 最近の Waydroid や Mainline カーネルでは BinderFS を使うのが標準。 2. エラーの原因 Waydroid 起動時のログ: [gbinder] ERROR: Can't open /dev/anbox-binder: No such device or address [08:49:18] Failed to add presence handler: None Copy これは、/dev/anbox-binder が存在しても中身が無効、 つまり Binder デバイスがカーネル側で認識されていないことを意味する。 ...