----Next_Part(Fri_Mar__1_12:52:56_2002_809)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

永井@知九工大です.

From: matz / ruby-lang.org (Yukihiro Matsumoto)
Subject: [ruby-dev:16152] ruby 1.6.7 preview 2
Date: Fri, 1 Mar 2002 00:57:56 +0900
Message-ID: <1014911874.899613.20330.nullmailer / ev.netlab.jp>
matz> preview1には(やっぱり)いろいろ問題があったのでpreview2です。
matz> これで問題がなければいよいよ正式リリースです。

Ruby/Tk への機加です.

# 間に合いなので.(^_^)

需要が全くないというわけでもないようですので,
root widget を destroy した後でも
再度 Tk を使えるようにするためのパッチです.
Tk.restart が追加されます.
root widget がまだ存在する場合は,を destroy した後に
Tk の行います (当然,以前に作っていた widget は全滅です).
少なくともージョンでは 
Ruby 側の参照まで全部クリアすることはできませんから,
Tk の再起動を行う度にメモリ消費量が少しずつ増大していくと思います.
また,Tk の拡張パッケージを使っていた場合にどうなるかは検証してません.

あと,TkFont クラスにも method_missing を追加しています.
-- 
                                         永井  (九工大 知報)
                                             nagai / ai.kyutech.ac.jp

----Next_Part(Fri_Mar__1_12:52:56_2002_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=tkdiff4

diff -ur ../ruby-1.6.7-prev2.orig/ext/tcltklib/tcltklib.c ext/tcltklib/tcltklib.c
--- ../ruby-1.6.7-prev2.orig/ext/tcltklib/tcltklib.c	Tue Aug  8 14:05:33 2000
+++ ext/tcltklib/tcltklib.c	Fri Mar  1 11:51:54 2002
@@ -120,6 +120,30 @@
     return Qnil;
 }
 
+/* restart Tk */
+static VALUE
+lib_restart(self)
+    VALUE self;
+{
+    struct tcltkip *ptr;	/* tcltkip data struct */
+
+    /* get the data struct */
+    Data_Get_Struct(self, struct tcltkip, ptr);
+
+    /* destroy the root wdiget */
+    ptr->return_value  cl_Eval(ptr->ip, "destroy .");
+    /* ignore ERROR */
+    DUMP2("(TCL_Eval result) %d", ptr->return_value);
+
+    /* execute Tk_Init */
+    DUMP1("Tk_Init");
+    if (Tk_Init(ptr->ip) TCL_ERROR) {
+	rb_raise(rb_eRuntimeError, "%s", ptr->ip->result);
+    }
+
+    return Qnil;
+}
+
 static int
 #if TCL_MAJOR_VERSION > 
 ip_ruby(clientData, interp, argc, argv)
@@ -512,6 +536,7 @@
     rb_define_method(ip, "_invoke", ip_invoke, -1);
     rb_define_method(ip, "_return_value", ip_retval, 0);
     rb_define_method(ip, "mainloop", lib_mainloop, 0);
+    rb_define_method(ip, "restart", lib_restart, 0);
 
     main_thread  b_thread_current();
 #ifdef __MACOS__
diff -ur ../ruby-1.6.7-prev2.orig/ext/tk/lib/tk.rb ext/tk/lib/tk.rb
--- ../ruby-1.6.7-prev2.orig/ext/tk/lib/tk.rb	Thu Feb 28 15:52:49 2002
+++ ext/tk/lib/tk.rb	Fri Mar  1 11:43:55 2002
@@ -620,6 +620,12 @@
     TclTkLib.mainloop
   end
 
+  def restart
+    TkCore::INTERP.restart
+    TkComm::Tk_WINDOWS.clear
+    nil
+  end
+
   def event_generate(window, context, keysl)
     window  indow.path if window.kind_of? TkObject
     if keys
diff -ur ../ruby-1.6.7-prev2.orig/ext/tk/lib/tkfont.rb ext/tk/lib/tkfont.rb
--- ../ruby-1.6.7-prev2.orig/ext/tk/lib/tkfont.rb	Wed Feb 27 16:14:35 2002
+++ ext/tk/lib/tkfont.rb	Fri Mar  1 12:23:59 2002
@@ -758,6 +758,22 @@
   ###################################
   public
   ###################################
+  def method_missing(id, *args)
+    name  d.id2name
+    case args.length
+    when 1
+      configure name, args[0]
+    when 0
+      begin
+	configinfo name
+      rescue
+	fail NameError, "undefined local variable or method `#{name}' for #{self.to_s}", error_at
+      end
+    else
+      fail NameError, "undefined method `#{name}' for #{self.to_s}", error_at
+    end
+  end
+
   def call_font_configure(path, *args)
     args + ash_kv(args.pop.update(@fontslot))
     tk_call *args

----Next_Part(Fri_Mar__1_12:52:56_2002_809)----