window_blessing 0.0.1 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +30 -0
- data/README.md +1 -1
- data/bin/buffered_screen_demo.rb +4 -4
- data/bin/color_picker_demo.rb +1 -0
- data/bin/windowed_screen_demo.rb +1 -1
- data/bin/xterm_screen_demo.rb +6 -4
- data/lib/window_blessing.rb +2 -2
- data/lib/window_blessing/buffer.rb +16 -6
- data/lib/window_blessing/buffered_screen.rb +2 -2
- data/lib/window_blessing/color.rb +1 -0
- data/lib/window_blessing/debug_tools/log_request_redraw_internal.rb +16 -0
- data/lib/window_blessing/event_manager.rb +11 -6
- data/lib/window_blessing/evented.rb +1 -1
- data/lib/window_blessing/evented_variable.rb +10 -1
- data/lib/window_blessing/tools.rb +11 -1
- data/lib/window_blessing/version.rb +1 -1
- data/lib/window_blessing/widgets/draggable_background.rb +1 -1
- data/lib/window_blessing/widgets/label.rb +1 -1
- data/lib/window_blessing/widgets/slider.rb +10 -2
- data/lib/window_blessing/widgets/text_field.rb +1 -1
- data/lib/window_blessing/window.rb +48 -45
- data/lib/window_blessing/window_redraw_areas.rb +23 -0
- data/lib/window_blessing/windowed_screen.rb +11 -13
- data/lib/window_blessing/xterm_event_parser.rb +68 -59
- data/lib/window_blessing/xterm_screen.rb +2 -2
- data/lib/window_blessing/xterm_state.rb +1 -1
- data/spec/buffer_spec.rb +56 -0
- data/spec/color_spec.rb +14 -0
- data/spec/event_manager_spec.rb +107 -0
- data/spec/event_queue_spec.rb +46 -0
- data/spec/evented_variable_spec.rb +43 -0
- data/spec/tools_spec.rb +18 -0
- data/spec/window_redraw_areas_spec.rb +79 -0
- data/spec/window_spec.rb +138 -3
- data/spec/xterm_event_parser_spec.rb +86 -0
- data/window_blessing.gemspec +4 -3
- metadata +20 -11
- data/bin/foiled_demo.rb +0 -27
- data/bin/text_editor_demo.rb +0 -292
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: window_blessing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: babel_bridge
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0.
|
37
|
+
version: 0.3.1
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0.
|
45
|
+
version: 0.3.1
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: rake
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,21 +139,20 @@ dependencies:
|
|
139
139
|
- - ! '>='
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
|
-
description: Forget
|
142
|
+
description: Forget curses. Try blessings. WindowBlessing is an evented, windowing
|
143
143
|
framework for terminal apps.
|
144
144
|
email:
|
145
145
|
- shanebdavis@gmail.com
|
146
146
|
executables:
|
147
147
|
- buffered_screen_demo.rb
|
148
148
|
- color_picker_demo.rb
|
149
|
-
- foiled_demo.rb
|
150
|
-
- text_editor_demo.rb
|
151
149
|
- windowed_screen_demo.rb
|
152
150
|
- xterm_screen_demo.rb
|
153
151
|
extensions: []
|
154
152
|
extra_rdoc_files: []
|
155
153
|
files:
|
156
154
|
- .gitignore
|
155
|
+
- CHANGELOG.md
|
157
156
|
- Gemfile
|
158
157
|
- Guardfile
|
159
158
|
- LICENSE.txt
|
@@ -161,8 +160,6 @@ files:
|
|
161
160
|
- Rakefile
|
162
161
|
- bin/buffered_screen_demo.rb
|
163
162
|
- bin/color_picker_demo.rb
|
164
|
-
- bin/foiled_demo.rb
|
165
|
-
- bin/text_editor_demo.rb
|
166
163
|
- bin/windowed_screen_demo.rb
|
167
164
|
- bin/xterm_screen_demo.rb
|
168
165
|
- lib/window_blessing.rb
|
@@ -170,6 +167,7 @@ files:
|
|
170
167
|
- lib/window_blessing/buffered_screen.rb
|
171
168
|
- lib/window_blessing/color.rb
|
172
169
|
- lib/window_blessing/constants.rb
|
170
|
+
- lib/window_blessing/debug_tools/log_request_redraw_internal.rb
|
173
171
|
- lib/window_blessing/event_manager.rb
|
174
172
|
- lib/window_blessing/event_queue.rb
|
175
173
|
- lib/window_blessing/evented.rb
|
@@ -181,6 +179,7 @@ files:
|
|
181
179
|
- lib/window_blessing/widgets/slider.rb
|
182
180
|
- lib/window_blessing/widgets/text_field.rb
|
183
181
|
- lib/window_blessing/window.rb
|
182
|
+
- lib/window_blessing/window_redraw_areas.rb
|
184
183
|
- lib/window_blessing/windowed_screen.rb
|
185
184
|
- lib/window_blessing/xterm_event_parser.rb
|
186
185
|
- lib/window_blessing/xterm_input.rb
|
@@ -190,9 +189,14 @@ files:
|
|
190
189
|
- lib/window_blessing/xterm_state.rb
|
191
190
|
- spec/buffer_spec.rb
|
192
191
|
- spec/color_spec.rb
|
192
|
+
- spec/event_manager_spec.rb
|
193
|
+
- spec/event_queue_spec.rb
|
194
|
+
- spec/evented_variable_spec.rb
|
193
195
|
- spec/spec_helper.rb
|
194
196
|
- spec/tools_spec.rb
|
197
|
+
- spec/window_redraw_areas_spec.rb
|
195
198
|
- spec/window_spec.rb
|
199
|
+
- spec/xterm_event_parser_spec.rb
|
196
200
|
- window_blessing.gemspec
|
197
201
|
homepage: https://github.com/shanebdavis/window_blessing
|
198
202
|
licenses: []
|
@@ -214,13 +218,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
214
218
|
version: '0'
|
215
219
|
requirements: []
|
216
220
|
rubyforge_project:
|
217
|
-
rubygems_version: 1.8.
|
221
|
+
rubygems_version: 1.8.25
|
218
222
|
signing_key:
|
219
223
|
specification_version: 3
|
220
|
-
summary:
|
224
|
+
summary: Evented windowing framework for terminal apps.
|
221
225
|
test_files:
|
222
226
|
- spec/buffer_spec.rb
|
223
227
|
- spec/color_spec.rb
|
228
|
+
- spec/event_manager_spec.rb
|
229
|
+
- spec/event_queue_spec.rb
|
230
|
+
- spec/evented_variable_spec.rb
|
224
231
|
- spec/spec_helper.rb
|
225
232
|
- spec/tools_spec.rb
|
233
|
+
- spec/window_redraw_areas_spec.rb
|
226
234
|
- spec/window_spec.rb
|
235
|
+
- spec/xterm_event_parser_spec.rb
|
data/bin/foiled_demo.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require File.expand_path File.join(File.dirname(__FILE__), %w{.. lib window_blessing})
|
3
|
-
|
4
|
-
|
5
|
-
WindowBlessing.main do |main_window|
|
6
|
-
# raise main_window.inspect
|
7
|
-
(c1 = window(rect(10,10,15,7))).background='-='
|
8
|
-
main_window.add_child c1
|
9
|
-
|
10
|
-
on_key do |key|
|
11
|
-
case key
|
12
|
-
when ?Q, ?q then break
|
13
|
-
when Curses::Key::UP then c1.area += point(0,-1)
|
14
|
-
when Curses::Key::DOWN then c1.area += point(0,1)
|
15
|
-
when Curses::Key::LEFT then c1.area += point(-1,0)
|
16
|
-
when Curses::Key::RIGHT then c1.area += point(1,0)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
on_tick do
|
21
|
-
time = Time.now
|
22
|
-
if time.sec != @last_sec
|
23
|
-
write point(0,0), time.to_s
|
24
|
-
@last_sec = time.sec
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/bin/text_editor_demo.rb
DELETED
@@ -1,292 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
require File.expand_path File.join(File.dirname(__FILE__), %w{.. lib window_blessing})
|
4
|
-
include GuiGeo
|
5
|
-
include WindowBlessing::Tools
|
6
|
-
include WindowBlessing
|
7
|
-
include Widgets
|
8
|
-
|
9
|
-
class Theme
|
10
|
-
include WindowBlessing::Tools
|
11
|
-
COLORS = {
|
12
|
-
background: color("ffc").to_screen_color,
|
13
|
-
foreground: color(0.25).to_screen_color,
|
14
|
-
comment: color(0.5).to_screen_color,
|
15
|
-
keyword: color("4a744a").to_screen_color,
|
16
|
-
string: color("4a7494").to_screen_color,
|
17
|
-
number: color("4a7494").to_screen_color,
|
18
|
-
regexp: color("4a7494").to_screen_color,
|
19
|
-
constant: color("c96600").to_screen_color,
|
20
|
-
operator: color("4a744a").to_screen_color
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
class CodeMarkup < BabelBridge::Parser
|
25
|
-
|
26
|
-
rule :file, :space, many?(:element) do
|
27
|
-
def colors
|
28
|
-
[[Theme::COLORS[:foreground]]*space.match_length,element.collect{|a| a.colors}].flatten
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
rule :element, :comment, :space do
|
33
|
-
def colors; [Theme::COLORS[:comment]] * match_length; end
|
34
|
-
end
|
35
|
-
|
36
|
-
rule :element, :keyword, :space do
|
37
|
-
def colors; [Theme::COLORS[:keyword]] * match_length; end
|
38
|
-
end
|
39
|
-
|
40
|
-
rule :element, :string, :space do
|
41
|
-
def colors; [Theme::COLORS[:string]] * match_length; end
|
42
|
-
end
|
43
|
-
|
44
|
-
rule :element, :regexp, :space do
|
45
|
-
def colors; [Theme::COLORS[:regex]] * match_length; end
|
46
|
-
end
|
47
|
-
|
48
|
-
rule :element, :constant, :space do
|
49
|
-
def colors; [Theme::COLORS[:constant]] * match_length; end
|
50
|
-
end
|
51
|
-
|
52
|
-
rule :element, :operator, :space do
|
53
|
-
def colors; [Theme::COLORS[:operator]] * match_length; end
|
54
|
-
end
|
55
|
-
|
56
|
-
rule :element, :number, :space do
|
57
|
-
def colors; [Theme::COLORS[:number]] * match_length; end
|
58
|
-
end
|
59
|
-
|
60
|
-
rule :element, :identifier, :space do
|
61
|
-
def colors; [Theme::COLORS[:foreground]] * match_length; end
|
62
|
-
end
|
63
|
-
|
64
|
-
rule :element, :non_space, :space do
|
65
|
-
def colors; [Theme::COLORS[:foreground]] * match_length; end
|
66
|
-
end
|
67
|
-
|
68
|
-
rule :space, /\s*/
|
69
|
-
rule :number, /[0-9]+(\.[0-9]+)?/
|
70
|
-
rule :comment, /#([^\n]|$)*/
|
71
|
-
rule :string, /"(\\.|[^\\"])*"/
|
72
|
-
rule :string, /:[_a-zA-Z0-9]+[?!]?/
|
73
|
-
rule :regexp, /\/(\\.|[^\\\/])*\//
|
74
|
-
rule :operator, /[-!@$%^&*()_+={}|\[\];:<>\?,\.\/~]+/
|
75
|
-
rule :keyword, /class|end|def|and|or|do|if|then/
|
76
|
-
rule :keyword, /else|elsif|case|then|when|require|include/
|
77
|
-
rule :identifier, /[_a-zA-Z][0-9_a-zA-Z]*/
|
78
|
-
rule :constant, /[A-Z][0-9_a-zA-Z]*/
|
79
|
-
rule :non_space, /[^\s]/
|
80
|
-
end
|
81
|
-
|
82
|
-
class TextEditor < Window
|
83
|
-
attr_accessor_with_redraw :edit_buffer, :cursor_loc, :cursor_bg
|
84
|
-
|
85
|
-
def initialize(filename)
|
86
|
-
super rect(0,0,80,20)
|
87
|
-
self.bg = Theme::COLORS[:background]
|
88
|
-
self.fg = Theme::COLORS[:foreground]
|
89
|
-
@cursor_loc = point
|
90
|
-
@cursor_bg = Color.yellow
|
91
|
-
|
92
|
-
init_event_handlers
|
93
|
-
self.text = File.read(filename)
|
94
|
-
|
95
|
-
on :parent_resize do |event|
|
96
|
-
self.size = event[:size]
|
97
|
-
end
|
98
|
-
on :parent_set do |event|
|
99
|
-
self.size = parent.size
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def init_event_handlers
|
104
|
-
on :string_input do |event|
|
105
|
-
string = event[:string]
|
106
|
-
line = current_line
|
107
|
-
x,y = cursor_loc.x,cursor_loc.y
|
108
|
-
if x > line.length
|
109
|
-
line += " "*(x - line.length)
|
110
|
-
end
|
111
|
-
new_line = if x == 0
|
112
|
-
string + line
|
113
|
-
elsif x == line.length
|
114
|
-
line + string
|
115
|
-
else
|
116
|
-
line[0..x-1] + string + line[x..-1]
|
117
|
-
end
|
118
|
-
new_lines = new_line.split "\n"
|
119
|
-
|
120
|
-
#cop-out for now
|
121
|
-
edit_buffer[cursor_loc.y]= new_lines[0]
|
122
|
-
request_redraw_internal(rect(cursor_loc,point(size.x,1)))
|
123
|
-
cursor_loc.x += string.length
|
124
|
-
color_lines[y]=nil
|
125
|
-
end
|
126
|
-
|
127
|
-
on :key_press do |event|
|
128
|
-
c = cursor_loc.clone
|
129
|
-
case event[:key]
|
130
|
-
when :control_m then c = newline_at_cursor
|
131
|
-
when :backspace then c = backspace
|
132
|
-
when :home then c = point(0,c.y)
|
133
|
-
when :page_up then #c = point(0,c.y)
|
134
|
-
when :page_down then #c = point(0,c.y)
|
135
|
-
when :end then c = point(edit_buffer[c.y].length,c.y)
|
136
|
-
when :left then
|
137
|
-
if c.x == 0
|
138
|
-
if c.y > 0
|
139
|
-
c.y-=1
|
140
|
-
c.x = edit_buffer[c.y].length
|
141
|
-
end
|
142
|
-
else
|
143
|
-
c.x -= 1
|
144
|
-
end
|
145
|
-
when :right then c.x += 1
|
146
|
-
when :up then c.y = max(0, c.y-1)
|
147
|
-
when :down then c.y = min(c.y+1, edit_buffer.length-1)
|
148
|
-
end
|
149
|
-
self.cursor_loc = c
|
150
|
-
end
|
151
|
-
|
152
|
-
on :focus do
|
153
|
-
request_redraw_internal
|
154
|
-
end
|
155
|
-
|
156
|
-
on :blur do
|
157
|
-
request_redraw_internal
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def cursor_area
|
162
|
-
rect(cursor_loc - scroll_pos,point(1,1))
|
163
|
-
end
|
164
|
-
|
165
|
-
def cursor_loc=(c)
|
166
|
-
request_redraw_internal cursor_area
|
167
|
-
@cursor_loc = c
|
168
|
-
request_redraw_internal cursor_area
|
169
|
-
end
|
170
|
-
|
171
|
-
def newline_at_cursor
|
172
|
-
c = cursor_loc.clone
|
173
|
-
x,y = c.x, c.y
|
174
|
-
if x == 0
|
175
|
-
edit_buffer.insert(y,"")
|
176
|
-
color_lines.insert(y,nil)
|
177
|
-
elsif x >= current_line.length
|
178
|
-
edit_buffer.insert(y+1,"")
|
179
|
-
color_lines.insert(y+1,nil)
|
180
|
-
else
|
181
|
-
l = current_line
|
182
|
-
edit_buffer.insert(y,l[0..x-1])
|
183
|
-
color_lines.insert(y,nil)
|
184
|
-
edit_buffer[y+1] = l[x..-1]
|
185
|
-
end
|
186
|
-
color_lines[y]=color_lines[y+1]=nil
|
187
|
-
request_redraw_internal
|
188
|
-
point(0,y+1)
|
189
|
-
end
|
190
|
-
|
191
|
-
def backspace
|
192
|
-
c = cursor_loc.clone
|
193
|
-
x,y = c.x, c.y
|
194
|
-
if x == 0
|
195
|
-
if y > 0
|
196
|
-
c.x = edit_buffer[y-1].length
|
197
|
-
edit_buffer[y-1] += edit_buffer[y]
|
198
|
-
color_lines[y-1] = nil
|
199
|
-
c.y -= 1
|
200
|
-
|
201
|
-
edit_buffer.delete_at(y)
|
202
|
-
color_lines.delete_at(y)
|
203
|
-
|
204
|
-
request_redraw_internal
|
205
|
-
end
|
206
|
-
else
|
207
|
-
edit_buffer[y] = if x == 1
|
208
|
-
current_line[1..-1]
|
209
|
-
elsif x == current_line.length
|
210
|
-
current_line[0..-2]
|
211
|
-
else
|
212
|
-
current_line[0..x-2] + current_line[x..-1]
|
213
|
-
end
|
214
|
-
c.x -= 1
|
215
|
-
request_redraw_current_line
|
216
|
-
end
|
217
|
-
color_lines[y]=nil
|
218
|
-
c
|
219
|
-
end
|
220
|
-
|
221
|
-
def request_redraw_current_line
|
222
|
-
request_redraw_internal current_line_area
|
223
|
-
end
|
224
|
-
|
225
|
-
def line_area(line_number)
|
226
|
-
rect(point(0,line_number),point(edit_buffer[line_number].length,1))
|
227
|
-
end
|
228
|
-
|
229
|
-
def current_line_area
|
230
|
-
line_area(cursor_loc.y)
|
231
|
-
end
|
232
|
-
|
233
|
-
def current_line
|
234
|
-
edit_buffer[cursor_loc.y]
|
235
|
-
end
|
236
|
-
|
237
|
-
def text
|
238
|
-
edit_buffer.join("\n")
|
239
|
-
end
|
240
|
-
|
241
|
-
def text=(t)
|
242
|
-
self.edit_buffer = t.split("\n")
|
243
|
-
end
|
244
|
-
|
245
|
-
def scroll_pos
|
246
|
-
point
|
247
|
-
end
|
248
|
-
|
249
|
-
def line_range
|
250
|
-
scroll_pos.y..scroll_pos.y+size.y-1
|
251
|
-
end
|
252
|
-
|
253
|
-
def visible_lines
|
254
|
-
edit_buffer[line_range]
|
255
|
-
end
|
256
|
-
|
257
|
-
def color_lines
|
258
|
-
@color_lines ||= []
|
259
|
-
end
|
260
|
-
|
261
|
-
def draw_background
|
262
|
-
syntax_highlighter = CodeMarkup.new
|
263
|
-
crop_area = buffer.crop_area
|
264
|
-
|
265
|
-
range = (crop_area+scroll_pos).y_range
|
266
|
-
lines = edit_buffer[range]
|
267
|
-
clines = color_lines[range]
|
268
|
-
|
269
|
-
lines.each_with_index do |a,i|
|
270
|
-
clines[i] ||= begin
|
271
|
-
p = syntax_highlighter.parse(a.clone)
|
272
|
-
log syntax_highlighter.parser_failure_info unless p
|
273
|
-
p.colors
|
274
|
-
end
|
275
|
-
buffer.contents[i+crop_area.y] = a
|
276
|
-
buffer.fg_buffer[i+crop_area.y] = clines[i]
|
277
|
-
end
|
278
|
-
|
279
|
-
color_lines[range] = clines
|
280
|
-
|
281
|
-
buffer.sanitize_contents crop_area.y_range
|
282
|
-
buffer.normalize crop_area.y_range
|
283
|
-
buffer.fill bg:bg
|
284
|
-
buffer.fill :area => cursor_area, :bg => cursor_bg if focused?
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
WindowedScreen.new.start(:full=>true, :utf8 => true) do |screen|
|
289
|
-
filename = __FILE__
|
290
|
-
screen.root_window.add_child te=TextEditor.new(filename)
|
291
|
-
te.focus
|
292
|
-
end
|