はじめまして。
やまぐちと申します。

GUIにGtk+を使って、Rubyでちょっとしたものを作ってみようと思い
いじっているのですが、そこで困っているわけではないのですが、
ちょっと気になったことがあって、教えていただければと思い、
メールしました。

Gtk+ widgetが絡むオブジェクトはcloneメソッドでオブジェクトを
複製することが出来ないのでしょうか?

Gtk+ widgetが「絡む」オブジェクトというのも、かなり曖昧な表現に
なるのですが、例えば

require 'gtk'

class Icon
  def initialize(file)
    icon = GdkImlib::Image.new (file)
    icon.render(icon.rgb_width, icon.rgb_height)
    pixd, maskd = icon.get_pixmap
    @icon=Gtk::Pixmap.new(pixd, maskd)
  end

  def return
    return @icon
  end
end

icon=Icon.new("Hoge.gif")
icon2=icon.clone
pix=::icon.return
pix2=::icon2.return
pix.show
pix2.show

window1=Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
window2=Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
window1.set_title("a")
window2.set_title("b")
vbox1=Gtk::VBox.new(false,0)
vbox2=Gtk::VBox.new(false,0)
vbox1.show
vbox2.show
vbox1.pack_start(pix,false,true,0)
vbox2.pack_start(pix2,false,false,0)
window1.add(vbox1)
window2.add(vbox2)
window1.show
window2.show
Gtk::main

のスクリプトを実行すると、"a"のタイトルがついたウィンドウには
Hoge.gifの画像が出てくるのですが、"b"のタイトルのついたウィンドウには
画像が出ず、

Gtk-CRITICAL  **: file gtkbox.c: line 332 (gtk_box_pack_start):
assertion 'child->parent == NULL' failed

というエラーが端末の方に出ます。

で(ちょっと問題解決に見通しが悪いと思ったので)

require 'gtk'

window1=Gtk::Window.new
window2=window1.clone
window1.set_title("a")
window2.set_title("b")
window1.show
window2.show
Gtk::main

のスクリプトを実行してみると、タイトル"b" のウィンドウしか出ず、
しかも window2.show の部分をコメントアウトしてもタイトル"b"の
ウィンドウが出てきます。
(つまり、cloneでオブジェクトの複製がされていない?)

#下が、cloneしたオブジェクトがGtk widgetなのに対し、上は
#クラスそのものはGtk widgetを継承しているわけではないので
#あえて「絡んだ」と表現しました。

ちなみにcloneそのもの(に対する自分の認識)の確認のために

class Hoge
  def initialize(text)
    @text=text
  end

  def return
    return @text
  end

  def settext(text)
    @text=text
  end
end

a=Hoge.new("AAAAA")
b=a.clone
b.settext("BBB")

print a.return
print "\n"

print b.return
print"\n"

を実行しますと、
1
2
と返ってくるので、cloneは同じ中身のものを別個に作るという認識で
大きな間違いはないんじゃないかと思っているのですが....

それとも、私が根本的に何か大きな勘違いをしているのでしょうか?

#ちなみに環境はRuby-1.4.2+Ruby/Gtk-0.22、パッチは一切なしです。
--------
やまぐちたかゆき
tyamaguchi / geocities.co.jp
yamaguchi / ppc.linux.or.jp
* * * rbnamazu作成中 * * *