curses 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,9 +30,9 @@ have_library("tinfo", "tgetent") or have_library("termcap", "tgetent")
30
30
 
31
31
  header_library = nil
32
32
  [
33
+ ["ncursesw/curses.h", ["ncursesw"]],
33
34
  ["ncurses.h", ["ncursesw", "ncurses"]],
34
35
  ["ncurses/curses.h", ["ncurses"]],
35
- ["ncursesw/curses.h", ["ncursesw"]],
36
36
  ["curses_colr/curses.h", ["cur_colr"]],
37
37
  ["curses.h", ["curses", "pdcurses"]],
38
38
  # ["xcurses.h", ["XCurses"]], # XCurses (PDCurses for X11)
@@ -59,9 +59,10 @@ if header_library
59
59
  getbkgd getnstr init isendwin keyname keypad resizeterm
60
60
  scrl set setscrreg ungetch
61
61
  wattroff wattron wattrset wbkgd wbkgdset wdeleteln wgetnstr
62
- wresize wscrl wsetscrreg
62
+ wresize wscrl wsetscrreg werase redrawwin
63
63
  def_prog_mode reset_prog_mode timeout wtimeout nodelay
64
- init_color wcolor_set use_default_colors newpad)
64
+ init_color wcolor_set use_default_colors newpad
65
+ unget_wch get_wch wget_wch)
65
66
  have_func(f) || (have_macro(f, curses) && $defs.push(format("-DHAVE_%s", f.upcase)))
66
67
  end
67
68
  flag = "-D_XOPEN_SOURCE_EXTENDED"
data/lib/2.2/curses.so ADDED
Binary file
data/lib/2.3/curses.so ADDED
Binary file
data/lib/2.4/curses.so ADDED
Binary file
data/lib/curses.rb CHANGED
@@ -1 +1,22 @@
1
- require "curses.so"
1
+ pdcurses_path = File.expand_path("../vendor/#{RUBY_PLATFORM}/PDCurses", __dir__)
2
+ pdcurses_bundled = File.directory?(pdcurses_path)
3
+ if pdcurses_bundled
4
+ path = ENV["PATH"]
5
+ dir = File::ALT_SEPARATOR ?
6
+ pdcurses_path.tr("/", File::ALT_SEPARATOR) : dir
7
+ dirs = path.split(File::PATH_SEPARATOR)
8
+ if !dirs.include?(dir)
9
+ ENV["PATH"] = [dir, *dirs].join(File::PATH_SEPARATOR)
10
+ end
11
+ end
12
+
13
+ begin
14
+ major, minor, _ = RUBY_VERSION.split(/\./)
15
+ require "#{major}.#{minor}/curses.so"
16
+ rescue LoadError
17
+ require "curses.so"
18
+ end
19
+
20
+ if pdcurses_bundled
21
+ Curses.keyboard_encoding = Encoding::UTF_8
22
+ end
data/sample/hello.rb CHANGED
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "curses"
4
- include Curses
5
4
 
6
5
  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('|', '-')
6
+ height = 5
7
+ width = message.length + 6
8
+ top = (Curses.lines - height) / 2
9
+ left = (Curses.cols - width) / 2
10
+ win = Curses::Window.new(height, width, top, left)
11
+ win.box("|", "-")
11
12
  win.setpos(2, 3)
12
13
  win.addstr(message)
13
14
  win.refresh
@@ -15,16 +16,14 @@ def show_message(message)
15
16
  win.close
16
17
  end
17
18
 
18
- init_screen
19
+ Curses.init_screen
19
20
  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
21
+ Curses.crmode
22
+ Curses.setpos((Curses.lines - 1) / 2, (Curses.cols - 11) / 2)
23
+ Curses.addstr("Hit any key")
24
+ Curses.refresh
25
+ Curses.getch
26
26
  show_message("Hello, World!")
27
- refresh
28
27
  ensure
29
- close_screen
28
+ Curses.close_screen
30
29
  end
data/sample/mouse.rb CHANGED
@@ -5,13 +5,13 @@ include Curses
5
5
 
6
6
  def show_message(*msgs)
7
7
  message = msgs.join
8
- width = message.length + 6
9
- win = Window.new(5, width,
10
- (lines - 5) / 2, (cols - width) / 2)
8
+ height, width = 5, message.length + 6
9
+ top, left = (lines - height) / 2, (cols - width) / 2
10
+ win = Window.new(height, width, top, left)
11
11
  win.keypad = true
12
- win.attron(color_pair(COLOR_RED)){
13
- win.box(?|, ?-, ?+)
14
- }
12
+ win.attron(color_pair(COLOR_RED)) do
13
+ win.box("|", "-", "+")
14
+ end
15
15
  win.setpos(2, 3)
