canis 0.0.5 → 0.0.7
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 +4 -4
- data/CHANGES +10 -0
- data/README.md +99 -4
- data/examples/common/devel.rb +84 -1
- data/examples/dbdemo.rb +356 -30
- data/lib/canis/core/include/appmethods.rb +13 -4
- data/lib/canis/core/include/colorparser.rb +31 -10
- data/lib/canis/core/include/listselectionmodel.rb +2 -2
- data/lib/canis/core/include/rhistory.rb +2 -2
- data/lib/canis/core/system/colormap.rb +3 -3
- data/lib/canis/core/system/window.rb +8 -3
- data/lib/canis/core/util/app.rb +94 -93
- data/lib/canis/core/util/defaultcolorparser.rb +7 -3
- data/lib/canis/core/util/rdialogs.rb +325 -5
- data/lib/canis/core/util/viewer.rb +1 -1
- data/lib/canis/core/util/widgetshortcuts.rb +3 -3
- data/lib/canis/core/widgets/applicationheader.rb +2 -4
- data/lib/canis/core/widgets/extras/rtextarea.rb +3 -1
- data/lib/canis/core/widgets/listbox.rb +2 -1
- data/lib/canis/core/widgets/rmenu.rb +45 -31
- data/lib/canis/core/widgets/rmessagebox.rb +51 -2
- data/lib/canis/core/widgets/rwidget.rb +23 -15
- data/lib/canis/core/widgets/statusline.rb +19 -9
- data/lib/canis/core/widgets/textpad.rb +2 -2
- data/lib/canis/version.rb +1 -1
- metadata +2 -2
@@ -1,3 +1,5 @@
|
|
1
|
+
# Some methods an application may like to use such as the ability to suspend cooked mode
|
2
|
+
# and go to shell, or run a command and view output without leaving the app.
|
1
3
|
module Canis
|
2
4
|
module Utils
|
3
5
|
private
|
@@ -77,17 +79,24 @@ module Canis
|
|
77
79
|
# takes a unix command (system) and executes the same. No output
|
78
80
|
# @return return value of system command
|
79
81
|
#
|
80
|
-
def shell_out command
|
81
|
-
|
82
|
-
|
82
|
+
def shell_out command=nil
|
83
|
+
$shell_history ||= []
|
84
|
+
command ||= get_string("Enter system command:", :maxlen => 50) do |f|
|
85
|
+
require 'canis/core/include/rhistory'
|
86
|
+
f.extend(FieldHistory)
|
87
|
+
f.history($shell_history)
|
88
|
+
end
|
89
|
+
##w = @window || @form.window
|
90
|
+
#w.hide
|
83
91
|
Ncurses.endwin
|
84
92
|
ret = system command
|
85
93
|
Ncurses.refresh
|
86
94
|
#Ncurses.curs_set 0 # why ?
|
87
|
-
w.show
|
95
|
+
#w.show
|
88
96
|
return ret
|
89
97
|
end
|
90
98
|
end # utils
|
99
|
+
|
91
100
|
class PrefixCommand
|
92
101
|
attr_accessor :object
|
93
102
|
def initialize _symbol, calling, config={}, &block
|
@@ -5,7 +5,7 @@
|
|
5
5
|
# Author: jkepler http://github.com/mare-imbrium/canis/
|
6
6
|
# Date: 07.11.11 - 12:31
|
7
7
|
# Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
8
|
-
# Last update: 2014-
|
8
|
+
# Last update: 2014-09-01 11:57
|
9
9
|
# ------------------------------------------------------------ #
|
10
10
|
#
|
11
11
|
|
@@ -236,8 +236,8 @@ module Canis
|
|
236
236
|
self.form = cp
|
237
237
|
end
|
238
238
|
@attr ||= FFI::NCurses::A_NORMAL
|
239
|
-
@color ||=
|
240
|
-
@bgcolor ||=
|
239
|
+
@color ||= $def_fg_color
|
240
|
+
@bgcolor ||= $def_bg_color
|
241
241
|
@color_pair = get_color($datacolor, @color, @bgcolor)
|
242
242
|
@color_array = [@color]
|
243
243
|
@bgcolor_array = [@bgcolor]
|
@@ -345,6 +345,7 @@ module Canis
|
|
345
345
|
res = ChunkLine.new
|
346
346
|
# stack the values, so when user issues "/end" we can pop earlier ones
|
347
347
|
|
348
|
+
_color, _bgcolor = ColorMap.get_colors_for_pair colorp # 2014-08-31 - 13:31
|
348
349
|
newblockflag = false
|
349
350
|
@chunk_parser.parse_format(s) do |p|
|
350
351
|
case p
|
@@ -358,26 +359,32 @@ module Canis
|
|
358
359
|
if ls
|
359
360
|
#sc, sb, sa = resolve_style ls
|
360
361
|
map = resolve_style ls
|
361
|
-
|
362
|
+
#$log.debug " STYLLE #{ls} : #{map} "
|
362
363
|
lc ||= map[:color]
|
363
364
|
lb ||= map[:bgcolor]
|
364
365
|
la ||= map[:attr]
|
365
366
|
end
|
367
|
+
# 2014-09-01 should i set these to _color and _bgcolor if nil. NOTE
|
366
368
|
@_bgcolor = lb
|
367
369
|
@_color = lc
|
368
370
|
if la
|
369
371
|
@attr = get_attrib la
|
370
372
|
end
|
371
373
|
@_color_pair = nil
|
374
|
+
@_color_pair = colorp # 2014-08-31 - 13:20
|
375
|
+
# 2014-09-01 - 11:52 if only one of the two is given we were ignoring, now we
|
376
|
+
# need to derive the other one
|
372
377
|
if lc && lb
|
373
378
|
# we know only store color_pair if both are mentioned in style or tag
|
374
|
-
@_color_pair = get_color(
|
379
|
+
@_color_pair = get_color(colorp, lc, lb)
|
380
|
+
# added next two conditions on 2014-09-01 - 11:56 to take care of only one mentioned in
|
381
|
+
# #{ block.
|
382
|
+
elsif lc
|
383
|
+
@_color_pair = get_color(colorp, lc, _bgcolor)
|
384
|
+
elsif lb
|
385
|
+
@_color_pair = get_color(colorp, _color, lb)
|
375
386
|
end
|
376
387
|
|
377
|
-
#@color_pair_array << @color_pair
|
378
|
-
#@attrib_array << @attr
|
379
|
-
#$log.debug "XXX: CHUNK start cp=#{@color_pair} , a=#{@attr} :: c:#{lc} b:#{lb} : @c:#{@color} @bg: #{@bgcolor} "
|
380
|
-
#$log.debug "XXX: CHUNK start arr #{@color_pair_array} :: #{@attrib_array} ::#{@color_array} ::: #{@bgcolor_array} "
|
381
388
|
|
382
389
|
when :endcolor
|
383
390
|
|
@@ -387,6 +394,11 @@ module Canis
|
|
387
394
|
@_color_pair = nil
|
388
395
|
@attr = nil
|
389
396
|
|
397
|
+
# trying out 2014-08-31 - 13:09 since we have to respect passed in colors
|
398
|
+
@_color , @_bgcolor = _color, _bgcolor
|
399
|
+
@_color_pair = colorp
|
400
|
+
@attr = att
|
401
|
+
|
390
402
|
#$log.debug "XXX: CHUNK end parents:#{@parents.count}, last: #{@parents.last} "
|
391
403
|
when :reset # ansi has this
|
392
404
|
# end all previous colors
|
@@ -396,6 +408,11 @@ module Canis
|
|
396
408
|
@_bgcolor = @_color = nil
|
397
409
|
@_color_pair = nil
|
398
410
|
@attr = nil
|
411
|
+
|
412
|
+
# trying out 2014-08-31 - 13:09 since we have to respect passed in colors
|
413
|
+
@_color, @_bgcolor = _color, _bgcolor
|
414
|
+
@_color_pair = colorp
|
415
|
+
@attr = att
|
399
416
|
|
400
417
|
|
401
418
|
when String
|
@@ -403,7 +420,11 @@ module Canis
|
|
403
420
|
## create the chunk
|
404
421
|
#$log.debug "XXX: CHUNK using on #{p} : #{@_color_pair} , #{@attr}, fg: #{@_color}, #{@_bgcolor}, parent: #{@parents.last} " # 2011-12-10 12:38:51
|
405
422
|
|
406
|
-
#
|
423
|
+
# trying out 2014-08-31 - 13:09 since we have to respect passed in colors
|
424
|
+
@_color ||= _color
|
425
|
+
@_bgcolor ||= _bgcolor
|
426
|
+
@color_pair ||= colorp
|
427
|
+
@attr ||= att
|
407
428
|
chunk = Chunk.new @_color_pair, p, @attr
|
408
429
|
chunk.color = @_color
|
409
430
|
chunk.bgcolor = @_bgcolor
|
@@ -5,7 +5,7 @@
|
|
5
5
|
# Author: j kepler http://github.com/mare-imbrium/canis/
|
6
6
|
# Date: 2014-04-10 - 21:04
|
7
7
|
# License: Same as ruby license
|
8
|
-
# Last update: 2014-
|
8
|
+
# Last update: 2014-08-28 18:30
|
9
9
|
# ----------------------------------------------------------------------------- #
|
10
10
|
# listselectionmodel.rb Copyright (C) 2012-2014 j kepler
|
11
11
|
# ----------------------------------------------------------------------------- #
|
@@ -43,7 +43,7 @@ module Canis
|
|
43
43
|
# selection modes may be :multiple, :single or :none
|
44
44
|
dsl_accessor :selection_mode
|
45
45
|
# color of selected rows, and attribute of selected rows
|
46
|
-
|
46
|
+
dsl_property :selected_color, :selected_bgcolor, :selected_attr
|
47
47
|
# indices of selected rows
|
48
48
|
dsl_accessor :selected_indices
|
49
49
|
# model that takes care of selection operations
|
@@ -9,7 +9,7 @@
|
|
9
9
|
# Author: jkepler http://github.com/mare-imbrium/canis/
|
10
10
|
# Date: 2011-11-27 - 18:10
|
11
11
|
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
12
|
-
# Last update:
|
12
|
+
# Last update: 2014-08-19 00:02
|
13
13
|
# ----------------------------------------------------------------------------- #
|
14
14
|
#
|
15
15
|
# supply history for this object, at least give an empty array
|
@@ -83,7 +83,7 @@ module Canis
|
|
83
83
|
#end
|
84
84
|
r = @_history_config[:row] || r
|
85
85
|
c = @_history_config[:col] || c
|
86
|
-
ret = popuplist(list, :row => r, :col => c, :title => " History ")
|
86
|
+
ret = popuplist(list, :row => r, :col => c, :title => " History ", :color => :white, :bgcolor => :cyan)
|
87
87
|
if ret
|
88
88
|
self.text = list[ret]
|
89
89
|
self.set_form_col
|
@@ -82,8 +82,8 @@ module Canis
|
|
82
82
|
$color_map = {}
|
83
83
|
FFI::NCurses.start_color();
|
84
84
|
# Initialize few color pairs
|
85
|
-
$def_fg_color
|
86
|
-
$def_bg_color
|
85
|
+
$def_fg_color ||= :white # pls set these 2 for your application
|
86
|
+
$def_bg_color ||= :black
|
87
87
|
#COLORS = [COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE,
|
88
88
|
# COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE]
|
89
89
|
@@colors = [:black, :red, :green, :yellow, :blue, :magenta, :cyan, :white]
|
@@ -100,7 +100,7 @@ module Canis
|
|
100
100
|
$errorcolor = ColorMap.get_color :white, :red
|
101
101
|
#$promptcolor = $selectedcolor = ColorMap.get_color(:yellow, :red)
|
102
102
|
$promptcolor = ColorMap.get_color(:yellow, :red)
|
103
|
-
$normalcolor = $datacolor = ColorMap.get_color(
|
103
|
+
$normalcolor = $datacolor = ColorMap.get_color($def_fg_color, $def_bg_color)
|
104
104
|
$bottomcolor = $topcolor = ColorMap.get_color(:white, :blue)
|
105
105
|
$selectedcolor = $datacolor # since we now use reverse attr in list
|
106
106
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# Author: jkepler http://github.com/mare-imbrium/canis/
|
5
5
|
# Date: Around for a long time
|
6
6
|
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
7
|
-
# Last update: 2014-08-15
|
7
|
+
# Last update: 2014-08-20 15:08
|
8
8
|
#
|
9
9
|
# == CHANGED
|
10
10
|
# removed dead or redudant code - 2014-04-22 - 12:53
|
@@ -88,7 +88,7 @@ module Canis
|
|
88
88
|
@visible = true
|
89
89
|
set_layout(layout)
|
90
90
|
|
91
|
-
|
91
|
+
$log.debug "XXX:WINDOW got h #{@height}, w #{@width}, t #{@top}, l #{@left} "
|
92
92
|
|
93
93
|
@height = FFI::NCurses.LINES if @height == 0 # 2011-11-14 added since tired of checking for zero
|
94
94
|
@width = FFI::NCurses.COLS if @width == 0
|
@@ -97,7 +97,7 @@ module Canis
|
|
97
97
|
# trying out refreshing underlying window.
|
98
98
|
$global_windows ||= []
|
99
99
|
# this causes issues padrefresh failing when display_list does a resize.
|
100
|
-
|
100
|
+
$global_windows << self
|
101
101
|
@panel = Ncurses::Panel.new(@window) # added FFI 2011-09-6
|
102
102
|
#$error_message_row = $status_message_row = Ncurses.LINES-1
|
103
103
|
$error_message_row ||= Ncurses.LINES-1
|
@@ -125,6 +125,7 @@ module Canis
|
|
125
125
|
#Ncurses::wtimeout(@window, $ncurses_timeout || 500) # will wait a second on wgetch so we can get gg and qq
|
126
126
|
#@stack = [] # since we have moved to handler 2014-04-20 - 11:15
|
127
127
|
@name ||="#{self}"
|
128
|
+
$log.debug " WINDOW NAME is #{@name} "
|
128
129
|
@modified = true
|
129
130
|
$catch_alt_digits ||= false # is this where is should put globals ? 2010-03-14 14:00 XXX
|
130
131
|
end
|
@@ -163,6 +164,7 @@ module Canis
|
|
163
164
|
# above blanks out entire screen
|
164
165
|
# in case of multiple root windows lets just do last otherwise too much refreshing.
|
165
166
|
gw = $global_windows
|
167
|
+
$log.debug " REFRESH_ALL windows count = #{gw.count} "
|
166
168
|
if current_win
|
167
169
|
gw = $global_windows.select {|e| e != current_win }
|
168
170
|
end
|
@@ -177,6 +179,8 @@ module Canis
|
|
177
179
|
if f
|
178
180
|
# send hack to root windows form if passed.
|
179
181
|
f.handle_key 1000
|
182
|
+
else
|
183
|
+
$log.warn " REFRESH_ALL on #{w.name} (#{i}) NO FORM so could not send 1000 #{f}"
|
180
184
|
end
|
181
185
|
#w.ungetch(1000)
|
182
186
|
# below blanks out entire screen too
|
@@ -440,6 +444,7 @@ module Canis
|
|
440
444
|
# added here to hopefully take care of this issue once and for all.
|
441
445
|
# Whenever any window is destroyed, the root window is repainted.
|
442
446
|
#
|
447
|
+
# 2014-08-18 - 20:35 trying out without refresh all since lower dialog gets erased
|
443
448
|
Window.refresh_all
|
444
449
|
#$log.debug "win destroy end"
|
445
450
|
end
|
data/lib/canis/core/util/app.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
* Name: App
|
3
|
-
* Description:
|
4
|
-
|
3
|
+
* Description: Application class that wraps starting and shutting ncurses and creating a root window
|
4
|
+
and form.
|
5
|
+
* Author: jkepler
|
5
6
|
* file created 2010-09-04 22:10
|
6
7
|
Todo:
|
7
8
|
|
@@ -34,7 +35,6 @@ module Canis
|
|
34
35
|
# - box / rect
|
35
36
|
# - para looks like a label that is more than one line, and calculates rows itself based on text
|
36
37
|
# - multicontainer
|
37
|
-
# - multitextview, multisplit
|
38
38
|
# - tabbedpane
|
39
39
|
# / table - more work regarding vim keys, also editable
|
40
40
|
# - margin - is left offset
|
@@ -42,6 +42,8 @@ module Canis
|
|
42
42
|
#
|
43
43
|
|
44
44
|
# 2014-04-17 - 13:15 XXX are these used. required ???
|
45
|
+
=begin
|
46
|
+
# 2014-08-19 - 20:48 trying to remove excess convenience code
|
45
47
|
class Widget
|
46
48
|
def changed *args, &block
|
47
49
|
bind :CHANGED, *args, &block
|
@@ -57,9 +59,11 @@ module Canis
|
|
57
59
|
bind :PRESS, *args, &block
|
58
60
|
end
|
59
61
|
end
|
62
|
+
=end
|
60
63
|
class CheckBox
|
61
64
|
# a little dicey XXX
|
62
65
|
def text(*val)
|
66
|
+
raise "FIXME this is being used Checkbox app.rb text(), otherwise delete this. 2014-08-19 - 21:01 "
|
63
67
|
if val.empty?
|
64
68
|
@value ? @onvalue : @offvalue
|
65
69
|
else
|
@@ -75,8 +79,6 @@ module Canis
|
|
75
79
|
attr_reader :form
|
76
80
|
attr_reader :window
|
77
81
|
attr_writer :quit_key
|
78
|
-
# the row on which to prompt user for any inputs
|
79
|
-
#attr_accessor :prompt_row # 2011-10-17 14:06:22
|
80
82
|
|
81
83
|
# TODO: i should be able to pass window coords here in config
|
82
84
|
# :title
|
@@ -87,7 +89,7 @@ module Canis
|
|
87
89
|
widget_shortcuts_init
|
88
90
|
@variables = {}
|
89
91
|
# if we are creating child objects then we will not use outer form. this object will manage
|
90
|
-
|
92
|
+
#@current_object = [] # 2014-08-29 - 17:35 unused
|
91
93
|
@_system_commands = %w{ bind_global bind_component field_help_text }
|
92
94
|
|
93
95
|
init_vars
|
@@ -102,8 +104,6 @@ module Canis
|
|
102
104
|
init_ncurses
|
103
105
|
end
|
104
106
|
$lastline = Ncurses.LINES - 1
|
105
|
-
#@message_row = Ncurses.LINES-1
|
106
|
-
#@prompt_row = @message_row # hope to use for ask etc # 2011-10-17 14:06:27
|
107
107
|
unless $log
|
108
108
|
logpath=ENV["CANIS_LOG_PATH"]
|
109
109
|
$log = create_logger(logpath || "/dev/null")
|
@@ -112,7 +112,7 @@ module Canis
|
|
112
112
|
def logger; return $log; end
|
113
113
|
def close
|
114
114
|
$log.debug " INSIDE CLOSE, #{@stop_ncurses_on_close} "
|
115
|
-
@window.destroy if
|
115
|
+
@window.destroy if @window
|
116
116
|
$log.debug " INSIDE CLOSE, #{@stop_ncurses_on_close} "
|
117
117
|
if @stop_ncurses_on_close
|
118
118
|
Canis::stop_ncurses
|
@@ -138,39 +138,39 @@ module Canis
|
|
138
138
|
while true
|
139
139
|
catch :close do
|
140
140
|
while((ch = @window.getchar()) != 999 )
|
141
|
-
#break if ch == @break_key
|
142
141
|
if ch == @break_key || ch == @quit_key
|
143
|
-
#stopping = @window.fire_close_handler
|
144
|
-
#break if stopping.nil? || stopping
|
145
142
|
break
|
146
143
|
end
|
147
144
|
|
148
|
-
# execute a code block so caller program can handle keys from a hash or whatever.
|
149
|
-
# Currently this has the issue that the key is still evaluated again in the next block
|
150
|
-
# - A double evaluation can happen
|
151
|
-
# - these keys will not appear in help
|
152
|
-
# FIXME
|
153
|
-
if @keyblock
|
154
|
-
str = keycode_tos ch
|
155
|
-
# why did we ever want to convert to a symbol. why not just pass it as is.
|
156
|
-
#@keyblock.call(str.gsub(/-/, "_").to_sym) # not used ever
|
157
|
-
ret = @keyblock.call(str)
|
158
|
-
@form.repaint if ret
|
159
|
-
end
|
160
145
|
|
161
|
-
|
146
|
+
# 2014-08-19 - 22:51 commented next line, too much choice. keep it simple. delete in a month FIXME
|
147
|
+
#yield ch if block # <<<----
|
148
|
+
|
162
149
|
# this is what the user should have control ove. earlier we would put this in
|
163
150
|
# a try catch block so user could do what he wanted with the error. Now we
|
164
151
|
# need to get it to him somehow, perhaps through a block or on_error event
|
165
152
|
begin
|
153
|
+
# execute a code block so caller program can handle keys from a hash or whatever.
|
154
|
+
# NOTE: these keys will not appear in help
|
155
|
+
# FIXME : ideally if its just a hash, we should allow user to give it to form
|
156
|
+
# or widget which it will use, or merge, and be able to print help from
|
157
|
+
if @keyblock
|
158
|
+
str = keycode_tos ch
|
159
|
+
# why did we ever want to convert to a symbol. why not just pass it as is.
|
160
|
+
#@keyblock.call(str.gsub(/-/, "_").to_sym) # not used ever
|
161
|
+
ret = @keyblock.call(str)
|
162
|
+
if ret
|
163
|
+
@form.repaint
|
164
|
+
next
|
165
|
+
end
|
166
|
+
end
|
166
167
|
@form.handle_key ch
|
167
168
|
rescue => err
|
168
|
-
$log.debug( "handle_key rescue reached ")
|
169
|
+
$log.debug( "app.rb handle_key rescue reached ")
|
169
170
|
$log.debug( err.to_s)
|
170
171
|
$log.debug(err.backtrace.join("\n"))
|
171
172
|
textdialog [err.to_s, *err.backtrace], :title => "Exception"
|
172
173
|
end
|
173
|
-
#@form.repaint # was this duplicate ?? handle calls repaint not needed
|
174
174
|
@window.wrefresh
|
175
175
|
end
|
176
176
|
end # catch
|
@@ -181,6 +181,7 @@ module Canis
|
|
181
181
|
end
|
182
182
|
# if calling loop separately better to call this, since it will shut off ncurses
|
183
183
|
# and print error on screen.
|
184
|
+
# UNUSED
|
184
185
|
def safe_loop &block
|
185
186
|
begin
|
186
187
|
loop &block
|
@@ -296,14 +297,6 @@ module Canis
|
|
296
297
|
@form.bind_key(key){ send(cmd.to_sym) }
|
297
298
|
end
|
298
299
|
end
|
299
|
-
def bind_component
|
300
|
-
#rb_puts "Todo. ", :color_pair => get_color($promptcolor, :red, :black)
|
301
|
-
print_error_message "Todo this. "
|
302
|
-
# the idea here is to get the current component
|
303
|
-
# and bind some keys to some methods.
|
304
|
-
# however, how do we divine the methods we can map to
|
305
|
-
# and also in some cases the components itself has multiple components
|
306
|
-
end
|
307
300
|
# displays help_text associated with field. 2011-10-15
|
308
301
|
def field_help_text
|
309
302
|
f = @form.get_current_field
|
@@ -389,6 +382,7 @@ module Canis
|
|
389
382
|
# @example
|
390
383
|
# hline :width => 55
|
391
384
|
def hline config={}
|
385
|
+
raise "I think this is unused. removed if this does not raise 2014-08-29 - 12:43 "
|
392
386
|
row = config[:row] || @app_row
|
393
387
|
width = config[:width] || 20
|
394
388
|
_position config
|
@@ -457,63 +451,6 @@ module Canis
|
|
457
451
|
awin = @window
|
458
452
|
catch(:close) do
|
459
453
|
@form = Form.new @window
|
460
|
-
@form.bind_key([?\C-x, ?c], 'suspend') { suspend(false) do
|
461
|
-
system("tput cup 26 0")
|
462
|
-
system("tput ed")
|
463
|
-
system("echo Enter C-d to return to application")
|
464
|
-
system (ENV['PS1']='\s-\v\$ ')
|
465
|
-
system(ENV['SHELL']);
|
466
|
-
end
|
467
|
-
}
|
468
|
-
# this is a very rudimentary default command executer, it does not
|
469
|
-
# allow tab completion. App should use M-x with names of commands
|
470
|
-
# as in appgmail
|
471
|
-
# NOTE: This is gonna change very soon - 2012-01-8
|
472
|
-
@form.bind_key(?:, 'prompt') {
|
473
|
-
str = get_command_from_user
|
474
|
-
}
|
475
|
-
|
476
|
-
# this M-x stuff has to be moved out so it can be used by all. One should be able
|
477
|
-
# to add_commands properly to this, and to C-x. I am thinking how to go about this,
|
478
|
-
# and what function M-x actually serves.
|
479
|
-
|
480
|
-
@form.bind_key(?\M-x, 'M-x commands'){
|
481
|
-
# TODO previous command to be default
|
482
|
-
opts = get_all_commands()
|
483
|
-
@_command_history ||= Array.new
|
484
|
-
# previous command should be in opts, otherwise it is not in this context
|
485
|
-
cmd = rb_gets("Command: ", opts){ |q| q.default = @_previous_command; q.history = @_command_history }
|
486
|
-
if cmd.nil? || cmd == ""
|
487
|
-
else
|
488
|
-
@_command_history << cmd unless @_command_history.include? cmd
|
489
|
-
cmdline = cmd.split
|
490
|
-
cmd = cmdline.shift
|
491
|
-
# check if command is a substring of a larger command
|
492
|
-
if !opts.include?(cmd)
|
493
|
-
rcmd = _resolve_command(opts, cmd) if !opts.include?(cmd)
|
494
|
-
if rcmd.size == 1
|
495
|
-
cmd = rcmd.first
|
496
|
-
elsif !rcmd.empty?
|
497
|
-
rb_puts "Cannot resolve #{cmd}. Matches are: #{rcmd} "
|
498
|
-
end
|
499
|
-
end
|
500
|
-
if respond_to?(cmd, true)
|
501
|
-
@_previous_command = cmd
|
502
|
-
begin
|
503
|
-
send cmd, *cmdline
|
504
|
-
rescue => exc
|
505
|
-
$log.error "ERR EXC: send throwing an exception now. Duh. IMAP keeps crashing haha !! #{exc} " if $log.debug?
|
506
|
-
if exc
|
507
|
-
$log.debug( exc)
|
508
|
-
$log.debug(exc.backtrace.join("\n"))
|
509
|
-
rb_puts exc.to_s
|
510
|
-
end
|
511
|
-
end
|
512
|
-
else
|
513
|
-
rb_puts("Command [#{cmd}] not supported by #{self.class} ", :color_pair => $promptcolor)
|
514
|
-
end
|
515
|
-
end
|
516
|
-
}
|
517
454
|
#@form.bind_key(KEY_F1, 'help'){ display_app_help } # NOT REQUIRED NOW 2012-01-7 since form does it
|
518
455
|
@form.bind_key([?q,?q], 'quit' ){ throw :close } if $log.debug?
|
519
456
|
|
@@ -524,7 +461,7 @@ module Canis
|
|
524
461
|
#$error_message.update_command { @message.set_value($error_message.value) }
|
525
462
|
if block
|
526
463
|
begin
|
527
|
-
yield_or_eval &block if block_given?
|
464
|
+
yield_or_eval &block if block_given?
|
528
465
|
# how the hell does a user trap exception if the loop is hidden from him ? FIXME
|
529
466
|
loop
|
530
467
|
rescue => ex
|
@@ -549,8 +486,72 @@ module Canis
|
|
549
486
|
end # :close
|
550
487
|
end
|
551
488
|
end
|
489
|
+
# Some bindings that were earlier part of App (in the run block), but now optional for an
|
490
|
+
# app. I would like to move it out, so they can be mapped separately to whatever a user wants
|
491
|
+
# and be improved. these are very experimental and bare as yet.
|
492
|
+
# They should also be usable outside of App.
|
493
|
+
def app_bindings
|
494
|
+
@form.bind_key([?\C-x, ?c], 'suspend') { suspend(false) do
|
495
|
+
system("tput cup 26 0")
|
496
|
+
system("tput ed")
|
497
|
+
system("echo Enter C-d to return to application")
|
498
|
+
system (ENV['PS1']='\s-\v\$ ')
|
499
|
+
system(ENV['SHELL']);
|
500
|
+
end
|
501
|
+
}
|
502
|
+
# this is a very rudimentary default command executer, it does not
|
503
|
+
# allow tab completion. App should use M-x with names of commands
|
504
|
+
# as in appgmail
|
505
|
+
# NOTE: This is gonna change very soon - 2012-01-8
|
506
|
+
@form.bind_key(?:, 'prompt') {
|
507
|
+
str = get_command_from_user
|
508
|
+
}
|
509
|
+
|
510
|
+
# this M-x stuff has to be moved out so it can be used by all. One should be able
|
511
|
+
# to add_commands properly to this, and to C-x. I am thinking how to go about this,
|
512
|
+
# and what function M-x actually serves.
|
513
|
+
|
514
|
+
@form.bind_key(?\M-x, 'M-x commands'){
|
515
|
+
# TODO previous command to be default
|
516
|
+
opts = get_all_commands()
|
517
|
+
@_command_history ||= Array.new
|
518
|
+
# previous command should be in opts, otherwise it is not in this context
|
519
|
+
cmd = rb_gets("Command: ", opts){ |q| q.default = @_previous_command; q.history = @_command_history }
|
520
|
+
if cmd.nil? || cmd == ""
|
521
|
+
else
|
522
|
+
@_command_history << cmd unless @_command_history.include? cmd
|
523
|
+
cmdline = cmd.split
|
524
|
+
cmd = cmdline.shift
|
525
|
+
# check if command is a substring of a larger command
|
526
|
+
if !opts.include?(cmd)
|
527
|
+
rcmd = _resolve_command(opts, cmd) if !opts.include?(cmd)
|
528
|
+
if rcmd.size == 1
|
529
|
+
cmd = rcmd.first
|
530
|
+
elsif !rcmd.empty?
|
531
|
+
rb_puts "Cannot resolve #{cmd}. Matches are: #{rcmd} "
|
532
|
+
end
|
533
|
+
end
|
534
|
+
if respond_to?(cmd, true)
|
535
|
+
@_previous_command = cmd
|
536
|
+
begin
|
537
|
+
send cmd, *cmdline
|
538
|
+
rescue => exc
|
539
|
+
$log.error "ERR EXC: send throwing an exception now. Duh. IMAP keeps crashing haha !! #{exc} " if $log.debug?
|
540
|
+
if exc
|
541
|
+
$log.debug( exc)
|
542
|
+
$log.debug(exc.backtrace.join("\n"))
|
543
|
+
rb_puts exc.to_s
|
544
|
+
end
|
545
|
+
end
|
546
|
+
else
|
547
|
+
rb_puts("Command [#{cmd}] not supported by #{self.class} ", :color_pair => $promptcolor)
|
548
|
+
end
|
549
|
+
end
|
550
|
+
}
|
551
|
+
end
|
552
552
|
# process args, all widgets should call this
|
553
553
|
def _process_args args, config, block_event, events #:nodoc:
|
554
|
+
raise "FIXME seems uncalled _process_args, remove it this does not come up within a month 2014-08-19 "
|
554
555
|
args.each do |arg|
|
555
556
|
case arg
|
556
557
|
when Array
|