arcadia 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  name=file_history
2
- frames=0.0
2
+ frames=1.0
3
3
  frames.labels=File history
4
4
  frames.names=file_history
5
5
  active=yes
@@ -7,7 +7,7 @@ require=ext/ae-file-history/ae-file-history
7
7
  class=FilesHistrory
8
8
 
9
9
  file.name=arcadia.history
10
- length=35
10
+ length=20
11
11
  font=courier 11
12
12
  font.bold=courier 11 bold
13
13
  color.background=#ffffff
@@ -30,36 +30,6 @@ class TreeNode
30
30
  self.label.strip <=> other.label.strip
31
31
  end
32
32
 
33
- # def path
34
- # _path = @label
35
- # if @parent != nil
36
- # _path = @parent.path+_path
37
- # end
38
- # return _path
39
- # end
40
-
41
- def dir_old(_path)
42
- node = nil
43
- parent = self
44
- sons.each{|_tree|
45
- if _path[0.._tree.label.length-1] == _tree.label
46
- res = _path[_tree.label.length.._path.length-1]
47
- if ["\\","/"].include?(res[0,1])
48
- parent = _tree
49
- node= _tree.dir(res)
50
- end
51
- end
52
- break if node != nil
53
- }
54
- if node == nil
55
- node = TreeNode.new(parent,'KDir') do |_node|
56
- _node.label=_path
57
- _node.rif= parent.path+_path
58
- end
59
- end
60
- return node
61
- end
62
-
63
33
  def dir(_path)
64
34
  node = nil
65
35
  parent = self
@@ -108,13 +78,10 @@ class FilesHistrory < ArcadiaExt
108
78
  def sync_on
109
79
  @sync = true
110
80
  select_file_without_event(@last_file) if @last_file
111
-
112
- #Arcadia.attach_listener(self, BufferRaisedEvent)
113
81
  end
114
82
 
115
83
  def sync_off
116
84
  @sync = false
117
- #Arcadia.detach_listener(self, BufferRaisedEvent)
118
85
  end
119
86
 
120
87
  def on_before_build(_event)
@@ -126,11 +93,18 @@ class FilesHistrory < ArcadiaExt
126
93
  @cb_sync = TkCheckButton.new(self.frame.hinner_frame, Arcadia.style('checkbox')){
127
94
  text 'Sync'
128
95
  justify 'left'
129
- variable 1
130
- #command do_check
131
- place('x' => 0,'y' => 0,'height' => 22)
96
+ indicatoron 0
97
+ offrelief 'raised'
98
+ image TkPhotoImage.new('dat' => SYNCICON20_GIF)
99
+ place('x' => 0,'y' => 0,'height' => 26)
132
100
  }
133
101
 
102
+ Tk::BWidget::DynamicHelp::add(@cb_sync,
103
+ 'text'=>'Link open editors with content in the Navigator')
104
+
105
+
106
+
107
+
134
108
  do_check = proc {
135
109
  if @cb_sync.cget('onvalue')==@cb_sync.cget('variable').value.to_i
136
110
  sync_on
@@ -162,19 +136,26 @@ class FilesHistrory < ArcadiaExt
162
136
  #EditorContract.instance.open_file(self,'file'=>_file)
163
137
  end
164
138
  }
165
- # _background = conf('color.background')
166
- # _foreground = conf('color.foreground')
139
+
140
+ do_open_folder = proc{|_node|
141
+ children = @htree.nodes(_node)
142
+ if children.length == 1
143
+ @htree.open_tree(children[0],false)
144
+ end
145
+ }
146
+
167
147
  @font = Arcadia.conf('treeitem.font')
168
148
  @font_b = "#{Arcadia.conf('treeitem.font')} bold"
169
149
 
170
150
  @htree = Tk::BWidget::Tree.new(self.frame.hinner_frame, Arcadia.style('treepanel')){
171
151
  showlines false
172
152
  deltay 18
153
+ opencmd proc{|node| do_open_folder.call(node)}
173
154
  selectcommand proc{ do_select_item.call(self) }
174
155
  # place('relwidth' => 1,'relheight' => '1', 'x' => '0','y' => '22', 'height' => -22)
175
156
  }
176
157
  _wrapper = TkScrollWidget.new(@htree)