16
16
  win.addstr(message)
17
17
  win.refresh
@@ -21,28 +21,28 @@ end
21
21
 
22
22
  init_screen
23
23
  start_color
24
- init_pair(COLOR_BLUE,COLOR_BLUE,COLOR_WHITE)
25
- init_pair(COLOR_RED,COLOR_RED,COLOR_WHITE)
24
+ init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_WHITE)
25
+ init_pair(COLOR_RED, COLOR_RED, COLOR_WHITE)
26
26
  crmode
27
27
  noecho
28
28
  stdscr.keypad(true)
29
29
 
30
30
  begin
31
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){
32
+ setpos((lines - 1) / 2, (cols - 5) / 2)
33
+ attron(color_pair(COLOR_BLUE)|A_BOLD) do
34
34
  addstr("click")
35
- }
35
+ end
36
36
  refresh
37
- while( true )
37
+ loop do
38
38
  c = getch
39
39
  case c
40
40
  when KEY_MOUSE
41
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})")
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
46
  end
47
47
  break
48
48
  end
data/sample/rain.rb CHANGED
@@ -1,76 +1,72 @@
1
1
  #!/usr/bin/env ruby
2
- # rain for a curses test
3
2
 
4
3
  require "curses"
5
- include Curses
6
4
 
7
- def onsig(sig)
8
- close_screen
9
- exit sig
5
+ def onsig(signal)
6
+ Curses.close_screen
7
+ exit signal
10
8
  end
11
9
 
12
- def ranf
13
- rand(32767).to_f / 32767
10
+ def place_string(y, x, string)
11
+ Curses.setpos(y, x)
12
+ Curses.addstr(string)
14
13
  end
15
14
 
16
- # main #
17
- for i in %w[HUP INT QUIT TERM]
18
- if trap(i, "SIG_IGN") != 0 then # 0 for SIG_IGN
19
- trap(i) {|sig| onsig(sig) }
15
+ def cycle_index(index)
16
+ (index + 1) % 5
17
+ end
18
+
19
+ %w[HUP INT QUIT TERM].each do |sig|
20
+ unless trap(sig, "IGNORE") == "IGNORE" # previous handler
21
+ trap(sig) {|s| onsig(s) }
20
22
  end
21
23
  end
22
24
 
23
- init_screen
24
- nl
25
- noecho
25
+ Curses.init_screen
26
+ Curses.nl
27
+ Curses.noecho
28
+ Curses.curs_set 0
26
29
  srand
27
30
 
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
31
+ xpos, ypos = {}, {}
32
+ x_range = 2..(Curses.cols - 3)
33
+ y_range = 2..(Curses.lines - 3)
34
+ (0..4).each do |i|
35
+ xpos[i], ypos[i] = rand(x_range), rand(y_range)
35
36
  end
36
37
 
37
38
  i = 0
38
- while TRUE
39
- x = (c * ranf).to_i + 2
40
- y = (r * ranf).to_i + 2
39
+ loop do
40
+ x, y = rand(x_range), rand(y_range)
41
41
 
42
+ place_string(y, x, ".")
42
43
 
43
- setpos(y, x); addstr(".")
44
+ place_string(ypos[i], xpos[i], "o")
44
45
 
45
- setpos(ypos[i], xpos[i]); addstr("o")
46
+ i = cycle_index(i)
47
+ place_string(ypos[i], xpos[i], "O")
46
48
 
47
- i = if i == 0 then 4 else i - 1 end
48
- setpos(ypos[i], xpos[i]); addstr("O")
49
+ i = cycle_index(i)
50
+ place_string(ypos[i] - 1, xpos[i], "-")
51
+ place_string(ypos[i], xpos[i] - 1, "|.|")
52
+ place_string(ypos[i] + 1, xpos[i], "-")
49
53
 
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
+ i = cycle_index(i)
55
+ place_string(ypos[i] - 2, xpos[i], "-")
56
+ place_string(ypos[i] - 1, xpos[i] - 1, "/ \\")
57
+ place_string(ypos[i], xpos[i] - 2, "| O |")
58
+ place_string(ypos[i] + 1, xpos[i] - 1, "\\ /")
59
+ place_string(ypos[i] + 2, xpos[i], "-")
54
60
 
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
+ i = cycle_index(i)
62
+ place_string(ypos[i] - 2, xpos[i], " ")
63
+ place_string(ypos[i] - 1, xpos[i] - 1, " ")
64
+ place_string(ypos[i], xpos[i] - 2, " ")
65
+ place_string(ypos[i] + 1, xpos[i] - 1, " ")
66
+ place_string(ypos[i] + 2, xpos[i], " ")
61
67
 
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
+ xpos[i], ypos[i] = x, y
68
69
 
