goo blog サービス終了のお知らせ 

Hironytic Status

ひろんの開発日誌

メニュートリガー

2007-09-21 00:49:09 | 情報
図の一番上に示したのは BeOS を日本語で使っているとときどき見かける
「ファイル(F) 」というメニューです。ここで注目してほしいのは最後になんかゴミのような点があるところ。実はこの点、メニュー項目をキーで選択する際のトリガーである F の下に引かれるべき下線が別のところに出ているんです。

その下に示した 2 つのメニューは、BeOS R5 と Haiku で次のように作成した 4 つのメニュー項目を表示させてみたものです。

menuItem = new BMenuItem("Haiku BEOS beos rebirth", new BMessage('MNU1'));
menuItem->SetTrigger('B');
popupMenu->AddItem(menuItem);

menuItem = new BMenuItem("Haiku BEOS beos rebirth", new BMessage('MNU2'));
menuItem->SetTrigger('e');
popupMenu->AddItem(menuItem);

menuItem = new BMenuItem("はいく BEOS beos rebirth", new BMessage('MNU3'));
menuItem->SetTrigger('O');
popupMenu->AddItem(menuItem);

menuItem = new BMenuItem("はいく BEOS beos rebirth", new BMessage('MNU4'));
menuItem->SetTrigger('s');
popupMenu->AddItem(menuItem);

まずは BeOS R5 の方で上の 2 つのメニュー項目に注目。トリガーに大文字を指定しても小文字を指定しても、その区別なく、その文字が前から見つかったところに下線が引かれます。ところが、大文字で指定した方は実はキーでは操作できません。いや、もしかしたらキーに大文字が割り当てられている Keymap で試せば操作できるのかもしれませんが、そこまでは試していません。通常は小文字が割り当てられていると思うので、基本的にトリガーは小文字で指定すると考えていいでしょう。

次に BeOS R5 の残り 2 つのメニュー項目に注目。こっちは O と s を設定してあるのにとんでもないところに下線が引かれてます。どうもこれ、UTF-8 のバイト数で割り出したインデックスを文字数として計算しているようなのです。
UTF-8では「はいく BEOS beos rebirth」は「E3 81 AF E3 81 84 E3 81 8F 20 42 45 4F 53 20 62 65 6F 73 20 72 65 62 69 72 74 68」というコード列になります。「は」が「E3 81 AF」という 3 バイトで表されるわけです。
このコード列から「O」(4F あるいは 6F)を探すと前から 13 バイト目に見つかります。これは文字数で言えば前から 7 文字目になるのですが、実際に下線が引かれているのは 13 文字目ですね。マルチバイト圏のことが考慮されていないバグでしょう。

さて、このバグ、Haiku では治っているのかな~?と思って実験してみたのが図の一番下のもの。
Haiku の方でも注目して欲しいのが上の 2 つ。BeOS R5 と異なり、トリガーに指定した文字の大文字・小文字を区別して下線が引かれています。これは微妙に困ります。例えば「File」とメニューに「f」のトリガーを与える場合を考えてください。BeOS R5 では小文字を指定しないと実質動かないのですが、Haiku で小文字を指定すると(「f」はラベルに見つからないので)トリガーの下線が引かれません。BeOS R5 と Haiku の両方でうまく行くようなプログラムは作れないのです。ちなみに、Haiku、このバージョンではキーによるトリガー操作は大文字も小文字も効きませんでした。

それはそうと、残り 2 つのメニュー項目が今回の実験のメインです。結論から言うと、BeOS R5 と全く同じ不具合を持ってます。そんなところは再現しなくていいんだってば。

Haiku の BMenuItem のソースを見てみた感じでは、strchr で得たインデックスを BFont::GetEscapements() に渡しているのが悪いみたい。GetEscapements() の第 2 引数はバイト数じゃなくて文字数ですからね。
あと、ソースレベルでしか確認してませんが、BMenuItem::SetTrigger() を呼んだあとで BMenuItem::SetLabel() でラベルを変えてもトリガーの下線位置が更新されないように見えます。これもおかしいんじゃないのかな?

ある程度予想はしていたことですが Haiku も細かいところで完成度がまだまだのようです。

(2007-09-29 13:47追記
みなさんの励ましと Google 言語ツールのおかげで、なんとか Haiku プロジェクトへバグ報告しました。
http://dev.haiku-os.org/ticket/1506
)

最新の画像もっと見る

9 コメント(10/1 コメント投稿終了予定)

コメント日が  古い順  |   新しい順
Unknown (Be名無しさん)
2007-09-21 21:07:59
バグ報告キボンヌ
返信する
Unknown (Koki)
2007-09-22 03:01:21
ひろんさん、Kokiです。

御無沙汰しています。

Haikuはまだpre-alphaなので、そういう細かいところのバグがたくさんありますし、未実装の部分もあります。

このようなバグがみつかったら、是非バグ報告してください。

http://dev.haiku-os.org

haiku-os.orgでアカウントを作ったら、バグデータベースにもログインできます。

ではでは。
返信する
バグ報告 (ひろん)
2007-09-26 09:28:30
私もバグ報告したいところなんですが、英語でのバグ報告は敷居が高いんですよ‥‥。
情けないことですが英文が作れないんで。
返信する
Unknown (mt)
2007-09-26 20:32:01
今回は仕様の提案とか日本語環境に依存するとかいった
デリケートな問題でなく、ただのBugですから
「完璧な英文」でなくていいと思いますよ
私の報告例:http://dev.haiku-os.org/ticket/1435
まあこんな単語を並べただけ 汗)のでも大丈夫ということで。
返信する
バグレポートの英語 (Koki)
2007-09-27 00:34:48
mtさんのいう通り、完璧ではなくても、簡単な英語で開発者に通じて、バグを直してくれればそれで良いと思います。

http://www.google.co.jp/language_tools?hl=ja

…の力を借りて、一度やってみてください。:)
返信する
Unknown (ひろん)
2007-09-27 17:17:22
ヒマができたらチャレンジしてみます。
返信する
Unknown (Koki)
2007-09-29 12:19:51
Hironさん、お疲れさまです。

バグ報告したようですね。僕は内容はあまり理解していませんが、英語が問題ないですよ。:)

来週末Google Summer of Codeで学生の指導にあたった3人のHaikuデベロッパ(Stephan "Stippi" Assmus, Ryan Leavengood & Oliver Dorantes)がGoogle本社で開催される「Google Summer of Code Mentor Summit」に出席しますが、そのついでにこのエリアのHaikuファンと一緒にオフ会することになっています。その時にこのバグを見てもらうように頼んでみます。

ではでは。
返信する
Unknown (ひろん)
2007-09-29 13:50:02
コメントを書いてくださったみなさんに励まされました。
といっても、報告にはものすごく時間がかかったんですが(笑)
Kokiさん、よろしくお願いします。
返信する
Unknown (Koki)
2007-10-01 02:07:28
Axelさんが見てくれているようですね。:)

http://cia.vc/stats/project/OpenBeOS/.message/64e4bf
返信する