ffi-ncurses 0.3.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.
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sean O'Halpin, 2009-02-15
4
+ #
5
+ require 'ffi-ncurses'
6
+
7
+ # translated from "Programmer's Guide to NCurses", Gookin, p. 292
8
+
9
+ begin
10
+ include FFI::NCurses
11
+ initscr
12
+ noecho
13
+ win = newwin(5, 20, 10, 30)
14
+ box(win, 0, 0)
15
+ waddstr(win, "This is 'win'")
16
+ wrefresh(win)
17
+ wgetch(win)
18
+
19
+ winy, winx = getyx(win)
20
+ stdy, stdx = getyx(stdscr)
21
+ vy, vx = getsyx
22
+ printw(" win: %d, %d\n", :int, winy, :int, winx)
23
+ printw(" stdscr: %d, %d\n", :int, stdy, :int, stdx)
24
+ printw("virtual: %d, %d\n", :int, vy, :int, vx)
25
+ refresh
26
+ getch
27
+
28
+ vy, vx = getsyx
29
+ printw("virtual: %d, %d\n", :int, vy, :int, vx)
30
+ refresh
31
+ getch
32
+
33
+ leaveok(win, FFI::NCurses::TRUE)
34
+ wrefresh(win)
35
+ winy, winx = getyx(win)
36
+ vy, vx = getsyx
37
+ printw(" win: %d, %d\n", :int, winy, :int, winx)
38
+ printw("virtual: %d, %d\n", :int, vy, :int, vx)
39
+ refresh
40
+ getch
41
+
42
+ setsyx(3, 3)
43
+ wrefresh(newscr)
44
+ getch
45
+ vy, vx = getsyx
46
+ printw("virtual: %d, %d\n", :int, vy, :int, vx)
47
+ refresh
48
+ getch
49
+
50
+ rescue Object => e
51
+ FFI::NCurses.endwin
52
+ raise
53
+ ensure
54
+ FFI::NCurses.endwin
55
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sean O'Halpin, 2009-02-15
4
+ #
5
+ require 'ffi-ncurses'
6
+ include FFI::NCurses
7
+ begin
8
+ greeting = ARGV.shift || "World"
9
+ stdscr = initscr
10
+ raw
11
+ keypad stdscr, 1
12
+ noecho
13
+ curs_set 0
14
+ printw "Hello %s", :string, greeting
15
+ move 3, 0
16
+ addstr "Press any key to continue"
17
+ refresh
18
+ ch = getch
19
+ printw "\nYou pressed %c (%d)", :char, ch, :int, ch
20
+ refresh
21
+ sleep 1
22
+ ensure
23
+ endwin
24
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sean O'Halpin, 2009-02-15
4
+ #
5
+ require 'ffi'
6
+ require 'ffi-ncurses'
7
+
8
+ include FFI::NCurses
9
+
10
+ initscr
11
+ addstr 'Hello World'
12
+ refresh
13
+ getch
14
+ endwin
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sean O'Halpin, 2009-02-15
4
+ #
5
+ require 'ffi-ncurses'
6
+ include FFI::NCurses
7
+ begin
8
+ initscr
9
+ raw
10
+ keypad stdscr, 1
11
+ noecho
12
+ curs_set 0
13
+ ch = 0
14
+ name = "none"
15
+ while ch != 27
16
+ clear
17
+ addstr "Press any key (Escape to exit): "
18
+ printw "name: %s dec: %d char: [%c]", :string, name, :int, ch, :int, ch
19
+ refresh
20
+ ch = getch
21
+ name = keyname(ch)
22
+ end
23
+ ensure
24
+ endwin
25
+ end
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sean O'Halpin, 2009-02-15
4
+ #
5
+ require 'ffi-ncurses'
6
+ require 'ffi-ncurses/mouse'
7
+
8
+ include FFI::NCurses
9
+
10
+ begin
11
+ initscr
12
+ clear
13
+ noecho
14
+ cbreak
15
+ keypad stdscr, FFI::NCurses::TRUE
16
+
17
+ # Get all the mouse events
18
+ mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, nil)
19
+ mouse_event = MEVENT.new
20
+ ch = 0
21
+ addstr "Click mouse buttons anywhere on the screen. q to quit\n"
22
+ until ch == ?q do
23
+ ch = getch
24
+ case ch
25
+ when KEY_MOUSE
26
+ if getmouse(mouse_event) == OK
27
+ if FFI::NCurses::BUTTON_CLICK(mouse_event[:bstate], 1) > 0
28
+ addstr "Button 1 pressed (%d, %d, %x)" % [mouse_event[:y], mouse_event[:x], mouse_event[:bstate]]
29
+ elsif FFI::NCurses::BUTTON_CLICK(mouse_event[:bstate], 2) > 0
30
+ addstr "Button 2 pressed (%d, %d, %x)" % [mouse_event[:y], mouse_event[:x], mouse_event[:bstate]]
31
+ elsif FFI::NCurses::BUTTON_CLICK(mouse_event[:bstate], 3) > 0
32
+ addstr "Button 3 pressed (%d, %d, %x)" % [mouse_event[:y], mouse_event[:x], mouse_event[:bstate]]
33
+ else
34
+ addstr "Other mouse event %x" % mouse_event[:bstate]
35
+ end
36
+ row = getcury(stdscr) + 1
37
+ move row, 0
38
+ move mouse_event[:y], mouse_event[:x]
39
+ addch " "[0] | WA_STANDOUT
40
+ move row, 0
41
+ end
42
+ else
43
+ printw "other event (%lu)", :ulong, ch
44
+ addstr "\n"
45
+ end
46
+ refresh
47
+ end
48
+ ensure
49
+ endwin
50
+ end
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # shows how to call variadic functions
3
+ #
4
+ # Sean O'Halpin, 2009-02-15
5
+ #
6
+ require 'ffi-ncurses'
7
+ begin
8
+ FFI::NCurses.initscr
9
+ FFI::NCurses.clear
10
+ FFI::NCurses.printw("Hello %s! There are %d arguments to this variadic function!", :string, "world", :int, 2)
11
+ FFI::NCurses.refresh
12
+ FFI::NCurses.getch
13
+ ensure
14
+ FFI::NCurses.endwin
15
+ end
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sean O'Halpin, 2009-02-15
4
+ #
5
+ require 'ffi-ncurses'
6
+ include FFI::NCurses
7
+ begin
8
+ slk_init(0)
9
+ initscr
10
+ slk_set(1, "Mabelode", 1)
11
+ slk_set(2, "Xiombarg", 1)
12
+ slk_set(3, "Arioch", 1)
13
+ slk_set(4, "Chaos", 1)
14
+ slk_set(5, "Law", 1)
15
+ slk_set(6, "Corum", 1)
16
+ slk_set(7, "Jhaelen", 1)
17
+ slk_set(8, "Irsei", 1)
18
+ slk_refresh
19
+ getch
20
+ ensure
21
+ endwin
22
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sean O'Halpin, 2009-01-31
4
+ #
5
+ require 'ffi-ncurses'
6
+ begin
7
+ scr = FFI::NCurses.initscr
8
+ FFI::NCurses.box(FFI::NCurses.stdscr, 0, 0)
9
+ FFI::NCurses.mvaddstr 1, 1, "#{[scr, FFI::NCurses.stdscr].inspect}"
10
+ FFI::NCurses.refresh
11
+ FFI::NCurses.getch
12
+
13
+ rescue Object => e
14
+ FFI::NCurses.endwin
15
+ raise
16
+ ensure
17
+ FFI::NCurses.endwin
18
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sean O'Halpin, 2009-02-15
4
+ #
5
+ require 'ffi-ncurses'
6
+ include FFI::NCurses
7
+
8
+ begin
9
+ initscr
10
+ curs_set 0
11
+ win = newwin(6, 12, 15, 15)
12
+ box(win, 0, 0)
13
+ inner_win = newwin(4, 10, 16, 16)
14
+ waddstr(inner_win, (["Hello window!"] * 5).join(' '))
15
+ wrefresh(win)
16
+ wrefresh(inner_win)
17
+ ch = wgetch(inner_win)
18
+
19
+ rescue Object => e
20
+ endwin
21
+ puts e
22
+ ensure
23
+ endwin
24
+ end
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file exercises a mish-mash of different features.
4
+ #
5
+ # Sean O'Halpin, 2009-01-18
6
+ #
7
+ require 'ffi-ncurses'
8
+ begin
9
+ # the methods can be called as module methods
10
+ FFI::NCurses.initscr
11
+ FFI::NCurses.clear
12
+ FFI::NCurses.printw("Hello world!")
13
+ FFI::NCurses.refresh
14
+ FFI::NCurses.getch
15
+ FFI::NCurses.endwin
16
+
17
+ # or as included methods
18
+ include FFI::NCurses
19
+ initscr
20
+ start_color
21
+ curs_set 0
22
+ raw
23
+ cbreak
24
+ noecho
25
+ clear
26
+ move 10, 10
27
+ standout
28
+ # hmmm.. you have to jump through some hoops to avoid temporary variables
29
+ #
30
+ printw("Hi! maxyx %d %d\n", *([:int, :int].zip(getmaxyx(FFI::NCurses.stdscr)).flatten))
31
+ # easier to do this
32
+ #addstr(sprintf("paryx %d %d\n", *getparyx(FFI::NCurses.stdscr)))
33
+ standend
34
+
35
+ init_pair(1, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::BLACK)
36
+ init_pair(2, FFI::NCurses::Colour::RED, FFI::NCurses::Colour::BLACK)
37
+ init_pair(3, FFI::NCurses::Colour::GREEN, FFI::NCurses::Colour::BLACK)
38
+ init_pair(4, FFI::NCurses::Colour::YELLOW, FFI::NCurses::Colour::BLACK)
39
+ init_pair(5, FFI::NCurses::Colour::BLUE, FFI::NCurses::Colour::BLACK)
40
+ init_pair(6, FFI::NCurses::Colour::MAGENTA, FFI::NCurses::Colour::BLACK)
41
+ init_pair(7, FFI::NCurses::Colour::CYAN, FFI::NCurses::Colour::BLACK)
42
+ init_pair(8, FFI::NCurses::Colour::WHITE, FFI::NCurses::Colour::BLACK)
43
+
44
+ init_pair(9, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::BLACK)
45
+ init_pair(10, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::RED)
46
+ init_pair(11, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::GREEN)
47
+ init_pair(12, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::YELLOW)
48
+ init_pair(13, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::BLUE)
49
+ init_pair(14, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::MAGENTA)
50
+ init_pair(15, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::CYAN)
51
+ init_pair(16, FFI::NCurses::Colour::BLACK, FFI::NCurses::Colour::WHITE)
52
+
53
+ 1.upto(16) do |i|
54
+ attr_set FFI::NCurses::A_NORMAL, i, nil
55
+ addch(?A - 1 + i)
56
+ end
57
+ attr_set FFI::NCurses::A_HORIZONTAL, 0, nil
58
+ addch(?Z | COLOR_PAIR(3))
59
+ attr_set A_BOLD, 2, nil
60
+ addch ?S
61
+
62
+ refresh
63
+ ch = getch
64
+ endwin
65
+
66
+ initscr
67
+ curs_set 0
68
+ raw
69
+ cbreak
70
+ noecho
71
+ win = newwin(12, 22, 15, 15)
72
+ box(win, 0, 0)
73
+
74
+ # inner_win = newwin(10, 20, 16, 16)
75
+
76
+ # note: you can cause a bus error if subwindow parameters exceed
77
+ # parent boundaries
78
+
79
+ # inner_win = subwin(win, 8, 18, 18, 18)
80
+ inner_win = derwin(win, 8, 18, 1, 2)
81
+ waddstr(inner_win, sprintf("begyx %d %d\n", *getbegyx(inner_win)))
82
+ waddstr(inner_win, sprintf("maxyx %d %d\n", *getmaxyx(inner_win)))
83
+ waddstr(inner_win, sprintf("paryx %d %d\n", *getparyx(inner_win)))
84
+ waddstr(inner_win, (["Hello window!"] * 5).join(' '))
85
+
86
+ wrefresh(win)
87
+ wrefresh(inner_win)
88
+ ch = wgetch(win)
89
+ wclear(inner_win)
90
+ # note: you must clear up subwindows in reverse order
91
+ delwin(inner_win)
92
+ wmove(win, 1, 2)
93
+ waddstr(win, "Bye bye!")
94
+ wrefresh(win)
95
+ ch = wgetch(win)
96
+ delwin(win)
97
+
98
+ rescue Object => e
99
+ FFI::NCurses.endwin
100
+ raise
101
+ ensure
102
+ FFI::NCurses.endwin
103
+ # FFI::NCurses.class_eval {
104
+ # require 'pp'
105
+ # pp @unattached_functions
106
+
107
+ # }
108
+ end
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{ffi-ncurses}
5
+ s.version = "0.3.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Sean O'Halpin"]
9
+ s.date = %q{2009-02-15}
10
+ s.description = %q{}
11
+ s.email = %q{sean.ohalpin@gmail.com}
12
+ s.extra_rdoc_files = ["History.txt", "README.rdoc"]
13
+ s.files = ["History.txt", "README.rdoc", "Rakefile", "examples/doc-eg1.rb", "examples/doc-eg2.rb", "examples/example-attributes.rb", "examples/example-colour.rb", "examples/example-cursor.rb", "examples/example-getsetsyx.rb", "examples/example-hello.rb", "examples/example-jruby.rb", "examples/example-keys.rb", "examples/example-mouse.rb", "examples/example-printw-variadic.rb", "examples/example-softkeys.rb", "examples/example-stdscr.rb", "examples/example-windows.rb", "examples/example.rb", "ffi-ncurses.gemspec", "lib/ffi-ncurses.rb", "lib/ffi-ncurses/darwin.rb", "lib/ffi-ncurses/keydefs.rb", "lib/ffi-ncurses/mouse.rb", "lib/ffi-ncurses/winstruct.rb"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://github.com/seanohalpin/ffi-ncurses}
16
+ s.rdoc_options = ["--main", "README.rdoc"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{ffi-ncurses}
19
+ s.rubygems_version = %q{1.3.1}
20
+ s.summary = %q{FFI wrapper for ncurses}
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 2
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ s.add_runtime_dependency(%q<ffi>, [">= 0.2.0"])
28
+ s.add_development_dependency(%q<bones>, [">= 2.4.0"])
29
+ else
30
+ s.add_dependency(%q<ffi>, [">= 0.2.0"])
31
+ s.add_dependency(%q<bones>, [">= 2.4.0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<ffi>, [">= 0.2.0"])
35
+ s.add_dependency(%q<bones>, [">= 2.4.0"])
36
+ end
37
+ end
@@ -0,0 +1,584 @@
1
+ # ruby-ffi wrapper for ncurses
2
+ # Sean O'Halpin
3
+ # version 0.1.0 - 2008-12-04
4
+ # version 0.2.0 - 2009-01-18
5
+ # version 0.3.0 - 2009-01-31
6
+ # - added stdscr, newscr, curscr
7
+ # requires ruby-ffi >= 0.2.0 or jruby >= 1.1.6
8
+ # tested with ruby 1.8.6, jruby 1.1.6 on Ubuntu 8.04, Mac OS X 10.4
9
+ # ncurses 5.x
10
+
11
+ require 'ffi'
12
+
13
+ # would like to check FFI version here rather than use gem but there
14
+ # doesn't appear to be a version specified in the ffi lib
15
+
16
+ module FFI
17
+ module NCurses
18
+ extend FFI::Library
19
+
20
+ # use RUBY_FFI_NCURSES_LIB to specify exactly which lib you want, e.g. ncursesw, XCurses (from PDCurses)
21
+ if ENV["RUBY_FFI_NCURSES_LIB"].to_s != ""
22
+ LIB_HANDLE = ffi_lib( ENV["RUBY_FFI_NCURSES_LIB"] ).first
23
+ else
24
+ LIB_HANDLE = ffi_lib( 'ncurses', 'libncurses.so.5', 'XCurses' ).first
25
+ end
26
+
27
+ begin
28
+
29
+ if LIB_HANDLE.respond_to?(:find_symbol)
30
+ # these symbols are defined in ncurses.h
31
+ symbols = [ "stdscr", "curscr", "newscr" ]
32
+ SYMBOLS = Hash[*symbols.map { |sym| [sym, LIB_HANDLE.find_symbol(sym)]}.compact.flatten ]
33
+ SYMBOLS.keys.each do |sym|
34
+ # note that the symbol table entry in a dll for an exported
35
+ # variable contains a ~pointer to the address~ of the variable
36
+ # which will be initialized in the process's bss (uninitialized)
37
+ # data segment when the process is initialized
38
+
39
+ # this is unlike methods, where the symbol table entry points to
40
+ # the entry point of the method itself
41
+
42
+ # variables need another level of indirection because they are
43
+ # ~not~ shared between process instances - the sharing is of
44
+ # code only
45
+ # p SYMBOLS[sym]
46
+ define_method sym do
47
+ SYMBOLS[sym].read_pointer
48
+ end
49
+ module_function sym
50
+ end
51
+ else
52
+ end
53
+ rescue Object => e
54
+ end
55
+
56
+ # this list of function signatures was generated by the file
57
+ # generate-ffi-ncurses-function-signatures.rb and inserted here by hand
58
+ # then edited a bit :)
59
+ functions =
60
+ [
61
+ [:COLOR_PAIR, [:int], :int],
62
+ [:PAIR_NUMBER, [:int], :int],
63
+ # these functions are only in the debug version of ncurses
64
+ # [:_nc_tracebits, [], :string],
65
+ # [:_nc_visbuf, [:string], :string],
66
+ # [:_traceattr2, [:int, :uint], :string],
67
+ # [:_traceattr, [:uint], :string],
68
+ # [:_tracecchar_t2, [:int, :pointer], :string],
69
+ # [:_tracecchar_t, [:pointer], :string],
70
+ # [:_tracechar, [:int], :string],
71
+ # [:_tracechtype2, [:int, :uint], :string],
72
+ # [:_tracechtype, [:uint], :string],
73
+ # [:_tracedump, [:string, :pointer], :void],
74
+ # [:_tracef, [:string, :varargs], :void],
75
+ # [:_tracemouse, [:pointer], :string],
76
+ [:add_wchnstr, [:pointer, :int], :int],
77
+ [:add_wch, [:pointer], :int],
78
+ [:add_wchstr, [:pointer], :int],
79
+ [:addchnstr, [:pointer, :int], :int],
80
+ [:addchstr, [:pointer], :int],
81
+ [:addch, [:uint], :int],
82
+ [:addnstr, [:string, :int], :int],
83
+ [:addstr, [:string], :int],
84
+ [:assume_default_colors, [:int, :int], :int],
85
+ [:attr_get, [:pointer, :pointer, :pointer], :int],
86
+ [:attr_off, [:uint, :pointer], :int],
87
+ [:attr_on, [:uint, :pointer], :int],
88
+ [:attr_set, [:uint, :short, :pointer], :int],
89
+ [:attroff, [:uint], :int],
90
+ [:attron, [:uint], :int],
91
+ [:attrset, [:uint], :int],
92
+ [:baudrate, [], :int],
93
+ [:beep, [], :int],
94
+ [:bkgdset, [:uint], :void],
95
+ [:bkgd, [:uint], :int],
96
+ [:bkgrnd, [:pointer], :int],
97
+ [:bkgrndset, [:pointer], :void],
98
+ [:border_set, [:pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer], :int],
99
+ [:border, [:uint, :uint, :uint, :uint, :uint, :uint, :uint, :uint], :int],
100
+ [:box_set, [:pointer, :pointer, :pointer], :int],
101
+ [:box, [:pointer, :uint, :uint], :int],
102
+ [:can_change_color, [], :int],
103
+ [:cbreak, [], :int],
104
+ [:chgat, [:int, :uint, :short, :pointer], :int],
105
+ [:clear, [], :int],
106
+ [:clearok, [:pointer, :int], :int],
107
+ [:clrtobot, [], :int],
108
+ [:clrtoeol, [], :int],
109
+ [:color_content, [:short, :pointer, :pointer, :pointer], :int],
110
+ [:color_set, [:short, :pointer], :int],
111
+ [:copywin, [:pointer, :pointer, :int, :int, :int, :int, :int, :int, :int], :int],
112
+ [:curs_set, [:int], :int],
113
+ [:curses_version, [], :string],
114
+ [:def_prog_mode, [], :int],
115
+ [:def_shell_mode, [], :int],
116
+ [:define_key, [:string, :int], :int],
117
+ [:delay_output, [:int], :int],
118
+ [:delch, [], :int],
119
+ [:deleteln, [], :int],
120
+ [:delscreen, [:pointer], :void],
121
+ [:delwin, [:pointer], :int],
122
+ [:derwin, [:pointer, :int, :int, :int, :int], :pointer],
123
+ [:doupdate, [], :int],
124
+ [:dupwin, [:pointer], :pointer],
125
+ [:echo_wchar, [:pointer], :int],
126
+ [:echochar, [:uint], :int],
127
+ [:echo, [], :int],
128
+ [:endwin, [], :int],
129
+ [:erasechar, [], :char],
130
+ [:erase, [], :int],
131
+ [:filter, [], :void],
132
+ [:flash, [], :int],
133
+ [:flushinp, [], :int],
134
+ [:getbkgd, [:pointer], :uint],
135
+ [:getbkgrnd, [:pointer], :int],
136
+ [:getch, [], :int],
137
+
138
+ [:getattrs, [:pointer], :int],
139
+ [:getcurx, [:pointer], :int],
140
+ [:getcury, [:pointer], :int],
141
+ [:getbegx, [:pointer], :int],
142
+ [:getbegy, [:pointer], :int],
143
+ [:getmaxx, [:pointer], :int],
144
+ [:getmaxy, [:pointer], :int],
145
+ [:getparx, [:pointer], :int],
146
+ [:getpary, [:pointer], :int],
147
+
148
+ # this is defined in mouse.rb
149
+ # [:getmouse, [:pointer], :int],
150
+ [:getnstr, [:string, :int], :int],
151
+ [:getstr, [:string], :int],
152
+ [:getwin, [:pointer], :pointer],
153
+ [:halfdelay, [:int], :int],
154
+ [:has_colors, [], :int],
155
+ [:has_ic, [], :int],
156
+ [:has_il, [], :int],
157
+ [:has_key, [:int], :int],
158
+ [:hline_set, [:pointer, :int], :int],
159
+ [:hline, [:uint, :int], :int],
160
+ [:idcok, [:pointer, :int], :void],
161
+ [:idlok, [:pointer, :int], :int],
162
+ [:immedok, [:pointer, :int], :void],
163
+ [:in_wchnstr, [:pointer, :int], :int],
164
+ [:in_wch, [:pointer], :int],
165
+ [:in_wchstr, [:pointer], :int],
166
+ [:inchnstr, [:pointer, :int], :int],
167
+ [:inchstr, [:pointer], :int],
168
+ [:inch, [], :uint],
169
+ [:init_color, [:short, :short, :short, :short], :int],
170
+ [:init_pair, [:short, :short, :short], :int],
171
+ # need to intercept this to get stdscr for JRuby (for the moment)
172
+ ["_initscr", :initscr, [], :pointer],
173
+ [:innstr, [:string, :int], :int],
174
+ [:ins_wch, [:pointer], :int],
175
+ [:insch, [:uint], :int],
176
+ [:insdelln, [:int], :int],
177
+ [:insertln, [], :int],
178
+ [:insnstr, [:string, :int], :int],
179
+ [:insstr, [:string], :int],
180
+ [:instr, [:string], :int],
181
+ [:intrflush, [:pointer, :int], :int],
182
+ [:is_linetouched, [:pointer, :int], :int],
183
+ [:is_term_resized, [:int, :int], :int],
184
+ [:is_wintouched, [:pointer], :int],
185
+ [:isendwin, [], :int],
186
+ [:key_defined, [:string], :int],
187
+ [:keybound, [:int, :int], :string],
188
+ [:keyname, [:int], :string],
189
+ [:keyok, [:int, :int], :int],
190
+ [:keypad, [:pointer, :int], :int],
191
+ [:killchar, [], :char],
192
+ [:leaveok, [:pointer, :int], :int],
193
+ [:longname, [], :string],
194
+ [:mcprint, [:string, :int], :int],
195
+ [:meta, [:pointer, :int], :int],
196
+ [:mouse_trafo, [:pointer, :pointer, :int], :int],
197
+ [:mouseinterval, [:int], :int],
198
+ [:mousemask, [:uint, :pointer], :uint],
199
+ [:move, [:int, :int], :int],
200
+ [:mvadd_wch, [:int, :int, :pointer], :int],
201
+ [:mvadd_wchnstr, [:int, :int, :pointer, :int], :int],
202
+ [:mvadd_wchstr, [:int, :int, :pointer], :int],
203
+ [:mvaddch, [:int, :int, :uint], :int],
204
+ [:mvaddchnstr, [:int, :int, :pointer, :int], :int],
205
+ [:mvaddchstr, [:int, :int, :pointer], :int],
206
+ [:mvaddnstr, [:int, :int, :string, :int], :int],
207
+ [:mvaddstr, [:int, :int, :string], :int],
208
+ [:mvchgat, [:int, :int, :int, :uint, :short, :pointer], :int],
209
+ [:mvcur, [:int, :int, :int, :int], :int],
210
+ [:mvdelch, [:int, :int], :int],
211
+ [:mvderwin, [:pointer, :int, :int], :int],
212
+ [:mvgetch, [:int, :int], :int],
213
+ [:mvgetnstr, [:int, :int, :string, :int], :int],
214
+ [:mvgetstr, [:int, :int, :string], :int],
215
+ [:mvhline_set, [:int, :int, :pointer, :int], :int],
216
+ [:mvhline, [:int, :int, :uint, :int], :int],
217
+ [:mvin_wch, [:int, :int, :pointer], :int],
218
+ [:mvin_wchnstr, [:int, :int, :pointer, :int], :int],
219
+ [:mvin_wchstr, [:int, :int, :pointer], :int],
220
+ [:mvinch, [:int, :int], :uint],
221
+ [:mvinchnstr, [:int, :int, :pointer, :int], :int],
222
+ [:mvinchstr, [:int, :int, :pointer], :int],
223
+ [:mvinnstr, [:int, :int, :string, :int], :int],
224
+ [:mvins_wch, [:int, :int, :pointer], :int],
225
+ [:mvinsch, [:int, :int, :uint], :int],
226
+ [:mvinsnstr, [:int, :int, :string, :int], :int],
227
+ [:mvinsstr, [:int, :int, :string], :int],
228
+ [:mvinstr, [:int, :int, :string], :int],
229
+ [:mvprintw, [:int, :int, :string, :varargs], :int],
230
+ [:mvscanw, [:int, :int, :string, :varargs], :int],
231
+ [:mvvline_set, [:int, :int, :pointer, :int], :int],
232
+ [:mvvline, [:int, :int, :uint, :int], :int],
233
+ [:mvwadd_wchnstr, [:pointer, :int, :int, :pointer, :int], :int],
234
+ [:mvwadd_wch, [:pointer, :int, :int, :pointer], :int],
235
+ [:mvwadd_wchstr, [:pointer, :int, :int, :pointer], :int],
236
+ [:mvwaddchnstr, [:pointer, :int, :int, :pointer, :int], :int],
237
+ [:mvwaddch, [:pointer, :int, :int, :uint], :int],
238
+ [:mvwaddchstr, [:pointer, :int, :int, :pointer], :int],
239
+ [:mvwaddnstr, [:pointer, :int, :int, :string, :int], :int],
240
+ [:mvwaddstr, [:pointer, :int, :int, :string], :int],
241
+ [:mvwchgat, [:pointer, :int, :int, :int, :uint, :short, :pointer], :int],
242
+ [:mvwdelch, [:pointer, :int, :int], :int],
243
+ [:mvwgetch, [:pointer, :int, :int], :int],
244
+ [:mvwgetnstr, [:pointer, :int, :int, :string, :int], :int],
245
+ [:mvwgetstr, [:pointer, :int, :int, :string], :int],
246
+ [:mvwhline_set, [:pointer, :int, :int, :pointer, :int], :int],
247
+ [:mvwhline, [:pointer, :int, :int, :uint, :int], :int],
248
+ [:mvwin_wchnstr, [:pointer, :int, :int, :pointer, :int], :int],
249
+ [:mvwin_wch, [:pointer, :int, :int, :pointer], :int],
250
+ [:mvwin_wchstr, [:pointer, :int, :int, :pointer], :int],
251
+ [:mvwinchnstr, [:pointer, :int, :int, :pointer, :int], :int],
252
+ [:mvwinch, [:pointer, :int, :int], :uint],
253
+ [:mvwinchstr, [:pointer, :int, :int, :pointer], :int],
254
+ [:mvwinnstr, [:pointer, :int, :int, :string, :int], :int],
255
+ [:mvwin, [:pointer, :int, :int], :int],
256
+ [:mvwins_wch, [:pointer, :int, :int, :pointer], :int],
257
+ [:mvwinsch, [:pointer, :int, :int, :uint], :int],
258
+ [:mvwinsnstr, [:pointer, :int, :int, :string, :int], :int],
259
+ [:mvwinsstr, [:pointer, :int, :int, :string], :int],
260
+ [:mvwinstr, [:pointer, :int, :int, :string], :int],
261
+ [:mvwprintw, [:pointer, :int, :int, :string, :varargs], :int],
262
+ [:mvwscanw, [:pointer, :int, :int, :string, :varargs], :int],
263
+ [:mvwvline_set, [:pointer, :int, :int, :pointer, :int], :int],
264
+ [:mvwvline, [:pointer, :int, :int, :uint, :int], :int],
265
+ [:napms, [:int], :int],
266
+ [:newpad, [:int, :int], :pointer],
267
+ [:newterm, [:string, :pointer, :pointer], :pointer],
268
+ [:newwin, [:int, :int, :int, :int], :pointer],
269
+ [:nl, [], :int],
270
+ [:nocbreak, [], :int],
271
+ [:nodelay, [:pointer, :int], :int],
272
+ [:noecho, [], :int],
273
+ [:nonl, [], :int],
274
+ [:noqiflush, [], :void],
275
+ [:noraw, [], :int],
276
+ [:notimeout, [:pointer, :int], :int],
277
+ [:overlay, [:pointer, :pointer], :int],
278
+ [:overwrite, [:pointer, :pointer], :int],
279
+ [:pair_content, [:short, :pointer, :pointer], :int],
280
+ [:pecho_wchar, [:pointer, :pointer], :int],
281
+ [:pechochar, [:pointer, :uint], :int],
282
+ [:pnoutrefresh, [:pointer, :int, :int, :int, :int, :int, :int], :int],
283
+ [:prefresh, [:pointer, :int, :int, :int, :int, :int, :int], :int],
284
+ [:printw, [:string, :varargs], :int],
285
+ [:putp, [:string], :int],
286
+ [:putwin, [:pointer, :pointer], :int],
287
+ [:qiflush, [], :void],
288
+ [:raw, [], :int],
289
+ [:redrawwin, [:pointer], :int],
290
+ [:refresh, [], :int],
291
+ [:reset_prog_mode, [], :int],
292
+ [:reset_shell_mode, [], :int],
293
+ [:resetty, [], :int],
294
+ [:resize_term, [:int, :int], :int],
295
+ [:resizeterm, [:int, :int], :int],
296
+ [:ripoffline, [:int, :pointer], :int],
297
+ [:savetty, [], :int],
298
+ [:scanw, [:string, :varargs], :int],
299
+ [:scr_dump, [:string], :int],
300
+ [:scr_init, [:string], :int],
301
+ [:scr_restore, [:string], :int],
302
+ [:scr_set, [:string], :int],
303
+ [:scrl, [:int], :int],
304
+ [:scrollok, [:pointer, :int], :int],
305
+ [:scroll, [:pointer], :int],
306
+ [:set_term, [:pointer], :pointer],
307
+ [:setscrreg, [:int, :int], :int],
308
+ [:slk_attr_off, [:uint, :pointer], :int],
309
+ [:slk_attr_on, [:uint, :pointer], :int],
310
+ [:slk_attr_set, [:uint, :short, :pointer], :int],
311
+ [:slk_attroff, [:uint], :int],
312
+ [:slk_attron, [:uint], :int],
313
+ [:slk_attrset, [:uint], :int],
314
+ [:slk_attr, [], :uint],
315
+ [:slk_clear, [], :int],
316
+ [:slk_color, [:short], :int],
317
+ [:slk_init, [:int], :int],
318
+ [:slk_label, [:int], :string],
319
+ [:slk_noutrefresh, [], :int],
320
+ [:slk_refresh, [], :int],
321
+ [:slk_restore, [], :int],
322
+ [:slk_set, [:int, :string, :int], :int],
323
+ [:slk_touch, [], :int],
324
+ [:standend, [], :int],
325
+ [:standout, [], :int],
326
+ [:start_color, [], :int],
327
+ [:subpad, [:pointer, :int, :int, :int, :int], :pointer],
328
+ [:subwin, [:pointer, :int, :int, :int, :int], :pointer],
329
+ [:syncok, [:pointer, :int], :int],
330
+ [:term_attrs, [], :uint],
331
+ [:termattrs, [], :uint],
332
+ [:termname, [], :string],
333
+ [:tigetflag, [:string], :int],
334
+ [:tigetnum, [:string], :int],
335
+ [:tigetstr, [:string], :string],
336
+ [:timeout, [:int], :void],
337
+ [:touchline, [:pointer, :int, :int], :int],
338
+ [:touchwin, [:pointer], :int],
339
+ [:tparm, [:string, :varargs], :string],
340
+ # [:trace, [:uint], :void],
341
+ [:typeahead, [:int], :int],
342
+ [:ungetch, [:int], :int],
343
+ # moved into mouse
344
+ # [:ungetmouse, [:pointer], :int],
345
+ [:untouchwin, [:pointer], :int],
346
+ [:use_default_colors, [], :int],
347
+ [:use_env, [:int], :void],
348
+ [:use_extended_names, [:int], :int],
349
+ [:vid_attr, [:uint, :short, :pointer], :int],
350
+ [:vid_puts, [:uint, :short, :pointer, :pointer], :int],
351
+ [:vidattr, [:uint], :int],
352
+ [:vidputs, [:uint, :pointer], :int],
353
+ [:vline_set, [:pointer, :int], :int],
354
+ [:vline, [:uint, :int], :int],
355
+ [:wadd_wchnstr, [:pointer, :pointer, :int], :int],
356
+ [:wadd_wch, [:pointer, :pointer], :int],
357
+ [:wadd_wchstr, [:pointer, :pointer], :int],
358
+ [:waddchnstr, [:pointer, :pointer, :int], :int],
359
+ [:waddch, [:pointer, :uint], :int],
360
+ [:waddchstr, [:pointer, :pointer], :int],
361
+ [:waddnstr, [:pointer, :string, :int], :int],
362
+ [:waddstr, [:pointer, :string], :int],
363
+ [:wattr_get, [:pointer, :pointer, :pointer, :pointer], :int],
364
+ [:wattr_off, [:pointer, :uint, :pointer], :int],
365
+ [:wattr_on, [:pointer, :uint, :pointer], :int],
366
+ [:wattr_set, [:pointer, :uint, :short, :pointer], :int],
367
+ [:wattroff, [:pointer, :int], :int],
368
+ [:wattron, [:pointer, :int], :int],
369
+ [:wattrset, [:pointer, :int], :int],
370
+ [:wbkgd, [:pointer, :uint], :int],
371
+ [:wbkgdset, [:pointer, :uint], :void],
372
+ [:wbkgrnd, [:pointer, :pointer], :int],
373
+ [:wbkgrndset, [:pointer, :pointer], :void],
374
+ [:wborder_set, [:pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer], :int],
375
+ [:wborder, [:pointer, :uint, :uint, :uint, :uint, :uint, :uint, :uint, :uint], :int],
376
+ [:wchgat, [:pointer, :int, :uint, :short, :pointer], :int],
377
+ [:wclear, [:pointer], :int],
378
+ [:wclrtobot, [:pointer], :int],
379
+ [:wclrtoeol, [:pointer], :int],
380
+ [:wcolor_set, [:pointer, :short, :pointer], :int],
381
+ [:wcursyncup, [:pointer], :void],
382
+ [:wdelch, [:pointer], :int],
383
+ [:wdeleteln, [:pointer], :int],
384
+ [:wecho_wchar, [:pointer, :pointer], :int],
385
+ [:wechochar, [:pointer, :uint], :int],
386
+ [:wenclose, [:pointer, :int, :int], :int],
387
+ [:werase, [:pointer], :int],
388
+ [:wgetbkgrnd, [:pointer, :pointer], :int],
389
+ [:wgetch, [:pointer], :int],
390
+ [:wgetnstr, [:pointer, :string, :int], :int],
391
+ [:wgetstr, [:pointer, :string], :int],
392
+ [:whline_set, [:pointer, :pointer, :int], :int],
393
+ [:whline, [:pointer, :uint, :int], :int],
394
+ [:win_wchnstr, [:pointer, :pointer, :int], :int],
395
+ [:win_wch, [:pointer, :pointer], :int],
396
+ [:win_wchstr, [:pointer, :pointer], :int],
397
+ [:winchnstr, [:pointer, :pointer, :int], :int],
398
+ [:winch, [:pointer], :uint],
399
+ [:winchstr, [:pointer, :pointer], :int],
400
+ [:winnstr, [:pointer, :string, :int], :int],
401
+ [:wins_wch, [:pointer, :pointer], :int],
402
+ [:winsch, [:pointer, :uint], :int],
403
+ [:winsdelln, [:pointer, :int], :int],
404
+ [:winsertln, [:pointer], :int],
405
+ [:winsnstr, [:pointer, :string, :int], :int],
406
+ [:winsstr, [:pointer, :string], :int],
407
+ [:winstr, [:pointer, :string], :int],
408
+ [:wmove, [:pointer, :int, :int], :int],
409
+ [:wnoutrefresh, [:pointer], :int],
410
+ [:wprintw, [:pointer, :string, :varargs], :int],
411
+ [:wredrawln, [:pointer, :int, :int], :int],
412
+ [:wrefresh, [:pointer], :int],
413
+ [:wresize, [:pointer, :int, :int], :int],
414
+ [:wscanw, [:pointer, :string, :varargs], :int],
415
+ [:wscrl, [:pointer, :int], :int],
416
+ [:wsetscrreg, [:pointer, :int, :int], :int],
417
+ [:wstandend, [:pointer], :int],
418
+ [:wstandout, [:pointer], :int],
419
+ [:wsyncdown, [:pointer], :void],
420
+ [:wsyncup, [:pointer], :void],
421
+ [:wtimeout, [:pointer, :int], :void],
422
+ [:wtouchln, [:pointer, :int, :int, :int], :int],
423
+ [:wvline_set, [:pointer, :pointer, :int], :int],
424
+ [:wvline, [:pointer, :uint, :int], :int]
425
+ ]
426
+ # end of autogenerated function list
427
+
428
+ @unattached_functions = []
429
+ class << self
430
+ def unattached_functions
431
+ @unattached_functions
432
+ end
433
+ end
434
+
435
+ # attach functions
436
+ functions.each do |func|
437
+ begin
438
+ attach_function(*func)
439
+ rescue Object => e
440
+ # for debugging
441
+ unattached_functions << func[0]
442
+ end
443
+ end
444
+
445
+ module Colour
446
+ COLOR_BLACK = BLACK = 0
447
+ COLOR_RED = RED = 1
448
+ COLOR_GREEN = GREEN = 2
449
+ COLOR_YELLOW = YELLOW = 3
450
+ COLOR_BLUE = BLUE = 4
451
+ COLOR_MAGENTA = MAGENTA = 5
452
+ COLOR_CYAN = CYAN = 6
453
+ COLOR_WHITE = WHITE = 7
454
+ end
455
+ Color = Colour
456
+ include Colour
457
+
458
+ # FIXME: remove this code when JRuby gets find_sym
459
+ # fixup for JRuby 1.1.6 - doesn't have find_sym
460
+ # can hack for stdscr but not curscr or newscr (no methods return them)
461
+ # this will all be removed when JRuby 1.1.7 is released
462
+ module FixupInitscr
463
+ if !NCurses.respond_to?(:stdscr)
464
+ def initscr
465
+ @stdscr = NCurses._initscr
466
+ end
467
+ def stdscr
468
+ @stdscr
469
+ end
470
+ else
471
+ def initscr
472
+ NCurses._initscr
473
+ end
474
+ end
475
+ end
476
+ include FixupInitscr
477
+
478
+ module Attributes
479
+ # following definitions have been copied (almost verbatim) from ncurses.h
480
+ NCURSES_ATTR_SHIFT = 8
481
+ def self.NCURSES_BITS(mask, shift)
482
+ ((mask) << ((shift) + NCURSES_ATTR_SHIFT))
483
+ end
484
+
485
+ WA_NORMAL = A_NORMAL = (1 - 1)
486
+ WA_ATTRIBUTES = A_ATTRIBUTES = NCURSES_BITS(~(1 - 1),0)
487
+ WA_CHARTEXT = A_CHARTEXT = (NCURSES_BITS(1,0) - 1)
488
+ WA_COLOR = A_COLOR = NCURSES_BITS(((1) << 8) - 1,0)
489
+ WA_STANDOUT = A_STANDOUT = NCURSES_BITS(1,8) # best highlighting mode available
490
+ WA_UNDERLINE = A_UNDERLINE = NCURSES_BITS(1,9) # underlined text
491
+ WA_REVERSE = A_REVERSE = NCURSES_BITS(1,10) # reverse video
492
+ WA_BLINK = A_BLINK = NCURSES_BITS(1,11) # blinking text
493
+ WA_DIM = A_DIM = NCURSES_BITS(1,12) # half-bright text
494
+ WA_BOLD = A_BOLD = NCURSES_BITS(1,13) # extra bright or bold text
495
+ WA_ALTCHARSET = A_ALTCHARSET = NCURSES_BITS(1,14)
496
+ WA_INVIS = A_INVIS = NCURSES_BITS(1,15)
497
+ WA_PROTECT = A_PROTECT = NCURSES_BITS(1,16)
498
+ WA_HORIZONTAL = A_HORIZONTAL = NCURSES_BITS(1,17)
499
+ WA_LEFT = A_LEFT = NCURSES_BITS(1,18)
500
+ WA_LOW = A_LOW = NCURSES_BITS(1,19)
501
+ WA_RIGHT = A_RIGHT = NCURSES_BITS(1,20)
502
+ WA_TOP = A_TOP = NCURSES_BITS(1,21)
503
+ WA_VERTICAL = A_VERTICAL = NCURSES_BITS(1,22)
504
+ end
505
+ include Attributes
506
+
507
+ module Constants
508
+ FALSE = 0
509
+ TRUE = 1
510
+
511
+ ERR = -1
512
+ OK = 0
513
+ end
514
+ include Constants
515
+
516
+ require 'ffi-ncurses/winstruct'
517
+ include WinStruct
518
+
519
+ module EmulatedFunctions
520
+
521
+ # these 'functions' are implemented as macros in ncurses
522
+
523
+ # I'm departing from the NCurses API here - makes no sense to
524
+ # force people to use pointer return values when these are
525
+ # implemented as macros to make them easy to use in C when we have
526
+ # multiple return values in Ruby for that exact same purpose
527
+ def getyx(win)
528
+ [NCurses.getcury(win), NCurses.getcurx(win)]
529
+ end
530
+ def getbegyx(win)
531
+ [NCurses.getbegy(win), NCurses.getbegx(win)]
532
+ end
533
+ def getparyx(win)
534
+ [NCurses.getpary(win), NCurses.getparx(win)]
535
+ end
536
+ def getmaxyx(win)
537
+ [NCurses.getmaxy(win), NCurses.getmaxx(win)]
538
+ end
539
+
540
+ # transliterated from ncurses.h
541
+ # note: had to spell out NCurses::TRUE - will look into this
542
+ def getsyx
543
+ if (is_leaveok(newscr) == NCurses::TRUE)
544
+ [-1, -1]
545
+ else
546
+ getyx(newscr)
547
+ end
548
+ end
549
+ def setsyx(y, x)
550
+ if y == -1 && x == -1
551
+ leaveok(newscr, NCurses::TRUE)
552
+ else
553
+ leaveok(newscr, NCurses::FALSE)
554
+ wmove(newscr, y, x)
555
+ end
556
+ end
557
+
558
+ def self.fixup(function, &block)
559
+ if NCurses.unattached_functions.include?(function)
560
+ block.call
561
+ end
562
+ end
563
+
564
+ # hack for XCurses (PDCurses 3.3) - many more to come I suspect :)
565
+ fixup :getch do
566
+ def getch
567
+ wgetch(stdscr)
568
+ end
569
+ end
570
+ end
571
+ include EmulatedFunctions
572
+
573
+ # fixes for Mac OS X (mostly macros directly referencing the WINDOW struct)
574
+ if ::FFI::Platform::OS == "darwin"
575
+ require 'ffi-ncurses/darwin'
576
+ include NCurses::Darwin
577
+ end
578
+
579
+ # make all those instance methods module methods too
580
+ extend self
581
+
582
+ end
583
+ end
584
+