cognitom / cognitom/windmill

Android でも言語切替をトグルではなく直接指定にできないか (ユーザー補助サービスの検討)

Open
#55 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
4
Forks
0
Avg merge
3d 5h
Merged PRs (30d)
4

Description

## 背景

issue #53 / PR #54 で、Ctrlタップの言語切替をトグルにした。Windows は `KC_LNG1` (かな) / `KC_LNG2` (英数) を交互に送るので、IME側とずれてももう一度タップすれば揃う。

Android だけがトグル (Ctrl+Space) のままで、IME側を別の手段で切り替えてずれると、キーボードのベースレイヤーと食い違ったまま自力では戻せない。

Android で `KC_LNG1`/`KC_LNG2` 自体は効くが、日本語IMEが入力欄を移るたびに既定のかなへ戻ってしまい、英数を保てない。そのため、IMEそのもの (日本語⇔英語) を切り替える形にしてある。

このissueは、Android でもモードを直接指定できないか調べた結果のメモ。**実機では何も試しておらず、以下はすべて公開ドキュメントを読んだ範囲の話。**

## 分かったこと

- Android 11 (API 30) 以降、ユーザー補助 (アクセシビリティ) サービスは [`SoftKeyboardController.switchToInputMethod(imeId)`](https://developer.android.com/reference/android/accessibilityservice/AccessibilityService.SoftKeyboardController.html) で **IMEを名指しで切り替えられる**。条件はその IME がインストール済みかつ有効なこと。戻り値で成否が分かる
- ユーザー補助サービスは、**物理キーのイベントを IME やアプリより先に受け取れる** (`FLAG_REQUEST_FILTER_KEY_EVENTS`)。握りつぶすこともできる
- つまり、キーボードが「日本語へ」「英語へ」の専用キーを送り、常駐するサービスがそれを受けて IME を切り替えれば、**Windows と同じくモードを直接指定する形にできる**。ずれてもタップし直せば揃う

## 制約

- **切り替えられるのは IME 単位。** Gboard の中の日本語と英語は同じ IME の中の「サブタイプ」で、これを外部のアプリから選ぶ公開APIは無さそう (`setCurrentInputMethodSubtype` / `setInputMethodAndSubtype` は非推奨か、IME自身・システム専用)
- したがって **英語側を別の IME にする必要がある。** Key Mapper の "Basic Input Method" は画面キーボードを持たない IME なので、物理キーボード専用なら足りそう
- **物理キーボードの配列 (英語(US)) は IME ごとの設定。** 英語用の IME にも設定し直す必要があるかもしれない

## まずコードを書かずに試す

[Key Mapper](https://f-droid.org/en/packages/io.github.sds100.keymapper/) (オープンソース) がまさにこの仕組みで動いていて、アクション一覧に [`Switch keyboard`](https://keymapper.app/user-guide/actions/) がある。

- 専用キーA → Gboard (日本語)
- 専用キーB → 英語用の IME

これで想定どおり動けば、自作アプリはほぼ同じことをするだけで、ユーザー補助サービスと設定XMLで数十行程度に収まるはず。

ただし `Switch keyboard` が Android 11 以降で追加の権限なしに特定の IME を選べるかは、ドキュメントに書かれておらず未確認。

## 気をつけること

- **専用キーは新しく用意する。** `KC_LNG1`/`KC_LNG2` は Symレイヤーの数字・記号と、かなの「も」の Shift+タップ (半角`?`) で一時的な切り替えに使っているので、サービスが横取りすると壊れる
- **そのキーが Android に区別できる形で届くか要確認。** Android の `KeyEvent` は F1〜F12 までで、F13以降は「不明なキー」扱いになる可能性がある。キーテスターのアプリで先に確かめる
- Android 13以降、ストア外から入れたアプリのユーザー補助を有効にするには「制限付き設定を許可」の手順が要る
- 機種によっては省電力機能でサービスが止められることがある
- すべてのキー入力がサービスを通る。自作なら問題ないが、他人のアプリを使うなら信頼できるかの話になる
- 別の方法として、adb で `WRITE_SECURE_SETTINGS` を与えて既定のIMEの設定を書き換えるやり方もあるが、公式に用意された手段であるユーザー補助のほうが素直

## ファームウェア側に要ること

Android モードのとき、Ctrl+Space の代わりに専用キーを切り替え先に応じて送るよう、`firmware/windmill.c` の `td_tap_confirm()` の Android 分岐を変えるだけ。PR #54 の作りにそのまま載る。

## 進め方

1. Key Mapper で `Switch keyboard` が期待どおり動くか実機で確認する
2. 専用キーに使えるキーコードを実機で探す
3. 動けばファームウェア側を直し、常駐アプリを自作するか Key Mapper に任せるかを決める

1と2が通らなければ、Android はトグルのままにする。

Contributor guide

No contributing guide indexed for this repository

Research direction

First test Key Mapper’s “Switch keyboard” action on a real device, then use a key tester to check which dedicated key codes Android can distinguish. If both tests succeed, inspect the Android branch of td_tap_confirm() in firmware/windmill.c and determine which dedicated keys it should send. Done means the Android mode can select Japanese and English directly; otherwise, leave Android using the toggle.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, c
Domain
embedded-iot, mobile
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.