rbcurse 0.1.3 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/CHANGELOG +126 -0
  2. data/Manifest.txt +53 -20
  3. data/README.markdown +423 -0
  4. data/Rakefile +3 -1
  5. data/examples/keytest.rb +177 -0
  6. data/examples/mpad2.rb +156 -0
  7. data/examples/newtesttabp.rb +121 -0
  8. data/examples/rfe.rb +48 -10
  9. data/examples/rfe_renderer.rb +4 -4
  10. data/examples/rvimsplit.rb +376 -0
  11. data/examples/sqlc.rb +97 -106
  12. data/examples/sqlm.rb +446 -0
  13. data/examples/test1.rb +4 -4
  14. data/examples/test2.rb +12 -12
  15. data/examples/testchars.rb +140 -0
  16. data/examples/testkeypress.rb +9 -4
  17. data/examples/testmulticomp.rb +72 -0
  18. data/examples/testscroller.rb +136 -0
  19. data/examples/testscrolllb.rb +86 -0
  20. data/examples/testscrollp.rb +87 -0
  21. data/examples/testscrollta.rb +80 -0
  22. data/examples/testscrolltable.rb +166 -0
  23. data/examples/testsplit.rb +87 -0
  24. data/examples/testsplit2.rb +123 -0
  25. data/examples/testsplit3.rb +215 -0
  26. data/examples/testsplit3_1.rb +244 -0
  27. data/examples/testsplit3a.rb +215 -0
  28. data/examples/testsplit3b.rb +237 -0
  29. data/examples/testsplitta.rb +148 -0
  30. data/examples/testsplittv.rb +142 -0
  31. data/examples/testsplittvv.rb +144 -0
  32. data/examples/testtable.rb +1 -1
  33. data/examples/testtabp.rb +3 -2
  34. data/examples/testtestw.rb +69 -0
  35. data/examples/testtodo.rb +5 -3
  36. data/examples/testtpane.rb +203 -0
  37. data/examples/testtpane2.rb +145 -0
  38. data/examples/testtpanetable.rb +199 -0
  39. data/examples/viewtodo.rb +5 -3
  40. data/lib/rbcurse.rb +1 -1
  41. data/lib/rbcurse/celleditor.rb +2 -2
  42. data/lib/rbcurse/colormap.rb +5 -5
  43. data/lib/rbcurse/defaultlistselectionmodel.rb +3 -3
  44. data/lib/rbcurse/io.rb +663 -0
  45. data/lib/rbcurse/listeditable.rb +306 -0
  46. data/lib/rbcurse/listkeys.rb +15 -15
  47. data/lib/rbcurse/listscrollable.rb +168 -27
  48. data/lib/rbcurse/mapper.rb +35 -13
  49. data/lib/rbcurse/rchangeevent.rb +28 -0
  50. data/lib/rbcurse/rform.rb +845 -0
  51. data/lib/rbcurse/rlistbox.rb +144 -34
  52. data/lib/rbcurse/rmessagebox.rb +10 -5
  53. data/lib/rbcurse/rmulticontainer.rb +325 -0
  54. data/lib/rbcurse/rmultitextview.rb +306 -0
  55. data/lib/rbcurse/rscrollform.rb +369 -0
  56. data/lib/rbcurse/rscrollpane.rb +511 -0
  57. data/lib/rbcurse/rsplitpane.rb +820 -0
  58. data/lib/rbcurse/rtabbedpane.rb +737 -109
  59. data/lib/rbcurse/rtabbedwindow.rb +326 -0
  60. data/lib/rbcurse/rtable.rb +220 -64
  61. data/lib/rbcurse/rtextarea.rb +340 -181
  62. data/lib/rbcurse/rtextview.rb +237 -101
  63. data/lib/rbcurse/rviewport.rb +203 -0
  64. data/lib/rbcurse/rwidget.rb +919 -95
  65. data/lib/rbcurse/scrollable.rb +7 -7
  66. data/lib/rbcurse/selectable.rb +4 -4
  67. data/lib/rbcurse/table/tablecellrenderer.rb +3 -0
  68. data/lib/rbcurse/undomanager.rb +181 -0
  69. data/lib/rbcurse/vieditable.rb +100 -0
  70. data/lib/ver/window.rb +471 -21
  71. metadata +66 -22
  72. data/README.txt +0 -312
  73. data/examples/testd.db +0 -0
  74. data/examples/todocsv.csv +0 -28
