[Anthy-dev 511] Re: uimのキーバインド定義を簡単に

アーカイブの一覧に戻る

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*****



Anthy-dev メーリングリストの案内
アーカイブの一覧に戻る