稲地です。

----- Original Message -----
送信者 : Kazumi Okamoto <kazusan / pluto.dti.ne.jp>
宛先 : ruby mailing list <ruby-list / netlab.co.jp>
送信日時 : 1999年8月22日 22:41
件名 : [ruby-list:16252] Ruby/Gtk GC::set_foreground


> こんにちは、岡本です。
>
> Ruby/Gtk で、Gdk::GC で指定する色の値の取得方法を
> おしえてください。
>
> 現在は、Gdk::Colorオブジェクトを作成し、その作成時に指定した
> 値(pix)をGC にセットするようにしています。
>
> c = Gdk::Color.new(100, 255, 255, 255)
>                    ^^^
> gc = Gdk::GC.new(self)
> gc.set_foreground(100)
>                   ^^^
>
> このやりかたでは、Gdk::Color で設定した値が、gc で使われていないようで、
> もとからあるなんらかの色が使われているようです。

デフォルトのカラーマップに確保されている色が使われています。

> Gdk::GC::set_foreground メソッドの値をかえると色がかわるのですが、
> この値の求めかたがわかりません。
> Gdk::Color で設定した値ではだめなんでしょうか?

ネィティブな GTK+ でやるとすれば

   1. GdkColor で色を指定。
   2. その色をカラーマップで確保する(GtkColorにピクセル値を得る)。
   3. gdk_gc_set_forground に GdkColor を指定。

といった手順だと思うのですが、現状の Ruby/Gtk だと Gdk::Colormap はない
ので、Gdk::Color からピクセル値を得る手段がなく、Gdk::GC::set_foreground は
直接ピクセル値を指定するようになっているので方法がないのではないかと。

試しに先の手順を Ruby/Gtk で行えるようにするパッチを作成してみました
(ruby-gtk-SNAPSHOT-19990807用)。これを適用して

    c = Gdk::Color.new(0, 0xFFFF, 0xFFFF, 0xFFFF)
    cmap = Gdk::Colormap.get_system
    cmap.alloc(c);

    gc = Gdk::GC.new(self)
    gc.set_foreground(c)

のようにすると、Gdk::Color の指定が有効になることは確認しました。

-------
diff -uNr gtk19990807/src/rbgdk.c gtk/src/rbgdk.c
--- gtk19990807/src/rbgdk.c Sat Jul 31 21:21:47 1999
+++ gtk/src/rbgdk.c Mon Aug 23 01:43:43 1999
@@ -411,6 +411,24 @@
 }

 static VALUE
+gdkcmap_s_get_system(self)
+    VALUE self;
+{
+    GdkColormap *cmap;
+    cmap = gdk_colormap_get_system();
+    return make_gdkcmap(cmap);
+}
+
+static VALUE
+gdkcmap_alloc(self, color)
+    VALUE self, color;
+{
+    gboolean result;
+    result = gdk_color_alloc(get_gdkcmap(self), get_gdkcolor(color));
+    return result?Qtrue:Qfalse;
+}
+
+static VALUE
 gdkcolor_s_new(self, p, r, g, b)
     VALUE self;
     VALUE p, r, g, b;
@@ -690,12 +708,10 @@
 }

 static VALUE
-gdkwin_set_background(self, c)
-    VALUE self, c;
+gdkwin_set_background(self, color)
+    VALUE self, color;
 {
-  GdkColor color;
-  color.pixel = NUM2INT(c);
-  gdk_window_set_background(get_gdkwindow(self), &color);
+  gdk_window_set_background(get_gdkwindow(self), get_gdkcolor(color));
   return self;
 }

@@ -832,23 +848,19 @@
 }

 static VALUE
-gdkgc_set_foreground(self, pix)
-    VALUE pix;
+gdkgc_set_foreground(self, color)
+    VALUE self, color;
 {
-  GdkColor c;
-  c.pixel = NUM2INT(pix);
-  gdk_gc_set_foreground(get_gdkgc(self), &c);
-  return pix;
+  gdk_gc_set_foreground(get_gdkgc(self), get_gdkcolor(color));
+  return self;
 }

 static VALUE
-gdkgc_set_background(self, pix)
-    VALUE pix;
+gdkgc_set_background(self, color)
+    VALUE self, color;
 {
-  GdkColor c;
-  c.pixel = NUM2INT(pix);
-  gdk_gc_set_background(get_gdkgc(self), &c);
-  return pix;
+  gdk_gc_set_background(get_gdkgc(self), get_gdkcolor(color));
+  return self;
 }

 static VALUE
@@ -1760,6 +1772,7 @@
     mGdk = rb_define_module("Gdk");

     gdkFont = rb_define_class_under(mGdk, "Font", rb_cData);
+    gdkColormap = rb_define_class_under(mGdk, "Colormap", rb_cData);
     gdkColor = rb_define_class_under(mGdk, "Color", rb_cData);
     gdkDrawable = rb_define_class_under(mGdk, "Drawable", rb_cData);
     gdkPixmap = rb_define_class_under(mGdk, "Pixmap", gdkDrawable);
@@ -1815,6 +1828,11 @@
     rb_define_method(gdkFont, "ascent", gdkfnt_ascent, 0);
     rb_define_method(gdkFont, "descent", gdkfnt_descent, 0);
     rb_define_method(gdkFont, "==", gdkfnt_equal, 1);
+
+    /* GdkColormap */
+    rb_define_singleton_method(gdkColormap, "get_system",
+          gdkcmap_s_get_system, 0);
+    rb_define_method(gdkColormap, "alloc", gdkcmap_alloc, 1);

     /* GdkColor */
     rb_define_singleton_method(gdkColor, "new", gdkcolor_s_new, 4);
-------

稲地 稔 (e-mail: inachi / earth.interq.or.jp)