ncurses 0.9.1
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.
- data/COPYING +515 -0
- data/Changes +27 -0
- data/MANIFEST +27 -0
- data/README +273 -0
- data/README.windows +35 -0
- data/THANKS +11 -0
- data/TODO +15 -0
- data/VERSION +1 -0
- data/examples/LICENSES_for_examples +26 -0
- data/examples/example.rb +129 -0
- data/examples/form.rb +82 -0
- data/examples/form2.rb +184 -0
- data/examples/hello_ncurses.rb +57 -0
- data/examples/rain.rb +220 -0
- data/examples/read_line.rb +67 -0
- data/examples/tclock.rb +227 -0
- data/examples/test_scanw.rb +27 -0
- data/extconf.rb +130 -0
- data/form_wrap.c +1447 -0
- data/form_wrap.h +62 -0
- data/lib/ncurses.rb +289 -0
- data/make_dist.rb +45 -0
- data/ncurses_wrap.c +2611 -0
- data/ncurses_wrap.h +99 -0
- data/panel_wrap.c +256 -0
- data/panel_wrap.h +32 -0
- metadata +79 -0
data/examples/form.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# Copyright (c) 2004 by Simon Kaczor <skaczor@cox.net>
|
3
|
+
# Example from the NCurses Programming HOWTO
|
4
|
+
# This example uses module functions that are documented in the ncurses man page.
|
5
|
+
# For a more rubyish approach that uses Ruby objects see form2.rb
|
6
|
+
#
|
7
|
+
# The original example contained the following copyright:
|
8
|
+
# Copyright (c) 2001 by Pradeep Padala. This document may be distributed
|
9
|
+
# under the terms set forth in the LDP license at linuxdoc.org/COPYRIGHT.html.
|
10
|
+
|
11
|
+
require 'ncurses.rb'
|
12
|
+
|
13
|
+
begin
|
14
|
+
scr = Ncurses.initscr()
|
15
|
+
Ncurses.cbreak()
|
16
|
+
Ncurses.noecho()
|
17
|
+
Ncurses.keypad(scr, true)
|
18
|
+
|
19
|
+
#create some fields
|
20
|
+
fields = Array.new
|
21
|
+
fields.push(Ncurses::Form.new_field(1,10,4,18,0,0))
|
22
|
+
fields.push(Ncurses::Form.new_field(1,10,6,18,0,0))
|
23
|
+
|
24
|
+
# set field options
|
25
|
+
Ncurses::Form.set_field_back(fields[0], Ncurses::A_UNDERLINE)
|
26
|
+
Ncurses::Form.field_opts_off(fields[0], Ncurses::Form::O_AUTOSKIP)
|
27
|
+
|
28
|
+
Ncurses::Form.set_field_back(fields[1], Ncurses::A_UNDERLINE)
|
29
|
+
Ncurses::Form.field_opts_off(fields[1], Ncurses::Form::O_AUTOSKIP)
|
30
|
+
|
31
|
+
|
32
|
+
# create a form
|
33
|
+
form = Ncurses::Form.new_form(fields)
|
34
|
+
|
35
|
+
# post the form and refresh the screen
|
36
|
+
Ncurses::Form.post_form(form)
|
37
|
+
scr.refresh()
|
38
|
+
|
39
|
+
Ncurses.mvprintw(4, 10, "Value 1:")
|
40
|
+
Ncurses.mvprintw(6, 10, "Value 2:")
|
41
|
+
scr.refresh()
|
42
|
+
|
43
|
+
# Loop through to get user requests
|
44
|
+
while((ch = scr.getch()) != Ncurses::KEY_F1) do
|
45
|
+
case(ch)
|
46
|
+
when Ncurses::KEY_DOWN
|
47
|
+
# Go to next field
|
48
|
+
Ncurses::Form.form_driver(form, Ncurses::Form::REQ_NEXT_FIELD)
|
49
|
+
# Go to the end of the present buffer
|
50
|
+
# Leaves nicely at the last character
|
51
|
+
Ncurses::Form.form_driver(form, Ncurses::Form::REQ_END_LINE)
|
52
|
+
|
53
|
+
when Ncurses::KEY_UP
|
54
|
+
#Go to previous field
|
55
|
+
Ncurses::Form.form_driver(form, Ncurses::Form::REQ_PREV_FIELD)
|
56
|
+
Ncurses::Form.form_driver(form, Ncurses::Form::REQ_END_LINE);
|
57
|
+
else
|
58
|
+
# If this is a normal character, it gets Printed
|
59
|
+
Ncurses::Form.form_driver(form, ch)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# unpost and free form
|
64
|
+
Ncurses::Form.unpost_form(form);
|
65
|
+
Ncurses::Form.free_form(form)
|
66
|
+
Ncurses::Form.free_field(fields[0]);
|
67
|
+
Ncurses::Form.free_field(fields[1]);
|
68
|
+
|
69
|
+
|
70
|
+
#using class methods this time
|
71
|
+
# form = Ncurses::Form::FORM.new(fields)
|
72
|
+
# puts "Created form: #{form.inspect}\n"
|
73
|
+
# form.free()
|
74
|
+
|
75
|
+
ensure
|
76
|
+
# put the screen back in its normal state
|
77
|
+
Ncurses.echo()
|
78
|
+
Ncurses.nocbreak()
|
79
|
+
Ncurses.nl()
|
80
|
+
Ncurses.endwin()
|
81
|
+
end
|
82
|
+
|
data/examples/form2.rb
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# Copyright (c) 2004 by Simon Kaczor <skaczor@cox.net>
|
3
|
+
# Simple example of a form in action, based on the NCURSES Programming HOWTO:
|
4
|
+
# http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/
|
5
|
+
#
|
6
|
+
# All standard field types are created in the form.
|
7
|
+
# Additionnally a custom field is created to illustrate
|
8
|
+
# custom field validation using Ruby Proc objects, as shown in the example.
|
9
|
+
#
|
10
|
+
# The original example contained the following copyright:
|
11
|
+
# Copyright (c) 2001 by Pradeep Padala. This document may be distributed
|
12
|
+
# under the terms set forth in the LDP license at linuxdoc.org/COPYRIGHT.html.
|
13
|
+
|
14
|
+
require 'ncurses'
|
15
|
+
|
16
|
+
include Ncurses
|
17
|
+
include Ncurses::Form
|
18
|
+
|
19
|
+
def print_in_middle(win, starty, startx, width, string, color)
|
20
|
+
|
21
|
+
if(win == nil)
|
22
|
+
win = stdscr;
|
23
|
+
end
|
24
|
+
x = Array.new
|
25
|
+
y = Array.new
|
26
|
+
Ncurses.getyx(win, y, x);
|
27
|
+
if(startx != 0)
|
28
|
+
x[0] = startx;
|
29
|
+
end
|
30
|
+
if(starty != 0)
|
31
|
+
y[0] = starty;
|
32
|
+
end
|
33
|
+
if(width == 0)
|
34
|
+
width = 80;
|
35
|
+
end
|
36
|
+
length = string.length;
|
37
|
+
temp = (width - length)/ 2;
|
38
|
+
x[0] = startx + temp.floor;
|
39
|
+
win.attron(color);
|
40
|
+
win.mvprintw(y[0], x[0], "%s", string);
|
41
|
+
win.attroff(color);
|
42
|
+
Ncurses.refresh();
|
43
|
+
end
|
44
|
+
|
45
|
+
fields = Array.new
|
46
|
+
|
47
|
+
states = {"MI" => "Michigan",
|
48
|
+
"VA" => "Virginia",
|
49
|
+
"VE" => "Vermont"}
|
50
|
+
fieldcheck = proc { |afield|
|
51
|
+
val = afield.field_buffer(0)
|
52
|
+
val.strip!
|
53
|
+
if (states[val] != nil)
|
54
|
+
afield.set_field_buffer(0,states[val])
|
55
|
+
return true
|
56
|
+
else
|
57
|
+
return false
|
58
|
+
end
|
59
|
+
}
|
60
|
+
charcheck = proc { |ch|
|
61
|
+
if (('A'..'Z').include?(ch))
|
62
|
+
return true
|
63
|
+
else
|
64
|
+
return false
|
65
|
+
end
|
66
|
+
}
|
67
|
+
|
68
|
+
# Initialize curses
|
69
|
+
begin
|
70
|
+
stdscr = Ncurses.initscr();
|
71
|
+
Ncurses.start_color();
|
72
|
+
Ncurses.cbreak();
|
73
|
+
Ncurses.noecho();
|
74
|
+
Ncurses.keypad(stdscr, true);
|
75
|
+
|
76
|
+
# Initialize few color pairs
|
77
|
+
Ncurses.init_pair(1, COLOR_RED, COLOR_BLACK);
|
78
|
+
Ncurses.init_pair(2, COLOR_BLACK, COLOR_WHITE);
|
79
|
+
Ncurses.init_pair(3, COLOR_BLACK, COLOR_BLUE);
|
80
|
+
stdscr.bkgd(Ncurses.COLOR_PAIR(2));
|
81
|
+
|
82
|
+
# Initialize the fields
|
83
|
+
(1..9).each { |i|
|
84
|
+
field = FIELD.new(1, 10, i*2, 1, 0, 0)
|
85
|
+
field.set_field_back(A_UNDERLINE)
|
86
|
+
fields.push(field)
|
87
|
+
}
|
88
|
+
|
89
|
+
customtype = FIELDTYPE.new(fieldcheck, charcheck);
|
90
|
+
|
91
|
+
fields[1].set_field_type(TYPE_ALNUM, 0);
|
92
|
+
fields[2].set_field_type(TYPE_ALPHA, 0);
|
93
|
+
fields[3].set_field_type(TYPE_INTEGER, 0, 0, 1000);
|
94
|
+
fields[4].set_field_type(TYPE_NUMERIC, 2, 0, 1000);
|
95
|
+
fields[5].set_field_type(TYPE_ENUM, ["one","two","three"], false, false);
|
96
|
+
fields[6].set_field_type(TYPE_REGEXP, "^ *[0-9]* *$");
|
97
|
+
fields[7].set_field_type(TYPE_IPV4);
|
98
|
+
fields[8].set_field_type(customtype);
|
99
|
+
|
100
|
+
|
101
|
+
# Create the form and post it
|
102
|
+
my_form = FORM.new(fields);
|
103
|
+
|
104
|
+
my_form.user_object = "My identifier"
|
105
|
+
|
106
|
+
# Calculate the area required for the form
|
107
|
+
rows = Array.new()
|
108
|
+
cols = Array.new()
|
109
|
+
my_form.scale_form(rows, cols);
|
110
|
+
|
111
|
+
# Create the window to be associated with the form
|
112
|
+
my_form_win = WINDOW.new(rows[0] + 3, cols[0] + 14, 1, 1);
|
113
|
+
my_form_win.bkgd(Ncurses.COLOR_PAIR(3));
|
114
|
+
my_form_win.keypad(TRUE);
|
115
|
+
|
116
|
+
# Set main window and sub window
|
117
|
+
my_form.set_form_win(my_form_win);
|
118
|
+
my_form.set_form_sub(my_form_win.derwin(rows[0], cols[0], 2, 12));
|
119
|
+
|
120
|
+
# Print a border around the main window and print a title */
|
121
|
+
my_form_win.box(0, 0);
|
122
|
+
print_in_middle(my_form_win, 1, 0, cols[0] + 14, "My Form", Ncurses.COLOR_PAIR(1));
|
123
|
+
|
124
|
+
my_form.post_form();
|
125
|
+
|
126
|
+
# Print field types
|
127
|
+
my_form_win.mvaddstr(4, 2, "No Type")
|
128
|
+
my_form_win.mvaddstr(6, 2, "Alphanum")
|
129
|
+
my_form_win.mvaddstr(8, 2, "Alpha")
|
130
|
+
my_form_win.mvaddstr(10, 2, "Integer")
|
131
|
+
my_form_win.mvaddstr(12, 2, "Numeric")
|
132
|
+
my_form_win.mvaddstr(14, 2, "Enum")
|
133
|
+
my_form_win.mvaddstr(16, 2, "Regexp")
|
134
|
+
my_form_win.mvaddstr(18, 2, "IP")
|
135
|
+
my_form_win.mvaddstr(20, 2, "Custom")
|
136
|
+
|
137
|
+
my_form_win.wrefresh();
|
138
|
+
|
139
|
+
stdscr.mvprintw(Ncurses.LINES - 2, 28, "Use UP, DOWN arrow keys to switch between fields");
|
140
|
+
stdscr.mvprintw(Ncurses.LINES - 1, 28, "Press F1 to quit");
|
141
|
+
stdscr.refresh();
|
142
|
+
|
143
|
+
# Loop through to get user requests
|
144
|
+
while((ch = my_form_win.getch()) != KEY_F1)
|
145
|
+
case ch
|
146
|
+
when KEY_DOWN
|
147
|
+
# Go to next field */
|
148
|
+
my_form.form_driver(REQ_VALIDATION);
|
149
|
+
my_form.form_driver(REQ_NEXT_FIELD);
|
150
|
+
# Go to the end of the present buffer
|
151
|
+
# Leaves nicely at the last character
|
152
|
+
my_form.form_driver(REQ_END_LINE);
|
153
|
+
|
154
|
+
when KEY_UP
|
155
|
+
# Go to previous field
|
156
|
+
my_form.form_driver(REQ_VALIDATION);
|
157
|
+
my_form.form_driver(REQ_PREV_FIELD);
|
158
|
+
my_form.form_driver(REQ_END_LINE);
|
159
|
+
|
160
|
+
when KEY_LEFT
|
161
|
+
# Go to previous field
|
162
|
+
my_form.form_driver(REQ_PREV_CHAR);
|
163
|
+
|
164
|
+
when KEY_RIGHT
|
165
|
+
# Go to previous field
|
166
|
+
my_form.form_driver(REQ_NEXT_CHAR);
|
167
|
+
|
168
|
+
when KEY_BACKSPACE
|
169
|
+
my_form.form_driver(REQ_DEL_PREV);
|
170
|
+
else
|
171
|
+
# If this is a normal character, it gets Printed
|
172
|
+
my_form.form_driver(ch);
|
173
|
+
end
|
174
|
+
end
|
175
|
+
# Un post form and free the memory
|
176
|
+
my_form.unpost_form();
|
177
|
+
my_form.free_form();
|
178
|
+
fields.each {|f| f.free_field()}
|
179
|
+
|
180
|
+
|
181
|
+
ensure
|
182
|
+
Ncurses.endwin();
|
183
|
+
end
|
184
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# $Id: hello_ncurses.rb,v 1.3 2002/02/28 13:50:03 t-peters Exp $
|
4
|
+
|
5
|
+
# this ncurses-ruby program follows an ancient tradition of example
|
6
|
+
# computer programs: When invoked, it prints a friendly greeting on the
|
7
|
+
# screen and exits.
|
8
|
+
#
|
9
|
+
# Copyright (C) 2002 Tobias Peters <t-peters@users.berlios.de>
|
10
|
+
#
|
11
|
+
# You may use, modify, and redistribute this file without restriction.
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
# First, we have to tell Ruby to use the Ncurses extension module:
|
16
|
+
|
17
|
+
require "ncurses"
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
# Second, every program using ncurses must initialize the ncurses library
|
22
|
+
# before the first call to any ncurses function:
|
23
|
+
|
24
|
+
Ncurses.initscr
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
# Now the program can use ncurses facilities for screen output. It will print
|
29
|
+
# a greeting to the 5th line on the screen, starting at column 20
|
30
|
+
|
31
|
+
Ncurses.mvaddstr(4, 19, "Hello, world!");
|
32
|
+
|
33
|
+
# Note that ncurses counts lines and columns starting from 0, and that it
|
34
|
+
# expects the line number first and the column number second every time it
|
35
|
+
# expects a coordinate pair.
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
# The previous function call did not alter the screen at all. Ncurses makes
|
40
|
+
# all changes first to an internal buffer. The contents of this buffer is
|
41
|
+
# copied to the screen with the following function call:
|
42
|
+
|
43
|
+
Ncurses.refresh
|
44
|
+
|
45
|
+
|
46
|
+
# Now pause for a short while, enough time for the program user to read the
|
47
|
+
# greeting and greet back.
|
48
|
+
|
49
|
+
sleep(2.5)
|
50
|
+
|
51
|
+
|
52
|
+
# The program has almost finished its task. It only needs to put the screen
|
53
|
+
# back to its normal state:
|
54
|
+
|
55
|
+
Ncurses.endwin
|
56
|
+
|
57
|
+
|
data/examples/rain.rb
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# $Id: rain.rb,v 1.5 2002/11/16 21:16:32 t-peters Exp $
|
4
|
+
|
5
|
+
# This program is a translation of the popular rain.c demo program from the
|
6
|
+
# ncurses library distribution.
|
7
|
+
#
|
8
|
+
# Copyright (C) 2002 Tobias Peters <t-peters@users.berlios.de>
|
9
|
+
#
|
10
|
+
# I do not impose any additional restrictions over the copyright of the
|
11
|
+
# ncurses library distribution. It has the following Copyright notice
|
12
|
+
|
13
|
+
#/****************************************************************************
|
14
|
+
# * Copyright (c) 1998 Free Software Foundation, Inc. *
|
15
|
+
# * *
|
16
|
+
# * Permission is hereby granted, free of charge, to any person obtaining a *
|
17
|
+
# * copy of this software and associated documentation files (the *
|
18
|
+
# * "Software"), to deal in the Software without restriction, including *
|
19
|
+
# * without limitation the rights to use, copy, modify, merge, publish, *
|
20
|
+
# * distribute, distribute with modifications, sublicense, and/or sell *
|
21
|
+
# * copies of the Software, and to permit persons to whom the Software is *
|
22
|
+
# * furnished to do so, subject to the following conditions: *
|
23
|
+
# * *
|
24
|
+
# * The above copyright notice and this permission notice shall be included *
|
25
|
+
# * in all copies or substantial portions of the Software. *
|
26
|
+
# * *
|
27
|
+
# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
|
28
|
+
# * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
|
29
|
+
# * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
|
30
|
+
# * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
|
31
|
+
# * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
|
32
|
+
# * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
|
33
|
+
# * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
|
34
|
+
# * *
|
35
|
+
# * Except as contained in this notice, the name(s) of the above copyright *
|
36
|
+
# * holders shall not be used in advertising or otherwise to promote the *
|
37
|
+
# * sale, use or other dealings in this Software without prior written *
|
38
|
+
# * authorization. *
|
39
|
+
# ****************************************************************************/
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
require "ncurses"
|
44
|
+
|
45
|
+
|
46
|
+
# A class responsible for raindrop drawing
|
47
|
+
class Raindrop
|
48
|
+
def initialize (window, color_pair = nil)
|
49
|
+
@window = window
|
50
|
+
@color_pair = color_pair
|
51
|
+
lines = []
|
52
|
+
columns = []
|
53
|
+
window.getmaxyx(lines,columns)
|
54
|
+
lines = (lines[0] <= 4) ? 1 : (lines[0] - 4)
|
55
|
+
columns = (columns[0] <= 4) ? 1 : (columns[0] - 4)
|
56
|
+
@current_phase = 0
|
57
|
+
@x = rand(columns)+2
|
58
|
+
@y = rand(lines)+2
|
59
|
+
end
|
60
|
+
|
61
|
+
# draw_next_phase draws the next phase of a raindrop. If this was the last
|
62
|
+
# phase, returns 0, otherwise returns the raindrop.
|
63
|
+
def draw_next_phase
|
64
|
+
if (@color_pair)
|
65
|
+
if Ncurses.respond_to?(:color_set)
|
66
|
+
@window.color_set(@color_pair, nil)
|
67
|
+
else
|
68
|
+
@window.attrset(Ncurses.COLOR_PAIR(@color_pair))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
if (DRAWING_PROCS[@current_phase].call(@window,@y,@x))
|
72
|
+
@current_phase += 1
|
73
|
+
self
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
DRAWING_PROCS = [
|
78
|
+
Proc.new{|window,y,x|
|
79
|
+
window.mvaddstr(y,x, ".")
|
80
|
+
},
|
81
|
+
Proc.new{|window,y,x|
|
82
|
+
window.mvaddstr(y, x, "o")
|
83
|
+
},
|
84
|
+
Proc.new{|window,y,x|
|
85
|
+
window.mvaddstr(y, x, "O")
|
86
|
+
},
|
87
|
+
Proc.new{|window,y,x|
|
88
|
+
window.mvaddstr(y-1, x, "-")
|
89
|
+
window.mvaddstr(y, x-1, "|.|")
|
90
|
+
window.mvaddstr(y+1, x, "-")
|
91
|
+
},
|
92
|
+
Proc.new{|window,y,x|
|
93
|
+
window.mvaddstr(y-2, x, "-")
|
94
|
+
window.mvaddstr(y-1, x-1, "/ \\")
|
95
|
+
window.mvaddstr(y, x-2, "| O |")
|
96
|
+
window.mvaddstr(y+1, x-1, "\\ /")
|
97
|
+
window.mvaddstr(y+2, x, "-")
|
98
|
+
},
|
99
|
+
Proc.new{|window,y,x|
|
100
|
+
window.mvaddstr(y-2, x, " ")
|
101
|
+
window.mvaddstr(y-1, x-1, " ")
|
102
|
+
window.mvaddstr(y, x-2, " ")
|
103
|
+
window.mvaddstr(y+1, x-1, " ")
|
104
|
+
window.mvaddstr(y+2, x, " ")
|
105
|
+
nil # signal the last raindrop phase
|
106
|
+
}
|
107
|
+
]
|
108
|
+
NUMBER_OF_PHASES = DRAWING_PROCS.size - 1
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
# This class creates raindrops and tells them to draw on the screen
|
113
|
+
class Rain
|
114
|
+
AVERAGE_RAINDROP_SPACE = 475.1 # 4 simultaneous raindrops in a 80x24 Window
|
115
|
+
|
116
|
+
def Rain.sigwinch_handler(sig = nil)
|
117
|
+
ObjectSpace.each_object(Rain){|rain|
|
118
|
+
rain.window_size_changed = true
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
attr_writer :window_size_changed
|
123
|
+
|
124
|
+
def initialize(window)
|
125
|
+
@window = window
|
126
|
+
@window_size_changed = true
|
127
|
+
@raindrops = []
|
128
|
+
@has_colors = Ncurses.has_colors?
|
129
|
+
if (@has_colors)
|
130
|
+
@current_color = 1
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def fall_for_a_moment
|
135
|
+
adjust_to_new_window_size if (@window_size_changed)
|
136
|
+
|
137
|
+
current_number_of_new_raindrops.times{
|
138
|
+
if (@has_colors)
|
139
|
+
@raindrops.push(Raindrop.new(@window, @current_color))
|
140
|
+
@current_color = 3 - @current_color # alternate between 1 and 2
|
141
|
+
else
|
142
|
+
@raindrops.push(Raindrop.new(@window))
|
143
|
+
end
|
144
|
+
}
|
145
|
+
|
146
|
+
@raindrops = @raindrops.collect{|raindrop|
|
147
|
+
raindrop.draw_next_phase
|
148
|
+
}.compact # erase raindrops that have expired from the list
|
149
|
+
end
|
150
|
+
|
151
|
+
def adjust_to_new_window_size
|
152
|
+
@window_size_changed = false
|
153
|
+
window_size = @window.getmaxx * @window.getmaxy
|
154
|
+
average_number_of_raindrops = window_size / AVERAGE_RAINDROP_SPACE
|
155
|
+
@average_number_of_new_raindrops =
|
156
|
+
average_number_of_raindrops / Raindrop::NUMBER_OF_PHASES
|
157
|
+
end
|
158
|
+
|
159
|
+
def current_number_of_new_raindrops
|
160
|
+
num_floor = @average_number_of_new_raindrops.floor
|
161
|
+
num_ceil = @average_number_of_new_raindrops.ceil
|
162
|
+
chance = @average_number_of_new_raindrops - num_floor
|
163
|
+
if (rand > chance)
|
164
|
+
num_floor
|
165
|
+
else
|
166
|
+
num_ceil
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def fall(pause = 0.1)
|
171
|
+
begin
|
172
|
+
fall_for_a_moment
|
173
|
+
@window.refresh
|
174
|
+
sleep(pause)
|
175
|
+
end while (true)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
Ncurses.initscr
|
180
|
+
begin
|
181
|
+
if (Ncurses.has_colors?)
|
182
|
+
bg = Ncurses::COLOR_BLACK
|
183
|
+
Ncurses.start_color
|
184
|
+
if (Ncurses.respond_to?("use_default_colors"))
|
185
|
+
if (Ncurses.use_default_colors == Ncurses::OK)
|
186
|
+
bg = -1
|
187
|
+
end
|
188
|
+
end
|
189
|
+
Ncurses.init_pair(1, Ncurses::COLOR_BLUE, bg);
|
190
|
+
Ncurses.init_pair(2, Ncurses::COLOR_CYAN, bg);
|
191
|
+
end
|
192
|
+
Ncurses.nl()
|
193
|
+
Ncurses.noecho()
|
194
|
+
Ncurses.curs_set(0)
|
195
|
+
Ncurses.stdscr.nodelay(true)
|
196
|
+
Ncurses.timeout(0)
|
197
|
+
|
198
|
+
rain = Rain.new(Ncurses.stdscr)
|
199
|
+
|
200
|
+
begin
|
201
|
+
case(Ncurses.getch())
|
202
|
+
when 'q'[0], 'Q'[0]
|
203
|
+
Ncurses.curs_set(1)
|
204
|
+
Ncurses.endwin()
|
205
|
+
exit
|
206
|
+
when 's'[0]
|
207
|
+
Ncurses.stdscr.nodelay(false)
|
208
|
+
when ' '[0]
|
209
|
+
Ncurses.stdscr.nodelay(true)
|
210
|
+
when Ncurses::KEY_RESIZE
|
211
|
+
Rain.sigwinch_handler
|
212
|
+
end
|
213
|
+
sleep(0.050)
|
214
|
+
rain.fall_for_a_moment
|
215
|
+
Ncurses.refresh
|
216
|
+
end while true
|
217
|
+
ensure
|
218
|
+
Ncurses.curs_set(1)
|
219
|
+
Ncurses.endwin()
|
220
|
+
end
|