177
- _wrapper.show(0,22)
158
+ _wrapper.show(0,26)
178
159
  _wrapper.show_v_scroll
179
160
  _wrapper.show_h_scroll
180
161
  # _scrollcommand = proc{|*args| @htree.yview(*args)}
@@ -97,7 +97,7 @@ class SearchOutput
97
97
  @results = {}
98
98
  _open_file = proc do |tree, sel|
99
99
  n_parent, n = sel.split('@@@')
100
- Arcadia.process_event(OpenBufferEvent.new(self,'file'=>@results[n_parent][n][0], 'row'=>@results[n_parent][n][1])) if n && @results[n_parent][n]
100
+ Arcadia.process_event(OpenBufferTransientEvent.new(self,'file'=>@results[n_parent][n][0], 'row'=>@results[n_parent][n][1])) if n && @results[n_parent][n]
101
101
  #EditorContract.instance.open_file(self, 'file'=>@results[n_parent][n][0], 'line'=>@results[n_parent][n][1]) if n && @results[n_parent][n]
102
102
  end
103
103
 
@@ -170,6 +170,7 @@ class SearchOutput
170
170
  Tk.update
171
171
  @results[_r_node]={}
172
172
  @count = 0
173
+ @tree.set_focus
173
174
  return _r_node
174
175
  end
175
176
 
@@ -614,6 +614,10 @@ class Application
614
614
  def Application.conf(_property)
615
615
  @@instance['conf'][_property] if @@instance
616
616
  end
617
+
618
+ def conf(_property)
619
+ self['conf'][_property]
620
+ end
617
621
 
618
622
  def sys_info
619
623
  "[Platform = #{RUBY_PLATFORM}] [Ruby version = #{RUBY_VERSION}]"
@@ -58,6 +58,9 @@ end
58
58
  class OpenBufferEvent < BufferEvent
59
59
  end
60
60
 
61
+ class OpenBufferTransientEvent < OpenBufferEvent
62
+ end
63
+
61
64
  class CloseBufferEvent < BufferEvent
62
65
  end
63
66
 
@@ -68,6 +71,11 @@ class SaveAsBufferEvent < SaveBufferEvent
68
71
  attr_accessor :new_file
69
72
  end
70
73
 
74
+ class MoveBufferEvent < BufferEvent
75
+ attr_accessor :old_file
76
+ attr_accessor :new_file
77
+ end
78
+
71
79
  class GoToLineBufferEvent < BufferEvent
72
80
  attr_accessor :line
73
81
  end
@@ -23,7 +23,7 @@ class Arcadia < TkApplication
23
23
  super(
24
24
  ApplicationParams.new(
25
25
  'arcadia',
26
- '0.6.0',
26
+ '0.7.0',
27
27
  'conf/arcadia.conf',
28
28
  'conf/arcadia.pers'
29
29
  )
@@ -43,7 +43,9 @@ class Arcadia < TkApplication
43
43
  title _title
44
44
  withdraw
45
45
  protocol( "WM_DELETE_WINDOW", $arcadia['action.on_exit'])
46
+ iconphoto(TkPhotoImage.new('dat'=>ARCADIA_RING_GIF))
46
47
  }
48
+
47
49
  @on_event = Hash.new
48
50
 