@@ -1,3 +1,12 @@
1
+ #####################################################
2
+ # This is a sample program demonstrating a 2 pane file explorer using
3
+ # rbcurse's widgets.
4
+ # I have used a listbox here, perhaps a Table would be more configurable
5
+ # than a listbox.
6
+ #
7
+ # Copyright rkumar 2009, 2010 under Ruby License.
8
+ #
9
+ ####################################################
1
10
  require 'rubygems'
2
11
  require 'ncurses'
3
12
  require 'logger'
@@ -10,6 +19,7 @@ require 'rbcurse/keylabelprinter'
10
19
  require 'rbcurse/applicationheader'
11
20
  require 'rbcurse/action'
12
21
  require 'fileutils'
22
+ require 'yaml' ## added for 1.9
13
23
  #$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
14
24
 
15
25
  # TODO
@@ -160,9 +170,9 @@ class FileExplorer
160
170
  def readable_file_size(size, precision)
161
171
  case
162
172
  #when size == 1 : "1 B"
163
- when size < KILO_SIZE : "%d B" % size
164
- when size < MEGA_SIZE : "%.#{precision}f K" % (size / KILO_SIZE)
165
- when size < GIGA_SIZE : "%.#{precision}f M" % (size / MEGA_SIZE)
173
+ when size < KILO_SIZE then "%d B" % size
174
+ when size < MEGA_SIZE then "%.#{precision}f K" % (size / KILO_SIZE)
175
+ when size < GIGA_SIZE then "%.#{precision}f M" % (size / MEGA_SIZE)
166
176
  else "%.#{precision}f G" % (size / GIGA_SIZE)
167
177
  end
168
178
  end
@@ -285,13 +295,13 @@ class RFe
285
295
  status_row = RubyCurses::Label.new @form, {'text' => "", :row => Ncurses.LINES-4, :col => 0, :display_length=>Ncurses.COLS-2}
286
296
  @status_row = status_row
287
297
  colb = Ncurses.COLS/2
288
- ht = Ncurses.LINES - 7
298
+ ht = Ncurses.LINES - 5
289
299
  wid = Ncurses.COLS/2 - 0
290
300
  @trash_path = File.expand_path("~/.Trash")
291
301
  @trash_exists = File.directory? @trash_path
292
302
  $log.debug " trash_path #{@trash_path}, #{@trash_exists}"
293
- @lista = FileExplorer.new @form, self, row=2, col=1, ht, wid
294
- @listb = FileExplorer.new @form, self, row=2, col=colb, ht, wid
303
+ @lista = FileExplorer.new @form, self, row=1, col=1, ht, wid
304
+ @listb = FileExplorer.new @form, self, row=1, col=colb, ht, wid
295
305
 
296
306
  init_vars
297
307
  end
@@ -306,6 +316,7 @@ class RFe
306
316
  end
307
317
  end
308
318
  @config ||={}
319
+ @stopping = false
309
320
  end
310
321
  def save_config
311
322
  @config["last_dirs"]=[@lista.current_dir(),@listb.current_dir()]
@@ -480,7 +491,7 @@ class RFe
480
491
  @v_window.wrefresh
481
492
  Ncurses::Panel.update_panels
482
493
  begin
483
- while((ch = @v_window.getchar()) != ?\C-q )
494
+ while((ch = @v_window.getchar()) != ?\C-q.getbyte(0) )
484
495
  break if ch == KEY_F3
485
496
  @v_form.handle_key ch
486
497
  @v_form.repaint
@@ -497,6 +508,9 @@ class RFe
497
508
  when '.tgz','.gz'
498
509
  cmd = "tar -ztvf #{fp}"
