tk 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +2 -0
- data/MANUAL_tcltklib.eng +0 -2
- data/MANUAL_tcltklib.ja +0 -2
- data/README.ActiveTcl +1 -1
- data/README.md +43 -0
- data/ext/tk/extconf.rb +4 -2
- data/ext/tk/old-extconf.rb +0 -1
- data/ext/tk/tcltklib.c +46 -148
- data/ext/tk/tkutil/extconf.rb +0 -2
- data/ext/tk/tkutil/tkutil.c +6 -9
- data/lib/multi-tk.rb +95 -315
- data/lib/remote-tk.rb +6 -23
- data/lib/tk.rb +41 -122
- data/lib/tk/bgerror.rb +2 -2
- data/lib/tk/bindtag.rb +1 -1
- data/lib/tk/canvas.rb +6 -14
- data/lib/tk/canvastag.rb +8 -16
- data/lib/tk/font.rb +1 -1
- data/lib/tk/fontchooser.rb +1 -1
- data/lib/tk/image.rb +1 -1
- data/lib/tk/menu.rb +4 -4
- data/lib/tk/msgcat.rb +5 -5
- data/lib/tk/namespace.rb +12 -32
- data/lib/tk/optiondb.rb +3 -73
- data/lib/tk/scale.rb +2 -2
- data/lib/tk/scrollable.rb +4 -2
- data/lib/tk/selection.rb +5 -4
- data/lib/tk/text.rb +8 -16
- data/lib/tk/textmark.rb +1 -1
- data/lib/tk/texttag.rb +7 -15
- data/lib/tk/timer.rb +2 -2
- data/lib/tk/tk_mac.rb +18 -18
- data/lib/tk/validation.rb +4 -35
- data/lib/tk/variable.rb +7 -5
- data/lib/tk/virtevent.rb +1 -1
- data/lib/tkextlib/blt/barchart.rb +0 -17
- data/lib/tkextlib/blt/bitmap.rb +1 -1
- data/lib/tkextlib/blt/component.rb +34 -34
- data/lib/tkextlib/blt/dragdrop.rb +6 -6
- data/lib/tkextlib/blt/graph.rb +0 -17
- data/lib/tkextlib/blt/stripchart.rb +0 -17
- data/lib/tkextlib/blt/tabset.rb +16 -31
- data/lib/tkextlib/blt/tree.rb +5 -5
- data/lib/tkextlib/blt/treeview.rb +14 -14
- data/lib/tkextlib/blt/watch.rb +1 -1
- data/lib/tkextlib/bwidget/labelentry.rb +6 -14
- data/lib/tkextlib/bwidget/listbox.rb +13 -29
- data/lib/tkextlib/bwidget/notebook.rb +6 -14
- data/lib/tkextlib/bwidget/spinbox.rb +6 -14
- data/lib/tkextlib/bwidget/tree.rb +19 -35
- data/lib/tkextlib/itcl/incr_tcl.rb +2 -2
- data/lib/tkextlib/itk/incr_tk.rb +7 -29
- data/lib/tkextlib/iwidgets/calendar.rb +0 -15
- data/lib/tkextlib/iwidgets/entryfield.rb +0 -21
- data/lib/tkextlib/iwidgets/notebook.rb +2 -2
- data/lib/tkextlib/iwidgets/scrolledcanvas.rb +6 -14
- data/lib/tkextlib/iwidgets/tabnotebook.rb +2 -2
- data/lib/tkextlib/tcllib/ctext.rb +2 -2
- data/lib/tkextlib/tcllib/plotchart.rb +5 -5
- data/lib/tkextlib/tcllib/validator.rb +6 -6
- data/lib/tkextlib/tile.rb +1 -1
- data/lib/tkextlib/tile/style.rb +1 -1
- data/lib/tkextlib/tile/treeview.rb +13 -20
- data/lib/tkextlib/tkDND/tkdnd.rb +6 -22
- data/lib/tkextlib/tkHTML/htmlwidget.rb +1 -1
- data/lib/tkextlib/tktable/tktable.rb +1 -1
- data/lib/tkextlib/treectrl/tktreectrl.rb +12 -20
- data/lib/tkextlib/vu/pie.rb +1 -1
- data/sample/binding_sample.rb +2 -2
- data/sample/cmd_res_test.rb +1 -1
- data/sample/demos-en/widget +21 -21
- data/sample/demos-jp/widget +4 -4
- data/sample/multi-ip_sample.rb +0 -3
- data/sample/multi-ip_sample2.rb +1 -1
- data/sample/resource.en +3 -3
- data/sample/resource.ja +3 -3
- data/sample/tcltklib/sample1.rb +2 -2
- data/sample/tkballoonhelp.rb +2 -2
- data/sample/tkextlib/tkHTML/ss.rb +0 -6
- data/sample/tkmulticolumnlist.rb +2 -2
- data/sample/tkmultilistframe.rb +2 -2
- data/sample/tkoptdb.rb +14 -16
- data/tk.gemspec +4 -4
- metadata +6 -13
- data/ChangeLog.tkextlib +0 -949
- data/old-README.tcltklib.ja +0 -159
- data/sample/binstr_usage.rb +0 -46
- data/sample/remote-ip_sample2.rb +0 -57
- data/sample/safe-tk.rb +0 -132
- data/sample/tkoptdb-safeTk.rb +0 -74
- data/sample/tktree.rb +0 -104
- data/sample/tktree.tcl +0 -305
data/ext/tk/tkutil/extconf.rb
CHANGED
data/ext/tk/tkutil/tkutil.c
CHANGED
@@ -171,13 +171,6 @@ tk_obj_untrust(self, obj)
|
|
171
171
|
VALUE self;
|
172
172
|
VALUE obj;
|
173
173
|
{
|
174
|
-
#ifdef HAVE_RB_OBJ_TAINT
|
175
|
-
rb_obj_taint(obj);
|
176
|
-
#endif
|
177
|
-
#ifdef HAVE_RB_OBJ_UNTRUST
|
178
|
-
rb_obj_untrust(obj);
|
179
|
-
#endif
|
180
|
-
|
181
174
|
return obj;
|
182
175
|
}
|
183
176
|
|
@@ -190,7 +183,11 @@ tk_eval_cmd(argc, argv, self)
|
|
190
183
|
VALUE cmd, rest;
|
191
184
|
|
192
185
|
rb_scan_args(argc, argv, "1*", &cmd, &rest);
|
186
|
+
#ifdef RB_PASS_KEYWORDS
|
187
|
+
return rb_eval_cmd_kw(cmd, rest, 0);
|
188
|
+
#else
|
193
189
|
return rb_eval_cmd(cmd, rest, 0);
|
190
|
+
#endif
|
194
191
|
}
|
195
192
|
|
196
193
|
static VALUE
|
@@ -1142,7 +1139,7 @@ tcl2rb_string(self, value)
|
|
1142
1139
|
{
|
1143
1140
|
rb_check_type(value, T_STRING);
|
1144
1141
|
|
1145
|
-
if (RSTRING_PTR(value) == (char*)NULL) return
|
1142
|
+
if (RSTRING_PTR(value) == (char*)NULL) return rb_str_new2("");
|
1146
1143
|
|
1147
1144
|
return tkstr_to_str(value);
|
1148
1145
|
}
|
@@ -1154,7 +1151,7 @@ tcl2rb_num_or_str(self, value)
|
|
1154
1151
|
{
|
1155
1152
|
rb_check_type(value, T_STRING);
|
1156
1153
|
|
1157
|
-
if (RSTRING_PTR(value) == (char*)NULL) return
|
1154
|
+
if (RSTRING_PTR(value) == (char*)NULL) return rb_str_new2("");
|
1158
1155
|
|
1159
1156
|
return rb_rescue2(tkstr_to_number, value,
|
1160
1157
|
tkstr_to_str, value,
|
data/lib/multi-tk.rb
CHANGED
@@ -31,8 +31,8 @@ class << TclTkIp
|
|
31
31
|
end
|
32
32
|
obj = __new__(*args)
|
33
33
|
obj.instance_eval{
|
34
|
-
@force_default_encoding ||=
|
35
|
-
@encoding ||=
|
34
|
+
@force_default_encoding ||= [false]
|
35
|
+
@encoding ||= [nil]
|
36
36
|
def @encoding.to_s; self.join(nil); end
|
37
37
|
}
|
38
38
|
obj
|
@@ -88,26 +88,25 @@ class MultiTkIp
|
|
88
88
|
WITH_ENCODING = defined?(::Encoding.default_external)
|
89
89
|
#WITH_ENCODING = Object.const_defined?(:Encoding) && ::Encoding.class == Class
|
90
90
|
|
91
|
-
(@@SLAVE_IP_ID = ['slave'.freeze,
|
91
|
+
(@@SLAVE_IP_ID = ['slave'.freeze, '0']).instance_eval{
|
92
92
|
@mutex = Mutex.new
|
93
93
|
def mutex; @mutex; end
|
94
94
|
freeze
|
95
95
|
}
|
96
96
|
|
97
|
-
@@IP_TABLE =
|
97
|
+
@@IP_TABLE = {} unless defined?(@@IP_TABLE)
|
98
98
|
|
99
|
-
@@INIT_IP_ENV =
|
100
|
-
@@ADD_TK_PROCS =
|
99
|
+
@@INIT_IP_ENV = [] unless defined?(@@INIT_IP_ENV) # table of Procs
|
100
|
+
@@ADD_TK_PROCS = [] unless defined?(@@ADD_TK_PROCS) # table of [name, args, body]
|
101
101
|
|
102
|
-
@@TK_TABLE_LIST =
|
102
|
+
@@TK_TABLE_LIST = [] unless defined?(@@TK_TABLE_LIST)
|
103
103
|
|
104
104
|
unless defined?(@@TK_CMD_TBL)
|
105
|
-
@@TK_CMD_TBL =
|
105
|
+
@@TK_CMD_TBL = Object.new
|
106
106
|
|
107
|
-
|
108
|
-
tbl_obj = TkUtil.untrust(Hash.new{|hash,key|
|
107
|
+
tbl_obj = Hash.new{|hash,key|
|
109
108
|
fail IndexError, "unknown command ID '#{key}'"
|
110
|
-
}
|
109
|
+
}
|
111
110
|
@@TK_CMD_TBL.instance_variable_set('@tbl', tbl_obj)
|
112
111
|
|
113
112
|
class << @@TK_CMD_TBL
|
@@ -187,7 +186,7 @@ class MultiTkIp
|
|
187
186
|
@@CB_ENTRY_CLASS = Class.new(TkCallbackEntry){
|
188
187
|
def initialize(ip, cmd)
|
189
188
|
@ip = ip
|
190
|
-
@safe = safe =
|
189
|
+
@safe = safe = 0
|
191
190
|
# @cmd = cmd
|
192
191
|
cmd = MultiTkIp._proc_on_safelevel(&cmd)
|
193
192
|
@cmd = proc{|*args| cmd.call(safe, *args)}
|
@@ -302,8 +301,8 @@ class MultiTkIp
|
|
302
301
|
|
303
302
|
######################################
|
304
303
|
|
305
|
-
def set_cb_error(cmd =
|
306
|
-
@cb_error_proc[0] = cmd
|
304
|
+
def set_cb_error(cmd = nil, &block)
|
305
|
+
@cb_error_proc[0] = cmd || block
|
307
306
|
end
|
308
307
|
|
309
308
|
def cb_error(e)
|
@@ -315,26 +314,22 @@ class MultiTkIp
|
|
315
314
|
######################################
|
316
315
|
|
317
316
|
def set_safe_level(safe)
|
318
|
-
|
319
|
-
@safe_level[0] = safe
|
320
|
-
@cmd_queue.enq([@system, 'set_safe_level', safe])
|
321
|
-
end
|
322
|
-
@safe_level[0]
|
317
|
+
0
|
323
318
|
end
|
324
319
|
def safe_level=(safe)
|
325
|
-
|
320
|
+
0
|
326
321
|
end
|
327
322
|
def self.set_safe_level(safe)
|
328
|
-
|
323
|
+
0
|
329
324
|
end
|
330
325
|
def self.safe_level=(safe)
|
331
|
-
|
326
|
+
0
|
332
327
|
end
|
333
328
|
def safe_level
|
334
|
-
|
329
|
+
0
|
335
330
|
end
|
336
331
|
def self.safe_level
|
337
|
-
|
332
|
+
0
|
338
333
|
end
|
339
334
|
|
340
335
|
def wait_on_mainloop?
|
@@ -392,13 +387,11 @@ class MultiTkIp
|
|
392
387
|
end
|
393
388
|
end
|
394
389
|
|
395
|
-
def _receiver_eval_proc_core(
|
390
|
+
def _receiver_eval_proc_core(_safe_level, thread, cmd, *args)
|
396
391
|
begin
|
397
|
-
#ret = proc{$SAFE = safe_level; cmd.call(*args)}.call
|
398
|
-
#ret = cmd.call(safe_level, *args)
|
399
392
|
normal_ret = false
|
400
393
|
ret = catch(:IRB_EXIT) do # IRB hack
|
401
|
-
retval = cmd.call(
|
394
|
+
retval = cmd.call(0, *args)
|
402
395
|
normal_ret = true
|
403
396
|
retval
|
404
397
|
end
|
@@ -578,18 +571,18 @@ class MultiTkIp
|
|
578
571
|
end
|
579
572
|
end
|
580
573
|
|
581
|
-
def _receiver_eval_proc(last_thread,
|
574
|
+
def _receiver_eval_proc(last_thread, _safe_level, thread, cmd, *args)
|
582
575
|
if thread
|
583
576
|
Thread.new{
|
584
577
|
last_thread.join if last_thread
|
585
578
|
unless @interp.deleted?
|
586
|
-
_receiver_eval_proc_core(
|
579
|
+
_receiver_eval_proc_core(0, thread, cmd, *args)
|
587
580
|
end
|
588
581
|
}
|
589
582
|
else
|
590
583
|
Thread.new{
|
591
584
|
unless @interp.deleted?
|
592
|
-
_receiver_eval_proc_core(
|
585
|
+
_receiver_eval_proc_core(0, thread, cmd, *args)
|
593
586
|
end
|
594
587
|
}
|
595
588
|
last_thread
|
@@ -616,11 +609,11 @@ class MultiTkIp
|
|
616
609
|
end
|
617
610
|
end
|
618
611
|
|
619
|
-
def _create_receiver_and_watchdog(lvl =
|
620
|
-
lvl =
|
612
|
+
def _create_receiver_and_watchdog(lvl = 0)
|
613
|
+
lvl = 0
|
621
614
|
|
622
615
|
# command-procedures receiver
|
623
|
-
receiver = Thread.new(lvl){|
|
616
|
+
receiver = Thread.new(lvl){|_safe_level|
|
624
617
|
last_thread = {}
|
625
618
|
|
626
619
|
loop do
|
@@ -629,11 +622,6 @@ class MultiTkIp
|
|
629
622
|
if thread == @system
|
630
623
|
# control command
|
631
624
|
case cmd
|
632
|
-
when 'set_safe_level'
|
633
|
-
begin
|
634
|
-
safe_level = args[0] if safe_level < args[0]
|
635
|
-
rescue Exception
|
636
|
-
end
|
637
625
|
when 'call_mainloop'
|
638
626
|
thread = args.shift
|
639
627
|
_check_and_return(thread,
|
@@ -645,7 +633,7 @@ class MultiTkIp
|
|
645
633
|
else
|
646
634
|
# procedure
|
647
635
|
last_thread[thread] = _receiver_eval_proc(last_thread[thread],
|
648
|
-
|
636
|
+
0, thread,
|
649
637
|
cmd, *args)
|
650
638
|
end
|
651
639
|
end
|
@@ -717,15 +705,15 @@ class MultiTkIp
|
|
717
705
|
|
718
706
|
@@DEFAULT_MASTER = self.allocate
|
719
707
|
@@DEFAULT_MASTER.instance_eval{
|
720
|
-
@tk_windows =
|
708
|
+
@tk_windows = {}
|
721
709
|
|
722
|
-
@tk_table_list =
|
710
|
+
@tk_table_list = []
|
723
711
|
|
724
|
-
@slave_ip_tbl =
|
712
|
+
@slave_ip_tbl = {}
|
725
713
|
|
726
|
-
@slave_ip_top =
|
714
|
+
@slave_ip_top = {}
|
727
715
|
|
728
|
-
@evloop_thread =
|
716
|
+
@evloop_thread = []
|
729
717
|
|
730
718
|
unless keys.kind_of? Hash
|
731
719
|
fail ArgumentError, "expecting a Hash object for the 2nd argument"
|
@@ -808,28 +796,28 @@ class MultiTkIp
|
|
808
796
|
end
|
809
797
|
|
810
798
|
@interp.instance_eval{
|
811
|
-
@force_default_encoding ||=
|
812
|
-
@encoding ||=
|
799
|
+
@force_default_encoding ||= [false]
|
800
|
+
@encoding ||= [nil]
|
813
801
|
def @encoding.to_s; self.join(nil); end
|
814
802
|
}
|
815
803
|
|
816
804
|
@ip_name = nil
|
817
805
|
|
818
|
-
@callback_status =
|
806
|
+
@callback_status = []
|
819
807
|
|
820
808
|
@system = Object.new
|
821
809
|
|
822
|
-
@wait_on_mainloop =
|
810
|
+
@wait_on_mainloop = [true, 0]
|
823
811
|
|
824
812
|
@threadgroup = Thread.current.group
|
825
813
|
|
826
814
|
@safe_base = false
|
827
815
|
|
828
|
-
@safe_level = [
|
816
|
+
@safe_level = [0]
|
829
817
|
|
830
818
|
@cmd_queue = MultiTkIp::Command_Queue.new(@interp)
|
831
819
|
|
832
|
-
@cmd_receiver, @receiver_watchdog = _create_receiver_and_watchdog(
|
820
|
+
@cmd_receiver, @receiver_watchdog = _create_receiver_and_watchdog(0)
|
833
821
|
|
834
822
|
@threadgroup.add @cmd_receiver
|
835
823
|
@threadgroup.add @receiver_watchdog
|
@@ -902,7 +890,7 @@ class MultiTkIp
|
|
902
890
|
begin
|
903
891
|
req.ret[0] = req.target.instance_eval{
|
904
892
|
@cmd_receiver, @receiver_watchdog =
|
905
|
-
_create_receiver_and_watchdog(
|
893
|
+
_create_receiver_and_watchdog(0)
|
906
894
|
@threadgroup.add @cmd_receiver
|
907
895
|
@threadgroup.add @receiver_watchdog
|
908
896
|
@threadgroup.enclose
|
@@ -1194,8 +1182,8 @@ class MultiTkIp
|
|
1194
1182
|
ip_name = _create_slave_ip_name
|
1195
1183
|
slave_ip = @interp.create_slave(ip_name, true)
|
1196
1184
|
slave_ip.instance_eval{
|
1197
|
-
@force_default_encoding ||=
|
1198
|
-
@encoding ||=
|
1185
|
+
@force_default_encoding ||= [false]
|
1186
|
+
@encoding ||= [nil]
|
1199
1187
|
def @encoding.to_s; self.join(nil); end
|
1200
1188
|
}
|
1201
1189
|
@slave_ip_tbl[ip_name] = slave_ip
|
@@ -1242,8 +1230,8 @@ class MultiTkIp
|
|
1242
1230
|
ip_name = _create_slave_ip_name
|
1243
1231
|
slave_ip = @interp.create_slave(ip_name, false)
|
1244
1232
|
slave_ip.instance_eval{
|
1245
|
-
@force_default_encoding ||=
|
1246
|
-
@encoding ||=
|
1233
|
+
@force_default_encoding ||= [false]
|
1234
|
+
@encoding ||= [nil]
|
1247
1235
|
def @encoding.to_s; self.join(nil); end
|
1248
1236
|
}
|
1249
1237
|
slave_ip._invoke('set', 'argv0', name) if name.kind_of?(String)
|
@@ -1288,14 +1276,6 @@ class MultiTkIp
|
|
1288
1276
|
@slave_ip_top = {}
|
1289
1277
|
@cb_error_proc = []
|
1290
1278
|
@evloop_thread = []
|
1291
|
-
|
1292
|
-
TkUtil.untrust(@tk_windows) unless @tk_windows.tainted?
|
1293
|
-
TkUtil.untrust(@tk_table_list) unless @tk_table_list.tainted?
|
1294
|
-
TkUtil.untrust(@slave_ip_tbl) unless @slave_ip_tbl.tainted?
|
1295
|
-
TkUtil.untrust(@slave_ip_top) unless @slave_ip_top.tainted?
|
1296
|
-
TkUtil.untrust(@cb_error_proc) unless @cb_error_proc.tainted?
|
1297
|
-
TkUtil.untrust(@evloop_thread) unless @evloop_thread.tainted?
|
1298
|
-
|
1299
1279
|
@callback_status = []
|
1300
1280
|
|
1301
1281
|
name, safe, safe_opts, tk_opts = _parse_slaveopts(keys)
|
@@ -1309,30 +1289,12 @@ class MultiTkIp
|
|
1309
1289
|
unless WITH_RUBY_VM
|
1310
1290
|
@interp = TclTkIp.new(name, _keys2opts(tk_opts))
|
1311
1291
|
@interp.instance_eval{
|
1312
|
-
@force_default_encoding ||=
|
1313
|
-
@encoding ||=
|
1292
|
+
@force_default_encoding ||= [false]
|
1293
|
+
@encoding ||= [nil]
|
1314
1294
|
def @encoding.to_s; self.join(nil); end
|
1315
1295
|
}
|
1316
1296
|
|
1317
1297
|
else ### Ruby 1.9 !!!!!!!!!!!
|
1318
|
-
=begin
|
1319
|
-
@interp_thread = Thread.new{
|
1320
|
-
Thread.current[:interp] = interp = TclTkIp.new(name, _keys2opts(tk_opts))
|
1321
|
-
interp.instance_eval{
|
1322
|
-
@force_default_encoding ||= TkUtil.untrust([false])
|
1323
|
-
@encoding ||= TkUtil.untrust([nil])
|
1324
|
-
def @encoding.to_s; self.join(nil); end
|
1325
|
-
}
|
1326
|
-
|
1327
|
-
#sleep
|
1328
|
-
TclTkLib.mainloop(true)
|
1329
|
-
}
|
1330
|
-
until @interp_thread[:interp]
|
1331
|
-
Thread.pass
|
1332
|
-
end
|
1333
|
-
# INTERP_THREAD.run
|
1334
|
-
@interp = @interp_thread[:interp]
|
1335
|
-
=end
|
1336
1298
|
@interp_thread = Thread.new{
|
1337
1299
|
current = Thread.current
|
1338
1300
|
begin
|
@@ -1390,20 +1352,13 @@ class MultiTkIp
|
|
1390
1352
|
end
|
1391
1353
|
|
1392
1354
|
@interp.instance_eval{
|
1393
|
-
@force_default_encoding ||=
|
1394
|
-
@encoding ||=
|
1355
|
+
@force_default_encoding ||= [false]
|
1356
|
+
@encoding ||= [nil]
|
1395
1357
|
def @encoding.to_s; self.join(nil); end
|
1396
1358
|
}
|
1397
1359
|
|
1398
1360
|
@ip_name = nil
|
1399
1361
|
|
1400
|
-
if safe
|
1401
|
-
safe = $SAFE if safe < $SAFE
|
1402
|
-
@safe_level = [safe]
|
1403
|
-
else
|
1404
|
-
@safe_level = [$SAFE]
|
1405
|
-
end
|
1406
|
-
|
1407
1362
|
else
|
1408
1363
|
# create slave-ip
|
1409
1364
|
if safeip || master.safe?
|
@@ -1412,22 +1367,10 @@ class MultiTkIp
|
|
1412
1367
|
name, tk_opts)
|
1413
1368
|
# @interp_thread = nil if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!!
|
1414
1369
|
@interp_thread = nil unless WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!!
|
1415
|
-
if safe
|
1416
|
-
safe = master.safe_level if safe < master.safe_level
|
1417
|
-
@safe_level = [safe]
|
1418
|
-
else
|
1419
|
-
@safe_level = [1]
|
1420
|
-
end
|
1421
1370
|
else
|
1422
1371
|
@interp, @ip_name = master.__create_trusted_slave_obj(name, tk_opts)
|
1423
1372
|
# @interp_thread = nil if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!!
|
1424
1373
|
@interp_thread = nil unless WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!!
|
1425
|
-
if safe
|
1426
|
-
safe = master.safe_level if safe < master.safe_level
|
1427
|
-
@safe_level = [safe]
|
1428
|
-
else
|
1429
|
-
@safe_level = [master.safe_level]
|
1430
|
-
end
|
1431
1374
|
end
|
1432
1375
|
@set_alias_proc = proc{|name|
|
1433
1376
|
master._invoke('interp', 'alias', @ip_name, name, '', name)
|
@@ -1436,8 +1379,7 @@ class MultiTkIp
|
|
1436
1379
|
|
1437
1380
|
@system = Object.new
|
1438
1381
|
|
1439
|
-
@wait_on_mainloop =
|
1440
|
-
# @wait_on_mainloop = TkUtil.untrust([false, 0])
|
1382
|
+
@wait_on_mainloop = [true, 0]
|
1441
1383
|
|
1442
1384
|
@threadgroup = ThreadGroup.new
|
1443
1385
|
|
@@ -1445,19 +1387,11 @@ class MultiTkIp
|
|
1445
1387
|
|
1446
1388
|
@cmd_queue = MultiTkIp::Command_Queue.new(@interp)
|
1447
1389
|
|
1448
|
-
=begin
|
1449
|
-
@cmd_receiver, @receiver_watchdog = _create_receiver_and_watchdog(@safe_level[0])
|
1450
|
-
|
1451
|
-
@threadgroup.add @cmd_receiver
|
1452
|
-
@threadgroup.add @receiver_watchdog
|
1453
|
-
|
1454
|
-
@threadgroup.enclose
|
1455
|
-
=end
|
1456
1390
|
@@DEFAULT_MASTER.assign_receiver_and_watchdog(self)
|
1457
1391
|
|
1458
1392
|
@@IP_TABLE[@threadgroup] = self
|
1459
1393
|
@@TK_TABLE_LIST.size.times{
|
1460
|
-
@tk_table_list <<
|
1394
|
+
@tk_table_list << {}
|
1461
1395
|
}
|
1462
1396
|
_init_ip_internal(@@INIT_IP_ENV, @@ADD_TK_PROCS)
|
1463
1397
|
|
@@ -1510,7 +1444,7 @@ class MultiTkIp
|
|
1510
1444
|
super(interp){|ip| Thread.current[:callback_ip] = ip; blk.call}
|
1511
1445
|
end
|
1512
1446
|
|
1513
|
-
@table =
|
1447
|
+
@table = Hash.new{|h,k| h[k] = []}
|
1514
1448
|
def self.table
|
1515
1449
|
@table
|
1516
1450
|
end
|
@@ -1551,7 +1485,7 @@ class << MultiTkIp
|
|
1551
1485
|
alias __new new
|
1552
1486
|
private :__new
|
1553
1487
|
|
1554
|
-
def new_master(
|
1488
|
+
def new_master(_safe=nil, keys={}, &blk)
|
1555
1489
|
if MultiTkIp::WITH_RUBY_VM
|
1556
1490
|
#### TODO !!!!!!
|
1557
1491
|
fail RuntimeError,
|
@@ -1572,11 +1506,8 @@ class << MultiTkIp
|
|
1572
1506
|
end
|
1573
1507
|
|
1574
1508
|
ip = __new(__getip, nil, keys)
|
1575
|
-
#ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given?
|
1576
1509
|
if block_given?
|
1577
|
-
|
1578
|
-
#Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)}
|
1579
|
-
ip._proc_on_safelevel(&blk).call(ip.safe_level)
|
1510
|
+
ip._proc_on_safelevel(&blk).call(0)
|
1580
1511
|
end
|
1581
1512
|
ip
|
1582
1513
|
end
|
@@ -1598,11 +1529,8 @@ class << MultiTkIp
|
|
1598
1529
|
end
|
1599
1530
|
|
1600
1531
|
ip = __new(__getip, false, keys)
|
1601
|
-
# ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given?
|
1602
1532
|
if block_given?
|
1603
|
-
|
1604
|
-
#Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)}
|
1605
|
-
ip._proc_on_safelevel(&blk).call(ip.safe_level)
|
1533
|
+
ip._proc_on_safelevel(&blk).call(0)
|
1606
1534
|
end
|
1607
1535
|
ip
|
1608
1536
|
end
|
@@ -1621,11 +1549,8 @@ class << MultiTkIp
|
|
1621
1549
|
end
|
1622
1550
|
|
1623
1551
|
ip = __new(__getip, true, keys)
|
1624
|
-
# ip.eval_proc(proc{$SAFE=ip.safe_level; Proc.new}.call) if block_given?
|
1625
1552
|
if block_given?
|
1626
|
-
|
1627
|
-
#Thread.new{ip.eval_proc(proc{$SAFE=ip.safe_level; yield}.call)}
|
1628
|
-
ip._proc_on_safelevel(&blk).call(ip.safe_level)
|
1553
|
+
ip._proc_on_safelevel(&blk).call(0)
|
1629
1554
|
end
|
1630
1555
|
ip
|
1631
1556
|
end
|
@@ -1759,7 +1684,7 @@ class MultiTkIp
|
|
1759
1684
|
|
1760
1685
|
def _add_new_tables
|
1761
1686
|
(@@TK_TABLE_LIST.size - @tk_table_list.size).times{
|
1762
|
-
@tk_table_list <<
|
1687
|
+
@tk_table_list << {}
|
1763
1688
|
}
|
1764
1689
|
end
|
1765
1690
|
|
@@ -1850,7 +1775,8 @@ class MultiTkIp
|
|
1850
1775
|
return obj
|
1851
1776
|
end
|
1852
1777
|
|
1853
|
-
def self.init_ip_env(script =
|
1778
|
+
def self.init_ip_env(script = nil, &block)
|
1779
|
+
script ||= block
|
1854
1780
|
@@INIT_IP_ENV << script
|
1855
1781
|
if __getip.slave?
|
1856
1782
|
begin
|
@@ -1911,82 +1837,12 @@ class MultiTkIp
|
|
1911
1837
|
@@CB_ENTRY_CLASS.new(__getip, cmd).freeze
|
1912
1838
|
end
|
1913
1839
|
|
1914
|
-
=begin
|
1915
|
-
def cb_eval(cmd, *args)
|
1916
|
-
#self.eval_callback{ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *args)) }
|
1917
|
-
#ret = self.eval_callback{ TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *args)) }
|
1918
|
-
ret = self.eval_callback(*args){|safe, *params|
|
1919
|
-
$SAFE=safe if $SAFE < safe
|
1920
|
-
TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params))
|
1921
|
-
}
|
1922
|
-
if ret.kind_of?(Exception)
|
1923
|
-
raise ret
|
1924
|
-
end
|
1925
|
-
ret
|
1926
|
-
end
|
1927
|
-
=end
|
1928
1840
|
def cb_eval(cmd, *args)
|
1929
1841
|
self.eval_callback(*args,
|
1930
1842
|
&_proc_on_safelevel{|*params|
|
1931
1843
|
TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params))
|
1932
1844
|
})
|
1933
1845
|
end
|
1934
|
-
=begin
|
1935
|
-
def cb_eval(cmd, *args)
|
1936
|
-
self.eval_callback(*args){|safe, *params|
|
1937
|
-
$SAFE=safe if $SAFE < safe
|
1938
|
-
# TkUtil.eval_cmd(cmd, *params)
|
1939
|
-
TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params))
|
1940
|
-
}
|
1941
|
-
end
|
1942
|
-
=end
|
1943
|
-
=begin
|
1944
|
-
def cb_eval(cmd, *args)
|
1945
|
-
@callback_status[0] ||= TkVariable.new
|
1946
|
-
@callback_status[1] ||= TkVariable.new
|
1947
|
-
st, val = @callback_status
|
1948
|
-
th = Thread.new{
|
1949
|
-
self.eval_callback(*args){|safe, *params|
|
1950
|
-
#p [status, val, safe, *params]
|
1951
|
-
$SAFE=safe if $SAFE < safe
|
1952
|
-
begin
|
1953
|
-
TkComm._get_eval_string(TkUtil.eval_cmd(cmd, *params))
|
1954
|
-
rescue TkCallbackContinue
|
1955
|
-
st.value = 4
|
1956
|
-
rescue TkCallbackBreak
|
1957
|
-
st.value = 3
|
1958
|
-
rescue TkCallbackReturn
|
1959
|
-
st.value = 2
|
1960
|
-
rescue Exception => e
|
1961
|
-
val.value = e.message
|
1962
|
-
st.value = 1
|
1963
|
-
else
|
1964
|
-
st.value = 0
|
1965
|
-
end
|
1966
|
-
}
|
1967
|
-
}
|
1968
|
-
begin
|
1969
|
-
st.wait
|
1970
|
-
status = st.numeric
|
1971
|
-
retval = val.value
|
1972
|
-
rescue => e
|
1973
|
-
fail e
|
1974
|
-
end
|
1975
|
-
|
1976
|
-
if status == 1
|
1977
|
-
fail RuntimeError, retval
|
1978
|
-
elsif status == 2
|
1979
|
-
fail TkCallbackReturn, "Tk callback returns 'return' status"
|
1980
|
-
elsif status == 3
|
1981
|
-
fail TkCallbackBreak, "Tk callback returns 'break' status"
|
1982
|
-
elsif status == 4
|
1983
|
-
fail TkCallbackContinue, "Tk callback returns 'continue' status"
|
1984
|
-
else
|
1985
|
-
''
|
1986
|
-
end
|
1987
|
-
end
|
1988
|
-
=end
|
1989
|
-
|
1990
1846
|
end
|
1991
1847
|
|
1992
1848
|
# pseudo-toplevel operation support
|
@@ -2038,15 +1894,6 @@ end
|
|
2038
1894
|
if (!defined?(Use_PseudoToplevel_Feature_of_MultiTkIp) ||
|
2039
1895
|
Use_PseudoToplevel_Feature_of_MultiTkIp)
|
2040
1896
|
module MultiTkIp_PseudoToplevel_Evaluable
|
2041
|
-
#def pseudo_toplevel_eval(body = Proc.new)
|
2042
|
-
# Thread.current[:TOPLEVEL] = self
|
2043
|
-
# begin
|
2044
|
-
# body.call
|
2045
|
-
# ensure
|
2046
|
-
# Thread.current[:TOPLEVEL] = nil
|
2047
|
-
# end
|
2048
|
-
#end
|
2049
|
-
|
2050
1897
|
def pseudo_toplevel_evaluable?
|
2051
1898
|
@pseudo_toplevel_evaluable
|
2052
1899
|
end
|
@@ -2062,25 +1909,25 @@ if (!defined?(Use_PseudoToplevel_Feature_of_MultiTkIp) ||
|
|
2062
1909
|
end
|
2063
1910
|
|
2064
1911
|
class Object
|
2065
|
-
|
2066
|
-
|
2067
|
-
|
2068
|
-
|
2069
|
-
|
2070
|
-
|
2071
|
-
|
2072
|
-
|
2073
|
-
|
2074
|
-
|
2075
|
-
|
2076
|
-
end
|
1912
|
+
include(Module.new do
|
1913
|
+
private
|
1914
|
+
def method_missing(id, *args)
|
1915
|
+
begin
|
1916
|
+
has_top = (top = MultiTkIp.__getip.__pseudo_toplevel) &&
|
1917
|
+
top.respond_to?(:pseudo_toplevel_evaluable?) &&
|
1918
|
+
top.pseudo_toplevel_evaluable? &&
|
1919
|
+
top.respond_to?(id)
|
1920
|
+
rescue Exception => e
|
1921
|
+
has_top = false
|
1922
|
+
end
|
2077
1923
|
|
2078
|
-
|
2079
|
-
|
2080
|
-
|
2081
|
-
|
1924
|
+
if has_top
|
1925
|
+
top.__send__(id, *args)
|
1926
|
+
else
|
1927
|
+
super
|
1928
|
+
end
|
2082
1929
|
end
|
2083
|
-
end
|
1930
|
+
end)
|
2084
1931
|
end
|
2085
1932
|
else
|
2086
1933
|
# dummy
|
@@ -2104,22 +1951,8 @@ class MultiTkIp
|
|
2104
1951
|
_proc_on_safelevel(&cmd)
|
2105
1952
|
end
|
2106
1953
|
else
|
2107
|
-
|
2108
|
-
|
2109
|
-
# avoid security error on Exception objects
|
2110
|
-
untrust_proc = proc{|err|
|
2111
|
-
begin
|
2112
|
-
err.untrust if err.respond_to?(:untrust)
|
2113
|
-
rescue SecurityError
|
2114
|
-
end
|
2115
|
-
err
|
2116
|
-
}
|
2117
|
-
$SAFE=safe if $SAFE < safe;
|
2118
|
-
begin
|
2119
|
-
yield(*args)
|
2120
|
-
rescue Exception => e
|
2121
|
-
fail untrust_proc.call(e)
|
2122
|
-
end
|
1954
|
+
Proc.new{|_safe, *args|
|
1955
|
+
yield(*args)
|
2123
1956
|
}
|
2124
1957
|
end
|
2125
1958
|
end
|
@@ -2128,9 +1961,8 @@ class MultiTkIp
|
|
2128
1961
|
end
|
2129
1962
|
|
2130
1963
|
def _proc_on_current_safelevel(cmd=nil, &blk) # require a block for eval
|
2131
|
-
safe = $SAFE
|
2132
1964
|
cmd = _proc_on_safelevel(cmd, &blk)
|
2133
|
-
Proc.new{|*args| cmd.call(
|
1965
|
+
Proc.new{|*args| cmd.call(0, *args)}
|
2134
1966
|
end
|
2135
1967
|
def MultiTkIp._proc_on_current_safelevel(cmd=nil, &blk)
|
2136
1968
|
MultiTkIp.__getip._proc_on_current_safelevel(cmd, &blk)
|
@@ -2149,7 +1981,7 @@ class MultiTkIp
|
|
2149
1981
|
if @cmd_receiver == Thread.current ||
|
2150
1982
|
(!req_val && TclTkLib.mainloop_thread? != false) # callback
|
2151
1983
|
begin
|
2152
|
-
ret = cmd.call(
|
1984
|
+
ret = cmd.call(0, *args)
|
2153
1985
|
rescue SystemExit => e
|
2154
1986
|
# exit IP
|
2155
1987
|
warn("Warning: "+ e.inspect + " on " + self.inspect) if $DEBUG
|
@@ -2232,12 +2064,8 @@ class MultiTkIp
|
|
2232
2064
|
|
2233
2065
|
if false && WITH_RUBY_VM ### Ruby 1.9
|
2234
2066
|
# Not stable, so disable this feature
|
2235
|
-
def eval_callback(*args)
|
2236
|
-
|
2237
|
-
cmd = Proc.new
|
2238
|
-
else
|
2239
|
-
cmd = args.shift
|
2240
|
-
end
|
2067
|
+
def eval_callback(*args, &block)
|
2068
|
+
cmd = block || args.shift
|
2241
2069
|
begin
|
2242
2070
|
if @@CALLBACK_SUBTHREAD.table[self].index(Thread.current)
|
2243
2071
|
last_th = nil
|
@@ -2258,12 +2086,8 @@ if false && WITH_RUBY_VM ### Ruby 1.9
|
|
2258
2086
|
end
|
2259
2087
|
end
|
2260
2088
|
else ### Ruby 1.8
|
2261
|
-
def eval_callback(*args)
|
2262
|
-
|
2263
|
-
cmd = Proc.new
|
2264
|
-
else
|
2265
|
-
cmd = args.shift
|
2266
|
-
end
|
2089
|
+
def eval_callback(*args, &block)
|
2090
|
+
cmd = block || args.shift
|
2267
2091
|
begin
|
2268
2092
|
eval_proc_core(false, cmd, *args)
|
2269
2093
|
rescue Exception=>e
|
@@ -2300,47 +2124,11 @@ end
|
|
2300
2124
|
*args)
|
2301
2125
|
end
|
2302
2126
|
end
|
2303
|
-
=begin
|
2304
|
-
def eval_proc(*args)
|
2305
|
-
# The scope of the eval-block of 'eval_proc' method is different from
|
2306
|
-
# the external. If you want to pass local values to the eval-block,
|
2307
|
-
# use arguments of eval_proc method. They are passed to block-arguments.
|
2308
|
-
if block_given?
|
2309
|
-
cmd = Proc.new
|
2310
|
-
else
|
2311
|
-
unless (cmd = args.shift)
|
2312
|
-
fail ArgumentError, "A Proc or Method object is expected for 1st argument"
|
2313
|
-
end
|
2314
|
-
end
|
2315
|
-
if TclTkLib.mainloop_thread? == true
|
2316
|
-
# call from eventloop
|
2317
|
-
current = Thread.current
|
2318
|
-
backup_ip = current[:callback_ip]
|
2319
|
-
current[:callback_ip] = self
|
2320
|
-
begin
|
2321
|
-
eval_proc_core(false,
|
2322
|
-
proc{|safe, *params|
|
2323
|
-
$SAFE=safe if $SAFE < safe
|
2324
|
-
cmd.call(*params)
|
2325
|
-
}, *args)
|
2326
|
-
ensure
|
2327
|
-
current[:callback_ip] = backup_ip
|
2328
|
-
end
|
2329
|
-
else
|
2330
|
-
eval_proc_core(true,
|
2331
|
-
proc{|safe, *params|
|
2332
|
-
$SAFE=safe if $SAFE < safe
|
2333
|
-
Thread.new(*params, &cmd).value
|
2334
|
-
},
|
2335
|
-
*args)
|
2336
|
-
end
|
2337
|
-
end
|
2338
|
-
=end
|
2339
2127
|
alias call eval_proc
|
2340
2128
|
|
2341
|
-
def bg_eval_proc(*args)
|
2342
|
-
if
|
2343
|
-
cmd =
|
2129
|
+
def bg_eval_proc(*args, &block)
|
2130
|
+
if block
|
2131
|
+
cmd = block
|
2344
2132
|
else
|
2345
2133
|
unless (cmd = args.shift)
|
2346
2134
|
fail ArgumentError, "A Proc or Method object is expected for 1st argument"
|
@@ -2348,14 +2136,6 @@ end
|
|
2348
2136
|
end
|
2349
2137
|
Thread.new{
|
2350
2138
|
eval_proc(cmd, *args)
|
2351
|
-
=begin
|
2352
|
-
eval_proc_core(false,
|
2353
|
-
proc{|safe, *params|
|
2354
|
-
$SAFE=safe if $SAFE < safe
|
2355
|
-
Thread.new(*params, &cmd).value
|
2356
|
-
},
|
2357
|
-
safe_level, *args)
|
2358
|
-
=end
|
2359
2139
|
}
|
2360
2140
|
end
|
2361
2141
|
alias background_eval_proc bg_eval_proc
|
@@ -2371,8 +2151,7 @@ end
|
|
2371
2151
|
|
2372
2152
|
eval_proc_core(true,
|
2373
2153
|
proc{|safe|
|
2374
|
-
Kernel.eval(
|
2375
|
-
*eval_args)
|
2154
|
+
Kernel.eval(cmd, *eval_args)
|
2376
2155
|
})
|
2377
2156
|
end
|
2378
2157
|
alias eval_str eval_string
|
@@ -2385,8 +2164,7 @@ end
|
|
2385
2164
|
Thread.new{
|
2386
2165
|
eval_proc_core(true,
|
2387
2166
|
proc{|safe|
|
2388
|
-
Kernel.eval(
|
2389
|
-
*eval_args)
|
2167
|
+
Kernel.eval(cmd, *eval_args)
|
2390
2168
|
})
|
2391
2169
|
}
|
2392
2170
|
end
|
@@ -3348,21 +3126,22 @@ class MultiTkIp
|
|
3348
3126
|
self
|
3349
3127
|
end
|
3350
3128
|
|
3351
|
-
def set_bgerror_handler(cmd =
|
3129
|
+
def set_bgerror_handler(cmd = nil, slave = nil, &b)
|
3130
|
+
cmd ||= b
|
3352
3131
|
raise SecurityError, "no permission to manipulate" unless self.manipulable?
|
3353
3132
|
|
3354
3133
|
unless TkComm._callback_entry?(cmd)
|
3355
3134
|
if !slave && b
|
3356
3135
|
slave = cmd
|
3357
|
-
cmd =
|
3136
|
+
cmd = b
|
3358
3137
|
end
|
3359
3138
|
end
|
3360
3139
|
slave = '' unless slave
|
3361
3140
|
|
3362
3141
|
@interp._invoke('interp', 'bgerror', _slavearg(slave), cmd)
|
3363
3142
|
end
|
3364
|
-
def self.bgerror(cmd =
|
3365
|
-
__getip.bgerror(cmd, slave, &b)
|
3143
|
+
def self.bgerror(cmd = nil, slave = nil, &b)
|
3144
|
+
__getip.bgerror(cmd || b, slave, &b)
|
3366
3145
|
end
|
3367
3146
|
|
3368
3147
|
def get_bgerror_handler(slave = '')
|
@@ -3579,7 +3358,8 @@ class MultiTkIp
|
|
3579
3358
|
ip._eval("::safe::interpFindInAccessPath #{@ip_name} #{dir}")
|
3580
3359
|
end
|
3581
3360
|
|
3582
|
-
def safeip_set_log_cmd(cmd =
|
3361
|
+
def safeip_set_log_cmd(cmd = nil, &block)
|
3362
|
+
cmd ||= block
|
3583
3363
|
ip = MultiTkIp.__getip
|
3584
3364
|
ip._eval("::safe::setLogCmd #{@ip_name} #{_get_eval_string(cmd)}")
|
3585
3365
|
end
|