日本語入力中にエスケープキーを押すとクリアと通知させたい
ATOK 2013 で、入力文字を確定するために Enter を押したときにも「クリア」と通知される現象を確認しました。
Windows 7 32ビット+メモ帳でご報告いただきましたが、私の Windows 8 64ビットでも再現しました。
imeclear の下記の作業を評価中です。今のところ問題は報告されていません。
https://bitbucket.org/nvdajp/nvdajp/commits/4b83aa91d4d248667ee876b532fd4c255760909c?at=imeclear
2013.2jp にマージするかどうかを判断しているところです。
2013.1jp で本家の IME 対応を日本語化したときには、独自に行った拡張はすべて設定で無効化できるようにしました。
今回の修正も、「日本語版の文字入力拡張」をオフにしたら本家版の挙動に戻せるようにするかどうかを、合わせて検討します。
開発スナップショット jpdev130823
https://dl.dropboxusercontent.com/u/62564469/nvda_snapshot_jpdev130823.exe
ブランチ imeclear ハッシュ f0502d2 です。
本家の rc をマージしているので、2013.2jp のリリース候補としての作業です。
既存の実装との整合性を考慮して、「日本語版の文字入力拡張」をオフにしたら本家版の挙動に戻せるようにしました。
また「日本語版の説明」とその英語版ドキュメントに、この仕様変更について加筆しました。
imeclear 424f716 にて、本変更とは直接関係ないと思われる tsf.cpp の変更を元に戻しました。
release-2013.2jp ブランチに imeclear をマージしました。
$ git merge imeclear Updating a11ff7c..424f716 Fast-forward source/NVDAHelper.py | 9 ++++++++- source/locale/ja/LC_MESSAGES/nvda.po | 5 +++++ user_docs/en/readmejp.t2t | 6 ++++-- user_docs/ja/readmejp.t2t | 6 ++++-- 4 files changed, 21 insertions(+), 5 deletions(-)
Microsoft IME (2003, 2010) と Microsoft Word (2003, 2010) の組み合わせで、Enter キーを押して確定したときにクリアと通知する現象を確認したため、本チケットに関する作業のやり直しを検討します。
キーイベントで判定する必要があるかも知れないので、要求仕様を整理するために IME のキー操作でクリアを通知する可能性があるものを調べてみました。
ATOK: Esc, Ctrl+[ (開き大かっこ)
Microsoft IME: Esc, Shift+Esc, Ctrl+Z
いずれも Windows 8 で「全文字消去」の動作を確認しました。
以下、参考Webサイト:
misono さんの修正提案 fiximeclear をマージしました。
To ssh://git@bitbucket.org/nvdajp/nvdajp.git
実装から判断すると以下の仕様になっています:
次のリリース候補にこのままマージするか、さらに修正するか、検討中です。
追加の修正をしていただいたので imeclear ブランチにマージしました。
To ssh://git@bitbucket.org/nvdajp/nvdajp.git
バックスペースキーで1文字ずつ削除したときの処理を実装していただいたのですが、なぜか、クリアと読む場合と読まない場合がはっきり分かれています。
具体的には、「あ」「か」「さ」など、ア段の文字はカナ1文字だけを入力してすぐバックスペースを押すと「クリア」と読むのですが、「い、う、え、お」「き、く、け、こ」など、ア段以外の文字は、1文字だけ入力してすぐ削除しても「クリア」という通知がありません。
Windows 8 64ビット、メモ帳、Microsoft IME および ATOK 2013 で同じような状況です。
点字ディスプレイをつないで検証してみるべきですが、まだやっていません。
もう少し調べてみます。
いま作業中の箇所が呼ばれるタイミングと「直前に押されたキーのキーコードの更新」の順序が不定であるために、 A I U E O など直前の入力文字のキーコードを判定する必要が出てきています。
作業中の箇所が呼ばれるのは、変換候補文字列が確定されて empty になるか、入力コンポジションのセッションがキャンセルされて empty になるか、どちらかしかないように思えるので、キャンセルになるべき操作だったかどうかを定義するよりも、確定になるべき操作かどうかを定義して判定するほうが、安全な実装になるのではないか、思い始めました。
もう少し考えてみます。
作業時間が取れなくて遅くなってしまいましたが、最新の fiximeclear で本件の再確認をしています。
Windows 8 64ビット、Word 2013、Microsoft IME の組み合わせで、キーボード設定「コマンドキーの読み上げ」を有効にすると、エンターで確定したあとでアプリケーションのウィンドウタイトルを読み上げたり、クリアと読み上げたりする現象が発生しています。
「コマンドキーの読み上げ」は初心者向けの教材で推奨されていることがあるので、対応が必要と思います。
もう少し調べてみます。
Windows XP sp3 と Office IME 2010, Word 2003 の組み合わせでも、「コマンドキーの読み上げ」有効のときに、日本語変換を確定した後の冗長なメッセージが発生するようです。
確認に使っている実行ファイル(電子署名なし)を下記においておきます。
https://dl.dropboxusercontent.com/u/62564469/nvda_jpime130907.exe
コマンドキーを読みあげるとそのタイミングの影響で、getAsyncKeyState がうまく動かないのかも知れません。。
release-2013.2jp から派生した2種類のブランチについて、下記の作業をしました。
noimefix ブランチ:imeclear の実装をいったん削除する
imeclear ブランチ 0d345da : 「コマンドキーの読み上げ」がオフのときにだけ imeclear の処理を有効にする
どちらも bitbucket にだけ push してあります。
https://bitbucket.org/nvdajp/nvdajp/commits/all
どちらかを 2013.2jp にするか、他の選択肢を探すか、あるいはもっと 2013.2jp の開発に時間をかけるか、あと1日、ご意見を待ちつつ、考えてみます。
コマンドキーの読み上げがオフのときだけ imeclear という実装を jpime130907a としてビルドしました。
https://dl.dropboxusercontent.com/u/62564469/nvda_jpime130907a.exe
下記の修正が反映された状態で再度動作確認をしています。
To git@bitbucket.org:misono/nvdajp.git 6226d1e..4a4e47e fiximeclear -> fiximeclear
コマンドキーの読み上げの影響そのものは解決されたようです。
新たなテスト条件として、点字ディスプレイへの出力を有効にすると、Word 2013 やワードパッドで、エスケープキーを押したの挙動が不確実になります。
具体的には「クリア」とだけ読み上げたり、削除された文字列だけを読み上げたり、その両方を読み上げたり、のどれが起こるか確実ではありません。
コマンドキーの読み上げの設定には関係ないようです。また、ATOK 2013 と Microsoft IME の両方で同じ状況のようです。メモ帳では起こらないので TSF には依存しているようです。
Windows 8 64ビットで、USB 仮想 COM ポート接続で BM46 を使って試しています。
もう少し調べてみます。
現状の実装では本チケットを「完了」にできそうにないので、いったん 2013.2jp のマイルストーン指定を解除したいと思います。
getAsyncKeyState をなるべく使わない実装に書き直してみましたが、まだバックスペースの処理がうまく書けないので、検討中です。
To ssh://git@bitbucket.org/nvdajp/nvdajp.git ea692ce..9582b44 imeclear -> imeclear
コメントの追加などを行いました。
また、エスケープが押されたときの通知を音声のみにしました。
これはバックスペースの処理に合わせる意味と、文字が消えたときに一時的なメッセージ表示でエディットコントロールの内容を隠すよりも、エディットコントロールそのもので文字が消えたことをすぐに示したほうがよいのではないかという考えです。
バックスペースの処理については、getAsyncKeyState の最下位ビット判定で BM46 のバックスペース操作にもうまく対応できているので、このままにするか、同等の処理を keyboardHandler に追加するか、もうすこし検討します。
To ssh://git@bitbucket.org/nvdajp/nvdajp.git 9582b44..cbdec8a imeclear -> imeclear
この件については現在の jpnext の実装で作業完了にして jpbranch にマージしたいと思います。
jpbranch に imeclear ブランチをマージしました。
To ssh://git@bitbucket.org/nvdajp/nvdajp.git 941f679..705facc jpbranch -> jpbranch
日本語入力中にエスケープキーを押すとクリアと通知させたいということで、下記の変更を検討中です。
https://bitbucket.org/nvdajp/nvdajp/commits/492608e63fa3fb78fd448a5d6fae18cb3eee5a9f?at=imeclear
本家のもともとの実装では、入力が取り消されたときに、取り消された文字を通知するようになっており、ここを仕様変更する実装になっています。
本家へのパッチ提案の可能性もあるので、ここに情報をまとめておきます。