IME を独自に制御するアプリで読み上げの重複を回避する
NVDA 2014.2jp で以下のような実験をしてみました。
さらに実現できるとよさそうなもの:
これらに関する新しい設定項目をNVDA側に実装して、特定のアプリケーションを選択したときにトリガーされたプロファイルで「チェックなし」にしてもらうのが、本チケットに関するひとつの対応方法になりそうです。
本当にプロファイルのトリガーで候補ウィンドウの読み上げを制御できるかどうか、実験する必要はあります。
実験の追加:
「メモ帳」から IME の候補ウィンドウが開いた状態は、「メモ帳」のトリガーが解除されていないことが分かります。
さらに notepad プロファイルで「日本語版の文字入力拡張」をチェックなし、入力メソッド設定「選択した候補を通知」をチェックなしにすると、以下のような状況になります。
これらのことから、「日本語版の文字入力拡張」が無効の状態では、候補ウィンドウから Enter を押して確定したときに「メモ帳」のトリガーが解除されて、そのままフォーカス処理が不安定になるようです。
「日本語版の文字入力拡張」が有効であれば、入力メソッド設定「選択した候補を通知」チェックあり、チェックなしの違いはほとんどありません。 これは「選択した候補の通知」と重複する処理を「日本語版の文字入力拡張」で行っているためと思います。
プリエディット文字をバックスペースで削除したときに削除した文字が通知される処理は「コンポジションの更新を通知」チェックなしで止めることができます。
プリエディット文字がなくなったときに「クリア」と通知する処理は「日本語版の文字入力拡張」チェックなしで止めることができます。
ここまで追記した設定はすべて、設定プロファイルのトリガーが解除された状態では、自動的に元に戻ることを確認しています。
ブランチ ti33600 の作業:
[ti33600 7394fe2] work ti33600: announceSelectedCandidate option should enable/disable Japanese input support. 3 files changed, 3 insertions(+) To ssh://git@bitbucket.org/nvdajp/nvdajp.git * [new branch] ti33600 -> ti33600
「日本語版の文字入力拡張」がチェック、入力メソッド設定「選択した候補を通知」をチェックなしで、 以下を通知しないようにしました。
現状は Windows 8.1 64ビットの Microsoft IME だけ確認しています。
この仕様で、IMEを独自に読み上げるアプリケーションを、設定プロファイルのトリガー対象として「選択した候補を通知」をチェックなしにすれば、適切に使えるようになると思います。
入力モードの変更通知をどうするかですが、文字変換、変換停止、ひらがなローマ字、などのモード変更を独自処理で読み上げるアプリケーションがあるのかどうか、情報収集したほうがよいかも知れません。
ATOK の候補コメント通知を「日本語版の文字入力拡張」と「(入力メソッド)選択した候補を通知」の両方がチェックの場合にのみ行う修正:
To ssh://git@bitbucket.org/nvdajp/nvdajp.git 7394fe2..a2561b6 ti33600 -> ti33600
ALTAIR for Windows 10.53 が期待通りに制御できるかどうか確認しようとして、以下の問題に気づきました。
ALTAIL がフォアグラウンドのアプリケーションになると NVDA がアプリケーションスリープするので、 この状態で NVDA+N を押してもNVDAメニューを開くことができない。
そのため、設定プロファイルのトリガーを作るときに「現在のアプリケーション」で ALTAIR を選ぶことが(少なくとも簡単には)できない。
アプリケーションスリープ状態でも NVDA+N で NVDA メニューが開くようにする変更:
diff --git a/source/globalCommands.py b/source/globalCommands.py index d33dcf7..eda16eb 100755 --- a/source/globalCommands.py +++ b/source/globalCommands.py @@ -920,6 +920,7 @@ class GlobalCommands(ScriptableObject): gui.showGui() # Translators: Input help mode message for show NVDA menu command. script_showGui.__doc__=_("Shows the NVDA menu") + script_showGui.allowInSleepMode=True def script_review_sayAll(self,gesture): sayAllHandler.readText(sayAllHandler.CURSOR_REVIEW)
この変更をした実装で、以下を確認しました:
以上のことから、アプリケーションスリープ状態で NVDA+N を有効にするようにすれば、本件は解決すると思われます。
同じブランチに push までしておきました。
[ti33600 0389f4e] ti33660: enable NVDA+N in application sleep 1 file changed, 1 insertion(+) To ssh://git@bitbucket.org/nvdajp/nvdajp.git a2561b6..0389f4e ti33600 -> ti33600
日本語テスト版 jpalpha140626
https://dl.dropboxusercontent.com/u/62564469/nvda_jpalpha140626.exe
ブランチ ti33600 をマージしました(まだ jpbeta にはマージしていません)
事前の設定が必要ですが、IME の読み上げ重複の回避は、この方法による対応でよいか、ご検討ください。
念のために変更する項目をもう一度書いておきます:
またこのバージョンはスリープモードのアプリから NVDA+N でNVDAメニューが開くようになっています。
jpbeta に ti33600 をマージしました。
クローズする前にドキュメントの更新が必要。
NVDA 日本語版の説明を更新して本件の説明を書いたので、クローズします。
To ssh://git@bitbucket.org/nvdajp/nvdajp.git d825bcd..16aad7b jpbeta -> jpbeta
チケット #33646 アプリケーションスリープAPIに関する要望から本トピックを独立させます。
AppModule でNVDAをアプリケーションスリープしている WinAltair や、スリープAPIを使って独自に読み上げを制御しているボイスポッパーなどのアプリケーションで、 IME の読み上げが重複しているとのことです。
例えば NVDA 側に IME の読み上げを止めるオプションの追加を検討しています。 WinAltair がアクティベートしたときに設定プロファイルで IME 読み上げを止めることができたらいいのですが、 そもそもそういう制御がうまくいっていないことがこの問題の原因とも思われるので、 慎重に検討する必要があります。