diff options
Diffstat (limited to 'ext/tk')
-rw-r--r-- | ext/tk/lib/multi-tk.rb | 34 | ||||
-rw-r--r-- | ext/tk/sample/safe-tk.rb | 8 |
2 files changed, 30 insertions, 12 deletions
diff --git a/ext/tk/lib/multi-tk.rb b/ext/tk/lib/multi-tk.rb index 59e7e1d9ce..b08923e1d0 100644 --- a/ext/tk/lib/multi-tk.rb +++ b/ext/tk/lib/multi-tk.rb @@ -259,7 +259,7 @@ class MultiTkIp def __check_safetk_optkeys(optkeys) # based on 'safetk.tcl' new_keys = {} - optkeys.each{|k,v| new_key[k.to_s] = v} + optkeys.each{|k,v| new_keys[k.to_s] = v} # check 'display' if !new_keys.key?('display') @@ -312,12 +312,24 @@ class MultiTkIp private :__check_safetk_optkeys def __create_safetk_frame(slave_ip, slave_name, app_name, keys) - # create toplevel widget + # display option is used by ::safe::loadTk + loadTk_keys = {} + loadTk_keys['display'] = keys['display'] dup_keys = keys.dup - dup_keys['screen'] = dup_keys.delete('display') - dup_keys['classname'] = 'SafeTk' + + # keys for toplevel : allow followings + toplevel_keys = {} + ['height', 'width', 'background', 'menu'].each{|k| + toplevel_keys[k] = dup_keys.delete(k) if dup_keys.key?(k) + } + toplevel_keys['classname'] = 'SafeTk' + toplevel_keys['screen'] = dup_keys.delete('display') + + # other keys used by pack option of container frame + + # create toplevel widget begin - top = TkToplevel.new(dup_keys) + top = TkToplevel.new(toplevel_keys) rescue NameError fail unless @interp.safe? fail SecurityError, "unable create toplevel on the safe interpreter" @@ -360,10 +372,13 @@ class MultiTkIp } # container frame for slave interpreter - c = TkFrame.new(top, :container=>true).pack(:fill=>:both, :expand=>true) + dup_keys['fill'] = :both unless dup_keys.key?('fill') + dup_keys['expand'] = true unless dup_keys.key?('expand') + c = TkFrame.new(top, :container=>true).pack(dup_keys) - # return container's window id - TkWinfo.id(c) + # return keys + loadTk_keys['use'] = TkWinfo.id(c) + loadTk_keys end private :__create_safetk_frame @@ -375,8 +390,7 @@ class MultiTkIp @interp._eval("::safe::interpInit #{ip_name} "+_keys2opts(safe_opts)) tk_opts = __check_safetk_optkeys(tk_opts) unless tk_opts.key?('use') - tk_opts['use'] = __create_safetk_frame(slave_ip, ip_name, - app_name, tk_opts) + tk_opts = __create_safetk_frame(slave_ip, ip_name, app_name, tk_opts) end slave_ip._invoke('set', 'argv0', app_name) if app_name.kind_of?(String) @interp._eval("::safe::loadTk #{ip_name} #{_keys2opts(tk_opts)}") diff --git a/ext/tk/sample/safe-tk.rb b/ext/tk/sample/safe-tk.rb index 77cfc3c87f..34e1a460a0 100644 --- a/ext/tk/sample/safe-tk.rb +++ b/ext/tk/sample/safe-tk.rb @@ -5,7 +5,10 @@ require "multi-tk" # create slave interpreters trusted_slave = MultiTkIp.new_slave -safe_slave = MultiTkIp.new_safeTk +safe_slave1 = MultiTkIp.new_safeTk +safe_slave2 = MultiTkIp.new_safeTk('fill'=>:none, 'expand'=>false) +#safe_slave2 = MultiTkIp.new_safeTk('fill'=>:none) +#safe_slave2 = MultiTkIp.new_safeTk('expand'=>false) cmd = Proc.new{|txt| @@ -42,7 +45,8 @@ cmd = Proc.new{|txt| # call on the default master interpreter trusted_slave.eval_proc(cmd, 'trusted') -safe_slave.eval_proc(cmd, 'safe') +safe_slave1.eval_proc(cmd, 'safe1') +safe_slave2.eval_proc(cmd, 'safe2') cmd.call('master') Tk.mainloop |