[前][次][番号順一覧][スレッド一覧]

ruby-changes:8324

From: nagai <ko1@a...>
Date: Mon, 20 Oct 2008 08:22:28 +0900 (JST)
Subject: [ruby-changes:8324] Ruby:r19852 (trunk): * ext/tk/lib/tk.rb: support Encoding.default_internal.

nagai	2008-10-20 08:22:10 +0900 (Mon, 20 Oct 2008)

  New Revision: 19852

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=19852

  Log:
    * ext/tk/lib/tk.rb: support Encoding.default_internal.
    * ext/tk/tcltklib.c: ditto.
    * ext/tk/extconf.rb: improve the strategy for searching Tcl/Tk headers.

  Modified files:
    trunk/ChangeLog
    trunk/ext/tk/extconf.rb
    trunk/ext/tk/lib/tk/autoload.rb
    trunk/ext/tk/lib/tk/variable.rb
    trunk/ext/tk/lib/tk.rb
    trunk/ext/tk/tcltklib.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 19851)
+++ ChangeLog	(revision 19852)
@@ -1,3 +1,11 @@
+Mon Oct 20 08:20:01 2008  Hidetoshi NAGAI  <nagai@a...>
+
+	* ext/tk/lib/tk.rb: support Encoding.default_internal.
+
+	* ext/tk/tcltklib.c: ditto.
+
+	* ext/tk/extconf.rb: improve the strategy for searching Tcl/Tk headers.
+
 Mon Oct 20 00:57:04 2008  Tanaka Akira  <akr@f...>
 
 	* lib/test/unit.rb (Test::Unit.setup_argv): call given block for
Index: ext/tk/tcltklib.c
===================================================================
--- ext/tk/tcltklib.c	(revision 19851)
+++ ext/tk/tcltklib.c	(revision 19852)
@@ -4,7 +4,7 @@
  *              Oct. 24, 1997   Y. Matsumoto
  */
 
-#define TCLTKLIB_RELEASE_DATE "2008-06-17"
+#define TCLTKLIB_RELEASE_DATE "2008-10-20"
 
 #include "ruby.h"
 
@@ -44,9 +44,9 @@
 #include "stubs.h"
 
 #ifndef TCL_ALPHA_RELEASE
-#define TCL_ALPHA_RELEASE       0
-#define TCL_BETA_RELEASE        1
-#define TCL_FINAL_RELEASE       2
+#define TCL_ALPHA_RELEASE       0  /* "alpha" */
+#define TCL_BETA_RELEASE        1  /* "beta"  */
+#define TCL_FINAL_RELEASE       2  /* "final" */
 #endif
 
 static VALUE rb_thread_critical; /* dummy */
@@ -55,8 +55,8 @@
 static struct {
   int major;
   int minor;
+  int type;  /* ALPHA==0, BETA==1, FINAL==2 */
   int patchlevel;
-  int type;
 } tcltk_version = {0, 0, 0, 0};
 
 static void
@@ -9070,28 +9070,30 @@
 lib_getversion(self)
     VALUE self;
 {
-    volatile VALUE type_name;
+    set_tcltk_version();
 
+    return rb_ary_new3(4, INT2NUM(tcltk_version.major), 
+		          INT2NUM(tcltk_version.minor), 
+		          INT2NUM(tcltk_version.type), 
+		          INT2NUM(tcltk_version.patchlevel));
+}
+
+static VALUE
+lib_get_reltype_name(self)
+    VALUE self;
+{
     set_tcltk_version();
 
     switch(tcltk_version.type) {
     case TCL_ALPHA_RELEASE:
-      type_name = rb_str_new2("alpha");
-      break;
+      return rb_str_new2("alpha");
     case TCL_BETA_RELEASE:
-      type_name = rb_str_new2("beta");
-      break;
+      return rb_str_new2("beta");
     case TCL_FINAL_RELEASE:
-      type_name = rb_str_new2("final");
-      break;
+      return rb_str_new2("final");
     default:
-      type_name = rb_str_new2("unknown");
+      rb_raise(rb_eRuntimeError, "tcltklib has invalid release type number");
     }
-
-    return rb_ary_new3(5, INT2NUM(tcltk_version.major), 
-		          INT2NUM(tcltk_version.minor), 
-		          INT2NUM(tcltk_version.type), type_name, 
-		          INT2NUM(tcltk_version.patchlevel));
 }
 
 
