dellinです。

Ruby/GTKのItemFactoryを使ってRadioMenuItemのメニュー項目を作
ると、Segmentation Faultを起こすのに気づきました。

どうやら、create_itemとcreate_itemsを混ぜてつかうと落ちるみた
いです。ただなぜかcreate_itemでRadioMenuItemを2つ以上つくって
混ぜたときに落ちる、という奇妙な振舞いをするのですが…。
# 混ぜない時に正しく動作すればいいことはいいのですが、原因が
# わからないもので…。

実験環境は
  OS:VineLinux(kernel-2.4.5)
  Ruby:1.6.4, 
  Ruby/GTK:0.25
でした。

メールの最後に再現スクリプトを掲載します。

また、落ちる条件をさぐるために作ったRadioMenuItem用パッチや、
ItemFactoryにあてるパッチを
  http://priest.team-ct.org/~dellin/ruby/
で公開しています。

=RadioMenuItemのパッチ
  * RadioMenuItem#set_groupを実装。
    RadioMenuItem#groupでの返り値をつかってグループ化する

=ItemFactoryへのパッチ
  * ItemFactory#create_itemのバグつぶし
    ブロック内変数に入るはずのCheckMenuItem, RadioMenuItem,
    TearoffMenuItemがすべてMenuItemとなってしまっていて、固
    有の機能が使えなかったのを修正。
  * ItemFactory#get_itemの追加
    メニュー項目へのパスから各MenuItemのインスタンスを返す。

最初のcreate_itemsのバグについてはどう対処していいかが、私は
まったくわかりませんので、わかる方はお願いします。

#### ここから再現スクリプト↓
#!/usr/bin/ruby

require 'gtk'

window = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
window.set_title($0)
window.set_usize(400, 300)
window.set_uposition(20, 20)
window.signal_connect("destroy") do
  Gtk.main_quit
end
window.signal_connect("delete_event") do
  false
end

box1 = Gtk::VBox.new(false, 0)
accel = Gtk::AccelGroup.new
ifact = Gtk::ItemFactory.new(Gtk::ItemFactory::TYPE_MENU_BAR, "<main>", accel)
ifact.create_item("/_Radio/Radio1", nil, Gtk::ItemFactory::RADIO_ITEM)
ifact.create_item("/_Radio/Radio2", nil, Gtk::ItemFactory::RADIO_ITEM)
ifact.create_items([
                   ["/_Radio/Radio3", nil, Gtk::ItemFactory::RADIO_ITEM],
                   ["/_Radio/Radio4", nil, "/Radio/Radio3"]
                 ])
menubar = ifact.get_widget("<main>")
box1.pack_start(menubar, false, false, 0)
menubar.show
accel.attach(window)
label1 = Gtk::Label::new("Gtk::ItemFactory test program")
box1.pack_start(label1, true, false, 0)
label1.show
window.add(box1)
box1.show
window.show

Gtk::main
#### ここまで↑
--
dellin  Email dellin / team-ct.org
        WWW   http://priest.team-ct.org/~dellin/