いがらしです。

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自身を使うのが初めてなので、どう
> もGtk、Gdkのwindowの概念が今一わかりません。

このへん、GTK+の方でもあまり文章化されていないんですよね。
僕はGTK+のソースを読んで動作を理解しています。
また何か分からないことがあればどんどん質問して頂けると嬉しいです。
ドキュメントに反映させていきたいと思っていますので。

> #win95でも試してみましたが、再現性なしに途中で落ちたりします。

こちらの場合、何かメッセージは出ていますか?


########################
require 'gtk'

def player_xpm(color)
  [
    # width height num_colors chars_per_pixel
    "12 12 2 1",
    # colors
    ".      c #000090",
    "o      c " + color,
    # pixels
    "....oooo....",
    "..oooooooo..",
    ".oooooooooo.",
    ".oooooooooo.",
    "oooooooooooo",
    "oooooooooooo",
    "oooooooooooo",
    "oooooooooooo",
    ".oooooooooo.",
    ".oooooooooo.",
    "..oooooooo..",
    "....oooo....",
  ]
end

window = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
drawarea = Gtk::DrawingArea.new
window.add(drawarea)
pix = mask = nil
drawarea.signal_connect(Gtk::Widget::SIGNAL_REALIZE) do |w|
  STDERR.puts("drawarea is realized.")
  if pix.nil?
    pix, mask = Gdk::Pixmap::create_from_xpm_d(drawarea.window,
					       nil,
					       player_xpm('gray'))
  end
end
drawarea.signal_connect(Gtk::Widget::SIGNAL_EXPOSE_EVENT) do |w, e|
  gc = Gdk::GC.new(drawarea)
#  SNAPSHOTの場合Gdk::GC.newの引数にはGdk::Drawableを与えて下さい。
#  gc = Gdk::GC.new(drawarea.window)
  drawarea.window.draw_pixmap(gc, pix, 0, 0, 0, 0, 12, 12)
end
window.show_all
Gtk.main

--
五十嵐  宏  (Hiroshi IGARASHI)