大島です。

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