From: nagai@... Date: 2002-03-01T12:53:17+09:00 Subject: [ruby-dev:16153] Re: ruby 1.6.7 preview 2 ----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 = Tcl_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 >= 8 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 = rb_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, keys=nil) window = window.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 = id.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 += hash_kv(args.pop.update(@fontslot)) tk_call *args ----Next_Part(Fri_Mar__1_12:52:56_2002_809)----