aboutsummaryrefslogtreecommitdiffstats
path: root/ext/tk/lib/tk.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ext/tk/lib/tk.rb')
-rw-r--r--ext/tk/lib/tk.rb54
1 files changed, 46 insertions, 8 deletions
diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb
index c1550680cc..bfa435f326 100644
--- a/ext/tk/lib/tk.rb
+++ b/ext/tk/lib/tk.rb
@@ -25,6 +25,24 @@ module TkComm
Tk_WINDOWS.clear
end
+ def self.__add_target_for_init__(target)
+ INITIALIZE_TARGETS << target
+
+ if target.const_defined? :TkINTERP_SETUP_SCRIPTS
+ target::TkINTERP_SETUP_SCRIPTS.collect{|script|
+ if script.kind_of? Proc
+ script.call
+ elsif script.kind_of? Array
+ Tk.ip_invoke(*script)
+ else
+ Tk.ip_eval(script)
+ end
+ }
+ else
+ nil
+ end
+ end
+
def error_at
frames = caller()
frames.delete_if do |c|
@@ -39,7 +57,7 @@ module TkComm
begin
#tk_class = TkCore::INTERP._invoke('winfo', 'class', path)
- tk_class = Tk.tk_call('winfo', 'class', path)
+ tk_class = Tk.ip_invoke('winfo', 'class', path)
rescue
return path
end
@@ -840,6 +858,22 @@ module TkCore
tk_call 'tk_chooseDirectory', *hash_kv(keys)
end
+ def ip_eval(cmd_string)
+ res = INTERP._eval(cmd_string)
+ if INTERP._return_value() != 0
+ fail RuntimeError, res, error_at
+ end
+ return res
+ end
+
+ def ip_invoke(*args)
+ res = INTERP._invoke(*args)
+ if INTERP._return_value() != 0
+ fail RuntimeError, res, error_at
+ end
+ return res
+ end
+
def tk_call(*args)
puts args.inspect if $DEBUG
args.collect! {|x|ruby2tcl(x)}
@@ -937,12 +971,13 @@ module Tk
TK_LIBRARY = INTERP._invoke("set", "tk_library").freeze
LIBRARY = INTERP._invoke("info", "library").freeze
- PLATFORM = Hash[*tk_split_simplelist(INTERP._eval('array get tcl_platform'))]
+ PLATFORM = Hash[*tk_split_simplelist(INTERP._invoke('array', 'get',
+ 'tcl_platform'))]
PLATFORM.each{|k, v| k.freeze; v.freeze}
PLATFORM.freeze
TK_PREV = {}
- Hash[*tk_split_simplelist(INTERP._eval('array get tkPriv'))].each{|k,v|
+ Hash[*tk_split_simplelist(INTERP._invoke('array','get','tkPriv'))].each{|k,v|
k.freeze
case v
when /^-?\d+$/
@@ -1437,7 +1472,7 @@ class TkBindTag
BTagID_TBL = {}
Tk_BINDTAG_ID = ["btag00000"]
- TkComm::INITIALIZE_TARGETS << self
+ TkComm.__add_target_for_init__(self)
def self.__init_tables__
BTagID_TBL.clear
@@ -1509,16 +1544,19 @@ class TkVariable
TkVar_ID_TBL = {}
Tk_VARIABLE_ID = ["v00000"]
- TkComm::INITIALIZE_TARGETS << self
+ # this constant must be defined befor calling __add_target_for_init__
+ TkINTERP_SETUP_SCRIPTS = [
+ ["proc", "rb_var", "args",
+ "ruby [format \"TkVariable.callback %%Q!%s!\" $args]"]
+ ]
+
+ TkComm.__add_target_for_init__(self)
def self.__init_tables__
# cannot clear
# Tcl interpreter may keeps callbacks
end
- INTERP._invoke("proc", "rb_var", "args",
- "ruby [format \"TkVariable.callback %%Q!%s!\" $args]")
-
def TkVariable.callback(args)
name1,name2,op = tk_split_list(args)
if TkVar_CB_TBL[name1]