ffi-ncurses 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+