YamaKen
yamak****@bp*****
2004年 2月 5日 (木) 06:43:24 JST
At Wed, 04 Feb 2004 10:37:31 -0600, komat****@taiya***** wrote: > > At Wed, 04 Feb 2004 18:37:44 +0900, > YamaKen wrote: > > > > それと、上記のいずれにするにしてもcase insensitiveをどう表記する > > > > か考えないといけませんね。ちょっと短かめにして<IgnoreCase>とかで > > > > しょうか。 > > <IgnoreCase>はEmacsとかでそれなりに使われてるから大丈夫なんじゃ > > ないかと思いますが… 違和感ありますかね? > > この <IgnoreCase> って、<Shift> での置き換えは可能でしょうか? > # 置き換えるとややこしくなってしまうのであれば、無意味ですけども。 <IgnoreCase>はuimにおける大文字小文字の扱いが明確に決まっていな いために暫定的な仕組として導入しました。ユーザに取って良くないモ デルだという事は認識しています。 現在のuimでは「物理的に押されたキー」と「キー入力を受けてキーボー ドドライバが生成した文字」を区別していません。 例えば "<Ctrl>a" という入力を捕えたい場合、「物理的に押されたキー」 として見るなら以下のように検出するでしょう。 (key == Key_A && key_state == Key_Control) しかし、uimではprintableな文字のキーに対してはkeysymが割り当てら れておらず、「キー入力を受けてキーボードドライバが生成した文字」 の方しか見れません。この文字にはShift情報が適用済なので、 "<Ctrl>a"という入力の捕え方には以下の2通りがあります。 (!strcmp(key, "a") // 小文字の"a"のみを受け付ける && key_state == Key_Control) (!strcmp(tolower(key), "a") // CapsLock有効状態の"A"も受け付ける && key_state == Key_Control) また、"A"を捕えたい場合も、「物理的にShiftが押されている」事を検 出したいのか、「大文字アルファベットが入力された」事を検出したい かで以下の2通りに分かれます。 (!strcmp(tolower(key), "a") // CapsLock有効状態の"a"も受け付ける && key_state == Key_Shift) // 物理的にShiftが押されている (!strcmp(key, "A")) // CapsLock有効状態の"A"も受け付ける // Shiftが押されている/いないは無視 #書いていて気付きましたが、<IgnoreShift>もあった方がいいですね このような現状をありのままに反映して作ったのがmake-key-predicate です。内部処理の置き換えにも使うのでとりあえず低レベルなところま で見えています。uimで「キー入力と文字入力の区別」が明確になるま でには長い議論と多くのコード修正が必要なので、思考停止して対症療 法でしばらく楽になろうという魂胆です。 「キー入力と文字入力の区別」は特にPDA環境で重要なので、他の優先 事項が片付いてきたら改めて提案したいと思います。だいぶ先になると 思いますが。 ------------------------------- ヤマケン yamak****@bp*****