rubysl-curses 1.0.0
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 +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/ext/rubysl/curses/curses.c +2134 -0
- data/ext/rubysl/curses/extconf.rb +31 -0
- data/lib/curses.rb +1 -0
- data/lib/curses/extconf.rb +31 -0
- data/lib/curses/hello.rb +30 -0
- data/lib/curses/mouse.rb +53 -0
- data/lib/curses/rain.rb +76 -0
- data/lib/curses/view.rb +91 -0
- data/lib/curses/view2.rb +115 -0
- data/lib/rubysl-curses.rb +7 -0
- data/lib/rubysl/curses.rb +2 -0
- data/lib/rubysl/curses/version.rb +5 -0
- data/rubysl-curses.gemspec +24 -0
- metadata +120 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'mkmf'
|
|
2
|
+
|
|
3
|
+
dir_config('curses')
|
|
4
|
+
dir_config('ncurses')
|
|
5
|
+
dir_config('termcap')
|
|
6
|
+
|
|
7
|
+
make=false
|
|
8
|
+
have_library("mytinfo", "tgetent") if /bow/ =~ RUBY_PLATFORM
|
|
9
|
+
have_library("tinfo", "tgetent") or have_library("termcap", "tgetent")
|
|
10
|
+
if have_header(*curses=%w"ncurses.h") and have_library("ncurses", "initscr")
|
|
11
|
+
make=true
|
|
12
|
+
elsif have_header(*curses=%w"ncurses/curses.h") and have_library("ncurses", "initscr")
|
|
13
|
+
make=true
|
|
14
|
+
elsif have_header(*curses=%w"curses_colr/curses.h") and have_library("cur_colr", "initscr")
|
|
15
|
+
curses.unshift("varargs.h")
|
|
16
|
+
make=true
|
|
17
|
+
elsif have_header(*curses=%w"curses.h") and have_library("curses", "initscr")
|
|
18
|
+
make=true
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
if make
|
|
22
|
+
for f in %w(beep bkgd bkgdset curs_set deleteln doupdate flash getbkgd getnstr init isendwin keyname keypad resizeterm scrl set setscrreg ungetch wattroff wattron wattrset wbkgd wbkgdset wdeleteln wgetnstr wresize wscrl wsetscrreg def_prog_mode reset_prog_mode timeout wtimeout nodelay init_color wcolor_set)
|
|
23
|
+
have_func(f) || (have_macro(f, curses) && $defs.push(format("-DHAVE_%s", f.upcase)))
|
|
24
|
+
end
|
|
25
|
+
flag = "-D_XOPEN_SOURCE_EXTENDED"
|
|
26
|
+
src = "int test_var[(sizeof(char*)>sizeof(int))*2-1];"
|
|
27
|
+
if try_compile(cpp_include(%w[stdio.h stdlib.h]+curses)+src , flag)
|
|
28
|
+
$defs << flag
|
|
29
|
+
end
|
|
30
|
+
create_makefile("curses/curses")
|
|
31
|
+
end
|
data/lib/curses.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "rubysl/curses"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'mkmf'
|
|
2
|
+
|
|
3
|
+
dir_config('curses')
|
|
4
|
+
dir_config('ncurses')
|
|
5
|
+
dir_config('termcap')
|
|
6
|
+
|
|
7
|
+
make=false
|
|
8
|
+
have_library("mytinfo", "tgetent") if /bow/ =~ RUBY_PLATFORM
|
|
9
|
+
have_library("tinfo", "tgetent") or have_library("termcap", "tgetent")
|
|
10
|
+
if have_header(*curses=%w"ncurses.h") and have_library("ncurses", "initscr")
|
|
11
|
+
make=true
|
|
12
|
+
elsif have_header(*curses=%w"ncurses/curses.h") and have_library("ncurses", "initscr")
|
|
13
|
+
make=true
|
|
14
|
+
elsif have_header(*curses=%w"curses_colr/curses.h") and have_library("cur_colr", "initscr")
|
|
15
|
+
curses.unshift("varargs.h")
|
|
16
|
+
make=true
|
|
17
|
+
elsif have_header(*curses=%w"curses.h") and have_library("curses", "initscr")
|
|
18
|
+
make=true
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
if make
|
|
22
|
+
for f in %w(beep bkgd bkgdset curs_set deleteln doupdate flash getbkgd getnstr init isendwin keyname keypad resizeterm scrl set setscrreg ungetch wattroff wattron wattrset wbkgd wbkgdset wdeleteln wgetnstr wresize wscrl wsetscrreg def_prog_mode reset_prog_mode timeout wtimeout nodelay init_color wcolor_set)
|
|
23
|
+
have_func(f) || (have_macro(f, curses) && $defs.push(format("-DHAVE_%s", f.upcase)))
|
|
24
|
+
end
|
|
25
|
+
flag = "-D_XOPEN_SOURCE_EXTENDED"
|
|
26
|
+
src = "int test_var[(sizeof(char*)>sizeof(int))*2-1];"
|
|
27
|
+
if try_compile(cpp_include(%w[stdio.h stdlib.h]+curses)+src , flag)
|
|
28
|
+
$defs << flag
|
|
29
|
+
end
|
|
30
|
+
create_makefile("curses")
|
|
31
|
+
end
|
data/lib/curses/hello.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/local/bin/ruby
|
|
2
|
+
|
|
3
|
+
require "curses"
|
|
4
|
+
include Curses
|
|
5
|
+
|
|
6
|
+
def show_message(message)
|
|
7
|
+
width = message.length + 6
|
|
8
|
+
win = Window.new(5, width,
|
|
9
|
+
(lines - 5) / 2, (cols - width) / 2)
|
|
10
|
+
win.box(?|, ?-)
|
|
11
|
+
win.setpos(2, 3)
|
|
12
|
+
win.addstr(message)
|
|
13
|
+
win.refresh
|
|
14
|
+
win.getch
|
|
15
|
+
win.close
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
init_screen
|
|
19
|
+
begin
|
|
20
|
+
crmode
|
|
21
|
+
# show_message("Hit any key")
|
|
22
|
+
setpos((lines - 5) / 2, (cols - 10) / 2)
|
|
23
|
+
addstr("Hit any key")
|
|
24
|
+
refresh
|
|
25
|
+
getch
|
|
26
|
+
show_message("Hello, World!")
|
|
27
|
+
refresh
|
|
28
|
+
ensure
|
|
29
|
+
close_screen
|
|
30
|
+
end
|
data/lib/curses/mouse.rb
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/local/bin/ruby
|
|
2
|
+
|
|
3
|
+
require "curses"
|
|
4
|
+
include Curses
|
|
5
|
+
|
|
6
|
+
def show_message(*msgs)
|
|
7
|
+
message = msgs.join
|
|
8
|
+
width = message.length + 6
|
|
9
|
+
win = Window.new(5, width,
|
|
10
|
+
(lines - 5) / 2, (cols - width) / 2)
|
|
11
|
+
win.keypad = true
|
|
12
|
+
win.attron(color_pair(COLOR_RED)){
|
|
13
|
+
win.box(?|, ?-, ?+)
|
|
14
|
+
}
|
|
15
|
+
win.setpos(2, 3)
|
|
16
|
+
win.addstr(message)
|
|
17
|
+
win.refresh
|
|
18
|
+
win.getch
|
|
19
|
+
win.close
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
init_screen
|
|
23
|
+
start_color
|
|
24
|
+
init_pair(COLOR_BLUE,COLOR_BLUE,COLOR_WHITE)
|
|
25
|
+
init_pair(COLOR_RED,COLOR_RED,COLOR_WHITE)
|
|
26
|
+
crmode
|
|
27
|
+
noecho
|
|
28
|
+
stdscr.keypad(true)
|
|
29
|
+
|
|
30
|
+
begin
|
|
31
|
+
mousemask(BUTTON1_CLICKED|BUTTON2_CLICKED|BUTTON3_CLICKED|BUTTON4_CLICKED)
|
|
32
|
+
setpos((lines - 5) / 2, (cols - 10) / 2)
|
|
33
|
+
attron(color_pair(COLOR_BLUE)|A_BOLD){
|
|
34
|
+
addstr("click")
|
|
35
|
+
}
|
|
36
|
+
refresh
|
|
37
|
+
while( true )
|
|
38
|
+
c = getch
|
|
39
|
+
case c
|
|
40
|
+
when KEY_MOUSE
|
|
41
|
+
m = getmouse
|
|
42
|
+
if( m )
|
|
43
|
+
show_message("getch = #{c.inspect}, ",
|
|
44
|
+
"mouse event = #{'0x%x' % m.bstate}, ",
|
|
45
|
+
"axis = (#{m.x},#{m.y},#{m.z})")
|
|
46
|
+
end
|
|
47
|
+
break
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
refresh
|
|
51
|
+
ensure
|
|
52
|
+
close_screen
|
|
53
|
+
end
|
data/lib/curses/rain.rb
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/local/bin/ruby
|
|
2
|
+
# rain for a curses test
|
|
3
|
+
|
|
4
|
+
require "curses"
|
|
5
|
+
include Curses
|
|
6
|
+
|
|
7
|
+
def onsig(sig)
|
|
8
|
+
close_screen
|
|
9
|
+
exit sig
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def ranf
|
|
13
|
+
rand(32767).to_f / 32767
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# main #
|
|
17
|
+
for i in 1 .. 15 # SIGHUP .. SIGTERM
|
|
18
|
+
if trap(i, "SIG_IGN") != 0 then # 0 for SIG_IGN
|
|
19
|
+
trap(i) {|sig| onsig(sig) }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
init_screen
|
|
24
|
+
nl
|
|
25
|
+
noecho
|
|
26
|
+
srand
|
|
27
|
+
|
|
28
|
+
xpos = {}
|
|
29
|
+
ypos = {}
|
|
30
|
+
r = lines - 4
|
|
31
|
+
c = cols - 4
|
|
32
|
+
for i in 0 .. 4
|
|
33
|
+
xpos[i] = (c * ranf).to_i + 2
|
|
34
|
+
ypos[i] = (r * ranf).to_i + 2
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
i = 0
|
|
38
|
+
while TRUE
|
|
39
|
+
x = (c * ranf).to_i + 2
|
|
40
|
+
y = (r * ranf).to_i + 2
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
setpos(y, x); addstr(".")
|
|
44
|
+
|
|
45
|
+
setpos(ypos[i], xpos[i]); addstr("o")
|
|
46
|
+
|
|
47
|
+
i = if i == 0 then 4 else i - 1 end
|
|
48
|
+
setpos(ypos[i], xpos[i]); addstr("O")
|
|
49
|
+
|
|
50
|
+
i = if i == 0 then 4 else i - 1 end
|
|
51
|
+
setpos(ypos[i] - 1, xpos[i]); addstr("-")
|
|
52
|
+
setpos(ypos[i], xpos[i] - 1); addstr("|.|")
|
|
53
|
+
setpos(ypos[i] + 1, xpos[i]); addstr("-")
|
|
54
|
+
|
|
55
|
+
i = if i == 0 then 4 else i - 1 end
|
|
56
|
+
setpos(ypos[i] - 2, xpos[i]); addstr("-")
|
|
57
|
+
setpos(ypos[i] - 1, xpos[i] - 1); addstr("/ \\")
|
|
58
|
+
setpos(ypos[i], xpos[i] - 2); addstr("| O |")
|
|
59
|
+
setpos(ypos[i] + 1, xpos[i] - 1); addstr("\\ /")
|
|
60
|
+
setpos(ypos[i] + 2, xpos[i]); addstr("-")
|
|
61
|
+
|
|
62
|
+
i = if i == 0 then 4 else i - 1 end
|
|
63
|
+
setpos(ypos[i] - 2, xpos[i]); addstr(" ")
|
|
64
|
+
setpos(ypos[i] - 1, xpos[i] - 1); addstr(" ")
|
|
65
|
+
setpos(ypos[i], xpos[i] - 2); addstr(" ")
|
|
66
|
+
setpos(ypos[i] + 1, xpos[i] - 1); addstr(" ")
|
|
67
|
+
setpos(ypos[i] + 2, xpos[i]); addstr(" ")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
xpos[i] = x
|
|
71
|
+
ypos[i] = y
|
|
72
|
+
refresh
|
|
73
|
+
sleep(0.5)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# end of main
|
data/lib/curses/view.rb
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/local/bin/ruby
|
|
2
|
+
|
|
3
|
+
require "curses"
|
|
4
|
+
include Curses
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# main
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
if ARGV.size != 1 then
|
|
11
|
+
printf("usage: view file\n");
|
|
12
|
+
exit
|
|
13
|
+
end
|
|
14
|
+
begin
|
|
15
|
+
fp = open(ARGV[0], "r")
|
|
16
|
+
rescue
|
|
17
|
+
raise "cannot open file: #{ARGV[1]}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# signal(SIGINT, finish)
|
|
21
|
+
|
|
22
|
+
init_screen
|
|
23
|
+
#keypad(stdscr, TRUE)
|
|
24
|
+
nonl
|
|
25
|
+
cbreak
|
|
26
|
+
noecho
|
|
27
|
+
#scrollok(stdscr, TRUE)
|
|
28
|
+
|
|
29
|
+
# slurp the file
|
|
30
|
+
data_lines = []
|
|
31
|
+
fp.each_line { |l|
|
|
32
|
+
data_lines.push(l)
|
|
33
|
+
}
|
|
34
|
+
fp.close
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
lptr = 0
|
|
38
|
+
while TRUE
|
|
39
|
+
i = 0
|
|
40
|
+
while i < lines
|
|
41
|
+
setpos(i, 0)
|
|
42
|
+
#clrtoeol
|
|
43
|
+
addstr(data_lines[lptr + i]) #if data_lines[lptr + i]
|
|
44
|
+
i += 1
|
|
45
|
+
end
|
|
46
|
+
refresh
|
|
47
|
+
|
|
48
|
+
explicit = FALSE
|
|
49
|
+
n = 0
|
|
50
|
+
while TRUE
|
|
51
|
+
c = getch.chr
|
|
52
|
+
if c =~ /[0-9]/
|
|
53
|
+
n = 10 * n + c.to_i
|
|
54
|
+
else
|
|
55
|
+
break
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
n = 1 if !explicit && n == 0
|
|
60
|
+
|
|
61
|
+
case c
|
|
62
|
+
when "n" #when KEY_DOWN
|
|
63
|
+
i = 0
|
|
64
|
+
while i < n
|
|
65
|
+
if lptr + lines < data_lines.size then
|
|
66
|
+
lptr += 1
|
|
67
|
+
else
|
|
68
|
+
break
|
|
69
|
+
end
|
|
70
|
+
i += 1
|
|
71
|
+
end
|
|
72
|
+
#wscrl(i)
|
|
73
|
+
|
|
74
|
+
when "p" #when KEY_UP
|
|
75
|
+
i = 0
|
|
76
|
+
while i < n
|
|
77
|
+
if lptr > 0 then
|
|
78
|
+
lptr -= 1
|
|
79
|
+
else
|
|
80
|
+
break
|
|
81
|
+
end
|
|
82
|
+
i += 1
|
|
83
|
+
end
|
|
84
|
+
#wscrl(-i)
|
|
85
|
+
|
|
86
|
+
when "q"
|
|
87
|
+
break
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
close_screen
|
data/lib/curses/view2.rb
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/local/bin/ruby
|
|
2
|
+
|
|
3
|
+
require "curses"
|
|
4
|
+
|
|
5
|
+
if ARGV.size != 1 then
|
|
6
|
+
printf("usage: view file\n");
|
|
7
|
+
exit
|
|
8
|
+
end
|
|
9
|
+
begin
|
|
10
|
+
fp = open(ARGV[0], "r")
|
|
11
|
+
rescue
|
|
12
|
+
raise "cannot open file: #{ARGV[1]}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# signal(SIGINT, finish)
|
|
16
|
+
|
|
17
|
+
Curses.init_screen
|
|
18
|
+
Curses.nonl
|
|
19
|
+
Curses.cbreak
|
|
20
|
+
Curses.noecho
|
|
21
|
+
|
|
22
|
+
$screen = Curses.stdscr
|
|
23
|
+
|
|
24
|
+
$screen.scrollok(true)
|
|
25
|
+
#$screen.keypad(true)
|
|
26
|
+
|
|
27
|
+
# slurp the file
|
|
28
|
+
$data_lines = []
|
|
29
|
+
fp.each_line { |l|
|
|
30
|
+
$data_lines.push(l.chop)
|
|
31
|
+
}
|
|
32
|
+
fp.close
|
|
33
|
+
|
|
34
|
+
$top = 0
|
|
35
|
+
$data_lines[0..$screen.maxy-1].each_with_index{|line, idx|
|
|
36
|
+
$screen.setpos(idx, 0)
|
|
37
|
+
$screen.addstr(line)
|
|
38
|
+
}
|
|
39
|
+
$screen.setpos(0,0)
|
|
40
|
+
$screen.refresh
|
|
41
|
+
|
|
42
|
+
def scroll_up
|
|
43
|
+
if( $top > 0 )
|
|
44
|
+
$screen.scrl(-1)
|
|
45
|
+
$top -= 1
|
|
46
|
+
str = $data_lines[$top]
|
|
47
|
+
if( str )
|
|
48
|
+
$screen.setpos(0, 0)
|
|
49
|
+
$screen.addstr(str)
|
|
50
|
+
end
|
|
51
|
+
return true
|
|
52
|
+
else
|
|
53
|
+
return false
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def scroll_down
|
|
58
|
+
if( $top + $screen.maxy < $data_lines.length )
|
|
59
|
+
$screen.scrl(1)
|
|
60
|
+
$top += 1
|
|
61
|
+
str = $data_lines[$top + $screen.maxy - 1]
|
|
62
|
+
if( str )
|
|
63
|
+
$screen.setpos($screen.maxy - 1, 0)
|
|
64
|
+
$screen.addstr(str)
|
|
65
|
+
end
|
|
66
|
+
return true
|
|
67
|
+
else
|
|
68
|
+
return false
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
while true
|
|
73
|
+
result = true
|
|
74
|
+
c = Curses.getch
|
|
75
|
+
case c
|
|
76
|
+
when Curses::KEY_DOWN, Curses::KEY_CTRL_N
|
|
77
|
+
result = scroll_down
|
|
78
|
+
when Curses::KEY_UP, Curses::KEY_CTRL_P
|
|
79
|
+
result = scroll_up
|
|
80
|
+
when Curses::KEY_NPAGE, ?\s # white space
|
|
81
|
+
for i in 0..($screen.maxy - 2)
|
|
82
|
+
if( ! scroll_down )
|
|
83
|
+
if( i == 0 )
|
|
84
|
+
result = false
|
|
85
|
+
end
|
|
86
|
+
break
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
when Curses::KEY_PPAGE
|
|
90
|
+
for i in 0..($screen.maxy - 2)
|
|
91
|
+
if( ! scroll_up )
|
|
92
|
+
if( i == 0 )
|
|
93
|
+
result = false
|
|
94
|
+
end
|
|
95
|
+
break
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
when Curses::KEY_LEFT, Curses::KEY_CTRL_T
|
|
99
|
+
while( scroll_up )
|
|
100
|
+
end
|
|
101
|
+
when Curses::KEY_RIGHT, Curses::KEY_CTRL_B
|
|
102
|
+
while( scroll_down )
|
|
103
|
+
end
|
|
104
|
+
when ?q
|
|
105
|
+
break
|
|
106
|
+
else
|
|
107
|
+
$screen.setpos(0,0)
|
|
108
|
+
$screen.addstr("[unknown key `#{Curses.keyname(c)}'=#{c}] ")
|
|
109
|
+
end
|
|
110
|
+
if( !result )
|
|
111
|
+
Curses.beep
|
|
112
|
+
end
|
|
113
|
+
$screen.setpos(0,0)
|
|
114
|
+
end
|
|
115
|
+
Curses.close_screen
|