diff options
Diffstat (limited to 'ext/tk/lib/tk.rb')
-rw-r--r-- | ext/tk/lib/tk.rb | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index b25c5f3a1c..0a9aacaaa5 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -407,7 +407,13 @@ module TkComm if num = EV_KEY.index($1) case EV_TYPE[num] when ?n - arg_cnv << TkComm::number(arg_val[idx]) + begin + val = TkComm::number(arg_val[idx]) + rescue ArgumentError + # ignore --> no convert + val = TkComm::string(arg_val[idx]) + end + arg_cnv << val when ?s arg_cnv << TkComm::string(arg_val[idx]) when ?b @@ -3748,24 +3754,28 @@ class TkWindow<TkObject self end - def _destroy_children + def destroy + super children = [] rexp = /^#{self.path}\.[^.]+$/ TkCore::INTERP.tk_windows.each{|path, obj| - children << obj if path =~ rexp + children << [path, obj] if path =~ rexp } - children.each{|obj| obj.destroy} - end - private :_destroy_children - - def destroy - super - _destroy_children if defined?(@cmdtbl) for id in @cmdtbl uninstall_cmd id end end + + children.each{|path, obj| + if defined?(@cmdtbl) + for id in @cmdtbl + uninstall_cmd id + end + end + TkCore::INTERP.tk_windows.delete(path) + } + tk_call 'destroy', epath uninstall_win end @@ -5020,6 +5030,9 @@ module TkComposite extend Tk def initialize(parent=nil, *args) + @delegates = {} + @delegates['DEFAULT'] = @frame + if parent.kind_of? Hash keys = _symbolkey2str(parent) parent = keys['parent'] @@ -5031,10 +5044,6 @@ module TkComposite @path = @epath = @frame.path initialize_composite(*args) end - unless defined? @delegates - @delegates = {} - @delegates['DEFAULT'] = @frame - end end def epath @@ -5148,21 +5157,17 @@ end # widget_destroy_hook require 'tkvirtevent' -TkBindTag::ALL.bind(TkVirtualEvent.new('Destroy'), proc{|widget| - if widget.respond_to?(:path) - w = widget.path - else - w = widget.to_s - end - if widget.respond_to?(:__destroy_hook__) - begin - if TkCore::INTERP._invoke('winfo','exist',w) == '1' +TkBindTag::ALL.bind(TkVirtualEvent.new('Destroy'), proc{|xpath| + path = xpath[1..-1] + if (widget = TkCore::INTERP.tk_windows[path]) + if widget.respond_to?(:__destroy_hook__) + begin widget.__destroy_hook__ + rescue Exception end - rescue Exception end end - }, '%W') + }, 'x%W') # autoload autoload :TkCanvas, 'tkcanvas' |