69
-
70
- xpos[i] = x
71
- ypos[i] = y
72
- refresh
70
+ Curses.refresh
73
71
  sleep(0.5)
74
72
  end
75
-
76
- # end of main
data/sample/view.rb CHANGED
@@ -3,54 +3,41 @@
3
3
  require "curses"
4
4
  include Curses
5
5
 
6
- #
7
- # main
8
- #
9
-
10
- if ARGV.size != 1 then
11
- printf("usage: view file\n");
6
+ unless ARGV.size == 1
7
+ puts "usage: #{$0} file"
12
8
  exit
13
9
  end
10
+
14
11
  begin
15
- fp = open(ARGV[0], "r")
12
+ data_lines = File.readlines(ARGV[0])
16
13
  rescue
17
- raise "cannot open file: #{ARGV[1]}"
14
+ raise "cannot open file: #{ARGV[0]}"
18
15
  end
19
16
 
20
- # signal(SIGINT, finish)
21
-
22
17
  init_screen
23
- #keypad(stdscr, TRUE)
18
+ #keypad(stdscr, true)
24
19
  nonl
25
20
  cbreak
26
21
  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
-
22
+ #scrollok(stdscr, true)
36
23
 
37
24
  lptr = 0
38
- while TRUE
39
- i = 0
40
- while i < lines
25
+ loop do
26
+ lines.times do |i|
41
27
  setpos(i, 0)
42
28
  #clrtoeol
43
- addstr(data_lines[lptr + i] || '')
44
- i += 1
29
+ addstr(data_lines[lptr + i] || "")
45
30
  end
46
31
  refresh
47
32
 
48
- explicit = FALSE
33
+ explicit = false
49
34
  n = 0
50
- while TRUE
35
+ c = nil
36
+ loop do
51
37
  c = getch
52
38
  if c =~ /[0-9]/
53
39
  n = 10 * n + c.to_i
40
+ explicit = true
54
41
  else
55
42
  break
56
43
  end
@@ -61,31 +48,29 @@ while TRUE
61
48
  case c
62
49
  when "n" #when KEY_DOWN
63
50
  i = 0
64
- while i < n
65
- if lptr + lines < data_lines.size then
66
- lptr += 1
51
+ n.times do
52
+ if lptr + lines < data_lines.size
53
+ lptr += 1
67
54
  else
68
- break
55
+ break
69
56
  end
70
57
  i += 1
71
58
  end
72
59
  #wscrl(i)
73
-
74
60
  when "p" #when KEY_UP
75
61
  i = 0
76
- while i < n
77
- if lptr > 0 then
78
- lptr -= 1
62
+ n.times do
63
+ if lptr > 0
64
+ lptr -= 1
79
65
  else
80
- break
66
+ break
81
67
  end
82
68
  i += 1
83
69
  end
84
70
  #wscrl(-i)
85
-
86
71
  when "q"
87
72
  break
88
73
  end
89
-
90
74
  end
75
+
91
76
  close_screen
data/sample/view2.rb CHANGED
@@ -3,10 +3,10 @@
3
3
  require "curses"
4
4
 
5
5
 
6
- # A curses based file viewer
6
+ # A curses based file viewer.
7
7
  class FileViewer
8
8
 
9
- # Create a new fileviewer, and view the file.
9
+ # Create a new FileViewer and view the file.
10
10
  def initialize(filename)
11
11
  @data_lines = []
12
12
  @screen = nil
@@ -16,10 +16,8 @@ class FileViewer
16
16
  interact
17
17
  end
18
18
 
19
- # Perform the curses setup
19
+ # Perform the curses setup.
20
20
  def init_curses
21
- # signal(SIGINT, finish)
22
-
23
21
  Curses.init_screen
24
22
  Curses.nonl
25
23
  Curses.cbreak
@@ -28,37 +26,32 @@ class FileViewer
28
26
  @screen = Curses.stdscr
29
27
 
30
28
  @screen.scrollok(true)
31
- #$screen.keypad(true)
29
+ #@screen.keypad(true)
32
30
  end
33
31
 
34
- # Load the file into memory, and put
35
- # the first part on the curses display.
32
+ # Load the file into memory and
33
+ # put the first part on the curses display.
36
34
  def load_file(filename)
37
- fp = open(filename, "r") do |fp|
38
- # slurp the file
39
- fp.each_line { |l|
40
- @data_lines.push(l.chop)
41
- }
42
- end
35
+ @data_lines = File.readlines(filename).map(&:chomp)
43
36
  @top = 0