499
510
  content = %x[#{cmd}]
511
+ when '.zip'
512
+ cmd = "unzip -l #{fp}"
513
+ content = %x[#{cmd}]
500
514
  else
501
515
  content = File.open(fp,"r").readlines
502
516
  end
@@ -611,6 +625,9 @@ class RFe
611
625
  $log.debug " edit #{fp}"
612
626
  shell_out "/opt/local/bin/vim #{fp}"
613
627
  end
628
+ def stopping?
629
+ @stopping
630
+ end
614
631
  def draw_screens
615
632
  lasta = lastb = nil
616
633
  if !@config["last_dirs"].nil?
@@ -623,6 +640,26 @@ class RFe
623
640
  # @form.bind_key(?\M-x){
624
641
  # @current_list.mark_block
625
642
  # }
643
+ # i am just testing out double key bindings
644
+ @form.bind_key([?\C-w,?v]){
645
+ @status_row.text = "got C-w, v"
646
+ $log.debug " Got C-w v "
647
+ view()
648
+ }
649
+ @form.bind_key([?\C-w,?e]){
650
+ @status_row.text = "got C-w, e"
651
+ $log.debug " Got C-w e "
652
+ edit()
653
+ }
654
+ # bind dd to delete file
655
+ # actually this should be in listbox, and we should listen for row delete and then call opt_file
656
+ @form.bind_key([?d,?d]){
657
+ opt_file 'd'
658
+ }
659
+ @form.bind_key([?q,?q]){
660
+ @stopping = true
661
+ }
662
+ # this won't work since the listbox will consume the d first
626
663
  @form.bind_key(?@){
627
664
  @current_list.change_dir File.expand_path("~/")
628
665
  }
@@ -633,7 +670,7 @@ class RFe
633
670
  @klp.mode :file
634
671
  @klp.repaint
635
672
  ## FIXME chr could fail !!
636
- while((ch = @window.getchar()) != ?\C-c )
673
+ while((ch = @window.getchar()) != ?\C-c.getbyte(0) )
637
674
  if "cmdsuvrex".index(ch.chr) == nil
638
675
  Ncurses.beep
639
676
  else
@@ -648,7 +685,7 @@ class RFe
648
685
  @klp.repaint
649
686
  keys = @klp.get_current_keys
650
687
  ## FIXME chr could fail !!
651
- while((ch = @window.getchar()) != ?\C-c )
688
+ while((ch = @window.getchar()) != ?\C-c.getbyte(0) )
652
689
  if !keys.include?(ch.chr)
653
690
  Ncurses.beep
654
691
  else
@@ -704,7 +741,8 @@ class RFe
704
741
  @window.wrefresh
705
742
  Ncurses::Panel.update_panels
706
743
  begin
707
- while((ch = @window.getchar()) != ?\C-q )
744
+ ## qq stops program, but only if M-v (vim mode)
745
+ while(!stopping? && (ch = @window.getchar()) != ?\C-q.getbyte(0) )
708
746
  s = keycode_tos ch
709
747
  status_row.text = "Pressed #{ch} , #{s}"
710
748
  @form.handle_key(ch)
@@ -47,10 +47,10 @@ module RubyCurses
47
47
  # Return the file size with a readable style.
48
48
  def readable_file_size(size, precision)
49
49
  case
50
- #when size == 1 : "1 B"
51
- when size < KILO_SIZE : "%d B" % size
52
- when size < MEGA_SIZE : "%.#{precision}f K" % (size / KILO_SIZE)
53
- when size < GIGA_SIZE : "%.#{precision}f M" % (size / MEGA_SIZE)
50
+ #when size == 1 then "1 B"
51
+ when size < KILO_SIZE then "%d B" % size
52
+ when size < MEGA_SIZE then "%.#{precision}f K" % (size / KILO_SIZE)
53
+ when size < GIGA_SIZE then "%.#{precision}f M" % (size / MEGA_SIZE)
54
54
  else "%.#{precision}f G" % (size / GIGA_SIZE)
55
55
  end
56
56
  end
@@ -0,0 +1,376 @@
1
+ # this is a test program,
2
+ # testing out if subwins can help in splitpanes
3
+ # derwins, although easy to use flunk movement and resizing
4
+ # So i've changed Window to use subwins, so top and left are maintained
5
+ # We need to create events for resizing so refreshing window can be done.
6
+ #
7
+ # FIXME - resizing, divider change
8
+ # FIXME - left top 2 splits are not expanding to full height. check in draw box mode
9
+ # TODO = when resixing a split, if the other one has been split, its children need to be resized.
10
+ #
11
+ #$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
12
+ require 'rubygems'
13
+ require 'ncurses'
14
+ require 'logger'
15
+ require 'rbcurse'
16
+
17
+ class Split
18
+ def initialize type, first, second, win
19
+ @c1 = first
20
+ @c2 = second
21
+ @type = type # :VERTICAL or :HORIZONTAL
22
+ @parent = win # needed to draw divider on
23
+ end
24
+ def first_win; @c1; end
25
+ def second_win; @c2; end
26
+ def divider_location y,x
27
+ @y = y
28
+ @x = x
29
+ end
30
+
31
+ # change the size of a split
32
+ # still to redo the line etc.
33
+ def increase comp, units=1
34
+ $log.debug " increase got #{comp}, #{comp.class}, #{units} "
35
+ if @type == :HORIZONTAL
36
+ if comp == @c1
37
+ else
38
+ comp = @c1
39
+ units *= -1
40
+ end
41
+ other = @c2
42
+ #comp.wclear
43
+ #other.wclear
44
+ #comp.wrefresh
45
+ #other.wrefresh
46
+ # increase h
47
+ layout = comp.layout
48
+ $log.debug " layout #{layout} "
49
+ h = layout[:height]
50
+ w = layout[:width]
51
+ top = layout[:top]
52
+ left = layout[:left]
53
+ $log.debug "H1 ht change #{h} , #{h} + #{units} "
54
+ layout[:height]= h + units
55
+ divloc = h + units + 1
56
+ comp.resize_with(layout)
57
+ # decrease second, and push inc top
58
+ layout = other.layout
59
+ h = layout[:height]
60
+ w = layout[:width]
61
+ top = layout[:top]
62
+ left = layout[:left]
63
+ h = layout[:height]
64
+ top = layout[:top]
65
+ layout[:top] = top + units
66
+ layout[:height] = h- units
67
+ $log.debug "H1 c2 ht change #{h} , #{h} - #{units}, top #{top} + #{units} "
68
+ other.resize_with(layout)
69
+ h = @parent.height
70
+ w = @parent.width
71
+ #@parent.mvwhline( divloc, 0, ACS_HLINE, w+2)
72
+ @y += units
73
+ #@parent.werase #wclear
74
+ @parent.wclear
75
+ # FIXME double line printing ??? after tabbing or hitting a key
76
+ @parent.mvwhline( @y, 0, ACS_HLINE, w)
77
+ comp.wrefresh
78
+ other.wrefresh
79
+ @parent.wrefresh
80
+ # do wnoutrefresh and doupdate
81
+ return
82
+ end
83
+ if @type == :VERTICAL
84
+ if comp == @c1
85
+ else
86
+ units *= -1
87
+ comp = @c1
88
+ end
89
+ other = @c2
90
+ # increase w
91
+ layout = comp.layout
92
+ h = layout[:width]
93
+ layout[:width]= h + units
94
+ $log.debug "V1 ht change #{h} , #{h} + #{units} "
95
+ comp.resize_with(layout)
96
+ # decrease second, and push inc top
97
+ layout = other.layout
98
+ h = layout[:width]
99
+ top = layout[:left]
100
+ layout[:left] = top + units
101
+ layout[:width] = h - units
102
+ $log.debug "V c2 ht change #{h} , #{h} - #{units}, top #{top} + #{units} "
103
+ other.resize_with(layout)
104
+ # TODO add line here
105
+ comp.wclear
106
+ other.wclear
107
+ return
108
+ end
109
+
110
+ end
111
+ end
112
+ class VimSplit
113
+ def initialize window, lay
114
+ # array of window, to delete later
115
+ @wins = []
116
+ # mapping of a subwin and its Split, so i can resize
117
+ @splits = {}
118
+
119
+ # hash of windows and component attached
120
+ @win_comp = {}
121
+ @children = {} # parent and children array, since we have not designed this properly
122
+ # only those windows that can be focused, child windows when split, parent is invisible
123
+ @focusables = []
124
+ # main window
125
+ @window = window
126
+ @splouter = @window._subwin(lay)
127
+ # (0..@splouter.height).each {|i| @splouter.highlight_line($reversecolor,i,0,@splouter.width)}
128
+ @wins << @splouter
129
+ #@focusables << @splouter
130
+ @splouter.box(0,0)
131
+ @draw_boxes = false
132
+
133
+ @str = "" # dummy
134
+ end
135
+ def self.color_window win, color=$datacolor
136
+ (0..win.height).each {|i| win.highlight_line(color,i,0,win.width)}
137
+ end
138
+ # focussed component
139
+ def current
140
+ @current || _switch_split
141
+ end
142
+ # when we make the first split we want to keep the borders. AFter that we always want to start with zero
143
+ # so the window we split is "consumed".
144
+ def get_offset
145
+ if @wins.length == 1
146
+ return 1
147
+ end
148
+ 0
149
+ end
150
+ def get_win; @splouter; end
151
+
152
+ # splits horizontally at centre
153
+ # We need to give an initial weight or location for divider
154
+ def split_h win
155
+ h = win.height
156
+ w = win.width
157
+ off = get_offset()
158
+ #lay1 = { :height => h/2-0, :width => w-2, :top => 0, :left => off }
159
+ #lay2 = { :height => h/2-1, :width => w-2, :top => h/2+1, :left => 1 }
160
+ lay1 = { :height => h/2-0, :width => w-2, :top => off, :left => off }
161
+ lay2 = { :height => h/2-1, :width => w-2, :top => h/2+1, :left => off }
162
+ split1 = win._subwin(lay1)
163
+ split2 = win._subwin(lay2)
164
+ win.mvwhline( h/2, 0, ACS_HLINE, w+2)
165
+
166
+ if @draw_boxes
167
+ split1.box(0,0)
168
+ split2.box(0,0)
169
+ end
170
+ # if a window is split, then tab doesn't go there, it goes to its two subwins
171
+ @focusables.delete win
172
+ @wins << split1
173
+ @wins << split2
174
+ @focusables << split1 << split2
175
+ spl = Split.new :HORIZONTAL, split1, split2, win
176
+ spl.divider_location(h/2,0)
177
+ @splits[split1] = spl
178
+ @splits[split2] = spl
179
+ @children[win] = [ split1, split2 ]
180
+ #return split1, split2
181
+ return spl
182
+ end
183
+ def split_v win
184
+ h = win.height
185
+ w = win.width
186
+ off = get_offset()
187
+ lay1 = { :height => h-2, :width => w/2-1, :top => off, :left => off }
188
+ lay2 = { :height => h-2, :width => w/2-1, :top => off, :left => w/2+1 }
189
+ split1 = win._subwin(lay1)
190
+ split2 = win._subwin(lay2)
191
+ win.mvwvline( 0, w/2, ACS_VLINE, h+2)
192
+ if @draw_boxes
193
+ split1.box(0,0)
194
+ split2.box(0,0)
195
+ end
196
+ @focusables.delete win
197
+ @wins << split1
198
+ @wins << split2
199
+ @focusables << split1 << split2
200
+ spl = Split.new :VERTICAL, split1, split2, win
201
+ spl.divider_location(0,h/2)
202
+ @splits[split1] = spl
203
+ @splits[split2] = spl
204
+ @children[win] = [ split1, split2 ]
205
+ #return split1, split2
206
+ return spl
207
+ end
208
+ def set_focus_on split
209
+ raise "Given split not focusable" if @focusables.index.nil?
210
+ # actually we can take it's split and keep going down till first. But we don;t have a tree
211
+ @current = split
212
+ end
213
+
214
+ def destroy
215
+ @wins.each {|w| w.destroy}
216
+ super
217
+ end
218
+ ## attach a component to a window/split, so that all keys to that win go to the window
219
+ # create the comp without a form.
220
+ def attach win, comp
221
+ # i need to set the window to win.
222
+ comp.override_graphic(win) # i think XXX
223
+ @win_comp[win] = comp
224
+ end
225
+ def _switch_split
226
+ index = @focusables.index @current
227
+ index ||= 0
228
+ index+=1
229
+ if index >= @focusables.length
230
+ index = 0
231
+ end
232
+ @current = @focusables.at index
233
+ @current.wmove 0,0
234
+ @current.wrefresh
235
+ @current
236
+ end
237
+ def handle_key ch
238
+ case ch
239
+ when 9
240
+ _switch_split
241
+ return 0
242
+ #when 32..126
243
+ #char = ch.chr
244
+ #@str << char
245
+ #@current.printstring 0,0, @str, 0
246
+ #@current.wrefresh
247
+ #when 330, 127
248
+ #@str = @str[0..-2]
249
+ ##@current.wclear # casuses a flash
250
+ #@current.printstring 0,0, @str, 0
251
+ #@current.wrefresh
252
+ #when 10,13
253
+ #@str << "\n"
254
+ when ?\M-v.getbyte(0)
255
+ # allow user to split but this does not give the user programmatic control over the splits ??
256
+ # unless we call some events
257
+ split_v @current
258
+ @current.wrefresh
259
+ set_focus_on @focusables.last
260
+ @window.wrefresh
261
+ when ?\M-h.getbyte(0)
262
+ split_h @current
263
+ @current.wrefresh
264
+ set_focus_on @focusables.last
265
+ @window.wrefresh
266
+ when ?\M-+.getbyte(0)
267
+ spl = @splits[@current]
268
+ spl.increase(@current)
269
+ when ?\M--.getbyte(0)
270
+ spl = @splits[@current]
271
+ spl.increase(@current,-1)
272
+ else
273
+ comp = @win_comp[@current]
274
+ ret = :UNHANDLED
275
+ ret = comp.handle_key(ch) unless comp.nil?
276
+ return ret
277
+ end
278
+ ret = :UNHANDLED
279
+ end
280
+
281
+ end
282
+ class TestSubwin
283
+ def initialize
284
+ acolor = $reversecolor
285
+ end
286
+ def run
287
+ @window = VER::Window.root_window
288
+
289
+ h = 20; w = 75; t = 3; l = 4
290
+ @layoutouter = { :height => h, :width => w, :top => t, :left => l }
291
+
292
+ @vim = VimSplit.new @window, @layoutouter
293
+ @splouter = @vim.get_win
294
+ spl = @vim.split_v @splouter
295
+ @splleft = spl.first_win
296
+ @splright = spl.second_win
297
+ spl = @vim.split_h @splleft
298
+ @splleft1 = spl.first_win
299
+ @splleft2 = spl.second_win
300
+ @vim.split_h @splright
301
+ @vim.split_v @splleft1
302
+
303
+ @window.printstring(1,10,"Ncurses Subwindow test - splitpanes emulation using subwin",0)
304
+ @splouter.printstring(0,2, " Outer ", 0)
305
+ @splleft.printstring(0,2, "-Left ", 0)
306
+ @splleft1.printstring(0,1, "Top ", 0)
307
+ @splleft2.printstring(0,1, "Bottom ", 0)
308
+ #@vim.set_focus_on @splleft1
309
+
310
+ @window.printstring(2,10,"q to quit",2)
311
+ #
312
+ @form = Form.new @window
313
+ @help = "q to quit. "
314
+ RubyCurses::Label.new @form, {'text' => @help, "row" => 1, "col" => 2, "color" => "yellow"}
315
+ @form.repaint
316
+ @window.wrefresh
317
+ Ncurses::Panel.update_panels
318
+ ctr = 0
319
+ row = 2
320
+ str = "Hello"
321
+ buffers = {}
322
+ while((ch = @window.getchar()) != KEY_F1 )
323
+ ret = @vim.handle_key ch
324
+ if ret == :UNHANDLED
325
+ curr = @vim.current
326
+ buff = buffers[curr]
327
+ if buff.nil?
328
+ buff ||= ""
329
+ buffers[curr] = buff
330
+ end
331
+ case ch
332
+ when 32..126
333
+ char = ch.chr
334
+ buff << char
335
+ curr.printstring 0,0, buff, 0
336
+ curr.wrefresh
337
+ when 330, 127
338
+ buff = buff[0..-2]
339
+ buffers[curr] = buff
340
+ #@current.wclear # casuses a flash
341
+ curr.printstring 0,0, buff, 0
342
+ curr.clrtobot
343
+ curr.wrefresh
344
+ when 10,13
345
+ buff << "\n"
346
+ curr.printstring 0,0, buff, 0
347
+ curr.wrefresh
348
+ end
349
+
350
+ end
351
+ end
352
+
353
+ @window.destroy
354
+
355
+ end
356
+ end
357
+ if $0 == __FILE__
358
+ include RubyCurses
359
+ include RubyCurses::Utils
360
+ # Initialize curses
361
+ begin
362
+ # XXX update with new color and kb
363
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
364
+ $log = Logger.new("view.log")
365
+ $log.level = Logger::DEBUG
366
+ n = TestSubwin.new
367
+ n.run
368
+ rescue => ex
369
+ ensure
370
+ VER::stop_ncurses
371
+ p ex if ex
372
+ p(ex.backtrace.join("\n")) if ex
373
+ $log.debug( ex) if ex
374
+ $log.debug(ex.backtrace.join("\n")) if ex
375
+ end
376
+ end