@@ -9294,14 +9296,22 @@
       enc = rb_funcall(interp, ID_encoding_name, 0, 0);
     }
   }
-  /* 2nd: encoding system of Tcl/Tk */
+  /* 2nd: Encoding.default_internal */
   if (NIL_P(enc)) {
+    enc = rb_enc_default_internal();
+  }
+  /* 3rd: encoding system of Tcl/Tk */
+  if (NIL_P(enc)) {
     enc = rb_str_new2(Tcl_GetEncodingName((Tcl_Encoding)NULL));
   }
-  /* 3rd: Encoding.default_external */
+  /* 4th: Encoding.default_external */
   if (NIL_P(enc)) {
     enc = rb_enc_default_external();
   }
+  /* 5th: Encoding.locale_charmap */
+  if (NIL_P(enc)) {
+    enc = rb_locale_charmap(rb_cEncoding);
+  }
 
   if (RTEST(rb_obj_is_kind_of(enc, cRubyEncoding))) {
     /* Ruby's Encoding object */
@@ -9870,6 +9880,24 @@
 
    /* --------------------------------------------------------------- */
 
+#ifdef __WIN32__
+#define TK_WINDOWING_SYSTEM "win32"
+#else
+#ifdef MAC_TCL
+#define TK_WINDOWING_SYSTEM "classic"
+#else
+#ifdef MAC_OSX_TK
+#define TK_WINDOWING_SYSTEM "aqua"
+#else
+#define TK_WINDOWING_SYSTEM "x11"
+#endif
+#endif
+#endif
+    rb_define_const(lib, "WINDOWING_SYSTEM", 
+                    rb_obj_freeze(rb_str_new2(TK_WINDOWING_SYSTEM)));
+
+   /* --------------------------------------------------------------- */
+
     rb_define_const(ev_flag, "NONE",      INT2FIX(0));
     rb_define_const(ev_flag, "WINDOW",    INT2FIX(TCL_WINDOW_EVENTS));
     rb_define_const(ev_flag, "FILE",      INT2FIX(TCL_FILE_EVENTS));
@@ -9899,6 +9927,8 @@
     /* --------------------------------------------------------------- */
 
     rb_define_module_function(lib, "get_version", lib_getversion, -1);
+    rb_define_module_function(lib, "get_release_type_name", 
+			      lib_get_reltype_name, -1);
 
     rb_define_const(release_type, "ALPHA", INT2FIX(TCL_ALPHA_RELEASE));
     rb_define_const(release_type, "BETA",  INT2FIX(TCL_BETA_RELEASE));
Index: ext/tk/lib/tk.rb
===================================================================
--- ext/tk/lib/tk.rb	(revision 19851)
+++ ext/tk/lib/tk.rb	(revision 19852)
@@ -1112,7 +1112,15 @@
   WITH_RUBY_VM  = Object.const_defined?(:VM) && ::VM.class == Class
   WITH_ENCODING = defined?(::Encoding.default_external) && true
   #WITH_ENCODING = Object.const_defined?(:Encoding) && ::Encoding.class == Class
-
+  #if TclTkLib::WINDOWING_SYSTEM == 'aqua'
+  #  if (TclTkLib.get_version <=> [8, 4, TclTkLib::RELEASE_TYPE::FINAL, 9]) > 0
+  #    # *** KNOWN BUG ***
+  #    #   Main event loop thread of TkAqua (> Tk8.4.9) must be the main 
+  #    #   application thread. So, ruby1.9 users must call Tk.mainloop on 
+  #    #   the main application thread.
+  #    RUN_EVENTLOOP_ON_MAIN_THREAD = true
+  #  end
+  #end
   unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
     ### Ruby 1.9 !!!!!!!!!!!!!!!!!!!!!!!!!!
     RUN_EVENTLOOP_ON_MAIN_THREAD = false
@@ -1671,8 +1679,18 @@
   end
 
   def mainloop(check_root = true)
-    if !TkCore::WITH_RUBY_VM || TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
+    if !TkCore::WITH_RUBY_VM
       TclTkLib.mainloop(check_root)
+
+    elsif TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
+      #if TclTkLib::WINDOWING_SYSTEM == 'aqua' && 
+      #    Thread.current != Thread.main && 
+      #    (TclTkLib.get_version <=> [8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0
+      #  raise RuntimeError, 
+      #       "eventloop on TkAqua ( > Tk8.4.9 ) works on the main thread only"
+      #end
+      TclTkLib.mainloop(check_root)
+
     else ### Ruby 1.9 !!!!!
       unless TkCore::INTERP.default_master?
         # [MultiTkIp] slave interp ?
@@ -2389,6 +2407,7 @@
         BINARY_NAME  = 'binary'.freeze
         UTF8_NAME    = 'utf-8'.freeze
         DEFAULT_EXTERNAL_NAME = RubyEncoding.default_external.name.freeze
+        DEFAULT_INTERNAL_NAME = RubyEncoding.default_internal.name.freeze rescue nil
 
         BINARY  = RubyEncoding.find(BINARY_NAME)
         UNKNOWN = RubyEncoding.find('ASCII-8BIT')
@@ -2528,7 +2547,7 @@
         def tk_encoding_names
           #TkComm.simplelist(TkCore::INTERP._invoke_without_enc(Tk::Encoding::ENCNAMES_CMD[0], Tk::Encoding::ENCNAMES_CMD[1]))
           TkComm.simplelist(TkCore::INTERP._invoke_without_enc('encoding', 'names'))
-       end
+        end
         def encoding_names
           self.tk_encoding_names.find_all{|name|
             Tk::Encoding::ENCODING_TABLE.get_name(name) rescue false
@@ -2721,7 +2740,12 @@
         enc_name ||= 
           Tk::Encoding::ENCODING_TABLE.get_name(str.encoding) rescue nil
 
-        unless enc_name
+        if enc_name
+          # str has its encoding information
+          encstr = __toUTF8(str, enc_name)
+          encstr.force_encoding(Tk::Encoding::UTF8_NAME)
+          return encstr
+        else
           # str.encoding isn't supported by Tk -> try to convert on Ruby
           begin
             return str.encode(Tk::Encoding::UTF8_NAME) # new string
@@ -2976,6 +3000,7 @@
   else ### Ruby 1.9 !!!!!!!!!!!!
     loc_enc_obj = ::Encoding.find(::Encoding.locale_charmap)
     ext_enc_obj = ::Encoding.default_external
+    int_enc_obj = ::Encoding.default_internal || ext_enc_obj
     tksys_enc_name = Tk::Encoding::ENCODING_TABLE.get_name(Tk.encoding_system)
     # p [Tk.encoding, Tk.encoding_system, loc_enc_obj, ext_enc_obj]
 
@@ -3052,7 +3077,8 @@
     end
 
     unless enc_name
-      if ext_enc_obj == Tk::Encoding::UNKNOWN
+      #if ext_enc_obj == Tk::Encoding::UNKNOWN
+      if int_enc_obj == Tk::Encoding::UNKNOWN
         if loc_enc_obj == Tk::Encoding::UNKNOWN
           # use Tk.encoding_system
           enc_name = tksys_enc_name
@@ -3060,7 +3086,7 @@
           # use locale_charmap
           begin
             loc_enc_name = Tk::Encoding::ENCODING_TABLE.get_name(loc_enc_obj)
-            if loc_enc_name && loc_enc_name != tksys_enc_name
+            if loc_enc_name
               # use locale_charmap
               enc_name = loc_enc_name
             else
@@ -3074,10 +3100,12 @@
         end
       else
         begin
-          ext_enc_name = Tk::Encoding::ENCODING_TABLE.get_name(ext_enc_obj)
-          if ext_enc_name && ext_enc_name != tksys_enc_name
+          #ext_enc_name = Tk::Encoding::ENCODING_TABLE.get_name(ext_enc_obj)
+          #if ext_enc_name && ext_enc_name != tksys_enc_name
+          int_enc_name = Tk::Encoding::ENCODING_TABLE.get_name(int_enc_obj)
+          if int_enc_name
             # use default_external
-            enc_name = ext_enc_name
+            enc_name = int_enc_name
           else
             # use Tk.encoding_system
             enc_name = tksys_enc_name
@@ -5501,7 +5529,7 @@
 #Tk.freeze
 
 module Tk
-  RELEASE_DATE = '2008-06-17'.freeze
+  RELEASE_DATE = '2008-10-20'.freeze
 
   autoload :AUTO_PATH,        'tk/variable'
   autoload :TCL_PACKAGE_PATH, 'tk/variable'
Index: ext/tk/lib/tk/variable.rb
===================================================================
--- ext/tk/lib/tk/variable.rb	(revision 19851)
+++ ext/tk/lib/tk/variable.rb	(revision 19852)
@@ -26,7 +26,7 @@
     TkVar_ID_TBL.mutex.synchronize{ TkVar_ID_TBL.clear }
   }
 
-  major, minor, type, type_name, patchlevel = TclTkLib.get_version
+  major, minor, type, patchlevel = TclTkLib.get_version
   USE_OLD_TRACE_OPTION_STYLE = (major < 8) || (major == 8 && minor < 4)
 
   #TkCore::INTERP.add_tk_procs('rb_var', 'args', 
Index: ext/tk/lib/tk/autoload.rb
===================================================================
--- ext/tk/lib/tk/autoload.rb	(revision 19851)
+++ ext/tk/lib/tk/autoload.rb	(revision 19852)
@@ -394,7 +394,7 @@
 
 ############################################
 #  depend on the version of Tcl/Tk
-# major, minor, type, type_name, patchlevel = TclTkLib.get_version
+# major, minor, type, patchlevel = TclTkLib.get_version
 
 ############################################
 # Ttk (Tile) support
Index: ext/tk/extconf.rb
===================================================================
--- ext/tk/extconf.rb	(revision 19851)
+++ ext/tk/extconf.rb	(revision 19852)
@@ -64,6 +64,18 @@
 
 use_X = with_config("X11", (! is_win32))
 
+def parse_tclConfig(file)
+  # check tclConfig.sh/tkConfig.sh
+  tbl = {}
+  IO.foreach(file){|line|
+    line.strip!
+    next if line !~ /^([^\#=][^=]*)=(['"]|)(.*)\2$/
+    key, val = $1, $3
+    tbl[key] = val.gsub(/\$\{([^}]+)\}/){|s| tbl[$1]} rescue nil
+  }
+  tbl
+end
+
 def check_tcltk_version(version)
   return [nil, nil] unless version
 
@@ -118,7 +130,7 @@
   if version && ! version.empty?
     versions = [version]
   else
-    versions = %w[8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.6]
+    versions = %w[8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.6]
   end
 
   if tcllib
@@ -161,7 +173,7 @@
   if version && ! version.empty?
     versions = [version]
   else
-    versions = %w[8.6 8.5 8.4 8.3 8.2 8.1 8.0 4.2]
+    versions = %w[8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 4.2]
   end
 
   if tklib
@@ -185,6 +197,35 @@
   st
 end
 
+def find_tcltk_header(tclver, tkver)
+  base_dir = ['/usr/local/include', '/usr/pkg/include', '/usr/include']
+  base_dir << '/Tcl/include' # default for ActiveTcl
+
+  unless have_tcl_h = have_header('tcl.h')
+    if tclver && ! tclver.empty?
+      versions = [tclver]
+    else
+      versions = %w[8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.6]
+    end
+    paths = base_dir.dup
+    versions.each{|ver| paths.concat(base_dir.map{|dir| dir + '/tcl' + ver})}
+    have_tcl_h = find_header('tcl.h', *paths)
+  end
+
+  unless have_tk_h  = have_header("tk.h")
+    if tkver && ! tkver.empty?
+      versions = [tkver]
+    else
+      versions = %w[8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 4.2]
+    end
+    paths = base_dir.dup
+    versions.each{|ver| paths.concat(base_dir.map{|dir| dir + '/tk' + ver})}
+    have_tk_h = find_header('tk.h', *paths)
+  end
+
+  have_tcl_h && have_tk_h
+end
+
 def find_X11(*opt_paths)
   default_paths = 
     [ "/usr/X11/lib", "/usr/lib/X11", "/usr/X11R6/lib", "/usr/openwin/lib" ]
@@ -218,37 +259,19 @@
     else
       # tcl-thread is unknown and tclConfig.sh is given
       begin
-        open(tclConfig, "r") do |cfg|
-          while line = cfg.gets()
-            if line =~ /^\s*TCL_THREADS=(0|1)/
-              tcl_enable_thread = ($1 == "1")
-              break
-            end
-
-            if line =~ /^\s*TCL_MAJOR_VERSION=("|')(\d+)\1/
-              tcl_major_ver = $2
-              if tcl_major_ver =~ /^[1-7]$/
-                tcl_enable_thread = false
-                break
-              end
-              if tcl_major_ver == "8" && tcl_minor_ver == "0"
-                tcl_enable_thread = false
-                break
-              end
-            end
-
-            if line =~ /^\s*TCL_MINOR_VERSION=("|')(\d+)\1/
-              tcl_minor_ver = $2
-              if tcl_major_ver == "8" && tcl_minor_ver == "0"
-                tcl_enable_thread = false
-                break
-              end
-            end
+        tbl = parse_tclConfig(tclConfig)
+        if tbl['TCL_THREADS']
+          tcl_enable_thread = (tbl['TCL_THREADS'] == "1")
+        else
+          tcl_major_ver = tbl['TCL_MAJOR_VERSION'].to_i
+          tcl_minor_ver = tbl['TCL_MINOR_VERSION'].to_i
+          if tcl_major_ver < 8 || (tcl_major_ver == 8 && tcl_minor_ver == 0)
+            tcl_enable_thread = false
           end
         end
 
         if tcl_enable_thread == nil
-          # not find definition
+          # cannot find definition
           if tcl_major_ver
             puts("Warning: '#{tclConfig}' doesn't include TCL_THREADS definition.")
           else
@@ -376,11 +399,11 @@
 
 tclver, tkver = check_tcltk_version(tcltk_version)
 
-if have_header("tcl.h") && have_header("tk.h") && 
-    ( tcltk_framework || 
-        ( ( !use_X || find_X11(x11_ldir2, x11_ldir) ) &&
-            find_tcl(tcllib, stubs, tclver, *tcl_ldir_list) &&
-            find_tk(tklib, stubs, tkver, *tk_ldir_list) ) )
+if ( tcltk_framework || 
+       ( find_tcltk_header(tclver, tkver) && 
+           ( !use_X || find_X11(x11_ldir2, x11_ldir) ) &&
+           find_tcl(tcllib, stubs, tclver, *tcl_ldir_list) &&
+           find_tk(tklib, stubs, tkver, *tk_ldir_list) ) )
   $CPPFLAGS += ' -DUSE_TCL_STUBS -DUSE_TK_STUBS' if stubs
   $CPPFLAGS += ' -D_WIN32' if /cygwin/ =~ RUBY_PLATFORM
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]