49
51
  @main_menu_bar = TkMenubar.new(
@@ -69,7 +71,6 @@ class Arcadia < TkApplication
69
71
  @splash.set_progress(50) if @splash
70
72
  @splash.deiconify if @splash
71
73
  Tk.update
72
- #sleep(1)
73
74
  @splash.next_step('..prepare') if @splash
74
75
  prepare
75
76
  @splash.last_step('..load finish') if @splash
@@ -406,7 +407,7 @@ class Arcadia < TkApplication
406
407
 
407
408
 
408
409
  def do_exit
409
- q1 = (Arcadia.dialog(self,
410
+ q1 = conf('confirm-on-exit')!='yes' || (Arcadia.dialog(self,
410
411
  'type'=>'yes_no',
411
412
  'msg'=>"Do you want exit?",
412
413
  'title' => '(Arcadia) Exit',
@@ -816,6 +817,21 @@ class ArcadiaMainMenu < ArcadiaUserControl
816
817
  @menu.add_menu(menu_spec_view)
817
818
  @menu.add_menu(menu_spec_tools)
818
819
  @menu.add_menu(menu_spec_help)
820
+
821
+ #@menu.bind_append("1", proc{
822
+ # chs = TkWinfo.children(@menu)
823
+ # hh = 25
824
+ # @last_post = nil
825
+ # chs.each{|ch|
826
+ # ch.bind_append("Enter", proc{|x,y,rx,ry|
827
+ # @last_post.unpost if @last_post
828
+ # ch.menu.post(x-rx,y-ry+hh)
829
+ # @last_post=ch.menu}, "%X %Y %x %y")
830
+ # ch.bind_append("Leave", proc{
831
+ # @last_post.unpost if @last_post
832
+ # })
833
+ # }
834
+ #})
819
835
  end
820
836
 
821
837
  end
@@ -869,6 +885,14 @@ class ArcadiaAboutSplash < TkToplevel
869
885
  justify 'left'
870
886
  place('width' => '120','x' => 150,'y' => 65,'height' => 19)
871
887
  }
888
+ @tkLabel21 = TkLabel.new(self){
889
+ text 'by Antonio Galeone - 2004/2009'
890
+ background _bgcolor
891
+ foreground '#ffffff'
892
+ font Arcadia.instance['conf']['splash.credits.font']
893
+ justify 'left'
894
+ place('width' => '210','x' => 100,'y' => 95,'height' => 19)
895
+ }
872
896
  @tkLabelStep = TkLabel.new(self){
873
897
  text ''
874
898
  background _bgcolor
@@ -876,20 +900,12 @@ class ArcadiaAboutSplash < TkToplevel
876
900
  font Arcadia.instance['conf']['splash.banner.font']
877
901
  justify 'left'
878
902
  anchor 'w'
879
- place('width'=>-5,'relwidth' => 1,'x' => 5,'y' => 175,'height' => 19)
880
- }
881
- @tkLabel21 = TkLabel.new(self){
882
- text 'by Antonio Galeone - 2004/2009'
883
- background _bgcolor
884
- foreground '#ffffff'
885
- font Arcadia.instance['conf']['splash.credits.font']
886
- justify 'left'
887
- place('width' => '210','x' => 100,'y' => 146,'height' => 19)
903
+ place('width'=>-5,'relwidth' => 1,'x' => 5,'y' => 160,'height' => 19)
888
904
  }
889
905
  @progress = TkVariable.new
890
906
  reset
891
907
  _width = 340
892
- _height = 210
908
+ _height = 200
893
909
  #_width = 0;_height = 0
894
910
  _x = TkWinfo.screenwidth(self)/2 - _width / 2
895
911
  _y = TkWinfo.screenheight(self)/2 - _height / 2
@@ -908,11 +924,12 @@ class ArcadiaAboutSplash < TkToplevel
908
924
  @max = _max
909
925
  Tk::BWidget::ProgressBar.new(self, :width=>150, :height=>10,
910
926
  :background=>'black',
911
- :foreground=>'yellow',
927
+ :troughcolor=>'black',
928
+ :foreground=>'#a11934',
912
929
  :variable=>@progress,
913
930
  :borderwidth=>0,
914
931
  :relief=>'flat',
915
- :maximum=>_max).place('width' => '150','x' => 145,'y' => 95,'height' => 15)
932
+ :maximum=>_max).place('relwidth' => '1','y' => 146,'height' => 2)
916
933
  end
917
934
 
918
935
  def reset
@@ -961,25 +978,36 @@ class ArcadiaDialogManager
961
978
  @arcadia = _arcadia
962
979
  Arcadia.attach_listener(self, DialogEvent)
963
980
  end
981
+
964
982
  def on_dialog(_event)
983
+ type = _event.type
984
+ if !DialogEvent::TYPE_PATTERNS.include?(_event.type)
985
+ type = 'ok'
986
+ end
987
+ res_array = type.split('_')
988
+ icon = _event.level
989
+ tktype = type.gsub('_','').downcase
990
+
991
+ tkdialog = Tk::BWidget::MessageDlg.new(
992
+ 'icon' => icon,
993
+ 'bg' => Arcadia.conf('background'),
994
+ 'fg' => Arcadia.conf('foreground'),
995
+ 'type' => tktype,
996
+ 'title' => _event.title,
997
+ 'message' => _event.msg)
998
+
999
+ tkdialog.configure('font'=>'courier 6')
1000
+ res = tkdialog.create
1001
+ _event.add_result(self, 'value'=>res_array[res.to_i])
1002
+ end
1003
+
1004
+
1005
+ def on_dialog_old(_event)
965
1006
  type = _event.type
966
1007
  if !DialogEvent::TYPE_PATTERNS.include?(_event.type)
967
1008
  type = 'ok'
968
1009
  end
969
1010
  icon = _event.level
970
- # case _event
971
- # when QuestionDialogEvent
972
- # icon = 'question'
973
- # when InfoDialogEvent
974
- # icon = 'info'
975
- # when WarningDialogEvent
976
- # icon = 'warning'
977
- # when ErrorDialogEvent
978
- # icon = 'error'
979
- # else
980
- # icon = 'info'
981
- # end
982
-
983
1011
  tktype = type.gsub('_','').downcase
984
1012
 
985
1013
  res = Tk.messageBox(
@@ -6,6 +6,46 @@
6
6
  require "lib/a-commons"
7
7
  require "tk/menu"
8
8
 
9
+ class MyBwTree < Tk::BWidget::Tree
10
+
11
+ def open?(node)
12
+ bool(self.itemcget(tagid(node), 'open'))
13
+ end
14
+
15
+ def areabind(context, *args)
16
+ if TkComm._callback_entry?(args[0]) || !block_given?
17
+ cmd = args.shift
18
+ else
19
+ cmd = Proc.new
20
+ end
21
+ _bind_for_event_class(Event_for_Items, [path, 'bindArea'],
22
+ context, cmd, *args)
23
+ self
24
+ end
25
+
26
+ def areabind_append(context, *args)
27
+ if TkComm._callback_entry?(args[0]) || !block_given?
28
+ cmd = args.shift
29
+ else
30
+ cmd = Proc.new
31
+ end
32
+ _bind_append_for_event_class(Event_for_Items, [path, 'bindArea'],
33
+ context, cmd, *args)
34
+ self
35
+ end
36
+
37
+ def areabind_remove(*args)
38
+ _bind_remove_for_event_class(Event_for_Items, [path, 'bindArea'], *args)
39
+ self
40
+ end
41
+
42
+ def areabindinfo(*args)
43
+ _bindinfo_for_event_class(Event_for_Items, [path, 'bindArea'], *args)
44
+ end
45
+
46
+ end
47
+
48
+
9
49
  class TkApplication < Application
10
50
  attr_reader :tcltk_info
11
51
  def initialize(_application_params)
@@ -275,11 +315,7 @@ class AGTkVSplittedFrames < AGTkSplittedFrames
275
315
  attr_reader :left_frame, :right_frame, :splitter_frame
276
316
  def initialize(parent=nil, frame=nil, width=10, slen=5, perc=false, keys=nil)
277
317
  super(parent, frame, width, slen, keys)
278
- #self.place('relheight'=>1, 'relwidth'=>1, 'bordermode'=>'outside' )
279
- #self.pack(:expand=>true, :fill=>:both)
280
- @left_frame = TkFrame.new(self, Arcadia.style('panel')){
281
- #relief 'flat'
282
- }
318
+ @left_frame = TkFrame.new(self, Arcadia.style('panel'))
283
319
  @frame1 = @left_frame
284
320
  if perc
285
321
  p_width = TkWinfo.screenwidth(self)
@@ -303,10 +339,7 @@ class AGTkVSplittedFrames < AGTkSplittedFrames
303
339
  @left_frame_obj.relwidth = 0
304
340
  @left_frame_obj.relheight = 1
305
341
 
306
- @splitter_frame = TkFrame.new(self, Arcadia.style('splitter')){
307
- #relief 'raised'
308
- #border 1
309
- }
342
+ @splitter_frame = TkFrame.new(self, Arcadia.style('splitter'))
310
343
 
311
344
  @splitter_frame.place(
312
345
  'relx' => 0,
@@ -321,81 +354,99 @@ class AGTkVSplittedFrames < AGTkSplittedFrames
321
354
  "ButtonRelease-1",
322
355
  proc{do_resize}
323
356
  )
324
- _self = self
325
- @b_left = TkButton.new(nil, Arcadia.style('button')){
326
- image TkPhotoImage.new('dat'=>LEFT_SIDE_GIF)
327
- }
328
-
329
- @b_right = TkButton.new(nil, Arcadia.style('button')){
330
- image TkPhotoImage.new('dat'=>RIGHT_SIDE_GIF)
331
- }
332
- @proc_unplace = proc{
333
- @b_left.unplace
334
- @b_right.unplace
335
- }
336
- @splitter_frame.bind_append(
337
- "B1-Motion",
338
- proc{@splitter_frame.raise;@proc_unplace.call}
339
- )
340
- @@last_b_left = nil
341
- @@last_b_right = nil
342
- @b_left.bind_append('ButtonPress-1',proc{_self.hide_left;@proc_unplace.call})
343
- @b_right.bind_append('ButtonPress-1',proc{_self.hide_right;@proc_unplace.call})
344
- @proc_place = proc{|x,y|
345
- if !TkWinfo.mapped?(@b_left)
346
- _x = TkWinfo.pointerx(self) - 10
347
- _y = TkWinfo.pointery(self) - 20
348
- if @@last_b_left != nil
349
- @@last_b_left.unplace
350
- @@last_b_right.unplace
351
- end
352
- @b_left.place('x'=>_x,'y'=>_y,'border'=>'outside')
353
- @b_right.place('x'=>_x,'y'=>_y+25,'border'=>'outside')
354
- @b_left.raise
355
- @b_right.raise
356
- @@last_b_left = @b_left
357
- @@last_b_right = @b_right
358
- if @thread_unplace
359
- @thread_unplace.kill
360
- end
361
- @thread_unplace= Thread.new {
362
- sleep(5)
363
- @proc_unplace.call
364
- kill
365
- }
366
- end
367
- }
368
-
369
- @splitter_frame.bind_append(
370
- 'ButtonPress-1',
371
- proc{|x,y|
372
- @thread_place= Thread.new {
373
- @proc_place.call(x,y)
374
- }
375
- }, "%x %y")
376
-
357
+ #-----
358
+ #-----
359
+ # _self = self
360
+ # @b_left = TkButton.new(nil, Arcadia.style('button')){
361
+ # image TkPhotoImage.new('dat'=>LEFT_SIDE_GIF)
362
+ # }
363
+ #
364
+ # @b_right = TkButton.new(nil, Arcadia.style('button')){
365
+ # image TkPhotoImage.new('dat'=>RIGHT_SIDE_GIF)
366
+ # }
367
+ # @proc_unplace = proc{
368
+ # @b_left.unplace
369
+ # @b_right.unplace
370
+ # }
377
371
  # @splitter_frame.bind_append(
378
- # "Enter",
379
- # proc{
380
- # @color_save = @splitter_frame.background
381
- # @splitter_frame.background(Arcadia.conf('splitter.highlightbackground'))}
382
- # #@splitter_frame.background('#9aa6a7')}
372
+ # "B1-Motion",
373
+ # proc{@splitter_frame.raise;@proc_unplace.call}
383
374
  # )
375
+ # @@last_b_left = nil
376
+ # @@last_b_right = nil
377
+ # @b_left.bind_append('ButtonPress-1',proc{_self.hide_left;@proc_unplace.call})
378
+ # @b_right.bind_append('ButtonPress-1',proc{_self.hide_right;@proc_unplace.call})
379
+ # @proc_place = proc{|x,y|
380
+ # if !TkWinfo.mapped?(@b_left)
381
+ # _x = TkWinfo.pointerx(self) - 10
382
+ # _y = TkWinfo.pointery(self) - 20
383
+ # if @@last_b_left != nil
384
+ # @@last_b_left.unplace
385
+ # @@last_b_right.unplace
386
+ # end
387
+ # @b_left.place('x'=>_x,'y'=>_y,'border'=>'outside')
388
+ # @b_right.place('x'=>_x,'y'=>_y+25,'border'=>'outside')
389
+ # @b_left.raise
390
+ # @b_right.raise
391
+ # @@last_b_left = @b_left
392
+ # @@last_b_right = @b_right
393
+ # if @thread_unplace
394
+ # @thread_unplace.kill
395
+ # end
396
+ # @thread_unplace= Thread.new {
397
+ # sleep(5)
398
+ # @proc_unplace.call
399
+ # kill
400
+ # }
401
+ # end
402
+ # }
403
+ #
384
404
  # @splitter_frame.bind_append(
385
- # "Leave",
386
- # proc{
387
- # @splitter_frame.background(@color_save)
405
+ # 'ButtonPress-1',
406
+ # proc{|x,y|
407
+ # @thread_place= Thread.new {
408
+ # @proc_place.call(x,y)
388
409
  # }
389
- # )
410
+ # }, "%x %y")
411
+ #-----
412
+ #-----
413
+ _xbutton = TkButton.new(@splitter_frame, Arcadia.style('toolbarbutton')){
414
+ background '#4966d7'
415
+ }
416
+ _xbutton.place(
417
+ 'x' => 0,
418
+ 'y' => 0,
419
+ 'relwidth' => 1,
420
+ 'bordermode' => 'outside',
421
+ 'height' => 20
422
+ )
423
+ _xbutton.bind_append(
424
+ "ButtonPress-1",
425
+ proc{hide_left}
426
+ )
427
+ _ybutton = TkButton.new(@splitter_frame, Arcadia.style('toolbarbutton')){
428
+ background '#118124'
429
+ }
430
+ _ybutton.place(
431
+ 'x' => 0,
432
+ 'y' => 21,
433
+ 'bordermode' => 'outside',
434
+ 'height' => 20,
435
+ 'relwidth' => 1
436
+ )
437
+ _ybutton.bind_append(
438
+ "ButtonPress-1",
439
+ proc{hide_right}
440
+ )
441
+ #-----
442
+ #-----
390
443
  @splitter_frame_obj = AGTkObjPlace.new(@splitter_frame, 'x')
391
444
  @splitter_frame_obj.width = @slen
392
445
  @splitter_frame_obj.height = 0
393
446
  @splitter_frame_obj.relwidth = 0
394
447
  @splitter_frame_obj.relheight = 1
395
448
  x = x + @slen
396
- @right_frame = TkFrame.new(self, Arcadia.style('panel')){
397
- #relief 'flat'
398
- }
449
+ @right_frame = TkFrame.new(self, Arcadia.style('panel'))
399
450
  @frame2 = @right_frame
400
451
  @right_frame.place(
401
452
  'relwidth' => 1,
@@ -506,15 +557,6 @@ class AGTkOSplittedFrames < AGTkSplittedFrames
506
557
  attr_reader :top_frame, :bottom_frame, :splitter_frame
507
558
  def initialize(parent=nil, frame=nil, height=10, slen=5, perc=false, keys=nil)
508
559
  super(parent, frame, height, slen, keys)
509
- # self.place(
510
- # 'relwidth' => 1,
511
- # 'relx' => 0,
512
- # 'x' => 0,
513
- # 'y' => 0,
514
- # 'relheight' => 1,
515
- # 'rely' => 0,
516
- # 'bordermode' => 'inside'
517
- # )
518
560
  @top_frame = TkFrame.new(self, Arcadia.style('panel')){
519
561
  # relief 'flat'
520
562
  }
@@ -584,8 +626,6 @@ class AGTkOSplittedFrames < AGTkSplittedFrames
584
626
  @bottom_frame_obj.relheight = 1
585
627
  _xbutton = TkButton.new(@splitter_frame, Arcadia.style('toolbarbutton')){
586
628
  background '#4966d7'
587
- #overrelief 'raised'
588
- #relief 'flat'
589
629
  }
590
630
  _xbutton.place(
591
631
  'x' => 0,
@@ -600,8 +640,6 @@ class AGTkOSplittedFrames < AGTkSplittedFrames
600
640
  )
601
641
  _ybutton = TkButton.new(@splitter_frame, Arcadia.style('toolbarbutton')){
602
642
  background '#118124'
603
- #overrelief 'raised'
604
- #relief 'flat'
605
643
  }
606
644
  _ybutton.place(
607
645
  'x' => 21,
@@ -1172,7 +1210,8 @@ end
1172
1210
  class TclTkInfo
1173
1211
  attr_reader :level
1174
1212
  def initialize
1175
- @level = TclTkIp.new._eval "info patchlevel"
1213
+ @level = Tk.tk_call( "eval", "info patchlevel")
1214
+ # @level = TclTkIp.new._eval "info patchlevel"
1176
1215
  end
1177
1216
  end
1178
1217