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.
- data/History.txt +22 -0
- data/README.rdoc +220 -0
- data/Rakefile +50 -0
- data/examples/doc-eg1.rb +14 -0
- data/examples/doc-eg2.rb +23 -0
- data/examples/example-attributes.rb +40 -0
- data/examples/example-colour.rb +62 -0
- data/examples/example-cursor.rb +22 -0
- data/examples/example-getsetsyx.rb +55 -0
- data/examples/example-hello.rb +24 -0
- data/examples/example-jruby.rb +14 -0
- data/examples/example-keys.rb +25 -0
- data/examples/example-mouse.rb +50 -0
- data/examples/example-printw-variadic.rb +15 -0
- data/examples/example-softkeys.rb +22 -0
- data/examples/example-stdscr.rb +18 -0
- data/examples/example-windows.rb +24 -0
- data/examples/example.rb +108 -0
- data/ffi-ncurses.gemspec +37 -0
- data/lib/ffi-ncurses.rb +584 -0
- data/lib/ffi-ncurses/darwin.rb +215 -0
- data/lib/ffi-ncurses/keydefs.rb +106 -0
- data/lib/ffi-ncurses/mouse.rb +146 -0
- data/lib/ffi-ncurses/winstruct.rb +177 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +50 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +300 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- metadata +109 -0
@@ -0,0 +1,215 @@
|
|
1
|
+
module FFI
|
2
|
+
module NCurses
|
3
|
+
module Darwin
|
4
|
+
NCURSES_SIZE_T = :short
|
5
|
+
NCURSES_ATTR_T = :int
|
6
|
+
NCURSES_COLOR_T = :short
|
7
|
+
NCURSES_CH_T = :short
|
8
|
+
|
9
|
+
CHTYPE = :ulong
|
10
|
+
CCHARW_MAX = 5
|
11
|
+
|
12
|
+
BOOLEAN = :uchar # sizeof(bool) == 1
|
13
|
+
|
14
|
+
WCHAR_T = :ushort
|
15
|
+
|
16
|
+
# class CCharT < FFI::Struct
|
17
|
+
# layout \
|
18
|
+
# :attr, NCURSES_ATTR_T,
|
19
|
+
# :chars, [WCHAR_T, CCHARW_MAX]
|
20
|
+
# end
|
21
|
+
|
22
|
+
class PDat < FFI::Struct
|
23
|
+
layout \
|
24
|
+
:_pad_y, NCURSES_SIZE_T,
|
25
|
+
:_pad_x, NCURSES_SIZE_T,
|
26
|
+
:_pad_top, NCURSES_SIZE_T,
|
27
|
+
:_pad_left, NCURSES_SIZE_T,
|
28
|
+
:_pad_bottom, NCURSES_SIZE_T,
|
29
|
+
:_pad_right, NCURSES_SIZE_T
|
30
|
+
end
|
31
|
+
|
32
|
+
class WinSt < FFI::Struct
|
33
|
+
layout \
|
34
|
+
:_cury, NCURSES_SIZE_T,
|
35
|
+
:_curx, NCURSES_SIZE_T,
|
36
|
+
:_maxy, NCURSES_SIZE_T,
|
37
|
+
:_maxx, NCURSES_SIZE_T,
|
38
|
+
:_begy, NCURSES_SIZE_T,
|
39
|
+
:_begx, NCURSES_SIZE_T,
|
40
|
+
:_flags, :short,
|
41
|
+
:_attrs, NCURSES_ATTR_T,
|
42
|
+
:_bkgd, CHTYPE,
|
43
|
+
:_notimeout, BOOLEAN,
|
44
|
+
:_clear, BOOLEAN,
|
45
|
+
:_leaveok, BOOLEAN,
|
46
|
+
:_scroll, BOOLEAN,
|
47
|
+
:_idlok, BOOLEAN,
|
48
|
+
:_idcok, BOOLEAN,
|
49
|
+
:_immed, BOOLEAN,
|
50
|
+
:_sync, BOOLEAN,
|
51
|
+
:_use_keypad, BOOLEAN,
|
52
|
+
:_delay, :int,
|
53
|
+
|
54
|
+
# struct ldat *_line
|
55
|
+
:_line, :pointer,
|
56
|
+
|
57
|
+
:_regtop, NCURSES_SIZE_T,
|
58
|
+
:_regbottom, NCURSES_SIZE_T,
|
59
|
+
|
60
|
+
# why x,y when everything else is y,x?
|
61
|
+
:_parx, :int,
|
62
|
+
:_pary, :int,
|
63
|
+
:_parent, :pointer # WINDOW
|
64
|
+
|
65
|
+
# don't know how to include nested Struct yet
|
66
|
+
# :_pad, PDat,
|
67
|
+
|
68
|
+
# :_yoffset, NCURSES_SIZE_T
|
69
|
+
# :_bkgrnd, CCharT
|
70
|
+
end
|
71
|
+
|
72
|
+
# translated from Mac OSX 10.4 ('Tiger') /usr/include/ncurses.h
|
73
|
+
def getattrs(win)
|
74
|
+
win_st = WinSt.new(win)
|
75
|
+
win ? win_st[:_attrs] : A_NORMAL
|
76
|
+
end
|
77
|
+
def getcurx(win)
|
78
|
+
win_st = WinSt.new(win)
|
79
|
+
win ? win_st[:_curx] : ERR
|
80
|
+
end
|
81
|
+
def getcury(win)
|
82
|
+
win_st = WinSt.new(win)
|
83
|
+
win ? win_st[:_cury] : ERR
|
84
|
+
end
|
85
|
+
def getbegx(win)
|
86
|
+
win_st = WinSt.new(win)
|
87
|
+
win ? win_st[:_begx] : ERR
|
88
|
+
end
|
89
|
+
def getbegy(win)
|
90
|
+
win_st = WinSt.new(win)
|
91
|
+
win ? win_st[:_begy] : ERR
|
92
|
+
end
|
93
|
+
def getmaxx(win)
|
94
|
+
win_st = WinSt.new(win)
|
95
|
+
win ? win_st[:_maxx] + 1 : ERR
|
96
|
+
end
|
97
|
+
def getmaxy(win)
|
98
|
+
win_st = WinSt.new(win)
|
99
|
+
win ? win_st[:_maxy] + 1 : ERR
|
100
|
+
end
|
101
|
+
def getparx(win)
|
102
|
+
win_st = WinSt.new(win)
|
103
|
+
win ? win_st[:_parx] : ERR
|
104
|
+
end
|
105
|
+
def getpary(win)
|
106
|
+
win_st = WinSt.new(win)
|
107
|
+
win ? win_st[:_pary] : ERR
|
108
|
+
end
|
109
|
+
|
110
|
+
def _win(win, member)
|
111
|
+
win && WinSt.new(win)[member]
|
112
|
+
end
|
113
|
+
private :_win
|
114
|
+
|
115
|
+
# extensions - not in X/Open
|
116
|
+
def is_cleared(win)
|
117
|
+
_win(win, :_clear)
|
118
|
+
end
|
119
|
+
def is_idcok(win)
|
120
|
+
_win(win, :_idcok)
|
121
|
+
end
|
122
|
+
def is_idlok(win)
|
123
|
+
_win(:win, :_idlok)
|
124
|
+
end
|
125
|
+
def is_immedok(win)
|
126
|
+
_win(win, :_immed)
|
127
|
+
end
|
128
|
+
def is_keypad(win)
|
129
|
+
_win(win, :_use_keypad)
|
130
|
+
end
|
131
|
+
def is_leaveok(win)
|
132
|
+
_win(win, :_leaveok) || ERR
|
133
|
+
end
|
134
|
+
def is_nodelay(win)
|
135
|
+
_win(win, :_delay) == 0 ? FFI::NCurses::TRUE : FFI::NCurses::FALSE
|
136
|
+
end
|
137
|
+
def is_notimeout(win)
|
138
|
+
_win(win, :_notimeout)
|
139
|
+
end
|
140
|
+
def is_scrollok(win)
|
141
|
+
_win(win, :_scroll)
|
142
|
+
end
|
143
|
+
def is_syncok(win)
|
144
|
+
_win(win, :_sync)
|
145
|
+
end
|
146
|
+
def wgetparent(win)
|
147
|
+
_win(win, :_parent)
|
148
|
+
end
|
149
|
+
def wgetscrreg(win, t, b)
|
150
|
+
# ((win) ? (*(t) = (win)->_regtop, *(b) = (win)->_regbottom, OK) : ERR)
|
151
|
+
# not entirely satisfactory - no error return
|
152
|
+
# should I raise an exception?
|
153
|
+
if win
|
154
|
+
win_st = WinSt.new(win)
|
155
|
+
[win_st[:_regtop], win_st[:_regbottom]]
|
156
|
+
else
|
157
|
+
#raise ArgumentError, "win is nil"
|
158
|
+
nil
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# struct _win_st
|
164
|
+
# {
|
165
|
+
# NCURSES_SIZE_T _cury, _curx; /* current cursor position */
|
166
|
+
|
167
|
+
# /* window location and size */
|
168
|
+
# NCURSES_SIZE_T _maxy, _maxx; /* maximums of x and y, NOT window size */
|
169
|
+
# NCURSES_SIZE_T _begy, _begx; /* screen coords of upper-left-hand corner */
|
170
|
+
|
171
|
+
# short _flags; /* window state flags */
|
172
|
+
|
173
|
+
# /* attribute tracking */
|
174
|
+
# attr_t _attrs; /* current attribute for non-space character */
|
175
|
+
# chtype _bkgd; /* current background char/attribute pair */
|
176
|
+
|
177
|
+
# /* option values set by user */
|
178
|
+
# bool _notimeout; /* no time out on function-key entry? */
|
179
|
+
# bool _clear; /* consider all data in the window invalid? */
|
180
|
+
# bool _leaveok; /* OK to not reset cursor on exit? */
|
181
|
+
# bool _scroll; /* OK to scroll this window? */
|
182
|
+
# bool _idlok; /* OK to use insert/delete line? */
|
183
|
+
# bool _idcok; /* OK to use insert/delete char? */
|
184
|
+
# bool _immed; /* window in immed mode? (not yet used) */
|
185
|
+
# bool _sync; /* window in sync mode? */
|
186
|
+
# bool _use_keypad; /* process function keys into KEY_ symbols? */
|
187
|
+
# int _delay; /* 0 = nodelay, <0 = blocking, >0 = delay */
|
188
|
+
|
189
|
+
# struct ldat *_line; /* the actual line data */
|
190
|
+
|
191
|
+
# /* global screen state */
|
192
|
+
# NCURSES_SIZE_T _regtop; /* top line of scrolling region */
|
193
|
+
# NCURSES_SIZE_T _regbottom; /* bottom line of scrolling region */
|
194
|
+
|
195
|
+
# /* these are used only if this is a sub-window */
|
196
|
+
# int _parx; /* x coordinate of this window in parent */
|
197
|
+
# int _pary; /* y coordinate of this window in parent */
|
198
|
+
# WINDOW *_parent; /* pointer to parent if a sub-window */
|
199
|
+
|
200
|
+
# /* these are used only if this is a pad */
|
201
|
+
# struct pdat
|
202
|
+
# {
|
203
|
+
# NCURSES_SIZE_T _pad_y, _pad_x;
|
204
|
+
# NCURSES_SIZE_T _pad_top, _pad_left;
|
205
|
+
# NCURSES_SIZE_T _pad_bottom, _pad_right;
|
206
|
+
# } _pad;
|
207
|
+
|
208
|
+
# NCURSES_SIZE_T _yoffset; /* real begy is _begy + _yoffset */
|
209
|
+
|
210
|
+
# #ifdef _XOPEN_SOURCE_EXTENDED
|
211
|
+
# cchar_t _bkgrnd; /* current background char/attribute pair */
|
212
|
+
# #endif
|
213
|
+
# };
|
214
|
+
end
|
215
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module NCurses
|
2
|
+
KEY_CODE_YES = 0400 # A wchar_t contains a key code
|
3
|
+
KEY_MIN = 0401 # Minimum curses key
|
4
|
+
KEY_BREAK = 0401 # Break key (unreliable)
|
5
|
+
KEY_SRESET = 0530 # Soft (partial) reset (unreliable)
|
6
|
+
KEY_RESET = 0531 # Reset or hard reset (unreliable)
|
7
|
+
|
8
|
+
KEY_DOWN = 0402 # down-arrow key
|
9
|
+
KEY_UP = 0403 # up-arrow key
|
10
|
+
KEY_LEFT = 0404 # left-arrow key
|
11
|
+
KEY_RIGHT = 0405 # right-arrow key
|
12
|
+
KEY_HOME = 0406 # home key
|
13
|
+
KEY_BACKSPACE = 0407 # backspace key
|
14
|
+
KEY_F0 = 0410 # Function keys. Space for 64
|
15
|
+
|
16
|
+
# Value of function key n
|
17
|
+
def KEY_F(n)
|
18
|
+
(KEY_F0+(n))
|
19
|
+
end
|
20
|
+
|
21
|
+
KEY_DL = 0510 # delete-line key
|
22
|
+
KEY_IL = 0511 # insert-line key
|
23
|
+
KEY_DC = 0512 # delete-character key
|
24
|
+
KEY_IC = 0513 # insert-character key
|
25
|
+
KEY_EIC = 0514 # sent by rmir or smir in insert mode
|
26
|
+
KEY_CLEAR = 0515 # clear-screen or erase key
|
27
|
+
KEY_EOS = 0516 # clear-to-end-of-screen key
|
28
|
+
KEY_EOL = 0517 # clear-to-end-of-line key
|
29
|
+
KEY_SF = 0520 # scroll-forward key
|
30
|
+
KEY_SR = 0521 # scroll-backward key
|
31
|
+
KEY_NPAGE = 0522 # next-page key
|
32
|
+
KEY_PPAGE = 0523 # previous-page key
|
33
|
+
KEY_STAB = 0524 # set-tab key
|
34
|
+
KEY_CTAB = 0525 # clear-tab key
|
35
|
+
KEY_CATAB = 0526 # clear-all-tabs key
|
36
|
+
KEY_ENTER = 0527 # enter/send key
|
37
|
+
KEY_PRINT = 0532 # print key
|
38
|
+
KEY_LL = 0533 # lower-left key (home down)
|
39
|
+
KEY_A1 = 0534 # upper left of keypad
|
40
|
+
KEY_A3 = 0535 # upper right of keypad
|
41
|
+
KEY_B2 = 0536 # center of keypad
|
42
|
+
KEY_C1 = 0537 # lower left of keypad
|
43
|
+
KEY_C3 = 0540 # lower right of keypad
|
44
|
+
KEY_BTAB = 0541 # back-tab key
|
45
|
+
KEY_BEG = 0542 # begin key
|
46
|
+
KEY_CANCEL = 0543 # cancel key
|
47
|
+
KEY_CLOSE = 0544 # close key
|
48
|
+
KEY_COMMAND = 0545 # command key
|
49
|
+
KEY_COPY = 0546 # copy key
|
50
|
+
KEY_CREATE = 0547 # create key
|
51
|
+
KEY_END = 0550 # end key
|
52
|
+
KEY_EXIT = 0551 # exit key
|
53
|
+
KEY_FIND = 0552 # find key
|
54
|
+
KEY_HELP = 0553 # help key
|
55
|
+
KEY_MARK = 0554 # mark key
|
56
|
+
KEY_MESSAGE = 0555 # message key
|
57
|
+
KEY_MOVE = 0556 # move key
|
58
|
+
KEY_NEXT = 0557 # next key
|
59
|
+
KEY_OPEN = 0560 # open key
|
60
|
+
KEY_OPTIONS = 0561 # options key
|
61
|
+
KEY_PREVIOUS = 0562 # previous key
|
62
|
+
KEY_REDO = 0563 # redo key
|
63
|
+
KEY_REFERENCE = 0564 # reference key
|
64
|
+
KEY_REFRESH = 0565 # refresh key
|
65
|
+
KEY_REPLACE = 0566 # replace key
|
66
|
+
KEY_RESTART = 0567 # restart key
|
67
|
+
KEY_RESUME = 0570 # resume key
|
68
|
+
KEY_SAVE = 0571 # save key
|
69
|
+
KEY_SBEG = 0572 # shifted begin key
|
70
|
+
KEY_SCANCEL = 0573 # shifted cancel key
|
71
|
+
KEY_SCOMMAND = 0574 # shifted command key
|
72
|
+
KEY_SCOPY = 0575 # shifted copy key
|
73
|
+
KEY_SCREATE = 0576 # shifted create key
|
74
|
+
KEY_SDC = 0577 # shifted delete-character key
|
75
|
+
KEY_SDL = 0600 # shifted delete-line key
|
76
|
+
KEY_SELECT = 0601 # select key
|
77
|
+
KEY_SEND = 0602 # shifted end key
|
78
|
+
KEY_SEOL = 0603 # shifted clear-to-end-of-line key
|
79
|
+
KEY_SEXIT = 0604 # shifted exit key
|
80
|
+
KEY_SFIND = 0605 # shifted find key
|
81
|
+
KEY_SHELP = 0606 # shifted help key
|
82
|
+
KEY_SHOME = 0607 # shifted home key
|
83
|
+
KEY_SIC = 0610 # shifted insert-character key
|
84
|
+
KEY_SLEFT = 0611 # shifted left-arrow key
|
85
|
+
KEY_SMESSAGE = 0612 # shifted message key
|
86
|
+
KEY_SMOVE = 0613 # shifted move key
|
87
|
+
KEY_SNEXT = 0614 # shifted next key
|
88
|
+
KEY_SOPTIONS = 0615 # shifted options key
|
89
|
+
KEY_SPREVIOUS = 0616 # shifted previous key
|
90
|
+
KEY_SPRINT = 0617 # shifted print key
|
91
|
+
KEY_SREDO = 0620 # shifted redo key
|
92
|
+
KEY_SREPLACE = 0621 # shifted replace key
|
93
|
+
KEY_SRIGHT = 0622 # shifted right-arrow key
|
94
|
+
KEY_SRSUME = 0623 # shifted resume key
|
95
|
+
KEY_SSAVE = 0624 # shifted save key
|
96
|
+
KEY_SSUSPEND = 0625 # shifted suspend key
|
97
|
+
KEY_SUNDO = 0626 # shifted undo key
|
98
|
+
KEY_SUSPEND = 0627 # suspend key
|
99
|
+
KEY_UNDO = 0630 # undo key
|
100
|
+
KEY_MOUSE = 0631 # Mouse event has occurred
|
101
|
+
KEY_RESIZE = 0632 # Terminal resize event
|
102
|
+
KEY_EVENT = 0633 # We were interrupted by an event
|
103
|
+
|
104
|
+
KEY_MAX = 0777 # Maximum key value is 0633
|
105
|
+
|
106
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'ffi-ncurses'
|
2
|
+
module FFI
|
3
|
+
module NCurses
|
4
|
+
|
5
|
+
NCURSES_MOUSE_VERSION = 1
|
6
|
+
|
7
|
+
# mouse interface
|
8
|
+
|
9
|
+
if NCURSES_MOUSE_VERSION > 1
|
10
|
+
def self.NCURSES_MOUSE_MASK(b,m)
|
11
|
+
((m) << (((b) - 1) * 5))
|
12
|
+
end
|
13
|
+
else
|
14
|
+
def self.NCURSES_MOUSE_MASK(b,m)
|
15
|
+
((m) << (((b) - 1) * 6))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
NCURSES_BUTTON_RELEASED = 001
|
20
|
+
NCURSES_BUTTON_PRESSED = 002
|
21
|
+
NCURSES_BUTTON_CLICKED = 004
|
22
|
+
NCURSES_DOUBLE_CLICKED = 010
|
23
|
+
NCURSES_TRIPLE_CLICKED = 020
|
24
|
+
NCURSES_RESERVED_EVENT = 040
|
25
|
+
|
26
|
+
# event masks
|
27
|
+
BUTTON1_RELEASED = NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_RELEASED)
|
28
|
+
BUTTON1_PRESSED = NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_PRESSED)
|
29
|
+
BUTTON1_CLICKED = NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_CLICKED)
|
30
|
+
BUTTON1_DOUBLE_CLICKED = NCURSES_MOUSE_MASK(1, NCURSES_DOUBLE_CLICKED)
|
31
|
+
BUTTON1_TRIPLE_CLICKED = NCURSES_MOUSE_MASK(1, NCURSES_TRIPLE_CLICKED)
|
32
|
+
|
33
|
+
BUTTON2_RELEASED = NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_RELEASED)
|
34
|
+
BUTTON2_PRESSED = NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_PRESSED)
|
35
|
+
BUTTON2_CLICKED = NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_CLICKED)
|
36
|
+
BUTTON2_DOUBLE_CLICKED = NCURSES_MOUSE_MASK(2, NCURSES_DOUBLE_CLICKED)
|
37
|
+
BUTTON2_TRIPLE_CLICKED = NCURSES_MOUSE_MASK(2, NCURSES_TRIPLE_CLICKED)
|
38
|
+
|
39
|
+
BUTTON3_RELEASED = NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_RELEASED)
|
40
|
+
BUTTON3_PRESSED = NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_PRESSED)
|
41
|
+
BUTTON3_CLICKED = NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_CLICKED)
|
42
|
+
BUTTON3_DOUBLE_CLICKED = NCURSES_MOUSE_MASK(3, NCURSES_DOUBLE_CLICKED)
|
43
|
+
BUTTON3_TRIPLE_CLICKED = NCURSES_MOUSE_MASK(3, NCURSES_TRIPLE_CLICKED)
|
44
|
+
|
45
|
+
BUTTON4_RELEASED = NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_RELEASED)
|
46
|
+
BUTTON4_PRESSED = NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_PRESSED)
|
47
|
+
BUTTON4_CLICKED = NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_CLICKED)
|
48
|
+
BUTTON4_DOUBLE_CLICKED = NCURSES_MOUSE_MASK(4, NCURSES_DOUBLE_CLICKED)
|
49
|
+
BUTTON4_TRIPLE_CLICKED = NCURSES_MOUSE_MASK(4, NCURSES_TRIPLE_CLICKED)
|
50
|
+
|
51
|
+
#
|
52
|
+
# In 32 bits the version-1 scheme does not provide enough space for a 5th
|
53
|
+
# button, unless we choose to change the ABI by omitting the reserved-events.
|
54
|
+
#
|
55
|
+
|
56
|
+
if NCURSES_MOUSE_VERSION > 1
|
57
|
+
|
58
|
+
BUTTON5_RELEASED = NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_RELEASED)
|
59
|
+
BUTTON5_PRESSED = NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_PRESSED)
|
60
|
+
BUTTON5_CLICKED = NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_CLICKED)
|
61
|
+
BUTTON5_DOUBLE_CLICKED = NCURSES_MOUSE_MASK(5, NCURSES_DOUBLE_CLICKED)
|
62
|
+
BUTTON5_TRIPLE_CLICKED = NCURSES_MOUSE_MASK(5, NCURSES_TRIPLE_CLICKED)
|
63
|
+
|
64
|
+
BUTTON_CTRL = NCURSES_MOUSE_MASK(6, 0001)
|
65
|
+
BUTTON_SHIFT = NCURSES_MOUSE_MASK(6, 0002)
|
66
|
+
BUTTON_ALT = NCURSES_MOUSE_MASK(6, 0004)
|
67
|
+
REPORT_MOUSE_POSITION = NCURSES_MOUSE_MASK(6, 0010)
|
68
|
+
|
69
|
+
else
|
70
|
+
|
71
|
+
BUTTON1_RESERVED_EVENT = NCURSES_MOUSE_MASK(1, NCURSES_RESERVED_EVENT)
|
72
|
+
BUTTON2_RESERVED_EVENT = NCURSES_MOUSE_MASK(2, NCURSES_RESERVED_EVENT)
|
73
|
+
BUTTON3_RESERVED_EVENT = NCURSES_MOUSE_MASK(3, NCURSES_RESERVED_EVENT)
|
74
|
+
BUTTON4_RESERVED_EVENT = NCURSES_MOUSE_MASK(4, NCURSES_RESERVED_EVENT)
|
75
|
+
|
76
|
+
BUTTON_CTRL = NCURSES_MOUSE_MASK(5, 0001)
|
77
|
+
BUTTON_SHIFT = NCURSES_MOUSE_MASK(5, 0002)
|
78
|
+
BUTTON_ALT = NCURSES_MOUSE_MASK(5, 0004)
|
79
|
+
REPORT_MOUSE_POSITION = NCURSES_MOUSE_MASK(5, 0010)
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
ALL_MOUSE_EVENTS = (REPORT_MOUSE_POSITION - 1)
|
84
|
+
|
85
|
+
class << self
|
86
|
+
# macros to extract single event-bits from masks
|
87
|
+
def BUTTON_RELEASE(e, x)
|
88
|
+
((e) & (001 << (6 * ((x) - 1))))
|
89
|
+
end
|
90
|
+
def BUTTON_PRESS(e, x)
|
91
|
+
((e) & (002 << (6 * ((x) - 1))))
|
92
|
+
end
|
93
|
+
def BUTTON_CLICK(e, x)
|
94
|
+
((e) & (004 << (6 * ((x) - 1))))
|
95
|
+
end
|
96
|
+
def BUTTON_DOUBLE_CLICK(e, x)
|
97
|
+
((e) & (010 << (6 * ((x) - 1))))
|
98
|
+
end
|
99
|
+
def BUTTON_TRIPLE_CLICK(e, x)
|
100
|
+
((e) & (020 << (6 * ((x) - 1))))
|
101
|
+
end
|
102
|
+
def BUTTON_RESERVED_EVENT(e, x)
|
103
|
+
((e) & (040 << (6 * ((x) - 1))))
|
104
|
+
end
|
105
|
+
|
106
|
+
# if NCURSES_MOUSE_VERSION > 1
|
107
|
+
# def NCURSES_MOUSE_MASK(b,m)
|
108
|
+
# ((m) << (((b) - 1) * 5))
|
109
|
+
# end
|
110
|
+
# else
|
111
|
+
# def NCURSES_MOUSE_MASK(b,m)
|
112
|
+
# ((m) << (((b) - 1) * 6))
|
113
|
+
# end
|
114
|
+
# end
|
115
|
+
end
|
116
|
+
|
117
|
+
# def mouse_trafo(y, x, to_screen)
|
118
|
+
# end
|
119
|
+
|
120
|
+
KEY_MOUSE = 0631 # Mouse event has occurred
|
121
|
+
|
122
|
+
#FFI.add_typedef :ulong, :mmask_t
|
123
|
+
class MEVENT < FFI::Struct
|
124
|
+
layout :id, :short,
|
125
|
+
:x, :int,
|
126
|
+
:y, :int,
|
127
|
+
:z, :int,
|
128
|
+
# :bstate, :mmask_t
|
129
|
+
:bstate, :ulong
|
130
|
+
end
|
131
|
+
|
132
|
+
functions =
|
133
|
+
[
|
134
|
+
[:getmouse, [MEVENT], :int],
|
135
|
+
[:ungetmouse, [MEVENT], :int],
|
136
|
+
]
|
137
|
+
|
138
|
+
functions.each do |function|
|
139
|
+
begin
|
140
|
+
attach_function(*function)
|
141
|
+
rescue Object => e
|
142
|
+
(@unattached_functions ||= []) << function
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|