京都大学の高橋です。

<19990715060607F.iga / ueda.info.waseda.ac.jp>の記事において
igarashi / ueda.info.waseda.ac.jpさんは書きました。

>> >   ところで、wmhints.rb を書いてて
>> > Gdk::Bitmap::create_from_data が非常に使いにくかったんですが、
>> > もっといい書き方がありますでしょうか?
>> > 本家の testgtk.c では #include "circles.xbm" 一行で終ってるところ
>> > なんですが、、、、
>> 
>> いい書き方ですか……ちょっと分かりません。
>> Cでは#includeで済んでしまうので
>>     gdk_bitmap_create_from_xbm
>> は用意されていないんでしょうね。
>> xbmファイルからの読み込みはそれほど需要もないでしょうし。

  本家になくても Ruby/Gtk 独自のメソッドとして作ってしまえ、
ってことで書いてみました。
直接 Xlib の関数呼んでます。
これを使えば testgtk/wmhints.rb は

    circles = Gdk::Bitmap::create_from_xbm(window, "circles.xbm")

の一発で OK です。


--- rbgdk.c~	Fri Jul 16 06:06:10 1999
+++ rbgdk.c	Fri Jul 16 06:09:08 1999
@@ -532,6 +532,24 @@
     return make_gdkbitmap2(self,new);
 }
 
+static VALUE
+gdkbmap_create_from_xbm(self, win, fname)
+    VALUE self, win, fname;
+{
+    GdkBitmap *new;
+    GdkWindow *window = get_gdkwindow(win);
+    unsigned char *data;
+    unsigned int width, height;
+    int x, y;
+
+    Check_Type(fname, T_STRING);
+    if (XReadBitmapFileData(STR2CSTR(fname), &width, &height, &data, &x, &y))
+        rb_raise(rb_eArgError, "Bitmap not created from %s", STR2CSTR(fname));
+    new = gdk_bitmap_create_from_data(window, data, width, height);
+    XFree(data);
+    return make_gdkbitmap2(self, new);
+}
+
 
 static VALUE
 gdkimage_s_newbmap(klass, visual, data, w, h)
@@ -1805,6 +1823,8 @@
     rb_define_singleton_method(gdkBitmap, "new", gdkbmap_s_new, 3);
     rb_define_singleton_method(gdkBitmap, "create_from_data",
 			       gdkbmap_create_from_data, 4);
+    rb_define_singleton_method(gdkBitmap, "create_from_xbm",
+			       gdkbmap_create_from_xbm, 2);
 
     /* GdkWindow */
     rb_define_method(gdkWindow, "get_pointer", gdkwin_get_pointer, 0);

-------------------------------------------------------------------
                       TAKAHASHI Hitoshi
      Experimental Nuclear and Hadronic Physics Laboratory
             Department of Physics, Kyoto University
            E-mail: thitoshi / ne.scphys.kyoto-u.ac.jp
  URL: http://www-nh.scphys.kyoto-u.ac.jp/~thitoshi/member.html
-------------------------------------------------------------------