大島です。 From: Hiroshi IGARASHI <igarashi / ueda.info.waseda.ac.jp> Subject: [ruby-list:17637] Re: "#" and Ruby/Gtk Date: Tue, 12 Oct 1999 19:10:02 +0900 > At Tue, 12 Oct 1999 14:12:44 +0900, > in [ruby-list:17630] "#" and Ruby/Gtk, > Ryunosuke Ohshima <ryu / jaist.ac.jp> wrote: > > > > また、Ruby/Gtkで最近遊んでいますが、以下の警告(?)が多数出てしまいま > > す。 > > > > Gdk-CRITICAL **: file gdkwindow.c: line 716 (gdk_window_ref): > > assertion `window != NULL' failed. > > Gdk-WARNING **: Creating pixmap from xpm with NULL window and > > colormap > > Gtk::Windowを作成した後「実体化」されないうちに、Gtk::Widget#window > メソッドなどでGdk::Windowオブジェクトを取得しようとすると、 > このメッセージが出ます。 > > 「実体化」されるタイミングはシグナル"realize"を拾うことで分かります。 > #で、あってますよね? もっともまともな方法あるのかな? > このメイル末尾のスクリプトを参考にして下さい。 > (示されたgpb.rbからpixmapを拝借しています。) Gtk::Window#realizeメソッドを呼んでもすぐにはrealizeされないので、シ グナルを待つ必要があるわけですね。シグナルを待つように変更してみたと ころ、これらの警告メッセージを出ないようにできました。ありがとうござ いました。 > > どうすれば抑制できるでしょうか?Gtk自身を使うのが初めてなので、どう > > もGtk、Gdkのwindowの概念が今一わかりません。 > > このへん、GTK+の方でもあまり文章化されていないんですよね。 > 僕はGTK+のソースを読んで動作を理解しています。 > また何か分からないことがあればどんどん質問して頂けると嬉しいです。 > ドキュメントに反映させていきたいと思っていますので。 ちょっと手元にソースが無かったのでruby-gtkのソースまでしか見ていませ んでした。やはりGTK+のソースも読むしかないですね。 Gdk::Pixmap::create_from_xpm_dでなぜwindowが引数に必要かが良くわから ず、このwindowにどの(自分か親かトップかなど)Gdk::Windowを与えれば良 いのかもわかりません。 > > #win95でも試してみましたが、再現性なしに途中で落ちたりします。 > > こちらの場合、何かメッセージは出ていますか? こちらで試している環境はwin95の非力なノートなので、実はあまり試して いませんでした。Rubyはruby-cygwin-1.4.0、ruby-gtk-0.21-cygwin、 cygwin1-19990115.dll。GTK+はGIMP-1.1のdll一式です。 まず、以下のスクリプトの例のようにGdk::Pixmap#get_geometryを使うと Gdk-WARNING **: gdk_window_get_geometry: GetClientRect failed test.rb:5: [BUG] Segmentation fault となって必ず落ちます。 ### begin test.rb require 'gtk' w = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL) w.realize b = Gdk::Pixmap::new(w.window, 100, 100, -1) g = b.get_geometry Gtk.main ### end test.rb 必ずしも再現しないのですが、ウィンドウの大きさを変更したときも同様の メッセージで落ちることがあります。他に気づいた点では、画面の広さが十 分でないと表示がずれます。 またGdk::Pixmap#get_geometryを使わないようにしても、落ちるわけではな いですが、途中から以下のような警告が多数出て、DrawingAreaの更新が行 われなくなります。 Gdk-WARNING **: gdk_draw_pixmap: CreateCompatibleDC failed Gdk-WARNING **: gdk_draw_pixmap: SelectObject #1 failed Gdk-WARNING **: gdk_draw_pixmap: BitBlt failed Gdk-WARNING **: gdk_draw_pixmap: SelectObject #2 failed Gdk-WARNING **: gdk_draw_pixmap: DeleteDC failed Gdk-WARNING **: gdk_gc_predraw: SaveDC #1 failed Gdk-WARNING **: gdk_gc_postdraw: RestoreDC failed Gdk-WARNING **: gdk_pixmap_new: CreateDIBSection failed: 0 Gdk-CRITICAL **: file gdkpixmap.c: line 1021 (gdk_pixmap_ref): assertion `pixmap != NULL' failed. Gdk-CRITICAL **: file gdkdraw.c: line 122 (gdk_draw_rectangle): assertion `drawable != NULL' failed. Gdk-CRITICAL **: file gdkdraw.c: line 350 (gdk_draw_text): assertion `drawable != NULL' failed. Gdk-CRITICAL **: file gdkdraw.c: line 462 (gdk_draw_pixmap): assertion `drawable != NULL' failed. Gdk-CRITICAL **: file gdkdraw.c: line 463 (gdk_draw_pixmap): assertion `src != NULL' failed. Gdk-WARNING **: gdk_gc_predraw: SaveDC #2 failed Gdk-WARNING **: gdk_gc_predraw: CreateSolidBrush failed Gdk-WARNING **: gdk_gc_predraw: SelectObject #3 failed Gdk-WARNING **: gdk_gc_postdraw: RestoreDC failed Gdk-WARNING **: gdk_gc_predraw: SaveDC #2 failed Gdk-WARNING **: gdk_gc_postdraw: RestoreDC failed Gdk-WARNING **: BitmapToRegion: CreateDIBSection failed Gdk-WARNING **: gdk_gc_predraw: SaveDC #2 failed Gdk-WARNING **: gdk_gc_predraw: CreatePen failed Gdk-WARNING **: gdk_gc_predraw: SelectObject #2 failed Gdk-WARNING **: gdk_gc_postdraw: RestoreDC failed 大島 龍之介 ryu / jaist.ac.jp