# File tk/lib/multi-tk.rb, line 799 def self.mainloop(check_root = true) begin TclTkLib.set_eventloop_window_mode(true) @interp_thread.value ensure TclTkLib.set_eventloop_window_mode(false) end end
Support for the Ruby 2.3 series has ended. See here for reference.
methods for construction
get target IP
get info
instance methods to treat tables
class methods to treat tables
for callback operation
pseudo-toplevel operation support
evaluate a procedure on the proper interpreter
event loop all master/slave IPs are controlled by only one event-loop
depend on TclTkIp
interp command support
manipulating safe interpreter
Ruby 1.9 !!!!!!!!!!!!!!!!!!!!!!!!!!
# File tk/lib/remote-tk.rb, line 19 def self._DEFAULT_MASTER # work only once if @flag @flag = nil @@DEFAULT_MASTER else nil end end
# File tk/lib/remote-tk.rb, line 15 def self._IP_TABLE; @@IP_TABLE; end
# File tk/lib/remote-tk.rb, line 16 def self._TK_TABLE_LIST; @@TK_TABLE_LIST; end
# File tk/lib/multi-tk.rb, line 1526 def self.__getip current = Thread.current if current.kind_of?(@@CALLBACK_SUBTHREAD) return current[:callback_ip] end if TclTkLib.mainloop_thread? != false && current[:callback_ip] return current[:callback_ip] end if current.group == ThreadGroup::Default @@DEFAULT_MASTER else ip = @@IP_TABLE[current.group] unless ip fail SecurityError, "cannot call Tk methods on #{Thread.current.inspect}" end ip end end
# File tk/lib/multi-tk.rb, line 956 def self.__init_ip_env__(table, script) ret = [] mtx = (Thread.current[:MultiTk_ip_Mutex] ||= Mutex.new) cond = (Thread.current[:MultiTk_ip_CondVar] ||= ConditionVariable.new) mtx.synchronize{ @init_ip_env_queue.enq([mtx, cond, ret, table, script]) cond.wait(mtx) } if ret[0].kind_of?(Exception) raise ret[0] else ret[0] end end
# File tk/lib/multi-tk.rb, line 845 def self.__pseudo_toplevel Thread.current.group == ThreadGroup::Default && MultiTkIp.__getip == @@DEFAULT_MASTER && self.__pseudo_toplevel_evaluable? && @pseudo_toplevel[1] end
# File tk/lib/multi-tk.rb, line 851 def self.__pseudo_toplevel=(m) unless (Thread.current.group == ThreadGroup::Default && MultiTkIp.__getip == @@DEFAULT_MASTER) fail SecurityError, "no permission to manipulate" end # if m.kind_of?(Module) && m.respond_to?(:pseudo_toplevel_evaluable?) if m.respond_to?(:pseudo_toplevel_evaluable?) @pseudo_toplevel[0] = true @pseudo_toplevel[1] = m else fail ArgumentError, 'fail to set pseudo-toplevel' end self end
# File tk/lib/multi-tk.rb, line 875 def self.__pseudo_toplevel_evaluable=(mode) unless (Thread.current.group == ThreadGroup::Default && MultiTkIp.__getip == @@DEFAULT_MASTER) fail SecurityError, "no permission to manipulate" end @pseudo_toplevel[0] = (mode)? true: false end
# File tk/lib/multi-tk.rb, line 867 def self.__pseudo_toplevel_evaluable? begin @pseudo_toplevel[0] && @pseudo_toplevel[1].pseudo_toplevel_evaluable? rescue Exception false end end
# File tk/lib/multi-tk.rb, line 2675 def _conv_listelement(arg) __getip._conv_listelement(arg) end
# File tk/lib/multi-tk.rb, line 2679 def _create_console __getip._create_console end
# File tk/lib/multi-tk.rb, line 2583 def _eval(str) __getip._eval(str) end
# File tk/lib/multi-tk.rb, line 2599 def _eval_with_enc(str) __getip._eval_with_enc(str) end
# File tk/lib/multi-tk.rb, line 2591 def _eval_without_enc(str) __getip._eval_without_enc(str) end
# File tk/lib/multi-tk.rb, line 2611 def _fromUTF8(str, encoding=nil) __getip._fromUTF8(str, encoding) end
# File tk/lib/multi-tk.rb, line 2646 def _get_global_var(var) __getip._get_global_var(var) end
# File tk/lib/multi-tk.rb, line 2649 def _get_global_var2(var, idx) __getip._get_global_var2(var, idx) end
# File tk/lib/multi-tk.rb, line 2627 def _get_variable(var, flag) __getip._get_variable(var, flag) end
# File tk/lib/multi-tk.rb, line 2630 def _get_variable2(var, idx, flag) __getip._get_variable2(var, idx, flag) end
# File tk/lib/multi-tk.rb, line 2587 def _invoke(*args) __getip._invoke(*args) end
# File tk/lib/multi-tk.rb, line 2603 def _invoke_with_enc(*args) __getip._invoke_with_enc(*args) end
# File tk/lib/multi-tk.rb, line 2595 def _invoke_without_enc(*args) __getip._invoke_without_enc(*args) end
# File tk/lib/multi-tk.rb, line 1518 def self._ip_id_ __getip._ip_id_ end
# File tk/lib/multi-tk.rb, line 2672 def _merge_tklist(*args) __getip._merge_tklist(*args) end
# File tk/lib/multi-tk.rb, line 2134 def MultiTkIp._proc_on_current_safelevel(cmd=nil, &blk) MultiTkIp.__getip._proc_on_current_safelevel(cmd, &blk) end
# File tk/lib/multi-tk.rb, line 2125 def MultiTkIp._proc_on_safelevel(cmd=nil, &blk) MultiTkIp.__getip._proc_on_safelevel(cmd, &blk) end
# File tk/lib/multi-tk.rb, line 2623 def _return_value __getip._return_value end
# File tk/lib/multi-tk.rb, line 2652 def _set_global_var(var, value) __getip._set_global_var(var, value) end
# File tk/lib/multi-tk.rb, line 2655 def _set_global_var2(var, idx, value) __getip._set_global_var2(var, idx, value) end
# File tk/lib/multi-tk.rb, line 2633 def _set_variable(var, value, flag) __getip._set_variable(var, value, flag) end
# File tk/lib/multi-tk.rb, line 2636 def _set_variable2(var, idx, value, flag) __getip._set_variable2(var, idx, value, flag) end
# File tk/lib/multi-tk.rb, line 2669 def _split_tklist(str) __getip._split_tklist(str) end
# File tk/lib/multi-tk.rb, line 2619 def _thread_tkwait(mode, target) __getip._thread_tkwait(mode, target) end
# File tk/lib/multi-tk.rb, line 2615 def _thread_vwait(var) __getip._thread_vwait(var) end
# File tk/lib/multi-tk.rb, line 2607 def _toUTF8(str, encoding=nil) __getip._toUTF8(str, encoding) end
# File tk/lib/multi-tk.rb, line 2658 def _unset_global_var(var) __getip._unset_global_var(var) end
# File tk/lib/multi-tk.rb, line 2661 def _unset_global_var2(var, idx) __getip._unset_global_var2(var, idx) end
# File tk/lib/multi-tk.rb, line 2639 def _unset_variable(var, flag) __getip._unset_variable(var, flag) end
# File tk/lib/multi-tk.rb, line 2642 def _unset_variable2(var, idx, flag) __getip._unset_variable2(var, idx, flag) end
# File tk/lib/multi-tk.rb, line 2560 def abort(msg = nil) __getip.abort(msg) end
# File tk/lib/multi-tk.rb, line 1875 def self.add_tk_procs(name, args=nil, body=nil) if name.kind_of?(Array) # => an array of [name, args, body] name.each{|param| self.add_tk_procs(*param)} else name = name.to_s @@ADD_TK_PROCS << [name, args, body] @@IP_TABLE.each{|tg, ip| ip._add_tk_procs(name, args, body) } end end
# File tk/lib/multi-tk.rb, line 3190 def self.alias_delete(slave, cmd_name) __getip.alias_delete(slave, cmd_name) self end
# File tk/lib/multi-tk.rb, line 3181 def self.alias_info(slave, cmd_name) __getip.alias_info(slave, cmd_name) end
# File tk/lib/multi-tk.rb, line 3421 def self.alias_target(aliascmd, slave = '') __getip.alias_target(aliascmd, slave) end
# File tk/lib/multi-tk.rb, line 3210 def self.aliases(slave = '') __getip.aliases(slave) end
# File tk/lib/multi-tk.rb, line 1688 def self.alive? __getip.alive? end
# File tk/lib/multi-tk.rb, line 2540 def allow_ruby_exit= (mode) __getip.allow_ruby_exit = mode end
# File tk/lib/multi-tk.rb, line 2536 def allow_ruby_exit? __getip.allow_ruby_exit? end
# File tk/lib/multi-tk.rb, line 923 def self.assign_receiver_and_watchdog(target) ret = [nil] @assign_thread.raise(@assign_request.new(target, ret)) while ret[0] == nil unless @assign_thread.alive? raise RuntimeError, 'lost the thread to assign a receiver and a watchdog thread' end end if ret[0].kind_of?(Exception) raise ret[0] else ret[0] end end
# File tk/lib/multi-tk.rb, line 2461 def bg_eval(*args, &blk) # class ==> interp object __getip.bg_eval(*args, &blk) end
# File tk/lib/multi-tk.rb, line 2434 def bg_eval_proc(*args, &blk) # class ==> interp object __getip.bg_eval_proc(*args, &blk) end
# File tk/lib/multi-tk.rb, line 2449 def bg_eval_string(cmd, *eval_args) # class ==> interp object __getip.bg_eval_string(cmd, *eval_args) end
# File tk/lib/multi-tk.rb, line 3363 def self.bgerror(cmd = Proc.new, slave = nil, &b) __getip.bgerror(cmd, slave, &b) end
# File tk/lib/multi-tk.rb, line 1906 def self.cb_entry_class @@CB_ENTRY_CLASS end
# File tk/lib/tk.rb, line 1454 def INTERP.cb_eval(cmd, *args) TkUtil._get_eval_string(TkUtil.eval_cmd(cmd, *args)) end
# File tk/lib/multi-tk.rb, line 1818 def self.create_table if __getip.slave? begin raise SecurityError, "slave-IP has no permission creating a new table" rescue SecurityError => e #p e.backtrace # Is called on a Ruby/Tk library? caller_info = e.backtrace[1] if caller_info =~ %r{^#{MultiTkIp::BASE_DIR}/(tk|tkextlib)/[^:]+\.rb:} # Probably, caller is a Ruby/Tk library --> allow creating else raise e end end end id = @@TK_TABLE_LIST.size obj = Object.new @@TK_TABLE_LIST << obj obj.instance_variable_set(:@id, id) obj.instance_variable_set(:@mutex, Mutex.new) obj.instance_eval{ def self.mutex @mutex end def self.method_missing(m, *args) MultiTkIp.tk_object_table(@id).__send__(m, *args) end } obj.freeze @@IP_TABLE.each{|tg, ip| ip._add_new_tables } return obj end
# File tk/lib/multi-tk.rb, line 3201 def self.def_alias(slave, new_cmd, org_cmd, *args) ret = __getip.def_alias(slave, new_cmd, org_cmd, *args) (ret == new_cmd)? self: nil end
# File tk/lib/multi-tk.rb, line 3602 def default_encoding=(enc) __getip.default_encoding=(enc) end
# File tk/lib/multi-tk.rb, line 2472 def self.default_master? __getip == @@DEFAULT_MASTER end
# File tk/lib/multi-tk.rb, line 3240 def self.delete_cmd(slave, cmd) __getip.delete_cmd(slave, cmd) self end
# File tk/lib/multi-tk.rb, line 3220 def self.delete_slaves(*args) __getip.delete_slaves(*args) self end
# File tk/lib/multi-tk.rb, line 2548 def deleted? __getip.deleted? end
# File tk/lib/multi-tk.rb, line 2483 def do_one_event(flag = TclTkLib::EventFlag::ALL) __getip.do_one_event(flag) end
# File tk/lib/multi-tk.rb, line 3606 def encoding=(enc) __getip.encoding=(enc) end
# File tk/lib/multi-tk.rb, line 3620 def encoding_convertfrom(str, enc=None) __getip.encoding_convertfrom(str, enc) end
# File tk/lib/multi-tk.rb, line 3625 def encoding_convertto(str, enc=None) __getip.encoding_convertto(str, enc) end
# File tk/lib/multi-tk.rb, line 3610 def encoding_name __getip.encoding_name end
# File tk/lib/multi-tk.rb, line 3614 def encoding_obj __getip.encoding_obj end
# File tk/lib/multi-tk.rb, line 3590 def encoding_table __getip.encoding_table end
# File tk/lib/multi-tk.rb, line 2457 def eval(*args, &blk) # class ==> interp object __getip.eval(*args, &blk) end
class method
# File tk/lib/multi-tk.rb, line 2428 def eval_proc(*args, &blk) # class ==> interp object __getip.eval_proc(*args, &blk) end
# File tk/lib/multi-tk.rb, line 2443 def eval_string(cmd, *eval_args) # class ==> interp object __getip.eval_string(cmd, *eval_args) end
# File tk/lib/multi-tk.rb, line 3230 def self.exist?(slave = '') __getip.exist?(slave) end
# File tk/lib/multi-tk.rb, line 2564 def exit(st = true) __getip.exit(st) end
# File tk/lib/multi-tk.rb, line 2568 def exit!(st = false) __getip.exit!(st) end
# File tk/lib/multi-tk.rb, line 3254 def self.expose_cmd(slave, cmd, aliasname = nil) __getip.expose_cmd(slave, cmd, aliasname) self end
# File tk/lib/multi-tk.rb, line 3594 def force_default_encoding=(mode) __getip.force_default_encoding=(mode) end
# File tk/lib/multi-tk.rb, line 3598 def force_default_encoding? __getip.force_default_encoding? end
# File tk/lib/multi-tk.rb, line 1909 def self.get_cb_entry(cmd) @@CB_ENTRY_CLASS.new(__getip, cmd).freeze end
# File tk/lib/multi-tk.rb, line 2497 def get_eventloop_tick __getip.get_eventloop_tick end
# File tk/lib/multi-tk.rb, line 2509 def get_eventloop_weight __getip.get_eventloop_weight end
# File tk/lib/multi-tk.rb, line 3404 def self.get_limit(limit_type, slave = '', slot = nil) __getip.get_limit(limit_type, slave, slot) end
# File tk/lib/multi-tk.rb, line 2503 def get_no_event_wait __getip.get_no_event_wait end
# File tk/lib/multi-tk.rb, line 2552 def has_mainwindow? __getip.has_mainwindow? end
# File tk/lib/multi-tk.rb, line 3268 def self.hide_cmd(slave, cmd, aliasname = nil) __getip.hide_cmd(slave, cmd, aliasname) self end
# File tk/lib/multi-tk.rb, line 982 def self.inherited(subclass) # trust if on ThreadGroup::Default or @@DEFAULT_MASTER's ThreadGroup if @@IP_TABLE[Thread.current.group] == @@DEFAULT_MASTER begin class << subclass self.methods.each{|m| name = m.to_s begin unless name == '__id__' || name == '__send__' || name == 'freeze' undef_method(m) end rescue Exception # ignore all exceptions end } end ensure subclass.freeze fail SecurityError, "cannot create subclass of MultiTkIp on a untrusted ThreadGroup" end end end
# File tk/lib/multi-tk.rb, line 1852 def self.init_ip_env(script = Proc.new) @@INIT_IP_ENV << script if __getip.slave? begin raise SecurityError, "slave-IP has no permission initializing IP env" rescue SecurityError => e #p e.backtrace # Is called on a Ruby/Tk library? caller_info = e.backtrace[1] if caller_info =~ %r{^#{MultiTkIp::BASE_DIR}/(tk|tkextlib)/[^:]+\.rb:} # Probably, caller is a Ruby/Tk library --> allow creating else raise e end end end # @@IP_TABLE.each{|tg, ip| # ip._init_ip_env(script) # } @@DEFAULT_MASTER.__init_ip_env__(@@IP_TABLE, script) end
# File tk/lib/multi-tk.rb, line 1899 def self.init_ip_internal __getip._init_ip_internal(@@INIT_IP_ENV, @@ADD_TK_PROCS) end
# File tk/lib/multi-tk.rb, line 2556 def invalid_namespace? __getip.invalid_namespace? end
# File tk/lib/multi-tk.rb, line 1701 def self.ip_name __getip.ip_name end
# File tk/lib/multi-tk.rb, line 799 def self.mainloop(check_root = true) begin TclTkLib.set_eventloop_window_mode(true) @interp_thread.value ensure TclTkLib.set_eventloop_window_mode(false) end end
# File tk/lib/multi-tk.rb, line 2486 def mainloop_abort_on_exception # __getip.mainloop_abort_on_exception TclTkLib.mainloop_abort_on_exception end
# File tk/lib/multi-tk.rb, line 2490 def mainloop_abort_on_exception=(mode) # __getip.mainloop_abort_on_exception=(mode) TclTkLib.mainloop_abort_on_exception=(mode) end
# File tk/lib/multi-tk.rb, line 2480 def mainloop_watchdog(check_root = true) __getip.mainloop_watchdog(check_root) end
# File tk/lib/multi-tk.rb, line 2520 def make_safe __getip.make_safe end
# File tk/lib/multi-tk.rb, line 1732 def self.manipulable? true end
# File tk/lib/multi-tk.rb, line 3345 def self.mark_trusted(slave = '') __getip.mark_trusted(slave) self end
# File tk/lib/multi-tk.rb, line 1666 def self.master? __getip.master? end
# File tk/lib/multi-tk.rb, line 1843 def self.method_missing(m, *args) MultiTkIp.tk_object_table(@id).__send__(m, *args) end
# File tk/lib/multi-tk.rb, line 187 def initialize(ip, cmd) @ip = ip @safe = safe = $SAFE # @cmd = cmd cmd = MultiTkIp._proc_on_safelevel(&cmd) @cmd = proc{|*args| cmd.call(safe, *args)} self.freeze end
# File tk/lib/multi-tk.rb, line 887 def self.new(target, ret) obj = super() obj.target = target obj.ret = ret obj end
# File tk/lib/multi-tk.rb, line 1553 def new_master(safe=nil, keys={}, &blk) if MultiTkIp::WITH_RUBY_VM #### TODO !!!!!! fail RuntimeError, 'sorry, still not support multiple master-interpreters on RubyVM' end if safe.kind_of?(Hash) keys = safe elsif safe.kind_of?(Integer) raise ArgumentError, "unexpected argument(s)" unless keys.kind_of?(Hash) if !keys.key?(:safe) && !keys.key?('safe') keys[:safe] = safe end elsif safe == nil # do nothing else raise ArgumentError, "unexpected argument(s)" end ip = __new(__getip, nil, keys) #ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given? if block_given? #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call)} #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)} ip._proc_on_safelevel(&blk).call(ip.safe_level) end ip end
# File tk/lib/multi-tk.rb, line 1610 def new_safe_slave(safe=1, keys={}, &blk) if safe.kind_of?(Hash) keys = safe elsif safe.kind_of?(Integer) raise ArgumentError, "unexpected argument(s)" unless keys.kind_of?(Hash) if !keys.key?(:safe) && !keys.key?('safe') keys[:safe] = safe end else raise ArgumentError, "unexpected argument(s)" end ip = __new(__getip, true, keys) # ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given? if block_given? #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call)} #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)} ip._proc_on_safelevel(&blk).call(ip.safe_level) end ip end
# File tk/lib/multi-tk.rb, line 1585 def new_slave(safe=nil, keys={}, &blk) if safe.kind_of?(Hash) keys = safe elsif safe.kind_of?(Integer) raise ArgumentError, "unexpected argument(s)" unless keys.kind_of?(Hash) if !keys.key?(:safe) && !keys.key?('safe') keys[:safe] = safe end elsif safe == nil # do nothing else raise ArgumentError, "unexpected argument(s)" end ip = __new(__getip, false, keys) # ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given? if block_given? #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call)} #Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)} ip._proc_on_safelevel(&blk).call(ip.safe_level) end ip end
# File tk/lib/multi-tk.rb, line 3413 def self.recursion_limit(slave = '', limit = None) __getip.recursion_limit(slave) end
# File tk/lib/multi-tk.rb, line 1887 def self.remove_tk_procs(*names) names.each{|name| name = name.to_s @@ADD_TK_PROCS.delete_if{|elem| elem.kind_of?(Array) && elem[0].to_s == name } } @@IP_TABLE.each{|tg, ip| ip._remove_tk_procs(*names) } end
# File tk/lib/multi-tk.rb, line 2572 def restart(app_name = nil, keys = {}) init_ip_internal __getip._invoke('set', 'argv0', app_name) if app_name if keys.kind_of?(Hash) __getip._invoke('set', 'argv', _keys2opts(keys)) end __getip.restart end
# File tk/lib/multi-tk.rb, line 2528 def safe_base? begin __getip.safe_base? rescue false end end
# File tk/lib/multi-tk.rb, line 335 def self.safe_level __getip.safe_level end
# File tk/lib/multi-tk.rb, line 329 def self.safe_level=(safe) self.set_safe_level(safe) end
# File tk/lib/multi-tk.rb, line 2494 def set_eventloop_tick(tick) __getip.set_eventloop_tick(tick) end
# File tk/lib/multi-tk.rb, line 2506 def set_eventloop_weight(loop_max, no_event_tick) __getip.set_eventloop_weight(loop_max, no_event_tick) end
# File tk/lib/multi-tk.rb, line 3379 def self.set_limit(limit_type, slave = '', opts = {}) __getip.set_limit(limit_type, slave, opts) end
# File tk/lib/multi-tk.rb, line 2500 def set_no_event_wait(tick) __getip.set_no_event_wait(tick) end
# File tk/lib/multi-tk.rb, line 326 def self.set_safe_level(safe) __getip.set_safe_level(safe) end
# File tk/lib/multi-tk.rb, line 1673 def self.slave? not self.master? end
# File tk/lib/multi-tk.rb, line 1723 def self.slaves(all = false) __getip.slaves(all) end
# File tk/lib/multi-tk.rb, line 1809 def self.tk_cmd_tbl @@TK_CMD_TBL end
# File tk/lib/multi-tk.rb, line 1815 def self.tk_object_table(id) __getip._tk_table_list[id] end
# File tk/lib/multi-tk.rb, line 1812 def self.tk_windows __getip._tk_windows end
# File tk/lib/multi-tk.rb, line 1707 def self.to_eval __getip.to_eval end
# File tk/lib/multi-tk.rb, line 3480 def self.transfer_stderr(dist, src = '') __getip.transfer_stderr(dist, src) self end
# File tk/lib/multi-tk.rb, line 3460 def self.transfer_stdin(dist, src = '') __getip.transfer_stdin(dist, src) self end
# File tk/lib/multi-tk.rb, line 1189 def __create_safe_slave_obj(safe_opts, app_name, tk_opts) raise SecurityError, "no permission to manipulate" unless self.manipulable? # safe interpreter ip_name = _create_slave_ip_name slave_ip = @interp.create_slave(ip_name, true) slave_ip.instance_eval{ @force_default_encoding ||= TkUtil.untrust([false]) @encoding ||= TkUtil.untrust([nil]) def @encoding.to_s; self.join(nil); end } @slave_ip_tbl[ip_name] = slave_ip def slave_ip.safe_base? true end @interp._eval("::safe::interpInit #{ip_name}") slave_ip._invoke('set', 'argv0', app_name) if app_name.kind_of?(String) if tk_opts tk_opts = __check_safetk_optkeys(tk_opts) if tk_opts.key?('use') @slave_ip_top[ip_name] = '' else tk_opts, top_path = __create_safetk_frame(slave_ip, ip_name, app_name, tk_opts) @slave_ip_top[ip_name] = top_path end @interp._eval("::safe::loadTk #{ip_name} #{_keys2opts(tk_opts)}") @interp._invoke('__replace_slave_tk_commands__', ip_name) else @slave_ip_top[ip_name] = nil end if safe_opts.key?('deleteHook') || safe_opts.key?(:deleteHook) @interp._eval("::safe::interpConfigure #{ip_name} " + _keys2opts(safe_opts)) else @interp._eval("::safe::interpConfigure #{ip_name} " + _keys2opts(safe_opts) + '-deleteHook {' + TkComm._get_eval_string(proc{|slave| self._default_delete_hook(slave) }) + '}') end [slave_ip, ip_name] end
# File tk/lib/multi-tk.rb, line 1238 def __create_trusted_slave_obj(name, keys) raise SecurityError, "no permission to manipulate" unless self.manipulable? ip_name = _create_slave_ip_name slave_ip = @interp.create_slave(ip_name, false) slave_ip.instance_eval{ @force_default_encoding ||= TkUtil.untrust([false]) @encoding ||= TkUtil.untrust([nil]) def @encoding.to_s; self.join(nil); end } slave_ip._invoke('set', 'argv0', name) if name.kind_of?(String) slave_ip._invoke('set', 'argv', _keys2opts(keys)) @interp._invoke('load', '', 'Tk', ip_name) @interp._invoke('__replace_slave_tk_commands__', ip_name) @slave_ip_tbl[ip_name] = slave_ip [slave_ip, ip_name] end
# File tk/lib/multi-tk.rb, line 2997 def __eval(str) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.__eval(str) end
# File tk/lib/multi-tk.rb, line 3002 def __invoke(*args) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.__invoke(*args) end
instance method
# File tk/lib/multi-tk.rb, line 1994 def __pseudo_toplevel ip = MultiTkIp.__getip (ip == @@DEFAULT_MASTER || ip == self) && self.__pseudo_toplevel_evaluable? && @pseudo_toplevel[1] end
# File tk/lib/multi-tk.rb, line 2000 def __pseudo_toplevel=(m) unless (Thread.current.group == ThreadGroup::Default && MultiTkIp.__getip == @@DEFAULT_MASTER) fail SecurityError, "no permission to manipulate" end # if m.kind_of?(Module) && m.respond_to?(:pseudo_toplevel_evaluable?) if m.respond_to?(:pseudo_toplevel_evaluable?) @pseudo_toplevel[0] = true @pseudo_toplevel[1] = m else fail ArgumentError, 'fail to set pseudo-toplevel' end self end
# File tk/lib/multi-tk.rb, line 2024 def __pseudo_toplevel_evaluable=(mode) unless (Thread.current.group == ThreadGroup::Default && MultiTkIp.__getip == @@DEFAULT_MASTER) fail SecurityError, "no permission to manipulate" end @pseudo_toplevel[0] = (mode)? true: false end
# File tk/lib/multi-tk.rb, line 2016 def __pseudo_toplevel_evaluable? begin @pseudo_toplevel[0] && @pseudo_toplevel[1].pseudo_toplevel_evaluable? rescue Exception false end end
# File tk/lib/multi-tk.rb, line 1759 def _add_new_tables (@@TK_TABLE_LIST.size - @tk_table_list.size).times{ @tk_table_list << TkUtil.untrust({}) } end
# File tk/lib/multi-tk.rb, line 1769 def _add_tk_procs(name, args, body) return if slave? @interp._invoke('proc', name, args, body) if args && body @interp._invoke('interp', 'slaves').split.each{|slave| @interp._invoke('interp', 'alias', slave, name, '', name) } end
# File tk/lib/multi-tk.rb, line 3125 def _conv_listelement(arg) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._conv_listelement(arg) end
# File tk/lib/multi-tk.rb, line 1258 def _create_slave_object(keys={}) raise SecurityError, "no permission to manipulate" unless self.manipulable? ip = MultiTkIp.new_slave(self, keys={}) @slave_ip_tbl[ip.name] = ip end
# File tk/lib/multi-tk.rb, line 1475 def _default_delete_hook(slave) raise SecurityError, "no permission to manipulate" unless self.manipulable? @slave_ip_tbl.delete(slave) top = @slave_ip_top.delete(slave) if top.kind_of?(String) # call default hook of safetk.tcl (ignore exceptions) if top == '' begin @interp._eval("::safe::disallowTk #{slave}") rescue warn("Warning: fail to call '::safe::disallowTk'") if $DEBUG end else # toplevel path begin @interp._eval("::safe::tkDelete {} #{top} #{slave}") rescue warn("Warning: fail to call '::safe::tkDelete'") if $DEBUG begin @interp._eval("destroy #{top}") rescue warn("Warning: fail to destroy toplevel") if $DEBUG end end end end end
# File tk/lib/multi-tk.rb, line 350 def _destroy_slaves_of_slaveIP(ip) unless ip.deleted? # ip._split_tklist(ip._invoke('interp', 'slaves')).each{|name| ip._split_tklist(ip._invoke_without_enc('interp', 'slaves')).each{|name| name = _fromUTF8(name) begin # ip._eval_without_enc("#{name} eval {foreach i [after info] {after cancel $i}}") after_ids = ip._eval_without_enc("#{name} eval {after info}") ip._eval_without_enc("#{name} eval {foreach i {#{after_ids}} {after cancel $i}}") rescue Exception end begin # ip._invoke('interp', 'eval', name, 'destroy', '.') ip._invoke(name, 'eval', 'destroy', '.') rescue Exception end # safe_base? if ip._eval_without_enc("catch {::safe::interpConfigure #{name}}") == '0' begin ip._eval_without_enc("::safe::interpDelete #{name}") rescue Exception end end =begin if ip._invoke('interp', 'exists', name) == '1' begin ip._invoke(name, 'eval', 'exit') rescue Exception end end =end unless ip.deleted? if ip._invoke('interp', 'exists', name) == '1' begin ip._invoke('interp', 'delete', name) rescue Exception end end end } end end
# File tk/lib/multi-tk.rb, line 3007 def _eval(str) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._eval(str) end
# File tk/lib/multi-tk.rb, line 3027 def _eval_with_enc(str) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._eval_with_enc(str) end
# File tk/lib/multi-tk.rb, line 3017 def _eval_without_enc(str) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._eval_without_enc(str) end
# File tk/lib/multi-tk.rb, line 3042 def _fromUTF8(str, encoding=nil) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._fromUTF8(str, encoding) end
# File tk/lib/multi-tk.rb, line 3087 def _get_global_var(var) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._get_global_var(var) end
# File tk/lib/multi-tk.rb, line 3091 def _get_global_var2(var, idx) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._get_global_var2(var, idx) end
# File tk/lib/multi-tk.rb, line 3062 def _get_variable(var, flag) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._get_variable(var, flag) end
# File tk/lib/multi-tk.rb, line 3066 def _get_variable2(var, idx, flag) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._get_variable2(var, idx, flag) end
# File tk/lib/multi-tk.rb, line 1765 def _init_ip_env(script) self.eval_proc{script.call(self)} end
# File tk/lib/multi-tk.rb, line 1793 def _init_ip_internal(init_ip_env, add_tk_procs) #init_ip_env.each{|script| self.eval_proc{script.call(self)}} init_ip_env.each{|script| self._init_ip_env(script)} add_tk_procs.each{|name, args, body| if master? @interp._invoke('proc', name, args, body) if args && body else @set_alias_proc.call(name) end } end
# File tk/lib/multi-tk.rb, line 3012 def _invoke(*args) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke(*args) end
# File tk/lib/multi-tk.rb, line 3032 def _invoke_with_enc(*args) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke_with_enc(*args) end
# File tk/lib/multi-tk.rb, line 3022 def _invoke_without_enc(*args) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke_without_enc(*args) end
# File tk/lib/multi-tk.rb, line 1521 def _ip_id_ # for RemoteTkIp '' end
# File tk/lib/multi-tk.rb, line 3121 def _merge_tklist(*args) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._merge_tklist(*args) end
# File tk/lib/multi-tk.rb, line 2129 def _proc_on_current_safelevel(cmd=nil, &blk) # require a block for eval safe = $SAFE cmd = _proc_on_safelevel(cmd, &blk) Proc.new{|*args| cmd.call(safe, *args)} end
instance & class method
# File tk/lib/multi-tk.rb, line 2098 def _proc_on_safelevel(cmd=nil) # require a block for eval if cmd if cmd.kind_of?(Method) _proc_on_safelevel{|*args| cmd.call(*args)} else _proc_on_safelevel(&cmd) end else #Proc.new{|safe, *args| $SAFE=safe if $SAFE < safe; yield(*args)} Proc.new{|safe, *args| # avoid security error on Exception objects untrust_proc = proc{|err| begin err.untrust if err.respond_to?(:untrust) rescue SecurityError end err } $SAFE=safe if $SAFE < safe; begin yield(*args) rescue Exception => e fail untrust_proc.call(e) end } end end
# File tk/lib/multi-tk.rb, line 600 def _receiver_mainloop(check_root) if @evloop_thread[0] && @evloop_thread[0].alive? @evloop_thread[0] else @evloop_thread[0] = Thread.new{ while !@interp.deleted? #if check_root # inf = @interp._invoke_without_enc('info', 'command', '.') # break if !inf.kind_of?(String) || inf != '.' #end break if check_root && !@interp.has_mainwindow? sleep 0.5 end } @evloop_thread[0] end end
# File tk/lib/multi-tk.rb, line 1777 def _remove_tk_procs(*names) return if slave? names.each{|name| name = name.to_s return if @interp.deleted? @interp._invoke('rename', name, '') return if @interp.deleted? @interp._invoke('interp', 'slaves').split.each{|slave| return if @interp.deleted? @interp._invoke('interp', 'alias', slave, name, '') rescue nil } } end
# File tk/lib/multi-tk.rb, line 3057 def _return_value raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._return_value end
# File tk/lib/multi-tk.rb, line 3095 def _set_global_var(var, value) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._set_global_var(var, value) end
# File tk/lib/multi-tk.rb, line 3099 def _set_global_var2(var, idx, value) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._set_global_var2(var, idx, value) end
# File tk/lib/multi-tk.rb, line 3070 def _set_variable(var, value, flag) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._set_variable(var, value, flag) end
# File tk/lib/multi-tk.rb, line 3074 def _set_variable2(var, idx, value, flag) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._set_variable2(var, idx, value, flag) end
# File tk/lib/multi-tk.rb, line 3117 def _split_tklist(str) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._split_tklist(str) end
# File tk/lib/multi-tk.rb, line 3052 def _thread_tkwait(mode, target) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._thread_tkwait(mode, target) end
# File tk/lib/multi-tk.rb, line 3047 def _thread_vwait(var) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._thread_vwait(var) end
# File tk/lib/multi-tk.rb, line 1745 def _tk_cmd_tbl tbl = {} MultiTkIp.tk_cmd_tbl.each{|id, ent| tbl[id] = ent if ent.ip == self } tbl end
# File tk/lib/multi-tk.rb, line 1755 def _tk_table_list @tk_table_list end
# File tk/lib/multi-tk.rb, line 1751 def _tk_windows @tk_windows end
# File tk/lib/multi-tk.rb, line 3037 def _toUTF8(str, encoding=nil) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._toUTF8(str, encoding) end
# File tk/lib/multi-tk.rb, line 3103 def _unset_global_var(var) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._unset_global_var(var) end
# File tk/lib/multi-tk.rb, line 3107 def _unset_global_var2(var, idx) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._unset_global_var2(var, idx) end
# File tk/lib/multi-tk.rb, line 3078 def _unset_variable(var, flag) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._unset_variable(var, flag) end
# File tk/lib/multi-tk.rb, line 3082 def _unset_variable2(var, idx, flag) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._unset_variable2(var, idx, flag) end
# File tk/lib/multi-tk.rb, line 2949 def abort(msg = nil) raise SecurityError, "no permission to manipulate" unless self.manipulable? if master? && !safe? && allow_ruby_exit? if msg Kernel.abort(msg) else Kernel.abort end else # ignore msg delete 1 end end
# File tk/lib/multi-tk.rb, line 3185 def alias_delete(slave, cmd_name) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp', 'alias', _slavearg(slave), cmd_name, '') self end
# File tk/lib/multi-tk.rb, line 3177 def alias_info(slave, cmd_name) raise SecurityError, "no permission to manipulate" unless self.manipulable? _lst2ary(@interp._invoke('interp', 'alias', _slavearg(slave), cmd_name)) end
# File tk/lib/multi-tk.rb, line 3417 def alias_target(aliascmd, slave = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp', 'target', _slavearg(slave), aliascmd) end
# File tk/lib/multi-tk.rb, line 3206 def aliases(slave = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? _lst2ary(@interp._invoke('interp', 'aliases', _slavearg(slave))) end
# File tk/lib/multi-tk.rb, line 1677 def alive? raise SecurityError, "no permission to manipulate" unless self.manipulable? begin return false unless @cmd_receiver.alive? return false if @interp.deleted? return false if @interp._invoke('interp', 'exists', '') == '0' rescue Exception return false end true end
# File tk/lib/multi-tk.rb, line 2866 def allow_ruby_exit= (mode) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.allow_ruby_exit = mode end
# File tk/lib/multi-tk.rb, line 2861 def allow_ruby_exit? raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.allow_ruby_exit? end
# File tk/lib/multi-tk.rb, line 2410 def bg_eval(*args, &blk) if block_given? bg_eval_proc(*args, &blk) elsif args[0] if args[0].respond_to?(:call) bg_eval_proc(*args) else bg_eval_string(*args) end else fail ArgumentError, "no argument to eval" end end
# File tk/lib/multi-tk.rb, line 2340 def bg_eval_proc(*args) if block_given? cmd = Proc.new else unless (cmd = args.shift) fail ArgumentError, "A Proc or Method object is expected for 1st argument" end end Thread.new{ eval_proc(cmd, *args) =begin eval_proc_core(false, proc{|safe, *params| $SAFE=safe if $SAFE < safe Thread.new(*params, &cmd).value }, safe_level, *args) =end } end
# File tk/lib/multi-tk.rb, line 2379 def bg_eval_string(cmd, *eval_args) # cmd string ==> proc unless cmd.kind_of?(String) raise RuntimeError, "A String object is expected for the 'cmd' argument" end Thread.new{ eval_proc_core(true, proc{|safe| Kernel.eval("$SAFE=#{safe} if $SAFE < #{safe};" << cmd, *eval_args) }) } end
def eval_proc(*args) # The scope of the eval-block of 'eval_proc' method is different from # the external. If you want to pass local values to the eval-block, # use arguments of eval_proc method. They are passed to block-arguments. if block_given? cmd = Proc.new else unless (cmd = args.shift) fail ArgumentError, "A Proc or Method object is expected for 1st argument" end end if TclTkLib.mainloop_thread? == true # call from eventloop current = Thread.current backup_ip = current[:callback_ip] current[:callback_ip] = self begin eval_proc_core(false, proc{|safe, *params| $SAFE=safe if $SAFE < safe cmd.call(*params) }, *args) ensure current[:callback_ip] = backup_ip end else eval_proc_core(true, proc{|safe, *params| $SAFE=safe if $SAFE < safe Thread.new(*params, &cmd).value }, *args) end end
# File tk/lib/multi-tk.rb, line 199 def call(*args) unless @ip.deleted? current = Thread.current backup_ip = current[:callback_ip] current[:callback_ip] = @ip begin ret = @ip.cb_eval(@cmd, *args) fail ret if ret.kind_of?(Exception) ret rescue TkCallbackBreak, TkCallbackContinue => e fail e rescue SecurityError => e # in 'exit', 'exit!', and 'abort' : security error --> delete IP if e.backtrace[0] =~ /^(.+?):(\d+):in `(exit|exit!|abort)'/ @ip.delete elsif @ip.safe? if @ip.respond_to?(:cb_error) @ip.cb_error(e) else nil # ignore end else fail e end rescue Exception => e fail e if e.message =~ /^TkCallback/ if @ip.safe? if @ip.respond_to?(:cb_error) @ip.cb_error(e) else nil # ignore end else fail e end ensure current[:callback_ip] = backup_ip end end end
# File tk/lib/multi-tk.rb, line 308 def cb_error(e) if @cb_error_proc[0].respond_to?(:call) @cb_error_proc[0].call(e) end end
def cb_eval(cmd, *args) #self.eval_callback{ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *args)) } #ret = self.eval_callback{ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *args)) } ret = self.eval_callback(*args){|safe, *params| $SAFE=safe if $SAFE < safe TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params)) } if ret.kind_of?(Exception) raise ret end ret end
# File tk/lib/multi-tk.rb, line 1927 def cb_eval(cmd, *args) self.eval_callback(*args, &_proc_on_safelevel{|*params| TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params)) }) end
# File tk/lib/multi-tk.rb, line 3195 def def_alias(slave, new_cmd, org_cmd, *args) raise SecurityError, "no permission to manipulate" unless self.manipulable? ret = @interp._invoke('interp', 'alias', _slavearg(slave), new_cmd, '', org_cmd, *args) (ret == new_cmd)? self: nil end
# File tk/lib/multi-tk.rb, line 3644 def default_encoding=(enc) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.default_encoding = enc end
# File tk/lib/multi-tk.rb, line 2871 def delete raise SecurityError, "no permission to manipulate" unless self.manipulable? @slave_ip_tbl.each{|name, subip| _destroy_slaves_of_slaveIP(subip) =begin begin subip._invoke('destroy', '.') unless subip.deleted? rescue Exception end =end begin # subip._eval_without_enc("foreach i [after info] {after cancel $i}") unless subip.deleted? after_ids = subip._eval_without_enc("after info") subip._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}") end rescue Exception end # safe_base? if @interp._eval_without_enc("catch {::safe::interpConfigure #{name}}") == '0' begin @interp._eval_without_enc("::safe::interpDelete #{name}") rescue Exception else next if subip.deleted? end end if subip.respond_to?(:safe_base?) && subip.safe_base? && !subip.deleted? # do 'exit' to call the delete_hook procedure begin subip._eval_without_enc('exit') rescue Exception end else begin subip.delete unless subip.deleted? rescue Exception end end } begin # @interp._eval_without_enc("foreach i [after info] {after cancel $i}") after_ids = @interp._eval_without_enc("after info") @interp._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}") rescue Exception end begin @interp._invoke('destroy', '.') unless @interp.deleted? rescue Exception end if @safe_base && !@interp.deleted? # do 'exit' to call the delete_hook procedure @interp._eval_without_enc('exit') end @interp.delete self end
# File tk/lib/multi-tk.rb, line 3234 def delete_cmd(slave, cmd) raise SecurityError, "no permission to manipulate" unless self.manipulable? slave_invoke = @interp._invoke('list', 'rename', cmd, '') @interp._invoke('interp', 'eval', _slavearg(slave), slave_invoke) self end
# File tk/lib/multi-tk.rb, line 3214 def delete_slaves(*args) raise SecurityError, "no permission to manipulate" unless self.manipulable? slaves = args.collect{|s| _slavearg(s)} @interp._invoke('interp', 'delete', *slaves) if slaves.size > 0 self end
# File tk/lib/multi-tk.rb, line 2934 def deleted? raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.deleted? end
# File tk/lib/multi-tk.rb, line 3649 def encoding=(enc) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.encoding = enc end
# File tk/lib/multi-tk.rb, line 3664 def encoding_convertfrom(str, enc=None) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.encoding_convertfrom(str, enc) end
# File tk/lib/multi-tk.rb, line 3670 def encoding_convertto(str, enc=None) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.encoding_convertto(str, enc) end
# File tk/lib/multi-tk.rb, line 3653 def encoding_name raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.encoding_name end
# File tk/lib/multi-tk.rb, line 3657 def encoding_obj raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.encoding_obj end
# File tk/lib/multi-tk.rb, line 3631 def encoding_table @interp.encoding_table end
# File tk/lib/multi-tk.rb, line 2396 def eval(*args, &blk) if block_given? eval_proc(*args, &blk) elsif args[0] if args[0].respond_to?(:call) eval_proc(*args) else eval_string(*args) end else fail ArgumentError, "no argument to eval" end end
Not stable, so disable this feature
# File tk/lib/multi-tk.rb, line 2234 def eval_callback(*args) if block_given? cmd = Proc.new else cmd = args.shift end begin if @@CALLBACK_SUBTHREAD.table[self].index(Thread.current) last_th = nil else last_th = @@CALLBACK_SUBTHREAD.table[self][-1] end @@CALLBACK_SUBTHREAD.new(self){ @@CALLBACK_SUBTHREAD.table[self] << Thread.current begin last_th.join if last_th eval_proc_core(false, cmd, *args) rescue Exception=>e e ensure @@CALLBACK_SUBTHREAD.table[self].delete(Thread.current) end } end end
# File tk/lib/multi-tk.rb, line 2275 def eval_proc(*args, &blk) if block_given? cmd = _proc_on_safelevel(&blk) else unless (cmd = args.shift) fail ArgumentError, "A Proc or Method object is expected for 1st argument" end cmd = _proc_on_safelevel(&cmd) end if TclTkLib.mainloop_thread? == true # call from eventloop current = Thread.current backup_ip = current[:callback_ip] current[:callback_ip] = self begin eval_proc_core(false, cmd, *args) ensure current[:callback_ip] = backup_ip end else eval_proc_core(true, proc{|safe, *params| Thread.new{cmd.call(safe, *params)}.value }, *args) end end
# File tk/lib/multi-tk.rb, line 2365 def eval_string(cmd, *eval_args) # cmd string ==> proc unless cmd.kind_of?(String) raise RuntimeError, "A String object is expected for the 'cmd' argument" end eval_proc_core(true, proc{|safe| Kernel.eval("$SAFE=#{safe} if $SAFE < #{safe};" << cmd, *eval_args) }) end
# File tk/lib/multi-tk.rb, line 3225 def exist?(slave = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? ret = @interp._invoke('interp', 'exists', _slavearg(slave)) (ret == '1')? true: false end
# File tk/lib/multi-tk.rb, line 2964 def exit(st = true) raise SecurityError, "no permission to manipulate" unless self.manipulable? if master? && !safe? && allow_ruby_exit? Kernel.exit(st) else delete st end end
# File tk/lib/multi-tk.rb, line 2974 def exit!(st = false) raise SecurityError, "no permission to manipulate" unless self.manipulable? if master? && !safe? && allow_ruby_exit? Kernel.exit!(st) else delete st end end
# File tk/lib/multi-tk.rb, line 3245 def expose_cmd(slave, cmd, aliasname = nil) raise SecurityError, "no permission to manipulate" unless self.manipulable? if aliasname @interp._invoke('interp', 'expose', _slavearg(slave), cmd, aliasname) else @interp._invoke('interp', 'expose', _slavearg(slave), cmd) end self end
# File tk/lib/multi-tk.rb, line 3635 def force_default_encoding=(mode) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.force_default_encoding = mode end
# File tk/lib/multi-tk.rb, line 3639 def force_default_encoding? raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.force_default_encoding? end
# File tk/lib/multi-tk.rb, line 3367 def get_bgerror_handler(slave = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? procedure(@interp._invoke('interp', 'bgerror', _slavearg(slave))) end
# File tk/lib/multi-tk.rb, line 3383 def get_limit(limit_type, slave = '', slot = nil) raise SecurityError, "no permission to manipulate" unless self.manipulable? if slot num_or_str(@interp._invoke('interp', 'limit', _slavearg(slave), limit_type, slot)) else l = @interp._split_tklist(@interp._invoke_without_enc('interp', 'limit', _slavearg(slave), limit_type)) l.map!{|s| _fromUTF8(s)} r = {} until l.empty? key = l.shift[1..-1] val = l.shift val = num_or_str(val) if val r[key] = val end r end end
# File tk/lib/multi-tk.rb, line 2939 def has_mainwindow? raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.has_mainwindow? end
# File tk/lib/multi-tk.rb, line 3259 def hide_cmd(slave, cmd, aliasname = nil) raise SecurityError, "no permission to manipulate" unless self.manipulable? if aliasname @interp._invoke('interp', 'hide', _slavearg(slave), cmd, aliasname) else @interp._invoke('interp', 'hide', _slavearg(slave), cmd) end self end
# File tk/lib/multi-tk.rb, line 2944 def invalid_namespace? raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.invalid_namespace? end
# File tk/lib/multi-tk.rb, line 1698 def ip_name @ip_name || '' end
def mainloop(check_root = true, restart_on_dead = true)
# File tk/lib/multi-tk.rb, line 2736 def mainloop(check_root = true, restart_on_dead = false) raise SecurityError, "no permission to manipulate" unless self.manipulable? if WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!! return @interp_thread.value if @interp_thread end #return self if self.slave? #return self if self != @@DEFAULT_MASTER if self != @@DEFAULT_MASTER if @wait_on_mainloop[0] begin @wait_on_mainloop[1] += 1 @cmd_queue.enq([@system, 'call_mainloop', Thread.current, check_root]) Thread.stop rescue MultiTkIp_OK => ret # return value if ret.value.kind_of?(Thread) return ret.value.value else return ret.value end rescue SystemExit => e # exit IP warn("Warning: " + e.inspect + " on " + self.inspect) if $DEBUG begin self._eval_without_enc('exit') rescue Exception end self.delete rescue StandardError => e if $DEBUG warn("Warning: " + e.class.inspect + ((e.message.length > 0)? ' "' + e.message + '"': '') + " on " + self.inspect) end return e rescue Exception => e return e ensure @wait_on_mainloop[1] -= 1 end end return end unless restart_on_dead @wait_on_mainloop[1] += 1 =begin begin @interp.mainloop(check_root) rescue StandardError => e if $DEBUG warn("Warning: " + e.class.inspect + ((e.message.length > 0)? ' "' + e.message + '"': '') + " on " + self.inspect) end end =end begin @interp.mainloop(check_root) ensure @wait_on_mainloop[1] -= 1 end else loop do break unless self.alive? if check_root begin break if TclTkLib.num_of_mainwindows == 0 rescue StandardError break end end break if @interp.deleted? begin @wait_on_mainloop[1] += 1 @interp.mainloop(check_root) rescue StandardError => e if TclTkLib.mainloop_abort_on_exception != nil #STDERR.print("Warning: Tk mainloop receives ", $!.class.inspect, # " exception (ignore) : ", $!.message, "\n"); if $DEBUG warn("Warning: Tk mainloop receives " << e.class.inspect << " exception (ignore) : " << e.message); end end #raise e rescue Exception => e =begin if TclTkLib.mainloop_abort_on_exception != nil #STDERR.print("Warning: Tk mainloop receives ", $!.class.inspect, # " exception (ignore) : ", $!.message, "\n"); if $DEBUG warn("Warning: Tk mainloop receives " << e.class.inspect << " exception (ignore) : " << e.message); end end =end raise e ensure @wait_on_mainloop[1] -= 1 Thread.pass # avoid eventloop conflict end end end self end
# File tk/lib/multi-tk.rb, line 2846 def make_safe raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.make_safe end
# File tk/lib/multi-tk.rb, line 1727 def manipulable? return true if (Thread.current.group == ThreadGroup::Default) ip = MultiTkIp.__getip (ip == self) || ip._is_master_of?(@interp) end
# File tk/lib/multi-tk.rb, line 3340 def mark_trusted(slave = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp', 'marktrusted', _slavearg(slave)) self end
# File tk/lib/multi-tk.rb, line 1659 def master? if @ip_name false else true end end
# File tk/lib/multi-tk.rb, line 3408 def recursion_limit(slave = '', limit = None) raise SecurityError, "no permission to manipulate" unless self.manipulable? number(@interp._invoke('interp', 'recursionlimit', _slavearg(slave), limit)) end
# File tk/lib/multi-tk.rb, line 2984 def restart(app_name = nil, keys = {}) raise SecurityError, "no permission to manipulate" unless self.manipulable? _init_ip_internal(@@INIT_IP_ENV, @@ADD_TK_PROCS) @interp._invoke('set', 'argv0', app_name) if app_name if keys.kind_of?(Hash) @interp._invoke('set', 'argv', _keys2opts(keys)) end @interp.restart end
# File tk/lib/multi-tk.rb, line 346 def running_mainloop? @wait_on_mainloop[1] > 0 end
# File tk/lib/multi-tk.rb, line 2851 def safe? raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp.safe? end
# File tk/lib/multi-tk.rb, line 2856 def safe_base? raise SecurityError, "no permission to manipulate" unless self.manipulable? @safe_base end
# File tk/lib/multi-tk.rb, line 332 def safe_level @safe_level[0] end
# File tk/lib/multi-tk.rb, line 323 def safe_level=(safe) set_safe_level(safe) end
# File tk/lib/multi-tk.rb, line 3571 def safeip_add_to_access_path(dir) ip = MultiTkIp.__getip ip._eval("::safe::interpAddToAccessPath #{@ip_name} #{dir}") end
# File tk/lib/multi-tk.rb, line 3526 def safeip_configinfo(slot = nil) ip = MultiTkIp.__getip ret = {} if slot conf = _lst2ary(ip._eval("::safe::interpConfigure " + @ip_name + " -#{slot}")) if conf[0] == '-deleteHook' =begin if conf[1] =~ /^rb_out\S* (c(_\d+_)?\d+)/ ret[conf[0][1..-1]] = MultiTkIp._tk_cmd_tbl[$1] =end if conf[1] =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/ ret[conf[0][1..-1]] = MultiTkIp._tk_cmd_tbl[$4] else ret[conf[0][1..-1]] = conf[1] end else ret[conf[0][1..-1]] = conf[1] end else Hash[*_lst2ary(ip._eval("::safe::interpConfigure " + @ip_name))].each{|k, v| if k == '-deleteHook' =begin if v =~ /^rb_out\S* (c(_\d+_)?\d+)/ ret[k[1..-1]] = MultiTkIp._tk_cmd_tbl[$1] =end if v =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/ ret[k[1..-1]] = MultiTkIp._tk_cmd_tbl[$4] else ret[k[1..-1]] = v end else ret[k[1..-1]] = v end } end ret end
# File tk/lib/multi-tk.rb, line 3513 def safeip_configure(slot, value=None) # use for '-noStatics' option ==> {statics=>false} # for '-nestedLoadOk' option ==> {nested=>true} if slot.kind_of?(Hash) ip = MultiTkIp.__getip ip._eval('::safe::interpConfigure ' + @ip_name + ' ' + _keys2opts(slot)) else ip._eval('::safe::interpConfigure ' + @ip_name + ' ' + "-#{slot} #{_get_eval_string(value)}") end self end
# File tk/lib/multi-tk.rb, line 3566 def safeip_delete ip = MultiTkIp.__getip ip._eval("::safe::interpDelete " + @ip_name) end
# File tk/lib/multi-tk.rb, line 3576 def safeip_find_in_access_path(dir) ip = MultiTkIp.__getip ip._eval("::safe::interpFindInAccessPath #{@ip_name} #{dir}") end
# File tk/lib/multi-tk.rb, line 3581 def safeip_set_log_cmd(cmd = Proc.new) ip = MultiTkIp.__getip ip._eval("::safe::setLogCmd #{@ip_name} #{_get_eval_string(cmd)}") end
# File tk/lib/multi-tk.rb, line 3350 def set_bgerror_handler(cmd = Proc.new, slave = nil, &b) raise SecurityError, "no permission to manipulate" unless self.manipulable? unless TkComm._callback_entry?(cmd) if !slave && b slave = cmd cmd = Proc.new(&b) end end slave = '' unless slave @interp._invoke('interp', 'bgerror', _slavearg(slave), cmd) end
# File tk/lib/multi-tk.rb, line 304 def set_cb_error(cmd = Proc.new) @cb_error_proc[0] = cmd end
# File tk/lib/multi-tk.rb, line 3375 def set_limit(limit_type, slave = '', opts = {}) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp', 'limit', _slavearg(slave), limit_type, opts) end
# File tk/lib/multi-tk.rb, line 316 def set_safe_level(safe) if safe > @safe_level[0] @safe_level[0] = safe @cmd_queue.enq([@system, 'set_safe_level', safe]) end @safe_level[0] end
# File tk/lib/multi-tk.rb, line 1711 def slaves(all = false) raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp','slaves').split.map!{|name| if @slave_ip_tbl.key?(name) @slave_ip_tbl[name] elsif all name else nil end }.compact! end
# File tk/lib/multi-tk.rb, line 1704 def to_eval @ip_name || '' end
# File tk/lib/multi-tk.rb, line 3475 def transfer_stderr(dist, src = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp', 'transfer', src, 'stderr', dist) self end
# File tk/lib/multi-tk.rb, line 3455 def transfer_stdin(dist, src = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp', 'transfer', src, 'stdin', dist) self end
# File tk/lib/multi-tk.rb, line 3497 def transfer_stdio(dist, src = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp', 'transfer', src, 'stdin', dist) @interp._invoke('interp', 'transfer', src, 'stdout', dist) @interp._invoke('interp', 'transfer', src, 'stderr', dist) self end
# File tk/lib/multi-tk.rb, line 3465 def transfer_stdout(dist, src = '') raise SecurityError, "no permission to manipulate" unless self.manipulable? @interp._invoke('interp', 'transfer', src, 'stdout', dist) self end