1. mumurik
  2. xyzzy
Issue #32 resolved

(Part18, 71) フレームを複数生成すると、メニューが動作しなくなる

xyzzy_17_638
created an issue

== 再現方法 ==

コマンドライン {{{ xyzzy.exe -q }}} を実行

{{{ scratch }}} で {{{ (dotimes (i 10) (make-frame)) }}} を実行

最後に作られたフレームで、メニューから「ファイル(F)」>「新規作成(N)」を実行

== 期待する動作 == 新規バッファ "untitled" が作られる

== 実際の動作 == 何も起きない(エラーも起きない。ステータスバー等にも何も出ない)

ただし、この状態でも {{{ M-x new-file }}} は期待通りに新規バッファ "untitled" を生成する。

== 再現バージョン == * 0.2.3.7

== 備考 == http://toro.2ch.net/test/read.cgi/win/1333301089/71 {{{ 71 :名無し~3.EXE:2012/04/18(水) 14:55:51.20 ID:GZLbZmmz ファイルが開けなくなるの件ですが、出来るだけ状況を確定させようと再度テストしました。 たまたまttrayのテストをしていた時に気がついただけで、ttrayとmy-ttray.lが原因では なかったようです、混乱させて申し訳ない。

前にテストしていた時にC-x 5 2→お気に入りからファイルを開く→C-x 5 2して 次のお気に入りを開く(どのframeか分かりやすくしたかった) 上記のような操作をしていて3枚目のframeを作った後にお気に入りから開けなくなり 変だなと気がついてMenuからの新規作成を押しても無反応なので、開けなくなると表現しました。

今回テストした手順は make-frame new-file をセットで繰り返す、などしたのですが 開けない状況が再現出来なくて改めてmenuの方がおかしかったのに気がついた次第です。

まとめますと

WinXP SP3 32bit xyzzy 0.2.3.7.6 ttrayと同じ所で公開されているお気に入り管理(favorites.l)を使用 xyzzyを起動してframeを3枚開いた状況にする 3枚目からお気に入りからファイルを開こうとすると開けなくなる 最初のと次に作ったframeからの操作は問題なし }}}

http://toro.2ch.net/test/read.cgi/win/1333301089/72 {{{ 72 :70:2012/04/18(水) 18:50:29.53 ID:We0rLbgg menuがらみだとすると わたしがたまになるのも同じ感じかも

ずっと使ってるうちに メニューバー→検索→grep でダイアログが開かない時がたまにある そんな時でもM-x grep-dialogだったかを入力すると普通に開けるから あまり気にしてかったけど menuから開けなくなるという点では共通するね

win7 64bitだからなのかと思ってた }}}

Comments (4)

  1. xyzzy_17_638 reporter

    原因

    メニューの ID が MENU_ID_RANGE_MAX 以上になっている。

    • この現象はマルチフレーム版でのみ発生する。
      • ただし、0.2.2.235 のコードには記述ミスがある
    • マルチフレーム版では、フレーム生成の度に新しいメニューIDを用いてメニュー項目の追加を行うが、同一プロセスで持つメニュー項目の総数がMENU_ID_RANGE_MAX(1024)以上になるとメニュー項目が正常に追加(判別)できなくなり、結果としてコマンドの実行が行えなくなる。
    • また、0.2.2.235 のコードでは、bitsetの配列の大きさと、実際に扱う個数(ビット数)が食い違っているため、不適切な動作をする。
      • menu.cc:used_id[], usertool.cc:user_tool_bar::u_command_id[]

    関連するコード

    ID の範囲を広げる

    ed.h

     #define MENU_ID_RANGE_MIN 0
    -#define MENU_ID_RANGE_MAX 1024
    -#define TOOL_ID_RANGE_MIN 1024
    -#define TOOL_ID_RANGE_MAX 2048
    +#define MENU_ID_RANGE_MAX 32768
    +#define TOOL_ID_RANGE_MIN (MENU_ID_RANGE_MAX)
    +#define TOOL_ID_RANGE_MAX (65536-32)
    

    bitset 系の配列の大きさが不適切なのを修正

    menu.cc

    -static u_long used_id[(MENU_ID_RANGE_MAX - MENU_ID_RANGE_MIN) / sizeof (u_long)];
    +static u_long used_id[(MENU_ID_RANGE_MAX - MENU_ID_RANGE_MIN) / (sizeof (u_long) * 8)];
    

    usertool.cc

       static u_long u_command_id[(TOOL_ID_RANGE_MAX - TOOL_ID_RANGE_MIN)
    -                             / sizeof (u_long)];
    +                             / (sizeof (u_long)*8)];
    ...
     u_long user_tool_bar::u_command_id[(TOOL_ID_RANGE_MAX - TOOL_ID_RANGE_MIN)
    -                                   / sizeof (u_long)];
    +                                   / (sizeof (u_long)*8)];
    
  2. Log in to comment