京都大学の高橋です。 <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 -------------------------------------------------------------------