はじめまして、五十嵐@早大 です。

Rubyは1年半ほど利用させてもらっています。Rubyにはかなりお世話に
なったので少しずつでも還元していきたいです。
たいしたものはありませんが、今までに作ったスクリプトを
  http://www.ueda.info.waseda.ac.jp/~igarashi/work/ruby/index.html
に置いてあります。まだRubyで書かれたスクリプト自体があまり世に
出回ってなくて貴重なので、いくらかの価値はあるでしょうか?

現在私が主に使っている言語は Ruby:Java:KL1:Prolog = 1:1:1:1
という感じです。その時々で必要に応じ組み合わせて使っています。
Perlにはまっていた時期もありましたが、Rubyを知り捨てました^_^;


本題ですが、gtk拡張モジュールへメソッドを追加するパッチです
(メイル末尾にあります)。取り込んでいただけないでしょうか?
次のようにして非矩形ウィンドウが作れます。

require 'gtk'
window = Gtk::Window::new(Gtk::WINDOW_TOPLEVEL)
gdk_pixmap, gdk_pixmap_mask =
  Gdk::Pixmap::create_from_xpm(window.window, nil,
			       pixmap_filename)
pixmap_x, pixmap_y, pixmap_width, pixmap_height, pixmap_depth =
  gdk_pixmap.get_geometry
fixed = Gtk::Fixed::new()
window.add(fixed)
fixed.set_usize(pixmap_width, pixmap_height)
pixmap = Gtk::Pixmap::new(gdk_pixmap, gdk_pixmap_mask)
fixed.put(pixmap, 0, 0)
window.shape_combine_mask(gdk_pixmap_mask, 0, 0)

----
五十嵐  宏  (Hiroshi Igarashi)
[早稲田大学理工学部 情報学科4年 上田研究室配属]



*** gtk.c.orig	Fri Jun 26 18:04:19 1998
--- gtk.c	Wed Jul  1 04:18:51 1998
***************
*** 511,516 ****
--- 511,528 ----
  #define get_gdkbitmap(w) get_gdkdraw((w),gdkBitmap,"GdkBitmap")
  
  static VALUE
+ gdkdraw_get_geometry(self)
+     VALUE self;
+ {
+     gint x, y, width, height, depth;
+ 
+     gdk_window_get_geometry(get_gdkdrawable(self),
+ 			    &x, &y, &width, &height, &depth);
+     return ary_new3(5, INT2NUM(x), INT2NUM(y),
+ 		    INT2NUM(width), INT2NUM(height), INT2NUM(depth));
+ }
+ 
+ static VALUE
  gdkpmap_s_new(self, win, w, h, depth)
      VALUE self, win, w, h, depth;
  {
***************
*** 2055,2060 ****
--- 2067,2082 ----
  }
  
  static VALUE
+ widget_shape_combine_mask(self, gdk_pixmap_mask, x, y)
+     VALUE self, gdk_pixmap_mask, x, y;
+ {
+     gtk_widget_shape_combine_mask(get_widget(self),
+ 				  get_gdkpixmap(gdk_pixmap_mask),
+ 				  NUM2INT(x), NUM2INT(y));
+     return self;
+ }
+ 
+ static VALUE
  bbox_get_child_size_default(self)
      VALUE self;
  {
***************
*** 6086,6091 ****
--- 6132,6138 ----
      rb_define_method(gWidget, "ancestor?", widget_is_ancestor, 1);
      rb_define_method(gWidget, "child?", widget_is_child, 1);
      rb_define_method(gWidget, "window", widget_window, 0);
+     rb_define_method(gWidget, "shape_combine_mask", widget_shape_combine_mask, 3);
  
      rb_define_singleton_method(gWidget, "push_colomap", widget_push_cmap, 1);
      rb_define_singleton_method(gWidget, "push_visual", widget_push_visual, 1);
***************
*** 6706,6711 ****
--- 6756,6762 ----
      rb_define_method(gdkDrawable, "draw_image", gdkdraw_draw_image, 8);
      rb_define_method(gdkDrawable, "draw_points", gdkdraw_draw_pnts, 2);
      rb_define_method(gdkDrawable, "draw_segments", gdkdraw_draw_segs, 2);
+     rb_define_method(gdkDrawable, "get_geometry", gdkdraw_get_geometry, 0);
  
      /* GdkPixmap */
      rb_define_singleton_method(gdkPixmap, "new", gdkpmap_s_new, 4);