44
- @data_lines[0..@screen.maxy-1].each_with_index{|line, idx|
37
+ @data_lines[0..@screen.maxy-1].each_with_index do |line, idx|
45
38
  @screen.setpos(idx, 0)
46
39
  @screen.addstr(line)
47
- }
48
- @screen.setpos(0,0)
40
+ end
41
+ @screen.setpos(0, 0)
49
42
  @screen.refresh
50
43
  rescue
51
44
  raise "cannot open file '#{filename}' for reading"
52
45
  end
53
46
 
54
47
 
55
- # Scroll the display up by one line
48
+ # Scroll the display up by one line.
56
49
  def scroll_up
57
- if( @top > 0 )
50
+ if @top > 0
58
51
  @screen.scrl(-1)
59
52
  @top -= 1
60
53
  str = @data_lines[@top]
61
- if( str )
54
+ if str
62
55
  @screen.setpos(0, 0)
63
56
  @screen.addstr(str)
64
57
  end
@@ -68,13 +61,13 @@ class FileViewer
68
61
  end
69
62
  end
70
63
 
71
- # Scroll the display down by one line
64
+ # Scroll the display down by one line.
72
65
  def scroll_down
73
- if( @top + @screen.maxy < @data_lines.length )
66
+ if @top + @screen.maxy < @data_lines.length
74
67
  @screen.scrl(1)
75
68
  @top += 1
76
69
  str = @data_lines[@top + @screen.maxy - 1]
77
- if( str )
70
+ if str
78
71
  @screen.setpos(@screen.maxy - 1, 0)
79
72
  @screen.addstr(str)
80
73
  end
@@ -85,53 +78,49 @@ class FileViewer
85
78
  end
86
79
 
87
80
  # Allow the user to interact with the display.
88
- # This uses EMACS-like keybindings, and also
81
+ # This uses Emacs-like keybindings, and also
89
82
  # vi-like keybindings as well, except that left
90
83
  # and right move to the beginning and end of the
91
84
  # file, respectively.
92
85
  def interact
93
- while true
86
+ loop do
94
87
  result = true
95
88
  c = Curses.getch
96
89
  case c
97
- when Curses::KEY_DOWN, Curses::KEY_CTRL_N, ?j
90
+ when Curses::KEY_DOWN, Curses::KEY_CTRL_N, "j"
98
91
  result = scroll_down
99
- when Curses::KEY_UP, Curses::KEY_CTRL_P, ?k
92
+ when Curses::KEY_UP, Curses::KEY_CTRL_P, "k"
100
93
  result = scroll_up
101
- when Curses::KEY_NPAGE, ?\s # white space
102
- for i in 0..(@screen.maxy - 2)
103
- if( ! scroll_down )
104
- if( i == 0 )
105
- result = false
106
- end
94
+ when Curses::KEY_NPAGE, " "
95
+ (@screen.maxy - 1).times do |i|
96
+ if !scroll_down && i == 0
97
+ result = false
107
98
  break
108
99
  end
109
100
  end
110
101
  when Curses::KEY_PPAGE
111
- for i in 0..(@screen.maxy - 2)
112
- if( ! scroll_up )
113
- if( i == 0 )
114
- result = false
115
- end
102
+ (@screen.maxy - 1).times do |i|
103
+ if !scroll_up && i == 0
104
+ result = false
116
105
  break
117
106
  end
118
107
  end
119
- when Curses::KEY_LEFT, Curses::KEY_CTRL_T, ?h
120
- while( scroll_up )
108
+ when Curses::KEY_LEFT, Curses::KEY_CTRL_T, "h"
109
+ while scroll_up
121
110
  end
122
- when Curses::KEY_RIGHT, Curses::KEY_CTRL_B, ?l
123
- while( scroll_down )
111
+ when Curses::KEY_RIGHT, Curses::KEY_CTRL_B, "l"
112
+ while scroll_down
124
113
  end
125
- when ?q
114
+ when "q"
126
115
  break
127
116
  else
128
- @screen.setpos(0,0)
117
+ @screen.setpos(0, 0)
129
118
  @screen.addstr("[unknown key `#{Curses.keyname(c)}'=#{c}] ")
130
119
  end
131
- if( !result )
120
+ if !result
132
121
  Curses.beep
133
122
  end
134
- @screen.setpos(0,0)
123
+ @screen.setpos(0, 0)
135
124
  end
136
125
  Curses.close_screen
137
126
  end
@@ -140,8 +129,8 @@ end
140
129
 
141
130
  # If we are being run as a main program...
142
131
  if __FILE__ == $0
143
- if ARGV.size != 1 then
144
- printf("usage: #{$0} file\n");
132
+ unless ARGV.size == 1
133
+ puts "usage: #{$0} file"
145
134
  exit
146
135
  end
147
136