ncurses-ruby 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,49 @@
1
+ /*
2
+ * This is a curses menu wrapper as part of ncurses-ruby.
3
+ * It borrows heavily from form_wrap.h.
4
+ * Contributed by Earle Clubb <eclubb@valcom.com>
5
+ * Valcom Inc. <http://www.valcom.com>
6
+ * Copyright 2007
7
+ *
8
+ * This module is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU Lesser General Public
10
+ * License as published by the Free Software Foundation; either
11
+ * version 2 of the License, or (at your option) any later version.
12
+ *
13
+ * This module is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
+ * Lesser General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU Lesser General Public
19
+ * License along with this module; if not, write to the Free Software
20
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
+ *
22
+ */
23
+
24
+ #if !defined(MENU_HH) && defined(HAVE_MENU_H)
25
+ #define MENU_HH
26
+
27
+ #include <menu.h>
28
+ #include <ruby.h>
29
+
30
+ extern VALUE mMenu;
31
+ extern VALUE cITEM;
32
+ extern VALUE cMENU;
33
+
34
+ #define MENU_DEF_CONST(name) \
35
+ rb_define_const(mMenu, #name, INT2NUM(name));
36
+
37
+ #define MENU_SNG_FUNC(name, nargs) \
38
+ rb_define_singleton_method(mMenu, #name, &rbncurs_m_ ## name, nargs)
39
+
40
+ #define RB_CLASS_METH(class, alt_name, name, nargs) \
41
+ rb_define_method(class, #name, (&rbncurs_c_ ## name), nargs); \
42
+ if (alt_name != NULL) \
43
+ rb_define_method(class, alt_name, (&rbncurs_c_ ## name), nargs); \
44
+
45
+ //void init_menu_req_constants(void);
46
+ //void init_menu_opts_constants(void);
47
+ void init_menu(void);
48
+
49
+ #endif
@@ -0,0 +1,2739 @@
1
+ /*
2
+ * ncurses-ruby is a ruby module for accessing the FSF's ncurses library
3
+ * (C) 2002, 2003, 2004 Tobias Peters <t-peters@berlios.de>
4
+ * (C) 2004 Simon Kaczor <skaczor@cox.net>
5
+ * (C) 2005 2006 Tobias Herzke
6
+ *
7
+ * This module is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2 of the License, or (at your option) any later version.
11
+ *
12
+ * This module is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with this module; if not, write to the Free Software
19
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ *
21
+ * $Id: ncurses_wrap.c,v 1.13 2006/06/19 09:46:59 t-peters Exp $
22
+ *
23
+ * This file was adapted from the original ncurses header file which
24
+ * has the following copyright statements:
25
+ */
26
+
27
+ /****************************************************************************
28
+ * Copyright (c) 1998 Free Software Foundation, Inc. *
29
+ * *
30
+ * Permission is hereby granted, free of charge, to any person obtaining a *
31
+ * copy of this software and associated documentation files (the *
32
+ * "Software"), to deal in the Software without restriction, including *
33
+ * without limitation the rights to use, copy, modify, merge, publish, *
34
+ * distribute, distribute with modifications, sublicense, and/or sell *
35
+ * copies of the Software, and to permit persons to whom the Software is *
36
+ * furnished to do so, subject to the following conditions: *
37
+ * *
38
+ * The above copyright notice and this permission notice shall be included *
39
+ * in all copies or substantial portions of the Software. *
40
+ * *
41
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
42
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
43
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
44
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
45
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
46
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
47
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
48
+ * *
49
+ * Except as contained in this notice, the name(s) of the above copyright *
50
+ * holders shall not be used in advertising or otherwise to promote the *
51
+ * sale, use or other dealings in this Software without prior written *
52
+ * authorization. *
53
+ ****************************************************************************/
54
+
55
+ /****************************************************************************
56
+ * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
57
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
58
+ ****************************************************************************/
59
+
60
+ /*
61
+ NOT IMPLEMENTED:
62
+ - terminfo, termcap-functions
63
+ - rippoffline
64
+ - v*printw functions (but normal printw functions are supported!)
65
+ */
66
+
67
+ #include "ncurses_wrap.h"
68
+
69
+ VALUE mNcurses; /* module Ncurses */
70
+ VALUE cWINDOW; /* class Ncurses::WINDOW */
71
+ VALUE cSCREEN; /* class Ncurses::SCREEN */
72
+ VALUE eNcurses; /* Ncurses::Exception thrown by this extension */
73
+
74
+ static void Init_ncurses_full(void);
75
+
76
+ static
77
+ void
78
+ init_constants_1(void)
79
+ {
80
+ #ifdef CURSES
81
+ rb_define_const(mNcurses, "CURSES", INT2NUM((int)(CURSES)));
82
+ #endif
83
+ #ifdef CURSES_H
84
+ rb_define_const(mNcurses, "CURSES_H", INT2NUM((int)(CURSES_H)));
85
+ #endif
86
+ #ifdef NCURSES_VERSION_MAJOR
87
+ rb_define_const(mNcurses, "NCURSES_VERSION_MAJOR",
88
+ INT2NUM((int)(NCURSES_VERSION_MAJOR)));
89
+ #endif
90
+ #ifdef NCURSES_VERSION_MINOR
91
+ rb_define_const(mNcurses, "NCURSES_VERSION_MINOR",
92
+ INT2NUM((int)(NCURSES_VERSION_MINOR)));
93
+ #endif
94
+ #ifdef NCURSES_VERSION_PATCH
95
+ rb_define_const(mNcurses, "NCURSES_VERSION_PATCH",
96
+ INT2NUM((int)(NCURSES_VERSION_PATCH)));
97
+ #endif
98
+ #ifdef NCURSES_VERSION
99
+ rb_define_const(mNcurses, "NCURSES_VERSION",
100
+ rb_str_new2(NCURSES_VERSION));
101
+ #endif
102
+
103
+ /* attributes */
104
+ #ifdef WA_ATTRIBUTES
105
+ rb_define_const(mNcurses, "WA_ATTRIBUTES", INT2NUM(WA_ATTRIBUTES));
106
+ rb_define_const(mNcurses, "WA_NORMAL", INT2NUM(WA_NORMAL));
107
+ rb_define_const(mNcurses, "WA_STANDOUT", INT2NUM(WA_STANDOUT));
108
+ rb_define_const(mNcurses, "WA_UNDERLINE", INT2NUM(WA_UNDERLINE));
109
+ rb_define_const(mNcurses, "WA_REVERSE", INT2NUM(WA_REVERSE));
110
+ rb_define_const(mNcurses, "WA_BLINK", INT2NUM(WA_BLINK));
111
+ rb_define_const(mNcurses, "WA_DIM", INT2NUM(WA_DIM));
112
+ rb_define_const(mNcurses, "WA_BOLD", INT2NUM(WA_BOLD));
113
+ rb_define_const(mNcurses, "WA_ALTCHARSET", INT2NUM(WA_ALTCHARSET));
114
+ rb_define_const(mNcurses, "WA_INVIS", INT2NUM(WA_INVIS));
115
+ rb_define_const(mNcurses, "WA_PROTECT", INT2NUM(WA_PROTECT));
116
+ rb_define_const(mNcurses, "WA_HORIZONTAL", INT2NUM(WA_HORIZONTAL));
117
+ rb_define_const(mNcurses, "WA_LEFT", INT2NUM(WA_LEFT));
118
+ rb_define_const(mNcurses, "WA_LOW", INT2NUM(WA_LOW));
119
+ rb_define_const(mNcurses, "WA_RIGHT", INT2NUM(WA_RIGHT));
120
+ rb_define_const(mNcurses, "WA_TOP", INT2NUM(WA_TOP));
121
+ rb_define_const(mNcurses, "WA_VERTICAL", INT2NUM(WA_VERTICAL));
122
+ #endif
123
+ }
124
+
125
+ static VALUE rbncurs_COLORS()
126
+ {return INT2NUM(COLORS);}
127
+ static VALUE rbncurs_COLOR_PAIRS()
128
+ {return INT2NUM(COLOR_PAIRS);}
129
+
130
+ static
131
+ void
132
+ init_globals_1(void)
133
+ {
134
+ /* colors */
135
+ NCFUNC(COLORS, 0);
136
+ NCFUNC(COLOR_PAIRS, 0);
137
+ }
138
+ static
139
+ void
140
+ init_constants_2(void)
141
+ {
142
+ rb_define_const(mNcurses, "COLOR_BLACK", INT2NUM(COLOR_BLACK));
143
+ rb_define_const(mNcurses, "COLOR_RED", INT2NUM(COLOR_RED));
144
+ rb_define_const(mNcurses, "COLOR_GREEN", INT2NUM(COLOR_GREEN));
145
+ rb_define_const(mNcurses, "COLOR_YELLOW", INT2NUM(COLOR_YELLOW));
146
+ rb_define_const(mNcurses, "COLOR_BLUE", INT2NUM(COLOR_BLUE));
147
+ rb_define_const(mNcurses, "COLOR_MAGENTA", INT2NUM(COLOR_MAGENTA));
148
+ rb_define_const(mNcurses, "COLOR_CYAN", INT2NUM(COLOR_CYAN));
149
+ rb_define_const(mNcurses, "COLOR_WHITE", INT2NUM(COLOR_WHITE));
150
+
151
+ rb_define_const(mNcurses, "ERR", INT2NUM(ERR));
152
+ rb_define_const(mNcurses, "OK", INT2NUM(OK));
153
+
154
+ /* values for the _flags member */
155
+ #ifdef _SUBWIN
156
+ rb_define_const(mNcurses, "SUBWIN", INT2NUM(_SUBWIN));
157
+ #endif
158
+ #ifdef _ENDLINE
159
+ rb_define_const(mNcurses, "ENDLINE", INT2NUM(_ENDLINE));
160
+ #endif
161
+ #ifdef _FULLWIN
162
+ rb_define_const(mNcurses, "FULLWIN", INT2NUM(_FULLWIN));
163
+ #endif
164
+ #ifdef _SCROLLWIN
165
+ rb_define_const(mNcurses, "SCROLLWIN", INT2NUM(_SCROLLWIN));
166
+ #endif
167
+ #ifdef _ISPAD
168
+ rb_define_const(mNcurses, "ISPAD", INT2NUM(_ISPAD));
169
+ #endif
170
+ #ifdef _HASMOVED
171
+ rb_define_const(mNcurses, "HASMOVED", INT2NUM(_HASMOVED));
172
+ #endif
173
+ #ifdef _WRAPPED
174
+ rb_define_const(mNcurses, "WRAPPED", INT2NUM(_WRAPPED));
175
+ #endif
176
+
177
+ #ifdef _NOCHANGE
178
+ /*
179
+ * this value is used in the firstchar and lastchar fields to mark
180
+ * unchanged lines
181
+ */
182
+ rb_define_const(mNcurses, "NOCHANGE", INT2NUM(_NOCHANGE));
183
+ #endif
184
+ #ifdef _NEWINDEX
185
+ /*
186
+ * this value is used in the oldindex field to mark lines created by
187
+ * insertions and scrolls.
188
+ */
189
+ rb_define_const(mNcurses, "NEWINDEX", INT2NUM(_NEWINDEX));
190
+ #endif
191
+ #ifdef CCHARW_MAX
192
+ rb_define_const(mNcurses, "CCHARW_MAX", INT2NUM(CCHARW_MAX));
193
+ #endif
194
+ }
195
+
196
+ VALUE wrap_window(WINDOW* window)
197
+ {
198
+ if (window == 0) return Qnil;
199
+ {
200
+ VALUE windows_hash = rb_iv_get(mNcurses, "@windows_hash");
201
+ VALUE window_adress = INT2NUM((long)(window));
202
+ VALUE rb_window = rb_hash_aref(windows_hash, window_adress);
203
+ if (rb_window == Qnil) {
204
+ rb_window = Data_Wrap_Struct(cWINDOW, 0, 0, window);
205
+ rb_iv_set(rb_window, "@destroyed", Qfalse);
206
+ rb_hash_aset(windows_hash, window_adress, rb_window);
207
+ }
208
+ return rb_window;
209
+ }
210
+ }
211
+ WINDOW* get_window(VALUE rb_window)
212
+ {
213
+ WINDOW* window;
214
+ if (rb_window == Qnil) return 0;
215
+ if (rb_iv_get(rb_window, "@destroyed") == Qtrue) {
216
+ rb_raise(eNcurses, "Attempt to access a destroyed window");
217
+ return 0;
218
+ }
219
+ Data_Get_Struct(rb_window, WINDOW, window);
220
+ return window;
221
+ }
222
+ static VALUE rbncurs_delwin(VALUE dummy, VALUE arg1) {
223
+ VALUE windows_hash = rb_iv_get(mNcurses, "@windows_hash");
224
+ WINDOW* window = get_window(arg1);
225
+ VALUE window_adress = INT2NUM((long)(window));
226
+ rb_funcall(windows_hash, rb_intern("delete"), 1, window_adress);
227
+ rb_iv_set(arg1, "@destroyed", Qtrue);
228
+ return INT2NUM(delwin(window));
229
+ }
230
+
231
+ static VALUE wrap_screen(SCREEN* screen)
232
+ {
233
+ if (screen == 0) return Qnil;
234
+ {
235
+ VALUE screens_hash = rb_iv_get(mNcurses, "@screens_hash");
236
+ VALUE screen_adress = INT2NUM((long)(screen));
237
+ VALUE rb_screen = rb_hash_aref(screens_hash, screen_adress);
238
+ if (rb_screen == Qnil) {
239
+ rb_screen = Data_Wrap_Struct(cSCREEN, 0, 0, screen);
240
+ rb_iv_set(rb_screen, "@destroyed", Qfalse);
241
+ rb_hash_aset(screens_hash, screen_adress, rb_screen);
242
+ }
243
+ return rb_screen;
244
+ }
245
+ }
246
+ static SCREEN* get_screen(VALUE rb_screen)
247
+ {
248
+ SCREEN* screen;
249
+ if (rb_screen == Qnil) return 0;
250
+ if (rb_iv_get(rb_screen, "@destroyed") == Qtrue) {
251
+ rb_raise(eNcurses, "Attempt to access a destroyed screen");
252
+ return 0;
253
+ }
254
+ Data_Get_Struct(rb_screen, SCREEN, screen);
255
+ return screen;
256
+ }
257
+ #ifdef HAVE_DELSCREEN
258
+ static VALUE rbncurs_delscreen(VALUE dummy, VALUE arg1) {
259
+ VALUE screens_hash = rb_iv_get(mNcurses, "@screens_hash");
260
+ SCREEN* screen = get_screen(arg1);
261
+ VALUE screen_adress = INT2NUM((long)(screen));
262
+ rb_funcall(screens_hash, rb_intern("delete"), 1, screen_adress);
263
+ rb_iv_set(arg1, "@destroyed", Qtrue);
264
+ delscreen(screen);
265
+ return Qnil;
266
+ }
267
+ #endif
268
+ static VALUE rbncurs_winchnstr(VALUE dummy, VALUE rb_win, VALUE rb_str, VALUE rb_n)
269
+ {
270
+ if (rb_obj_is_instance_of(rb_str, rb_cArray) != Qtrue) {
271
+ rb_raise(rb_eArgError, "2nd argument must be an empty Array");
272
+ return Qnil;
273
+ }
274
+
275
+ {
276
+ WINDOW * window = get_window(rb_win);
277
+ int n = NUM2INT(rb_n);
278
+ chtype * str = ALLOC_N(chtype, n + 1);
279
+ int return_value;
280
+ return_value = winchnstr(window, str, n);
281
+ if (return_value != ERR) {
282
+ int i;
283
+ for (i = 0; i < return_value; ++i) {
284
+ rb_ary_push(rb_str, INT2NUM(str[i]));
285
+ }
286
+ }
287
+ xfree(str);
288
+ return INT2NUM(return_value);
289
+ }
290
+ }
291
+ static VALUE rbncurs_wgetnstr(VALUE dummy, VALUE rb_win, VALUE rb_chstr, VALUE rb_n)
292
+ {
293
+ WINDOW * window = get_window(rb_win);
294
+ int n = NUM2INT(rb_n);
295
+ char * str = ALLOC_N(char, n + 1);
296
+ int return_value;
297
+ return_value = wgetnstr(window, str, n);
298
+ if (return_value != ERR) {
299
+ rb_str_cat2(rb_chstr, str);
300
+ }
301
+ xfree(str);
302
+ return INT2NUM(return_value);
303
+ }
304
+ static VALUE rbncurs_winnstr(VALUE dummy, VALUE rb_win, VALUE rb_chstr, VALUE rb_n)
305
+ {
306
+ WINDOW * window = get_window(rb_win);
307
+ int n = NUM2INT(rb_n);
308
+ char* str = ALLOC_N(char, n + 1);
309
+ int return_value;
310
+ return_value = winnstr(window, str, n);
311
+ if (return_value != ERR) {
312
+ rb_str_cat(rb_chstr, str, return_value);
313
+ }
314
+ xfree(str);
315
+ return INT2NUM(return_value);
316
+ }
317
+
318
+ #ifdef HAVE_PANEL_H
319
+ #include "panel_wrap.h" /* needs access to mNcurses, wrap_window, get_window */
320
+ #endif
321
+
322
+ #ifdef HAVE_FORM_H
323
+ #include "form_wrap.h" /* needs init_form */
324
+ #endif
325
+
326
+ #ifdef HAVE_MENU_H
327
+ #include "menu_wrap.h" /* needs init_menu */
328
+ #endif
329
+
330
+ static
331
+ void
332
+ init_functions_0(void)
333
+ {
334
+ #ifdef HAVE_DELSCREEN
335
+ NCFUNC(delscreen, 1);
336
+ #endif
337
+ NCFUNC(delwin, 1);
338
+ NCFUNC(winchnstr, 3);
339
+ NCFUNC(winnstr, 3);
340
+ NCFUNC(wgetnstr, 3);
341
+ }
342
+
343
+ static VALUE get_stdscr()
344
+ {
345
+ VALUE rb_stdscr = rb_iv_get(mNcurses, "@stdscr");
346
+ if (rb_stdscr == Qnil) {
347
+ rb_stdscr = wrap_window(stdscr);
348
+ rb_iv_set(mNcurses, "@stdscr", rb_stdscr);
349
+ }
350
+ return rb_stdscr;
351
+ }
352
+ static VALUE get_curscr()
353
+ {
354
+ VALUE rb_curscr = rb_iv_get(mNcurses, "@curscr");
355
+ if (rb_curscr == Qnil) {
356
+ rb_curscr = wrap_window(curscr);
357
+ rb_iv_set(mNcurses, "@curscr", rb_curscr);
358
+ }
359
+ return rb_curscr;
360
+ }
361
+ #ifdef HAVE_NEWSCR
362
+ static VALUE get_newscr()
363
+ {
364
+ VALUE rb_newscr = rb_iv_get(mNcurses, "@newscr");
365
+ if (rb_newscr == Qnil) {
366
+ rb_newscr = wrap_window(newscr);
367
+ rb_iv_set(mNcurses, "@newscr", rb_newscr);
368
+ }
369
+ return rb_newscr;
370
+ }
371
+ #endif
372
+ static VALUE get_LINES() {return INT2NUM(LINES);}
373
+ static VALUE get_COLS() {return INT2NUM(COLS);}
374
+ #ifdef HAVE_TABSIZE
375
+ static VALUE get_TABSIZE() {return INT2NUM(TABSIZE);}
376
+ #endif
377
+ #ifdef HAVE_ESCDELAY
378
+ /* This global was an undocumented feature under AIX curses. */
379
+ /* ESC expire time in milliseconds */
380
+ static VALUE get_ESCDELAY(){return INT2NUM(ESCDELAY);}
381
+ static VALUE set_ESCDELAY(VALUE dummy, VALUE new_delay)
382
+ {
383
+ ESCDELAY=NUM2INT(new_delay);
384
+ return INT2NUM(ESCDELAY);
385
+ }
386
+ #endif
387
+
388
+ /* This global is wrapper-specific. It denotes the interval after which the
389
+ terminal is periodically checked for having resized or not. */
390
+ /* time in milliseconds */
391
+ static VALUE get_RESIZEDELAY(){return rb_iv_get(mNcurses, "@resize_delay");}
392
+ static VALUE set_RESIZEDELAY(VALUE dummy, VALUE rb_new_delay)
393
+ {
394
+ int c_new_delay = NUM2INT(rb_new_delay);
395
+ if (c_new_delay <= 0)
396
+ rb_raise(rb_eArgError, "delay must be > 0");
397
+ rb_new_delay = INT2NUM(c_new_delay);
398
+ rb_iv_set(mNcurses, "@resize_delay", rb_new_delay);
399
+ return rb_new_delay ;
400
+ }
401
+
402
+ static
403
+ void
404
+ init_globals_2(void)
405
+ {
406
+ rb_iv_set(mNcurses, "@stdscr", Qnil);
407
+ rb_iv_set(mNcurses, "@curscr", Qnil);
408
+ rb_iv_set(mNcurses, "@newscr", Qnil);
409
+
410
+ rb_define_module_function(mNcurses, "stdscr",
411
+ (&get_stdscr), 0);
412
+ rb_define_module_function(mNcurses, "curscr",
413
+ (&get_curscr), 0);
414
+ #ifdef HAVE_NEWSCR
415
+ rb_define_module_function(mNcurses, "newscr",
416
+ (&get_newscr), 0);
417
+ #endif
418
+ rb_define_module_function(mNcurses, "LINES",
419
+ (&get_LINES), 0);
420
+ rb_define_module_function(mNcurses, "COLS",
421
+ (&get_COLS), 0);
422
+ #ifdef HAVE_TABSIZE
423
+ rb_define_module_function(mNcurses, "TABSIZE",
424
+ (&get_TABSIZE),0);
425
+ #endif
426
+ #ifdef HAVE_ESCDELAY
427
+ rb_define_module_function(mNcurses, "ESCDELAY",
428
+ (&get_ESCDELAY),0);
429
+ rb_define_module_function(mNcurses, "ESCDELAY=",
430
+ (&set_ESCDELAY),1);
431
+ #endif
432
+ /* The maximum delay before screen resize is detected, in milliseconds */
433
+ rb_iv_set(mNcurses, "@resize_delay", INT2FIX(333));
434
+ rb_define_module_function(mNcurses, "RESIZEDELAY",
435
+ (&get_RESIZEDELAY),0);
436
+ rb_define_module_function(mNcurses, "RESIZEDELAY=",
437
+ (&set_RESIZEDELAY),1);
438
+ }
439
+ #ifdef HAVE_KEYBOUND
440
+ static VALUE rbncurs_keybound(VALUE dummy, VALUE keycode, VALUE count)
441
+ {
442
+ char * str = keybound(NUM2INT(keycode), NUM2INT(count));
443
+ VALUE rb_str = Qnil;
444
+ if (str) {
445
+ rb_str = rb_str_new2(str);
446
+ free(str);
447
+ }
448
+ return rb_str;
449
+ }
450
+ #endif
451
+ #ifdef HAVE_CURSES_VERSION
452
+ static VALUE rbncurs_curses_version(){return rb_str_new2(curses_version());}
453
+ #endif
454
+ #ifdef HAVE_DEFINE_KEY
455
+ static VALUE rbncurs_define_key(VALUE dummy, VALUE definition, VALUE keycode)
456
+ {
457
+ return INT2NUM(define_key((definition != Qnil)
458
+ ? StringValuePtr(definition)
459
+ : (char*)(NULL),
460
+ NUM2INT(keycode)));
461
+ }
462
+ #endif
463
+ #ifdef HAVE_KEYOK
464
+ static VALUE rbncurs_keyok(VALUE dummy, VALUE keycode, VALUE enable)
465
+ {
466
+ return INT2NUM(keyok(NUM2INT(keycode), RTEST(enable)));
467
+ }
468
+ #endif
469
+ #ifdef HAVE_RESIZETERM
470
+ static VALUE rbncurs_resizeterm(VALUE dummy, VALUE lines, VALUE columns)
471
+ {
472
+ return INT2NUM(resizeterm(NUM2INT(lines), NUM2INT(columns)));
473
+ }
474
+ #endif
475
+ #ifdef HAVE_USE_DEFAULT_COLORS
476
+ static VALUE rbncurs_use_default_colors()
477
+ {
478
+ return INT2NUM(use_default_colors());
479
+ }
480
+ #endif
481
+ #ifdef HAVE_USE_EXTENDED_NAMES
482
+ static VALUE rbncurs_use_extended_names(VALUE dummy, VALUE boolean)
483
+ {return INT2NUM(use_extended_names(RTEST(boolean)));}
484
+ #endif
485
+ #ifdef HAVE_WRESIZE
486
+ static VALUE rbncurs_wresize(VALUE dummy, VALUE win, VALUE lines, VALUE columns)
487
+ {
488
+ return INT2NUM(wresize(get_window(win), NUM2INT(lines), NUM2INT(columns)));
489
+ }
490
+ #endif
491
+ static
492
+ void
493
+ init_functions_1(void)
494
+ {
495
+ #ifdef HAVE_KEYBOUND
496
+ NCFUNC(keybound, 2);
497
+ #endif
498
+ #ifdef HAVE_CURSES_VERSION
499
+ NCFUNC(curses_version, 0);
500
+ #endif
501
+ #ifdef HAVE_DEFINE_KEY
502
+ NCFUNC(define_key, 2);
503
+ #endif
504
+ #ifdef HAVE_KEYOK
505
+ NCFUNC(keyok, 2);
506
+ #endif
507
+ #ifdef HAVE_RESIZETERM
508
+ NCFUNC(resizeterm, 2);
509
+ #endif
510
+ #ifdef HAVE_USE_DEFAULT_COLORS
511
+ NCFUNC(use_default_colors, 0);
512
+ #endif
513
+ #ifdef HAVE_USE_EXTENDED_NAMES
514
+ NCFUNC(use_extended_names, 1);
515
+ #endif
516
+ #ifdef HAVE_WRESIZE
517
+ NCFUNC(wresize, 3);
518
+ #endif
519
+ }
520
+ /* FIXME: what's this? */
521
+ /* extern char ttytype[]; */ /* needed for backward compatibility */
522
+
523
+
524
+ /* copy a chstr from ruby to c */
525
+ static chtype * RB2CHSTR(VALUE array)
526
+ {
527
+ if (rb_obj_is_instance_of(array, rb_cArray) != Qtrue) {
528
+ rb_raise(rb_eArgError,
529
+ "chtype string argument must be an empty Array");
530
+ return NULL;
531
+ }
532
+ {
533
+ size_t string_length =
534
+ NUM2ULONG(rb_funcall(array, rb_intern("size"), 0));
535
+ size_t vector_length =
536
+ string_length + 1; /* for terminating 0 */
537
+ chtype * chstr = ALLOC_N(chtype, vector_length);
538
+ unsigned long i;
539
+ for (i = 0; i < string_length; ++i) {
540
+ chstr[i] = NUM2ULONG(rb_ary_entry(array, i));
541
+ }
542
+ chstr[string_length] = 0;
543
+ return chstr;
544
+ }
545
+ }
546
+
547
+ static VALUE rbncurs_addch(VALUE dummy, VALUE arg1) {
548
+ return INT2NUM(addch(NUM2ULONG(arg1)));
549
+ }
550
+ static VALUE rbncurs_addchnstr(VALUE dummy, VALUE arg1, VALUE arg2) {
551
+ chtype * chstr = RB2CHSTR(arg1);
552
+ VALUE return_value = INT2NUM(addchnstr(chstr, NUM2INT(arg2)));
553
+ xfree(chstr);
554
+ return return_value;
555
+ }
556
+ static VALUE rbncurs_addchstr(VALUE dummy, VALUE arg1) {
557
+ chtype * chstr = RB2CHSTR(arg1);
558
+ VALUE return_value = INT2NUM(addchstr(chstr));
559
+ xfree(chstr);
560
+ return return_value;
561
+ }
562
+ static VALUE rbncurs_addnstr(VALUE dummy, VALUE arg1, VALUE arg2) {
563
+ return INT2NUM(addnstr(StringValuePtr(arg1), NUM2INT(arg2)));
564
+ }
565
+ static VALUE rbncurs_addstr(VALUE dummy, VALUE arg1) {
566
+ return INT2NUM(addstr(StringValuePtr(arg1)));
567
+ }
568
+ static VALUE rbncurs_attroff(VALUE dummy, VALUE arg1) {
569
+ return INT2NUM(attroff(NUM2ULONG(arg1)));
570
+ }
571
+ static VALUE rbncurs_attron(VALUE dummy, VALUE arg1) {
572
+ return INT2NUM(attron(NUM2ULONG(arg1)));
573
+ }
574
+ static VALUE rbncurs_attrset(VALUE dummy, VALUE arg1) {
575
+ return INT2NUM(attrset(NUM2ULONG(arg1)));
576
+ }
577
+ #if defined(NCURSES_VERSION_MAJOR) && NCURSES_VERSION_MAJOR > 4
578
+ #ifdef HAVE_ATTR_OFF
579
+ static VALUE rbncurs_attr_off(VALUE dummy, VALUE arg1, VALUE arg2) {
580
+ return INT2NUM(attr_off(NUM2ULONG(arg1), ((void)(arg2),NULL)));
581
+ }
582
+ #endif
583
+ #ifdef HAVE_ATTR_ON
584
+ static VALUE rbncurs_attr_on(VALUE dummy, VALUE arg1, VALUE arg2) {
585
+ return INT2NUM(attr_on(NUM2ULONG(arg1), ((void)(arg2),NULL)));
586
+ }
587
+ #endif
588
+ #ifdef HAVE_ATTR_SET
589
+ static VALUE rbncurs_attr_set(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
590
+ return INT2NUM(attr_set(NUM2ULONG(arg1), NUM2INT(arg2), ((void)(arg3),NULL)));
591
+ }
592
+ #endif
593
+ #if defined(HAVE_SLK_ATTR_OFF) || defined(slk_attr_off)
594
+ static VALUE rbncurs_slk_attr_off(VALUE dummy, VALUE arg1, VALUE arg2) {
595
+ return INT2NUM(slk_attr_off(NUM2ULONG(arg1), ((void)(arg2),NULL)));
596
+ }
597
+ #endif
598
+ #if defined(HAVE_SLK_ATTR_ON) || defined(slk_attr_on)
599
+ static VALUE rbncurs_slk_attr_on(VALUE dummy, VALUE arg1, VALUE arg2) {
600
+ return INT2NUM(slk_attr_on(NUM2ULONG(arg1), ((void)(arg2),NULL)));
601
+ }
602
+ #endif
603
+ #ifdef HAVE_SLK_ATTR_SET
604
+ static VALUE rbncurs_slk_attr_set(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
605
+ return INT2NUM(slk_attr_set(NUM2ULONG(arg1), NUM2INT(arg2), ((void)(arg3),NULL)));
606
+ }
607
+ #endif
608
+ #ifdef HAVE_WATTR_ON
609
+ static VALUE rbncurs_wattr_on(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
610
+ return INT2NUM(wattr_on(get_window(arg1), NUM2ULONG(arg2), ((void)(arg3),NULL)));
611
+ }
612
+ #endif
613
+ #ifdef HAVE_WATTR_OFF
614
+ static VALUE rbncurs_wattr_off(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
615
+ return INT2NUM(wattr_off(get_window(arg1), NUM2ULONG(arg2), ((void)(arg3),NULL)));
616
+ }
617
+ #endif
618
+ #ifdef HAVE_WATTR_SET
619
+ static VALUE rbncurs_wattr_set(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
620
+ return INT2NUM(wattr_set(get_window(arg1), NUM2ULONG(arg2), NUM2INT(arg3), ((void)(arg4),NULL)));
621
+ }
622
+ #endif
623
+ #if defined(HAVE_VID_ATTR) || defined(vid_attr)
624
+ static VALUE rbncurs_vid_attr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
625
+ return INT2NUM(vid_attr(NUM2ULONG(arg1), NUM2INT(arg2), ((void)(arg3),NULL)));
626
+ }
627
+ #endif
628
+ #ifdef HAVE_ATTR_GET
629
+ static VALUE rbncurs_attr_get(VALUE dummy, VALUE rb_attrs, VALUE rb_pair,
630
+ VALUE dummy2)
631
+ {
632
+ if ((rb_obj_is_instance_of(rb_attrs, rb_cArray) != Qtrue)
633
+ || (rb_obj_is_instance_of(rb_pair, rb_cArray) != Qtrue)) {
634
+ rb_raise(rb_eArgError,
635
+ "attrs and pair arguments must be empty Arrays");
636
+ return Qnil;
637
+ }
638
+ {
639
+ attr_t attrs = 0;
640
+ short pair = 0;
641
+ int return_value = attr_get(&attrs, &pair, 0);
642
+ rb_ary_push(rb_attrs, INT2NUM(attrs));
643
+ rb_ary_push(rb_pair, INT2NUM(pair));
644
+ return INT2NUM(return_value);
645
+ }
646
+ }
647
+ static VALUE rbncurs_wattr_get(VALUE dummy,VALUE win, VALUE rb_attrs, VALUE rb_pair,
648
+ VALUE dummy2)
649
+ {
650
+ if ((rb_obj_is_instance_of(rb_attrs, rb_cArray) != Qtrue)
651
+ || (rb_obj_is_instance_of(rb_pair, rb_cArray) != Qtrue)) {
652
+ rb_raise(rb_eArgError,
653
+ "attrs and pair arguments must be empty Arrays");
654
+ return Qnil;
655
+ }
656
+ {
657
+ attr_t attrs = 0;
658
+ short pair = 0;
659
+ int return_value = wattr_get(get_window(win), &attrs, &pair, 0);
660
+ rb_ary_push(rb_attrs, INT2NUM(attrs));
661
+ rb_ary_push(rb_pair, INT2NUM(pair));
662
+ return INT2NUM(return_value);
663
+ }
664
+ }
665
+ #endif /* HAVE_ATTR_GET */
666
+ #endif
667
+
668
+ static VALUE rbncurs_baudrate(VALUE dummy) {
669
+ return INT2NUM(baudrate());
670
+ }
671
+ static VALUE rbncurs_beep(VALUE dummy) {
672
+ return INT2NUM(beep());
673
+ }
674
+ static VALUE rbncurs_bkgd(VALUE dummy, VALUE arg1) {
675
+ return INT2NUM(bkgd(NUM2ULONG(arg1)));
676
+ }
677
+ static VALUE rbncurs_bkgdset(VALUE dummy, VALUE arg1) {
678
+ return ((bkgdset(NUM2ULONG(arg1))),Qnil);
679
+ }
680
+ static VALUE rbncurs_border(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5, VALUE arg6, VALUE arg7, VALUE arg8) {
681
+ return INT2NUM(border(NUM2ULONG(arg1), NUM2ULONG(arg2), NUM2ULONG(arg3), NUM2ULONG(arg4), NUM2ULONG(arg5), NUM2ULONG(arg6), NUM2ULONG(arg7), NUM2ULONG(arg8)));
682
+ }
683
+ static VALUE rbncurs_box(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
684
+ return INT2NUM(box(get_window(arg1), NUM2ULONG(arg2), NUM2ULONG(arg3)));
685
+ }
686
+ static VALUE rbncurs_can_change_color(VALUE dummy) {
687
+ return (can_change_color()) ? Qtrue : Qfalse;
688
+ }
689
+
690
+ static int rbncurshelper_halfdelay_cbreak(int tenths, int break_chars)
691
+ {
692
+ int status = break_chars ? cbreak() : nocbreak();
693
+ if (status != ERR) {
694
+ rb_iv_set(mNcurses, "@halfdelay", INT2NUM(tenths));
695
+ rb_iv_set(mNcurses, "@cbreak", break_chars ? Qtrue : Qfalse);
696
+ }
697
+ return status;
698
+ }
699
+ static void rbncurshelper_halfdelay_cbreak_restore()
700
+ {
701
+ if (RTEST(rb_iv_get(mNcurses, "@cbreak")))
702
+ cbreak();
703
+ else
704
+ nocbreak();
705
+ }
706
+ static VALUE rbncurs_cbreak(VALUE dummy) {
707
+ return INT2NUM(rbncurshelper_halfdelay_cbreak(0, 1));
708
+ }
709
+ #ifdef HAVE_CHGAT
710
+ static VALUE rbncurs_chgat(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
711
+ return INT2NUM(chgat(NUM2INT(arg1), NUM2ULONG(arg2), NUM2INT(arg3),
712
+ ((void)(arg4),NULL)));
713
+ }
714
+ #endif
715
+ static VALUE rbncurs_clear(VALUE dummy) {
716
+ return INT2NUM(clear());
717
+ }
718
+ static VALUE rbncurs_clearok(VALUE dummy, VALUE arg1, VALUE arg2) {
719
+ return INT2NUM(clearok(get_window(arg1), RTEST(arg2)));
720
+ }
721
+ static VALUE rbncurs_clrtobot(VALUE dummy) {
722
+ return INT2NUM(clrtobot());
723
+ }
724
+ static VALUE rbncurs_clrtoeol(VALUE dummy) {
725
+ return INT2NUM(clrtoeol());
726
+ }
727
+ #ifdef HAVE_COLOR_SET
728
+ static VALUE rbncurs_color_set(VALUE dummy, VALUE arg1, VALUE arg2) {
729
+ return INT2NUM(color_set(NUM2INT(arg1), ((void)(arg2),NULL)));
730
+ }
731
+ #endif
732
+ static VALUE rbncurs_COLOR_PAIR(VALUE dummy, VALUE arg1) {
733
+ return INT2NUM(COLOR_PAIR(NUM2INT(arg1)));
734
+ }
735
+ static VALUE rbncurs_copywin(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5, VALUE arg6, VALUE arg7, VALUE arg8, VALUE arg9) {
736
+ return INT2NUM(copywin(get_window(arg1), get_window(arg2), NUM2INT(arg3), NUM2INT(arg4), NUM2INT(arg5), NUM2INT(arg6), NUM2INT(arg7), NUM2INT(arg8), NUM2INT(arg9)));
737
+ }
738
+ static VALUE rbncurs_curs_set(VALUE dummy, VALUE arg1) {
739
+ return INT2NUM(curs_set(NUM2INT(arg1)));
740
+ }
741
+ static VALUE rbncurs_def_prog_mode(VALUE dummy) {
742
+ return INT2NUM(def_prog_mode());
743
+ }
744
+ static VALUE rbncurs_def_shell_mode(VALUE dummy) {
745
+ return INT2NUM(def_shell_mode());
746
+ }
747
+ static VALUE rbncurs_delay_output(VALUE dummy, VALUE arg1) {
748
+ return INT2NUM(delay_output(NUM2INT(arg1)));
749
+ }
750
+ static VALUE rbncurs_delch(VALUE dummy) {
751
+ return INT2NUM(delch());
752
+ }
753
+ static VALUE rbncurs_deleteln(VALUE dummy) {
754
+ return INT2NUM(deleteln());
755
+ }
756
+ static VALUE rbncurs_derwin(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5) {
757
+ return wrap_window(derwin(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4), NUM2INT(arg5)));
758
+ }
759
+ static VALUE rbncurs_doupdate(VALUE dummy) {
760
+ return INT2NUM(doupdate());
761
+ }
762
+ static VALUE rbncurs_dupwin(VALUE dummy, VALUE arg1) {
763
+ return wrap_window(dupwin(get_window(arg1)));
764
+ }
765
+ static VALUE rbncurs_echo(VALUE dummy) {
766
+ return INT2NUM(echo());
767
+ }
768
+ static VALUE rbncurs_echochar(VALUE dummy, VALUE arg1) {
769
+ return INT2NUM(echochar(NUM2ULONG(arg1)));
770
+ }
771
+ static VALUE rbncurs_endwin(VALUE dummy) {
772
+ return INT2NUM(endwin());
773
+ }
774
+ static VALUE rbncurs_erasechar(VALUE dummy) {
775
+ return INT2NUM(erasechar());
776
+ }
777
+ #ifdef HAVE_FILTER
778
+ static VALUE rbncurs_filter(VALUE dummy) {
779
+ return ((filter()),Qnil);
780
+ }
781
+ #endif
782
+ static VALUE rbncurs_flash(VALUE dummy) {
783
+ return INT2NUM(flash());
784
+ }
785
+ static VALUE rbncurs_flushinp(VALUE dummy) {
786
+ return INT2NUM(flushinp());
787
+ }
788
+ static VALUE rbncurs_getbkgd(VALUE dummy, VALUE arg1) {
789
+ return INT2NUM(getbkgd(get_window(arg1)));
790
+ }
791
+
792
+ static int rbncurshelper_nonblocking_wgetch(WINDOW *c_win) {
793
+ /* nonblocking wgetch only implemented for Ncurses */
794
+ int halfdelay = NUM2INT(rb_iv_get(mNcurses, "@halfdelay"));
795
+ int infd = NUM2INT(rb_iv_get(mNcurses, "@infd"));
796
+ double screen_delay = halfdelay * 0.1;
797
+ #ifdef NCURSES_VERSION
798
+ int windelay = c_win->_delay;
799
+ #else
800
+ int windelay = 0;
801
+ #endif
802
+ double window_delay = (windelay >= 0) ? 0.001 * windelay : (1e200*1e200);
803
+ /* FIXME: ^ Infinity ^*/
804
+ double delay = (screen_delay > 0) ? screen_delay : window_delay;
805
+ int result;
806
+ struct timeval tv;
807
+ struct timezone tz = {0,0};
808
+ double starttime, nowtime, finishtime;
809
+ double resize_delay = NUM2INT(get_RESIZEDELAY()) / 1000.0;
810
+ fd_set in_fds;
811
+ gettimeofday(&tv, &tz);
812
+ starttime = tv.tv_sec + tv.tv_usec * 1e-6;
813
+ finishtime = starttime + delay;
814
+ #ifdef NCURSES_VERSION
815
+ c_win->_delay = 0;
816
+ #endif
817
+ while (doupdate() /* detects resize */, (result = wgetch(c_win)) == ERR) {
818
+ gettimeofday(&tv, &tz);
819
+ nowtime = tv.tv_sec + tv.tv_usec * 1e-6;
820
+ delay = finishtime - nowtime;
821
+ if (delay <= 0) break;
822
+
823
+ /* Check for terminal size change every resize_delay seconds */
824
+ if (resize_delay > delay) resize_delay = delay;
825
+ tv.tv_sec = (time_t)resize_delay;
826
+ tv.tv_usec = (unsigned)( (resize_delay - tv.tv_sec) * 1e6 );
827
+
828
+ /* sleep on infd until input is available or tv reaches timeout */
829
+ FD_ZERO(&in_fds);
830
+ FD_SET(infd, &in_fds);
831
+ rb_thread_select(infd + 1, &in_fds, NULL, NULL, &tv);
832
+ }
833
+ #ifdef NCURSES_VERSION
834
+ c_win->_delay = windelay;
835
+ #endif
836
+ return result;
837
+ }
838
+ static VALUE rbncurs_getch(VALUE dummy) {
839
+ return INT2NUM(rbncurshelper_nonblocking_wgetch(stdscr));
840
+ }
841
+ static VALUE rbncurs_halfdelay(VALUE dummy, VALUE arg1) {
842
+ return INT2NUM(rbncurshelper_halfdelay_cbreak(NUM2INT(arg1), 1));
843
+ }
844
+ static VALUE rbncurs_has_colors(VALUE dummy) {
845
+ return (has_colors()) ? Qtrue : Qfalse;
846
+ }
847
+ static VALUE rbncurs_has_ic(VALUE dummy) {
848
+ return (has_ic()) ? Qtrue : Qfalse;
849
+ }
850
+ static VALUE rbncurs_has_il(VALUE dummy) {
851
+ return (has_il()) ? Qtrue : Qfalse;
852
+ }
853
+ static VALUE rbncurs_hline(VALUE dummy, VALUE arg1, VALUE arg2) {
854
+ return INT2NUM(hline(NUM2ULONG(arg1), NUM2INT(arg2)));
855
+ }
856
+ static VALUE rbncurs_idcok(VALUE dummy, VALUE arg1, VALUE arg2) {
857
+ return ((idcok(get_window(arg1), RTEST(arg2))),Qnil);
858
+ }
859
+ static VALUE rbncurs_idlok(VALUE dummy, VALUE arg1, VALUE arg2) {
860
+ return INT2NUM(idlok(get_window(arg1), RTEST(arg2)));
861
+ }
862
+ static VALUE rbncurs_immedok(VALUE dummy, VALUE arg1, VALUE arg2) {
863
+ return ((immedok(get_window(arg1), RTEST(arg2))),Qnil);
864
+ }
865
+ static VALUE rbncurs_inch(VALUE dummy) {
866
+ return INT2NUM(inch());
867
+ }
868
+ static VALUE rbncurs_initscr(VALUE dummy) {
869
+ VALUE v = wrap_window(initscr());
870
+ if (!RTEST(v))
871
+ return v;
872
+
873
+ Init_ncurses_full();
874
+
875
+ /* Some constants defined by the initscr call. */
876
+
877
+ /* line graphics */
878
+
879
+ /* VT100 symbols begin here */
880
+
881
+ rb_define_const(mNcurses, "ACS_ULCORNER", INT2NUM(ACS_ULCORNER));
882
+ rb_define_const(mNcurses, "ACS_LLCORNER", INT2NUM(ACS_LLCORNER));
883
+ rb_define_const(mNcurses, "ACS_URCORNER", INT2NUM(ACS_URCORNER));
884
+ rb_define_const(mNcurses, "ACS_LRCORNER", INT2NUM(ACS_LRCORNER));
885
+ rb_define_const(mNcurses, "ACS_LTEE", INT2NUM(ACS_LTEE));
886
+ rb_define_const(mNcurses, "ACS_RTEE", INT2NUM(ACS_RTEE));
887
+ rb_define_const(mNcurses, "ACS_BTEE", INT2NUM(ACS_BTEE));
888
+ rb_define_const(mNcurses, "ACS_TTEE", INT2NUM(ACS_TTEE));
889
+ rb_define_const(mNcurses, "ACS_HLINE", INT2NUM(ACS_HLINE));
890
+ rb_define_const(mNcurses, "ACS_VLINE", INT2NUM(ACS_VLINE));
891
+ rb_define_const(mNcurses, "ACS_PLUS", INT2NUM(ACS_PLUS));
892
+ rb_define_const(mNcurses, "ACS_S1", INT2NUM(ACS_S1));
893
+ rb_define_const(mNcurses, "ACS_S9", INT2NUM(ACS_S9));
894
+ rb_define_const(mNcurses, "ACS_DIAMOND", INT2NUM(ACS_DIAMOND));
895
+ rb_define_const(mNcurses, "ACS_CKBOARD", INT2NUM(ACS_CKBOARD));
896
+ rb_define_const(mNcurses, "ACS_DEGREE", INT2NUM(ACS_DEGREE));
897
+ rb_define_const(mNcurses, "ACS_PLMINUS", INT2NUM(ACS_PLMINUS));
898
+ rb_define_const(mNcurses, "ACS_BULLET", INT2NUM(ACS_BULLET));
899
+ /* Teletype 5410v1 symbols begin here */
900
+ rb_define_const(mNcurses, "ACS_LARROW", INT2NUM(ACS_LARROW));
901
+ rb_define_const(mNcurses, "ACS_RARROW", INT2NUM(ACS_RARROW));
902
+ rb_define_const(mNcurses, "ACS_DARROW", INT2NUM(ACS_DARROW));
903
+ rb_define_const(mNcurses, "ACS_UARROW", INT2NUM(ACS_UARROW));
904
+ rb_define_const(mNcurses, "ACS_BOARD", INT2NUM(ACS_BOARD));
905
+ rb_define_const(mNcurses, "ACS_LANTERN", INT2NUM(ACS_LANTERN));
906
+ rb_define_const(mNcurses, "ACS_BLOCK", INT2NUM(ACS_BLOCK));
907
+ /*
908
+ * These aren't documented, but a lot of System Vs have them anyway
909
+ * (you can spot pprryyzz{{||}} in a lot of AT&T terminfo strings).
910
+ * The ACS_names may not match AT&T's, our source didn't know them.
911
+ */
912
+ #ifdef ACS_S3
913
+ rb_define_const(mNcurses, "ACS_S3", INT2NUM(ACS_S3));
914
+ #endif
915
+ #ifdef ACS_S7
916
+ rb_define_const(mNcurses, "ACS_S7", INT2NUM(ACS_S7));
917
+ #endif
918
+ #ifdef ACS_LEQUAL
919
+ rb_define_const(mNcurses, "ACS_LEQUAL", INT2NUM(ACS_LEQUAL));
920
+ #endif
921
+ #ifdef ACS_LEQUAL
922
+ rb_define_const(mNcurses, "ACS_GEQUAL", INT2NUM(ACS_GEQUAL));
923
+ #endif
924
+ #ifdef ACS_PI
925
+ rb_define_const(mNcurses, "ACS_PI", INT2NUM(ACS_PI));
926
+ #endif
927
+ #ifdef ACS_NEQUAL
928
+ rb_define_const(mNcurses, "ACS_NEQUAL", INT2NUM(ACS_NEQUAL));
929
+ #endif
930
+ #ifdef ACS_STERLING
931
+ rb_define_const(mNcurses, "ACS_STERLING", INT2NUM(ACS_STERLING));
932
+ #endif
933
+ /*
934
+ * Line drawing ACS names are of the form ACS_trbl, where t is the top, r
935
+ * is the right, b is the bottom, and l is the left. t, r, b, and l might
936
+ * be B (blank), S (single), D (double), or T (thick). The subset defined
937
+ * here only uses B and S.
938
+ */
939
+ #ifdef ACS_BSSB
940
+ rb_define_const(mNcurses, "ACS_BSSB", INT2NUM(ACS_BSSB));
941
+ #endif
942
+ #ifdef ACS_SSBB
943
+ rb_define_const(mNcurses, "ACS_SSBB", INT2NUM(ACS_SSBB));
944
+ #endif
945
+ #ifdef ACS_BBSS
946
+ rb_define_const(mNcurses, "ACS_BBSS", INT2NUM(ACS_BBSS));
947
+ #endif
948
+ #ifdef ACS_SBBS
949
+ rb_define_const(mNcurses, "ACS_SBBS", INT2NUM(ACS_SBBS));
950
+ #endif
951
+ #ifdef ACS_SBSS
952
+ rb_define_const(mNcurses, "ACS_SBSS", INT2NUM(ACS_SBSS));
953
+ #endif
954
+ #ifdef ACS_SSSB
955
+ rb_define_const(mNcurses, "ACS_SSSB", INT2NUM(ACS_SSSB));
956
+ #endif
957
+ #ifdef ACS_SSBS
958
+ rb_define_const(mNcurses, "ACS_SSBS", INT2NUM(ACS_SSBS));
959
+ #endif
960
+ #ifdef ACS_BSSS
961
+ rb_define_const(mNcurses, "ACS_BSSS", INT2NUM(ACS_BSSS));
962
+ #endif
963
+ #ifdef ACS_BSBS
964
+ rb_define_const(mNcurses, "ACS_BSBS", INT2NUM(ACS_BSBS));
965
+ #endif
966
+ #ifdef ACS_SBSB
967
+ rb_define_const(mNcurses, "ACS_SBSB", INT2NUM(ACS_SBSB));
968
+ #endif
969
+ #ifdef ACS_SSSS
970
+ rb_define_const(mNcurses, "ACS_SSSS", INT2NUM(ACS_SSSS));
971
+ #endif
972
+ rbncurshelper_halfdelay_cbreak_restore();
973
+ rb_iv_set(mNcurses, "@infd", INT2FIX(0));
974
+ rb_iv_set(mNcurses, "@halfdelay", INT2FIX(0));
975
+ rb_iv_set(mNcurses, "@cbreak", Qfalse);
976
+ return v;
977
+ }
978
+ static VALUE rbncurs_init_color(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
979
+ return INT2NUM(init_color(NUM2INT(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4)));
980
+ }
981
+ static VALUE rbncurs_init_pair(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
982
+ return INT2NUM(init_pair(NUM2INT(arg1), NUM2INT(arg2), NUM2INT(arg3)));
983
+ }
984
+ static VALUE rbncurs_insch(VALUE dummy, VALUE arg1) {
985
+ return INT2NUM(insch(NUM2ULONG(arg1)));
986
+ }
987
+ static VALUE rbncurs_insdelln(VALUE dummy, VALUE arg1) {
988
+ return INT2NUM(insdelln(NUM2INT(arg1)));
989
+ }
990
+ static VALUE rbncurs_insertln(VALUE dummy) {
991
+ return INT2NUM(insertln());
992
+ }
993
+ static VALUE rbncurs_insnstr(VALUE dummy, VALUE arg1, VALUE arg2) {
994
+ return INT2NUM(insnstr(StringValuePtr(arg1), NUM2INT(arg2)));
995
+ }
996
+ static VALUE rbncurs_insstr(VALUE dummy, VALUE arg1) {
997
+ return INT2NUM(insstr(StringValuePtr(arg1)));
998
+ }
999
+ #ifdef HAVE_INTRFLUSH
1000
+ static VALUE rbncurs_intrflush(VALUE dummy, VALUE arg1, VALUE arg2) {
1001
+ return INT2NUM(intrflush(get_window(arg1), RTEST(arg2)));
1002
+ }
1003
+ #endif
1004
+ static VALUE rbncurs_isendwin(VALUE dummy) {
1005
+ return (isendwin()) ? Qtrue : Qfalse;
1006
+ }
1007
+ static VALUE rbncurs_is_linetouched(VALUE dummy, VALUE arg1, VALUE arg2) {
1008
+ return (is_linetouched(get_window(arg1), NUM2INT(arg2))) ? Qtrue : Qfalse;
1009
+ }
1010
+ static VALUE rbncurs_is_wintouched(VALUE dummy, VALUE arg1) {
1011
+ return (is_wintouched(get_window(arg1))) ? Qtrue : Qfalse;
1012
+ }
1013
+ static VALUE rbncurs_keyname(VALUE dummy, VALUE arg1) {
1014
+ return rb_str_new2(keyname(NUM2INT(arg1)));
1015
+ }
1016
+ static VALUE rbncurs_keypad(VALUE dummy, VALUE arg1, VALUE arg2) {
1017
+ return INT2NUM(keypad(get_window(arg1), RTEST(arg2)));
1018
+ }
1019
+ static VALUE rbncurs_killchar(VALUE dummy) {
1020
+ return INT2NUM(killchar());
1021
+ }
1022
+ static VALUE rbncurs_leaveok(VALUE dummy, VALUE arg1, VALUE arg2) {
1023
+ return INT2NUM(leaveok(get_window(arg1), RTEST(arg2)));
1024
+ }
1025
+ static VALUE rbncurs_longname(VALUE dummy) {
1026
+ return rb_str_new2(longname());
1027
+ }
1028
+ static VALUE rbncurs_meta(VALUE dummy, VALUE arg1, VALUE arg2) {
1029
+ return INT2NUM(meta(get_window(arg1), RTEST(arg2)));
1030
+ }
1031
+ static VALUE rbncurs_move(VALUE dummy, VALUE arg1, VALUE arg2) {
1032
+ return INT2NUM(move(NUM2INT(arg1), NUM2INT(arg2)));
1033
+ }
1034
+ static VALUE rbncurs_mvaddch(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1035
+ return INT2NUM(mvaddch(NUM2INT(arg1), NUM2INT(arg2), NUM2ULONG(arg3)));
1036
+ }
1037
+ static VALUE rbncurs_mvaddchnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3,
1038
+ VALUE arg4) {
1039
+ chtype * chstr = RB2CHSTR(arg3);
1040
+ VALUE return_value = INT2NUM(mvaddchnstr(NUM2INT(arg1), NUM2INT(arg2),
1041
+ chstr, NUM2INT(arg4)));
1042
+ xfree(chstr);
1043
+ return return_value;
1044
+ }
1045
+ static VALUE rbncurs_mvaddchstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1046
+ chtype * chstr = RB2CHSTR(arg3);
1047
+ VALUE return_value = INT2NUM(mvaddchstr(NUM2INT(arg1), NUM2INT(arg2),
1048
+ chstr));
1049
+ xfree(chstr);
1050
+ return return_value;
1051
+ }
1052
+ static VALUE rbncurs_mvaddnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1053
+ return INT2NUM(mvaddnstr(NUM2INT(arg1), NUM2INT(arg2), StringValuePtr(arg3), NUM2INT(arg4)));
1054
+ }
1055
+ static VALUE rbncurs_mvaddstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1056
+ return INT2NUM(mvaddstr(NUM2INT(arg1), NUM2INT(arg2), StringValuePtr(arg3)));
1057
+ }
1058
+ #ifdef HAVE_MVCHGAT
1059
+ static VALUE rbncurs_mvchgat(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5, VALUE arg6) {
1060
+ return INT2NUM(mvchgat(NUM2INT(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2ULONG(arg4), NUM2INT(arg5), ((void)(arg6),NULL)));
1061
+ }
1062
+ #endif
1063
+ static VALUE rbncurs_mvcur(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1064
+ return INT2NUM(mvcur(NUM2INT(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4)));
1065
+ }
1066
+ static VALUE rbncurs_mvdelch(VALUE dummy, VALUE arg1, VALUE arg2) {
1067
+ return INT2NUM(mvdelch(NUM2INT(arg1), NUM2INT(arg2)));
1068
+ }
1069
+ static VALUE rbncurs_mvderwin(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1070
+ return INT2NUM(mvderwin(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3)));
1071
+ }
1072
+ static VALUE rbncurs_mvgetch(VALUE dummy, VALUE arg1, VALUE arg2) {
1073
+ if (wmove(stdscr, NUM2INT(arg1), NUM2INT(arg2)) == ERR)
1074
+ return INT2NUM(ERR);
1075
+ return INT2NUM(rbncurshelper_nonblocking_wgetch(stdscr));
1076
+ }
1077
+ #ifdef HAVE_MVHLINE
1078
+ static VALUE rbncurs_mvhline(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1079
+ return INT2NUM(mvhline(NUM2INT(arg1), NUM2INT(arg2), NUM2ULONG(arg3), NUM2INT(arg4)));
1080
+ }
1081
+ #endif
1082
+ static VALUE rbncurs_mvinch(VALUE dummy, VALUE arg1, VALUE arg2) {
1083
+ return INT2NUM(mvinch(NUM2INT(arg1), NUM2INT(arg2)));
1084
+ }
1085
+ static VALUE rbncurs_mvinsch(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1086
+ return INT2NUM(mvinsch(NUM2INT(arg1), NUM2INT(arg2), NUM2ULONG(arg3)));
1087
+ }
1088
+ static VALUE rbncurs_mvinsnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1089
+ return INT2NUM(mvinsnstr(NUM2INT(arg1), NUM2INT(arg2), StringValuePtr(arg3), NUM2INT(arg4)));
1090
+ }
1091
+ static VALUE rbncurs_mvinsstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1092
+ return INT2NUM(mvinsstr(NUM2INT(arg1), NUM2INT(arg2), StringValuePtr(arg3)));
1093
+ }
1094
+ #ifdef HAVE_MVVLINE
1095
+ static VALUE rbncurs_mvvline(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1096
+ return INT2NUM(mvvline(NUM2INT(arg1), NUM2INT(arg2), NUM2ULONG(arg3), NUM2INT(arg4)));
1097
+ }
1098
+ #endif
1099
+ static VALUE rbncurs_mvwaddch(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1100
+ return INT2NUM(mvwaddch(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2ULONG(arg4)));
1101
+ }
1102
+ static VALUE rbncurs_mvwaddchnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3,
1103
+ VALUE arg4, VALUE arg5) {
1104
+ chtype * chstr = RB2CHSTR(arg4);
1105
+ VALUE return_value = INT2NUM(mvwaddchnstr(get_window(arg1), NUM2INT(arg2),
1106
+ NUM2INT(arg3), chstr,
1107
+ NUM2INT(arg5)));
1108
+ xfree(chstr);
1109
+ return return_value;
1110
+ }
1111
+ static VALUE rbncurs_mvwaddchstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3,
1112
+ VALUE arg4) {
1113
+ chtype * chstr = RB2CHSTR(arg4);
1114
+ VALUE return_value = INT2NUM(mvwaddchstr(get_window(arg1), NUM2INT(arg2),
1115
+ NUM2INT(arg3), chstr));
1116
+ xfree(chstr);
1117
+ return return_value;
1118
+ }
1119
+ static VALUE rbncurs_mvwaddnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5) {
1120
+ return INT2NUM(mvwaddnstr(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), StringValuePtr(arg4), NUM2INT(arg5)));
1121
+ }
1122
+ static VALUE rbncurs_mvwaddstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1123
+ return INT2NUM(mvwaddstr(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), StringValuePtr(arg4)));
1124
+ }
1125
+ #ifdef HAVE_MVWCHGAT
1126
+ static VALUE rbncurs_mvwchgat(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5, VALUE arg6, VALUE arg7) {
1127
+ return INT2NUM(mvwchgat(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4), NUM2ULONG(arg5), NUM2INT(arg6), ((void)(arg7),NULL)));
1128
+ }
1129
+ #endif
1130
+ static VALUE rbncurs_mvwdelch(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1131
+ return INT2NUM(mvwdelch(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3)));
1132
+ }
1133
+ static VALUE rbncurs_mvwgetch(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1134
+ WINDOW * c_win = get_window(arg1);
1135
+ if (wmove(c_win, NUM2INT(arg1), NUM2INT(arg2)) == ERR)
1136
+ return INT2NUM(ERR);
1137
+ return INT2NUM(rbncurshelper_nonblocking_wgetch(c_win));
1138
+ }
1139
+ #ifdef HAVE_MVWHLINE
1140
+ static VALUE rbncurs_mvwhline(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5) {
1141
+ return INT2NUM(mvwhline(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2ULONG(arg4), NUM2INT(arg5)));
1142
+ }
1143
+ #endif
1144
+ static VALUE rbncurs_mvwin(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1145
+ return INT2NUM(mvwin(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3)));
1146
+ }
1147
+ static VALUE rbncurs_mvwinch(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1148
+ return INT2NUM(mvwinch(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3)));
1149
+ }
1150
+ static VALUE rbncurs_mvwinsch(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1151
+ return INT2NUM(mvwinsch(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2ULONG(arg4)));
1152
+ }
1153
+ static VALUE rbncurs_mvwinsnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5) {
1154
+ return INT2NUM(mvwinsnstr(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), StringValuePtr(arg4), NUM2INT(arg5)));
1155
+ }
1156
+ static VALUE rbncurs_mvwinsstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1157
+ return INT2NUM(mvwinsstr(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), StringValuePtr(arg4)));
1158
+ }
1159
+ #ifdef HAVE_MVWVLINE
1160
+ static VALUE rbncurs_mvwvline(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5) {
1161
+ return INT2NUM(mvwvline(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2ULONG(arg4), NUM2INT(arg5)));
1162
+ }
1163
+ #endif
1164
+ static VALUE rbncurs_napms(VALUE dummy, VALUE arg1) {
1165
+ return INT2NUM(napms(NUM2INT(arg1)));
1166
+ }
1167
+ static VALUE rbncurs_newpad(VALUE dummy, VALUE arg1, VALUE arg2) {
1168
+ return wrap_window(newpad(NUM2INT(arg1), NUM2INT(arg2)));
1169
+ }
1170
+ static VALUE rbncurs_newwin(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1171
+ return wrap_window(newwin(NUM2INT(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4)));
1172
+ }
1173
+ static VALUE rbncurs_nl(VALUE dummy) {
1174
+ return INT2NUM(nl());
1175
+ }
1176
+ static VALUE rbncurs_nocbreak(VALUE dummy) {
1177
+ return INT2NUM(rbncurshelper_halfdelay_cbreak(0, 0));
1178
+ }
1179
+ static VALUE rbncurs_nodelay(VALUE dummy, VALUE arg1, VALUE arg2) {
1180
+ return INT2NUM(nodelay(get_window(arg1), RTEST(arg2)));
1181
+ }
1182
+ static VALUE rbncurs_noecho(VALUE dummy) {
1183
+ return INT2NUM(noecho());
1184
+ }
1185
+ static VALUE rbncurs_nonl(VALUE dummy) {
1186
+ return INT2NUM(nonl());
1187
+ }
1188
+ #ifdef HAVE_NOQIFLUSH
1189
+ static VALUE rbncurs_noqiflush(VALUE dummy) {
1190
+ return ((noqiflush()),Qnil);
1191
+ }
1192
+ #endif
1193
+ static VALUE rbncurs_noraw(VALUE dummy) {
1194
+ return INT2NUM(noraw());
1195
+ }
1196
+ static VALUE rbncurs_notimeout(VALUE dummy, VALUE arg1, VALUE arg2) {
1197
+ return INT2NUM(notimeout(get_window(arg1), RTEST(arg2)));
1198
+ }
1199
+ static VALUE rbncurs_overlay(VALUE dummy, VALUE arg1, VALUE arg2) {
1200
+ return INT2NUM(overlay(get_window(arg1), get_window(arg2)));
1201
+ }
1202
+ static VALUE rbncurs_overwrite(VALUE dummy, VALUE arg1, VALUE arg2) {
1203
+ return INT2NUM(overwrite(get_window(arg1), get_window(arg2)));
1204
+ }
1205
+ static VALUE rbncurs_PAIR_NUMBER(VALUE dummy, VALUE arg1) {
1206
+ return INT2NUM(PAIR_NUMBER(NUM2INT(arg1)));
1207
+ }
1208
+ #ifndef __PDCURSES__ /* pdcurses "pechochar" macro won't compile*/
1209
+ static VALUE rbncurs_pechochar(VALUE dummy, VALUE arg1, VALUE arg2) {
1210
+ return INT2NUM(pechochar(get_window(arg1), NUM2ULONG(arg2)));
1211
+ }
1212
+ #endif
1213
+ static VALUE rbncurs_pnoutrefresh(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5, VALUE arg6, VALUE arg7) {
1214
+ return INT2NUM(pnoutrefresh(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4), NUM2INT(arg5), NUM2INT(arg6), NUM2INT(arg7)));
1215
+ }
1216
+ static VALUE rbncurs_prefresh(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5, VALUE arg6, VALUE arg7) {
1217
+ return INT2NUM(prefresh(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4), NUM2INT(arg5), NUM2INT(arg6), NUM2INT(arg7)));
1218
+ }
1219
+ #ifdef HAVE_PUTP
1220
+ static VALUE rbncurs_putp(VALUE dummy, VALUE arg1) {
1221
+ return INT2NUM(putp(StringValuePtr(arg1)));
1222
+ }
1223
+ #endif
1224
+ #ifdef HAVE_QIFLUSH
1225
+ static VALUE rbncurs_qiflush(VALUE dummy) {
1226
+ return ((qiflush()),Qnil);
1227
+ }
1228
+ #endif
1229
+ static VALUE rbncurs_raw(VALUE dummy) {
1230
+ return INT2NUM(raw());
1231
+ }
1232
+ #ifndef __PDCURSES__ /* __PDCURSES__ redrawwin macro is buggy */
1233
+ static VALUE rbncurs_redrawwin(VALUE dummy, VALUE arg1) {
1234
+ return INT2NUM(redrawwin(get_window(arg1)));
1235
+ }
1236
+ #endif
1237
+ static VALUE rbncurs_refresh(VALUE dummy) {
1238
+ return INT2NUM(refresh());
1239
+ }
1240
+ static VALUE rbncurs_resetty(VALUE dummy) {
1241
+ return INT2NUM(resetty());
1242
+ }
1243
+ static VALUE rbncurs_reset_prog_mode(VALUE dummy) {
1244
+ return INT2NUM(reset_prog_mode());
1245
+ }
1246
+ static VALUE rbncurs_reset_shell_mode(VALUE dummy) {
1247
+ return INT2NUM(reset_shell_mode());
1248
+ }
1249
+ static VALUE rbncurs_savetty(VALUE dummy) {
1250
+ return INT2NUM(savetty());
1251
+ }
1252
+ #ifdef HAVE_SCR_DUMP
1253
+ static VALUE rbncurs_scr_dump(VALUE dummy, VALUE arg1) {
1254
+ return INT2NUM(scr_dump(StringValuePtr(arg1)));
1255
+ }
1256
+ #endif
1257
+ #ifdef HAVE_SCR_INIT
1258
+ static VALUE rbncurs_scr_init(VALUE dummy, VALUE arg1) {
1259
+ return INT2NUM(scr_init(StringValuePtr(arg1)));
1260
+ }
1261
+ #endif
1262
+ static VALUE rbncurs_scrl(VALUE dummy, VALUE arg1) {
1263
+ return INT2NUM(scrl(NUM2INT(arg1)));
1264
+ }
1265
+ static VALUE rbncurs_scroll(VALUE dummy, VALUE arg1) {
1266
+ return INT2NUM(scroll(get_window(arg1)));
1267
+ }
1268
+ static VALUE rbncurs_scrollok(VALUE dummy, VALUE arg1, VALUE arg2) {
1269
+ return INT2NUM(scrollok(get_window(arg1), RTEST(arg2)));
1270
+ }
1271
+ #ifdef HAVE_SCR_RESTORE
1272
+ static VALUE rbncurs_scr_restore(VALUE dummy, VALUE arg1) {
1273
+ return INT2NUM(scr_restore(StringValuePtr(arg1)));
1274
+ }
1275
+ #endif
1276
+ #ifdef HAVE_SCR_SET
1277
+ static VALUE rbncurs_scr_set(VALUE dummy, VALUE arg1) {
1278
+ return INT2NUM(scr_set(StringValuePtr(arg1)));
1279
+ }
1280
+ #endif
1281
+ static VALUE rbncurs_setscrreg(VALUE dummy, VALUE arg1, VALUE arg2) {
1282
+ return INT2NUM(setscrreg(NUM2INT(arg1), NUM2INT(arg2)));
1283
+ }
1284
+ static VALUE rbncurs_set_term(VALUE dummy, VALUE rb_new_screen) {
1285
+ VALUE rb_old_screen = wrap_screen(set_term(get_screen(rb_new_screen)));
1286
+ rb_iv_set(rb_old_screen, "@infd", rb_iv_get(mNcurses, "@infd"));
1287
+ rb_iv_set(rb_old_screen, "@halfdelay", rb_iv_get(mNcurses, "@halfdelay"));
1288
+ rb_iv_set(rb_old_screen, "@cbreak", rb_iv_get(mNcurses, "@cbreak"));
1289
+ rb_iv_set(mNcurses, "@infd", rb_iv_get(rb_new_screen, "@infd"));
1290
+ rb_iv_set(mNcurses, "@halfdelay", rb_iv_get(rb_new_screen, "@halfdelay"));
1291
+ rb_iv_set(mNcurses, "@cbreak", rb_iv_get(rb_new_screen, "@cbreak"));
1292
+
1293
+ rbncurshelper_halfdelay_cbreak_restore();
1294
+ return rb_old_screen;
1295
+ }
1296
+ static VALUE rbncurs_slk_attroff(VALUE dummy, VALUE arg1) {
1297
+ return INT2NUM(slk_attroff(NUM2ULONG(arg1)));
1298
+ }
1299
+ static VALUE rbncurs_slk_attron(VALUE dummy, VALUE arg1) {
1300
+ return INT2NUM(slk_attron(NUM2ULONG(arg1)));
1301
+ }
1302
+ static VALUE rbncurs_slk_attrset(VALUE dummy, VALUE arg1) {
1303
+ return INT2NUM(slk_attrset(NUM2ULONG(arg1)));
1304
+ }
1305
+ #ifdef HAVE_SLK_ATTR
1306
+ static VALUE rbncurs_slk_attr(VALUE dummy) {
1307
+ return INT2NUM(slk_attr());
1308
+ }
1309
+ #endif
1310
+
1311
+ static VALUE rbncurs_slk_clear(VALUE dummy) {
1312
+ return INT2NUM(slk_clear());
1313
+ }
1314
+ #ifdef HAVE_SLK_COLOR
1315
+ static VALUE rbncurs_slk_color(VALUE dummy, VALUE arg1) {
1316
+ return INT2NUM(slk_color(NUM2INT(arg1)));
1317
+ }
1318
+ #endif
1319
+ static VALUE rbncurs_slk_init(VALUE dummy, VALUE arg1) {
1320
+ return INT2NUM(slk_init(NUM2INT(arg1)));
1321
+ }
1322
+ static VALUE rbncurs_slk_label(VALUE dummy, VALUE arg1) {
1323
+ return rb_str_new2(slk_label(NUM2INT(arg1)));
1324
+ }
1325
+ static VALUE rbncurs_slk_noutrefresh(VALUE dummy) {
1326
+ return INT2NUM(slk_noutrefresh());
1327
+ }
1328
+ static VALUE rbncurs_slk_refresh(VALUE dummy) {
1329
+ return INT2NUM(slk_refresh());
1330
+ }
1331
+ static VALUE rbncurs_slk_restore(VALUE dummy) {
1332
+ return INT2NUM(slk_restore());
1333
+ }
1334
+ static VALUE rbncurs_slk_set(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1335
+ return INT2NUM(slk_set(NUM2INT(arg1), StringValuePtr(arg2), NUM2INT(arg3)));
1336
+ }
1337
+ static VALUE rbncurs_slk_touch(VALUE dummy) {
1338
+ return INT2NUM(slk_touch());
1339
+ }
1340
+ static VALUE rbncurs_standout(VALUE dummy) {
1341
+ return INT2NUM(standout());
1342
+ }
1343
+ static VALUE rbncurs_standend(VALUE dummy) {
1344
+ return INT2NUM(standend());
1345
+ }
1346
+ static VALUE rbncurs_start_color(VALUE dummy) {
1347
+ return INT2NUM(start_color());
1348
+ }
1349
+ static VALUE rbncurs_subpad(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5) {
1350
+ return wrap_window(subpad(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4), NUM2INT(arg5)));
1351
+ }
1352
+ static VALUE rbncurs_subwin(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5) {
1353
+ return wrap_window(subwin(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4), NUM2INT(arg5)));
1354
+ }
1355
+ static VALUE rbncurs_syncok(VALUE dummy, VALUE arg1, VALUE arg2) {
1356
+ return INT2NUM(syncok(get_window(arg1), RTEST(arg2)));
1357
+ }
1358
+ static VALUE rbncurs_termattrs(VALUE dummy) {
1359
+ return INT2NUM(termattrs());
1360
+ }
1361
+ static VALUE rbncurs_termname(VALUE dummy) {
1362
+ return rb_str_new2(termname());
1363
+ }
1364
+ #ifdef HAVE_TIGETFLAG
1365
+ static VALUE rbncurs_tigetflag(VALUE dummy, VALUE arg1) {
1366
+ return INT2NUM(tigetflag(StringValuePtr(arg1)));
1367
+ }
1368
+ #endif
1369
+ #ifdef HAVE_TIGETNUM
1370
+ static VALUE rbncurs_tigetnum(VALUE dummy, VALUE arg1) {
1371
+ return INT2NUM(tigetnum(StringValuePtr(arg1)));
1372
+ }
1373
+ #endif
1374
+ #ifdef HAVE_TIGETSTR
1375
+ static VALUE rbncurs_tigetstr(VALUE dummy, VALUE arg1) {
1376
+ return rb_str_new2(tigetstr(StringValuePtr(arg1)));
1377
+ }
1378
+ #endif
1379
+ static VALUE rbncurs_timeout(VALUE dummy, VALUE arg1) {
1380
+ return ((timeout(NUM2INT(arg1))),Qnil);
1381
+ }
1382
+ static VALUE rbncurs_typeahead(VALUE dummy, VALUE arg1) {
1383
+ return INT2NUM(typeahead(NUM2INT(arg1)));
1384
+ }
1385
+ static VALUE rbncurs_ungetch(VALUE dummy, VALUE arg1) {
1386
+ return INT2NUM(ungetch(NUM2INT(arg1)));
1387
+ }
1388
+ static VALUE rbncurs_untouchwin(VALUE dummy, VALUE arg1) {
1389
+ return INT2NUM(untouchwin(get_window(arg1)));
1390
+ }
1391
+ #ifdef HAVE_USE_ENV
1392
+ static VALUE rbncurs_use_env(VALUE dummy, VALUE arg1) {
1393
+ return ((use_env(RTEST(arg1))),Qnil);
1394
+ }
1395
+ #endif
1396
+ #ifdef HAVE_VIDATTR
1397
+ static VALUE rbncurs_vidattr(VALUE dummy, VALUE arg1) {
1398
+ return INT2NUM(vidattr(NUM2ULONG(arg1)));
1399
+ }
1400
+ #endif
1401
+ static VALUE rbncurs_vline(VALUE dummy, VALUE arg1, VALUE arg2) {
1402
+ return INT2NUM(vline(NUM2ULONG(arg1), NUM2INT(arg2)));
1403
+ }
1404
+ static VALUE rbncurs_waddch(VALUE dummy, VALUE arg1, VALUE arg2) {
1405
+ return INT2NUM(waddch(get_window(arg1), NUM2ULONG(arg2)));
1406
+ }
1407
+ static VALUE rbncurs_waddchnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1408
+ chtype * chstr = RB2CHSTR(arg2);
1409
+ VALUE return_value = INT2NUM(waddchnstr(get_window(arg1), chstr,
1410
+ NUM2INT(arg3)));
1411
+ xfree(chstr);
1412
+ return return_value;
1413
+ }
1414
+ static VALUE rbncurs_waddchstr(VALUE dummy, VALUE arg1, VALUE arg2) {
1415
+ chtype * chstr = RB2CHSTR(arg2);
1416
+ VALUE return_value = INT2NUM(waddchstr(get_window(arg1), chstr));
1417
+ xfree(chstr);
1418
+ return return_value;
1419
+ }
1420
+ static VALUE rbncurs_waddnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1421
+ return INT2NUM(waddnstr(get_window(arg1), StringValuePtr(arg2), NUM2INT(arg3)));
1422
+ }
1423
+ static VALUE rbncurs_waddstr(VALUE dummy, VALUE arg1, VALUE arg2) {
1424
+ return INT2NUM(waddstr(get_window(arg1), StringValuePtr(arg2)));
1425
+ }
1426
+ static VALUE rbncurs_wattron(VALUE dummy, VALUE arg1, VALUE arg2) {
1427
+ return INT2NUM(wattron(get_window(arg1), NUM2INT(arg2)));
1428
+ }
1429
+ static VALUE rbncurs_wattroff(VALUE dummy, VALUE arg1, VALUE arg2) {
1430
+ return INT2NUM(wattroff(get_window(arg1), NUM2INT(arg2)));
1431
+ }
1432
+ static VALUE rbncurs_wattrset(VALUE dummy, VALUE arg1, VALUE arg2) {
1433
+ return INT2NUM(wattrset(get_window(arg1), NUM2INT(arg2)));
1434
+ }
1435
+ static VALUE rbncurs_wbkgd(VALUE dummy, VALUE arg1, VALUE arg2) {
1436
+ return INT2NUM(wbkgd(get_window(arg1), NUM2ULONG(arg2)));
1437
+ }
1438
+ static VALUE rbncurs_wbkgdset(VALUE dummy, VALUE arg1, VALUE arg2) {
1439
+ return ((wbkgdset(get_window(arg1), NUM2ULONG(arg2))),Qnil);
1440
+ }
1441
+ static VALUE rbncurs_wborder(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5, VALUE arg6, VALUE arg7, VALUE arg8, VALUE arg9) {
1442
+ return INT2NUM(wborder(get_window(arg1), NUM2ULONG(arg2), NUM2ULONG(arg3), NUM2ULONG(arg4), NUM2ULONG(arg5), NUM2ULONG(arg6), NUM2ULONG(arg7), NUM2ULONG(arg8), NUM2ULONG(arg9)));
1443
+ }
1444
+ #ifdef HAVE_WCHGAT
1445
+ static VALUE rbncurs_wchgat(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4, VALUE arg5) {
1446
+ return INT2NUM(wchgat(get_window(arg1), NUM2INT(arg2), NUM2ULONG(arg3), NUM2INT(arg4), ((void)(arg5),NULL)));
1447
+ }
1448
+ #endif
1449
+ static VALUE rbncurs_wclear(VALUE dummy, VALUE arg1) {
1450
+ return INT2NUM(wclear(get_window(arg1)));
1451
+ }
1452
+ static VALUE rbncurs_wclrtobot(VALUE dummy, VALUE arg1) {
1453
+ return INT2NUM(wclrtobot(get_window(arg1)));
1454
+ }
1455
+ static VALUE rbncurs_wclrtoeol(VALUE dummy, VALUE arg1) {
1456
+ return INT2NUM(wclrtoeol(get_window(arg1)));
1457
+ }
1458
+ #ifdef HAVE_WCOLOR_SET
1459
+ static VALUE rbncurs_wcolor_set(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1460
+ return INT2NUM(wcolor_set(get_window(arg1), NUM2INT(arg2), ((void)(arg3),NULL)));
1461
+ }
1462
+ #endif
1463
+ static VALUE rbncurs_wcursyncup(VALUE dummy, VALUE arg1) {
1464
+ return ((wcursyncup(get_window(arg1))),Qnil);
1465
+ }
1466
+ static VALUE rbncurs_wdelch(VALUE dummy, VALUE arg1) {
1467
+ return INT2NUM(wdelch(get_window(arg1)));
1468
+ }
1469
+ static VALUE rbncurs_wdeleteln(VALUE dummy, VALUE arg1) {
1470
+ return INT2NUM(wdeleteln(get_window(arg1)));
1471
+ }
1472
+ static VALUE rbncurs_wechochar(VALUE dummy, VALUE arg1, VALUE arg2) {
1473
+ return INT2NUM(wechochar(get_window(arg1), NUM2ULONG(arg2)));
1474
+ }
1475
+ static VALUE rbncurs_werase(VALUE dummy, VALUE arg1) {
1476
+ return INT2NUM(werase(get_window(arg1)));
1477
+ }
1478
+ static VALUE rbncurs_wgetch(VALUE dummy, VALUE arg1) {
1479
+ return INT2NUM(rbncurshelper_nonblocking_wgetch(get_window(arg1)));
1480
+ }
1481
+ static VALUE rbncurs_whline(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1482
+ return INT2NUM(whline(get_window(arg1), NUM2ULONG(arg2), NUM2INT(arg3)));
1483
+ }
1484
+ static VALUE rbncurs_winch(VALUE dummy, VALUE arg1) {
1485
+ return INT2NUM(winch(get_window(arg1)));
1486
+ }
1487
+ static VALUE rbncurs_winsch(VALUE dummy, VALUE arg1, VALUE arg2) {
1488
+ return INT2NUM(winsch(get_window(arg1), NUM2ULONG(arg2)));
1489
+ }
1490
+ static VALUE rbncurs_winsdelln(VALUE dummy, VALUE arg1, VALUE arg2) {
1491
+ return INT2NUM(winsdelln(get_window(arg1), NUM2INT(arg2)));
1492
+ }
1493
+ static VALUE rbncurs_winsertln(VALUE dummy, VALUE arg1) {
1494
+ return INT2NUM(winsertln(get_window(arg1)));
1495
+ }
1496
+ static VALUE rbncurs_winsnstr(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1497
+ return INT2NUM(winsnstr(get_window(arg1), StringValuePtr(arg2), NUM2INT(arg3)));
1498
+ }
1499
+ static VALUE rbncurs_winsstr(VALUE dummy, VALUE arg1, VALUE arg2) {
1500
+ return INT2NUM(winsstr(get_window(arg1), StringValuePtr(arg2)));
1501
+ }
1502
+ static VALUE rbncurs_wmove(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1503
+ return INT2NUM(wmove(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3)));
1504
+ }
1505
+ static VALUE rbncurs_wnoutrefresh(VALUE dummy, VALUE arg1) {
1506
+ return INT2NUM(wnoutrefresh(get_window(arg1)));
1507
+ }
1508
+ static VALUE rbncurs_wredrawln(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1509
+ return INT2NUM(wredrawln(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3)));
1510
+ }
1511
+ static VALUE rbncurs_wrefresh(VALUE dummy, VALUE arg1) {
1512
+ return INT2NUM(wrefresh(get_window(arg1)));
1513
+ }
1514
+ static VALUE rbncurs_wscrl(VALUE dummy, VALUE arg1, VALUE arg2) {
1515
+ return INT2NUM(wscrl(get_window(arg1), NUM2INT(arg2)));
1516
+ }
1517
+ static VALUE rbncurs_wsetscrreg(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1518
+ return INT2NUM(wsetscrreg(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3)));
1519
+ }
1520
+ static VALUE rbncurs_wstandout(VALUE dummy, VALUE arg1) {
1521
+ return INT2NUM(wstandout(get_window(arg1)));
1522
+ }
1523
+ static VALUE rbncurs_wstandend(VALUE dummy, VALUE arg1) {
1524
+ return INT2NUM(wstandend(get_window(arg1)));
1525
+ }
1526
+ static VALUE rbncurs_wsyncdown(VALUE dummy, VALUE arg1) {
1527
+ return ((wsyncdown(get_window(arg1))),Qnil);
1528
+ }
1529
+ static VALUE rbncurs_wsyncup(VALUE dummy, VALUE arg1) {
1530
+ return ((wsyncup(get_window(arg1))),Qnil);
1531
+ }
1532
+ static VALUE rbncurs_wtimeout(VALUE dummy, VALUE arg1, VALUE arg2) {
1533
+ return ((wtimeout(get_window(arg1), NUM2INT(arg2))),Qnil);
1534
+ }
1535
+ static VALUE rbncurs_wtouchln(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3, VALUE arg4) {
1536
+ return INT2NUM(wtouchln(get_window(arg1), NUM2INT(arg2), NUM2INT(arg3), NUM2INT(arg4)));
1537
+ }
1538
+ static VALUE rbncurs_wvline(VALUE dummy, VALUE arg1, VALUE arg2, VALUE arg3) {
1539
+ return INT2NUM(wvline(get_window(arg1), NUM2ULONG(arg2), NUM2INT(arg3)));
1540
+ }
1541
+ static VALUE rbncurs_color_content(VALUE dummy, VALUE color, VALUE r, VALUE g, VALUE b) {
1542
+ if (rb_obj_is_instance_of(r, rb_cArray) != Qtrue
1543
+ || rb_obj_is_instance_of(g, rb_cArray) != Qtrue
1544
+ || rb_obj_is_instance_of(b, rb_cArray) != Qtrue) {
1545
+ rb_raise(rb_eArgError,
1546
+ "r,g and b (2nd to 4th argument) must be an empty Arrays");
1547
+ return Qnil;
1548
+ }
1549
+ {
1550
+ short cv[3] = {0,0,0};
1551
+ int return_value = color_content(NUM2INT(color), &cv[0], &cv[1],
1552
+ &cv[2]);
1553
+ rb_ary_push(r, INT2NUM(cv[0])); rb_ary_push(g, INT2NUM(cv[1]));
1554
+ rb_ary_push(b, INT2NUM(cv[2])); return INT2NUM(return_value);
1555
+ }
1556
+ }
1557
+ static VALUE rbncurs_pair_content(VALUE dummy, VALUE pair, VALUE fg, VALUE bg) {
1558
+ if (rb_obj_is_instance_of(fg, rb_cArray) != Qtrue
1559
+ || rb_obj_is_instance_of(bg, rb_cArray) != Qtrue) {
1560
+ rb_raise(rb_eArgError,
1561
+ "fg and bg (2nd and 3rd argument) must be an empty Arrays");
1562
+ return Qnil;
1563
+ }
1564
+ {
1565
+ short cn[2] = {0,0};
1566
+ int return_value = pair_content(NUM2INT(pair), &cn[0], &cn[1]);
1567
+ rb_ary_push(fg, INT2NUM(cn[0])); rb_ary_push(bg, INT2NUM(cn[1]));
1568
+ return INT2NUM(return_value);
1569
+ }
1570
+ }
1571
+ #ifdef HAVE_GETWIN
1572
+ static VALUE rbncurs_getwin(VALUE dummy, VALUE io)
1573
+ {
1574
+ int fd = dup(NUM2INT(rb_funcall(io, rb_intern("to_i"), 0)));
1575
+ FILE * f = fdopen(fd, "r");
1576
+ WINDOW * win = getwin(f);
1577
+ fclose(f);
1578
+ close(fd);
1579
+ {
1580
+ VALUE return_value = Qnil;
1581
+ if (win) return_value = wrap_window(win);
1582
+ return return_value;
1583
+ }
1584
+ }
1585
+ #endif
1586
+ #ifdef HAVE_PUTWIN
1587
+ static VALUE rbncurs_putwin(VALUE dummy, VALUE rb_win, VALUE io)
1588
+ {
1589
+ int fd = dup(NUM2INT(rb_funcall(io, rb_intern("to_i"), 0)));
1590
+ FILE * f = fdopen(fd, "w");
1591
+ WINDOW * win = get_window(rb_win);
1592
+ int return_value = putwin(win, f);
1593
+ fclose(f);
1594
+ close(fd);
1595
+ return INT2NUM(return_value);
1596
+ }
1597
+ #endif
1598
+ static VALUE rbncurs_unctrl(VALUE dummy, VALUE ch)
1599
+ { return rb_str_new2(unctrl(NUM2ULONG(ch))); }
1600
+ static VALUE rbncurs_newterm(VALUE dummy, VALUE rb_type, VALUE rb_outfd, VALUE rb_infd)
1601
+ {
1602
+ char * type = (rb_type == Qnil) ? (char*)0 : StringValuePtr(rb_type);
1603
+ int outfd = NUM2INT(rb_funcall(rb_outfd, rb_intern("to_i"), 0));
1604
+ int infd = NUM2INT(rb_funcall(rb_infd, rb_intern("to_i"), 0));
1605
+ VALUE rb_screen =
1606
+ wrap_screen(newterm(type, fdopen(outfd, "w"), fdopen(infd, "r")));
1607
+ if (RTEST(rb_screen)) {
1608
+ Init_ncurses_full();
1609
+ rbncurshelper_halfdelay_cbreak_restore();
1610
+ }
1611
+ rb_iv_set(mNcurses, "@infd", INT2NUM(infd));
1612
+ rb_iv_set(rb_screen, "@infd", INT2NUM(infd));
1613
+ rb_iv_set(mNcurses, "@halfdelay", INT2FIX(0));
1614
+ rb_iv_set(rb_screen, "@halfdelay", INT2FIX(0));
1615
+ rb_iv_set(mNcurses, "@cbreak", Qfalse);
1616
+ rb_iv_set(rb_screen, "@cbreak", Qfalse);
1617
+ return rb_screen;
1618
+ }
1619
+
1620
+
1621
+ static void init_functions_2(void) {
1622
+ NCFUNC(addch, 1);
1623
+ NCFUNC(addchnstr, 2);
1624
+ NCFUNC(addchstr, 1);
1625
+ NCFUNC(addnstr, 2);
1626
+ NCFUNC(addstr, 1);
1627
+ NCFUNC(attroff, 1);
1628
+ NCFUNC(attron, 1);
1629
+ NCFUNC(attrset, 1);
1630
+ #if defined(NCURSES_VERSION_MAJOR) && NCURSES_VERSION_MAJOR > 4
1631
+ #ifdef HAVE_ATTR_OFF
1632
+ NCFUNC(attr_off, 2);
1633
+ #endif
1634
+ #ifdef HAVE_ATTR_ON
1635
+ NCFUNC(attr_on, 2);
1636
+ #endif
1637
+ #ifdef HAVE_ATTR_SET
1638
+ NCFUNC(attr_set, 3);
1639
+ #endif
1640
+ #if defined(HAVE_SLK_ATTR_OFF) || defined(slk_attr_off)
1641
+ NCFUNC(slk_attr_off, 2);
1642
+ #endif
1643
+ #if defined(HAVE_SLK_ATTR_ON) || defined(slk_attr_on)
1644
+ NCFUNC(slk_attr_on, 2);
1645
+ #endif
1646
+ #ifdef HAVE_SLK_ATTR_SET
1647
+ NCFUNC(slk_attr_set, 3);
1648
+ #endif
1649
+ #ifdef HAVE_WATTR_ON
1650
+ NCFUNC(wattr_on, 3);
1651
+ #endif
1652
+ #ifdef HAVE_WATTR_OFF
1653
+ NCFUNC(wattr_off, 3);
1654
+ #endif
1655
+ #ifdef HAVE_WATTR_SET
1656
+ NCFUNC(wattr_set, 4);
1657
+ #endif
1658
+ #if defined (HAVE_VID_ATTR) || defined(vid_attr)
1659
+ NCFUNC(vid_attr, 3);
1660
+ #endif
1661
+ #ifdef HAVE_ATTR_GET
1662
+ NCFUNC(attr_get, 3);
1663
+ NCFUNC(wattr_get, 4);
1664
+ #endif /* HAVE_ATTR_GET */
1665
+ #endif
1666
+ NCFUNC(baudrate, 0);
1667
+ NCFUNC(beep, 0);
1668
+ NCFUNC(bkgd, 1);
1669
+ NCFUNC(bkgdset, 1);
1670
+ NCFUNC(border, 8);
1671
+ NCFUNC(box, 3);
1672
+ rb_define_module_function(mNcurses, "can_change_color?",
1673
+ (&rbncurs_can_change_color),
1674
+ 0);
1675
+ NCFUNC(cbreak, 0);
1676
+ #ifdef HAVE_CHGAT
1677
+ NCFUNC(chgat, 4);
1678
+ #endif
1679
+ NCFUNC(clear, 0);
1680
+ NCFUNC(clearok, 2);
1681
+ NCFUNC(clrtobot, 0);
1682
+ NCFUNC(clrtoeol, 0);
1683
+ #ifdef HAVE_COLOR_SET
1684
+ NCFUNC(color_set, 2);
1685
+ #endif
1686
+ NCFUNC(COLOR_PAIR, 1);
1687
+ NCFUNC(copywin, 9);
1688
+ NCFUNC(curs_set, 1);
1689
+ NCFUNC(def_prog_mode, 0);
1690
+ NCFUNC(def_shell_mode, 0);
1691
+ NCFUNC(delay_output, 1);
1692
+ NCFUNC(delch, 0);
1693
+ NCFUNC(deleteln, 0);
1694
+ NCFUNC(derwin, 5);
1695
+ NCFUNC(doupdate, 0);
1696
+ NCFUNC(dupwin, 1);
1697
+ NCFUNC(echo, 0);
1698
+ NCFUNC(echochar, 1);
1699
+ NCFUNC(endwin, 0);
1700
+ NCFUNC(erasechar, 0);
1701
+ NCFUNC(flash, 0);
1702
+ NCFUNC(flushinp, 0);
1703
+ NCFUNC(getbkgd, 1);
1704
+ NCFUNC(getch, 0);
1705
+ NCFUNC(halfdelay, 1);
1706
+ rb_define_module_function(mNcurses, "has_colors?",
1707
+ (&rbncurs_has_colors),
1708
+ 0);
1709
+ rb_define_module_function(mNcurses, "has_ic?",
1710
+ (&rbncurs_has_ic),
1711
+ 0);
1712
+ rb_define_module_function(mNcurses, "has_il?",
1713
+ (&rbncurs_has_il),
1714
+ 0);
1715
+ NCFUNC(hline, 2);
1716
+ NCFUNC(idcok, 2);
1717
+ NCFUNC(idlok, 2);
1718
+ NCFUNC(immedok, 2);
1719
+ NCFUNC(inch, 0);
1720
+ NCFUNC(init_color, 4);
1721
+ NCFUNC(init_pair, 3);
1722
+ NCFUNC(insch, 1);
1723
+ NCFUNC(insdelln, 1);
1724
+ NCFUNC(insertln, 0);
1725
+ NCFUNC(insnstr, 2);
1726
+ NCFUNC(insstr, 1);
1727
+ #ifdef HAVE_INTRFLUSH
1728
+ NCFUNC(intrflush, 2);
1729
+ #endif
1730
+ rb_define_module_function(mNcurses, "isendwin?",
1731
+ (&rbncurs_isendwin),
1732
+ 0);
1733
+ rb_define_module_function(mNcurses, "is_linetouched?",
1734
+ (&rbncurs_is_linetouched),
1735
+ 2);
1736
+ rb_define_module_function(mNcurses, "is_wintouched?",
1737
+ (&rbncurs_is_wintouched),
1738
+ 1);
1739
+ NCFUNC(keyname, 1);
1740
+ NCFUNC(keypad, 2);
1741
+ NCFUNC(killchar, 0);
1742
+ NCFUNC(leaveok, 2);
1743
+ NCFUNC(longname, 0);
1744
+ NCFUNC(meta, 2);
1745
+ NCFUNC(move, 2);
1746
+ NCFUNC(mvaddch, 3);
1747
+ NCFUNC(mvaddchnstr, 4);
1748
+ NCFUNC(mvaddchstr, 3);
1749
+ NCFUNC(mvaddnstr, 4);
1750
+ NCFUNC(mvaddstr, 3);
1751
+ #ifdef HAVE_MVCHGAT
1752
+ NCFUNC(mvchgat, 6);
1753
+ #endif
1754
+ NCFUNC(mvcur, 4);
1755
+ NCFUNC(mvdelch, 2);
1756
+ NCFUNC(mvderwin, 3);
1757
+ NCFUNC(mvgetch, 2);
1758
+ #ifdef HAVE_MVHLINE
1759
+ NCFUNC(mvhline, 4);
1760
+ #endif
1761
+ NCFUNC(mvinch, 2);
1762
+ NCFUNC(mvinsch, 3);
1763
+ NCFUNC(mvinsnstr, 4);
1764
+ NCFUNC(mvinsstr, 3);
1765
+ #ifdef HAVE_MVVLINE
1766
+ NCFUNC(mvvline, 4);
1767
+ #endif
1768
+ NCFUNC(mvwaddch, 4);
1769
+ NCFUNC(mvwaddchnstr, 5);
1770
+ NCFUNC(mvwaddchstr, 4);
1771
+ NCFUNC(mvwaddnstr, 5);
1772
+ NCFUNC(mvwaddstr, 4);
1773
+ #ifdef HAVE_MVWCHGAT
1774
+ NCFUNC(mvwchgat, 7);
1775
+ #endif
1776
+ NCFUNC(mvwdelch, 3);
1777
+ NCFUNC(mvwgetch, 3);
1778
+ #ifdef HAVE_MVWHLINE
1779
+ NCFUNC(mvwhline, 5);
1780
+ #endif
1781
+ NCFUNC(mvwin, 3);
1782
+ NCFUNC(mvwinch, 3);
1783
+ NCFUNC(mvwinsch, 4);
1784
+ NCFUNC(mvwinsnstr, 5);
1785
+ NCFUNC(mvwinsstr, 4);
1786
+ #ifdef HAVE_MVWVLINE
1787
+ NCFUNC(mvwvline, 5);
1788
+ #endif
1789
+ NCFUNC(napms, 1);
1790
+ NCFUNC(newpad, 2);
1791
+ NCFUNC(newwin, 4);
1792
+ NCFUNC(nl, 0);
1793
+ NCFUNC(nocbreak, 0);
1794
+ NCFUNC(nodelay, 2);
1795
+ NCFUNC(noecho, 0);
1796
+ NCFUNC(nonl, 0);
1797
+ #ifdef HAVE_NOQIFLUSH
1798
+ NCFUNC(noqiflush, 0);
1799
+ #endif
1800
+ NCFUNC(noraw, 0);
1801
+ NCFUNC(notimeout, 2);
1802
+ NCFUNC(overlay, 2);
1803
+ NCFUNC(overwrite, 2);
1804
+ NCFUNC(PAIR_NUMBER, 1);
1805
+ #ifndef __PDCURSES__ /* pdcurses' pechochar macro does not work */
1806
+ NCFUNC(pechochar, 2);
1807
+ #endif
1808
+ NCFUNC(pnoutrefresh, 7);
1809
+ NCFUNC(prefresh, 7);
1810
+ #ifdef HAVE_PUTP
1811
+ NCFUNC(putp, 1);
1812
+ #endif
1813
+ #ifdef HAVE_QIFLUSH
1814
+ NCFUNC(qiflush, 0);
1815
+ #endif
1816
+ NCFUNC(raw, 0);
1817
+ #ifndef __PDCURSES__ /* pdcurses redrawwin macro has a bug */
1818
+ NCFUNC(redrawwin, 1);
1819
+ #endif
1820
+ NCFUNC(refresh, 0);
1821
+ NCFUNC(resetty, 0);
1822
+ NCFUNC(reset_prog_mode, 0);
1823
+ NCFUNC(reset_shell_mode, 0);
1824
+ NCFUNC(savetty, 0);
1825
+ #ifdef HAVE_SCR_DUMP
1826
+ NCFUNC(scr_dump, 1);
1827
+ #endif
1828
+ #ifdef HAVE_SCR_INIT
1829
+ NCFUNC(scr_init, 1);
1830
+ #endif
1831
+ NCFUNC(scrl, 1);
1832
+ NCFUNC(scroll, 1);
1833
+ NCFUNC(scrollok, 2);
1834
+ #ifdef HAVE_SCR_RESTORE
1835
+ NCFUNC(scr_restore, 1);
1836
+ #endif
1837
+ #ifdef HAVE_SCR_SET
1838
+ NCFUNC(scr_set, 1);
1839
+ #endif
1840
+ NCFUNC(setscrreg, 2);
1841
+ NCFUNC(set_term, 1);
1842
+ NCFUNC(slk_attroff, 1);
1843
+ NCFUNC(slk_attron, 1);
1844
+ NCFUNC(slk_attrset, 1);
1845
+ #ifdef HAVE_SLK_ATTR
1846
+ NCFUNC(slk_attr, 0);
1847
+ #endif
1848
+ NCFUNC(slk_clear, 0);
1849
+ #ifdef HAVE_SLK_COLOR
1850
+ NCFUNC(slk_color, 1);
1851
+ #endif
1852
+ NCFUNC(slk_label, 1);
1853
+ NCFUNC(slk_noutrefresh, 0);
1854
+ NCFUNC(slk_refresh, 0);
1855
+ NCFUNC(slk_restore, 0);
1856
+ NCFUNC(slk_set, 3);
1857
+ NCFUNC(slk_touch, 0);
1858
+ NCFUNC(standout, 0);
1859
+ NCFUNC(standend, 0);
1860
+ NCFUNC(start_color, 0);
1861
+ NCFUNC(subpad, 5);
1862
+ NCFUNC(subwin, 5);
1863
+ NCFUNC(syncok, 2);
1864
+ NCFUNC(termattrs, 0);
1865
+ NCFUNC(termname, 0);
1866
+ #ifdef HAVE_TIGETFLAG
1867
+ NCFUNC(tigetflag, 1);
1868
+ #endif
1869
+ #ifdef HAVE_TIGETNUM
1870
+ NCFUNC(tigetnum, 1);
1871
+ #endif
1872
+ #ifdef HAVE_TIGETSTR
1873
+ NCFUNC(tigetstr, 1);
1874
+ #endif
1875
+ NCFUNC(timeout, 1);
1876
+ NCFUNC(typeahead, 1);
1877
+ NCFUNC(ungetch, 1);
1878
+ NCFUNC(untouchwin, 1);
1879
+ #ifdef HAVE_VIDATTR
1880
+ NCFUNC(vidattr, 1);
1881
+ #endif
1882
+ NCFUNC(vline, 2);
1883
+ NCFUNC(waddch, 2);
1884
+ NCFUNC(waddchnstr, 3);
1885
+ NCFUNC(waddchstr, 2);
1886
+ NCFUNC(waddnstr, 3);
1887
+ NCFUNC(waddstr, 2);
1888
+ NCFUNC(wattron, 2);
1889
+ NCFUNC(wattroff, 2);
1890
+ NCFUNC(wattrset, 2);
1891
+ NCFUNC(wbkgd, 2);
1892
+ NCFUNC(wbkgdset, 2);
1893
+ NCFUNC(wborder, 9);
1894
+ #ifdef HAVE_WCHGAT
1895
+ NCFUNC(wchgat, 5);
1896
+ #endif
1897
+ NCFUNC(wclear, 1);
1898
+ NCFUNC(wclrtobot, 1);
1899
+ NCFUNC(wclrtoeol, 1);
1900
+ #ifdef HAVE_WCOLOR_SET
1901
+ NCFUNC(wcolor_set, 3);
1902
+ #endif
1903
+ NCFUNC(wcursyncup, 1);
1904
+ NCFUNC(wdelch, 1);
1905
+ NCFUNC(wdeleteln, 1);
1906
+ NCFUNC(wechochar, 2);
1907
+ NCFUNC(werase, 1);
1908
+ NCFUNC(wgetch, 1);
1909
+ NCFUNC(whline, 3);
1910
+ NCFUNC(winch, 1);
1911
+ NCFUNC(winsch, 2);
1912
+ NCFUNC(winsdelln, 2);
1913
+ NCFUNC(winsertln, 1);
1914
+ NCFUNC(winsnstr, 3);
1915
+ NCFUNC(winsstr, 2);
1916
+ NCFUNC(wmove, 3);
1917
+ NCFUNC(wnoutrefresh, 1);
1918
+ NCFUNC(wredrawln, 3);
1919
+ NCFUNC(wrefresh, 1);
1920
+ NCFUNC(wscrl, 2);
1921
+ NCFUNC(wsetscrreg, 3);
1922
+ NCFUNC(wstandout, 1);
1923
+ NCFUNC(wstandend, 1);
1924
+ NCFUNC(wsyncdown, 1);
1925
+ NCFUNC(wsyncup, 1);
1926
+ NCFUNC(wtimeout, 2);
1927
+ NCFUNC(wtouchln, 4);
1928
+ NCFUNC(wvline, 3);
1929
+ NCFUNC(color_content, 4);
1930
+ NCFUNC(pair_content, 3);
1931
+ NCFUNC(pair_content, 3);
1932
+ #ifdef HAVE_GETWIN
1933
+ NCFUNC(getwin, 1);
1934
+ #endif
1935
+ #ifdef HAVE_PUTWIN
1936
+ NCFUNC(putwin, 2);
1937
+ #endif
1938
+ NCFUNC(unctrl, 1);
1939
+ }
1940
+
1941
+
1942
+ static void init_constants_3(void) {
1943
+ /* #define NCURSES_BITS(mask,shift) ((mask) << ((shift) + 8)) */
1944
+
1945
+ /* attributes */
1946
+
1947
+ rb_define_const(mNcurses, "A_NORMAL", INT2NUM(A_NORMAL));
1948
+ rb_define_const(mNcurses, "A_ATTRIBUTES", INT2NUM(A_ATTRIBUTES));
1949
+ rb_define_const(mNcurses, "A_CHARTEXT", INT2NUM(A_CHARTEXT));
1950
+ rb_define_const(mNcurses, "A_COLOR", INT2NUM(A_COLOR));
1951
+ rb_define_const(mNcurses, "A_STANDOUT", INT2NUM(A_STANDOUT));
1952
+ rb_define_const(mNcurses, "A_UNDERLINE", INT2NUM(A_UNDERLINE));
1953
+ rb_define_const(mNcurses, "A_REVERSE", INT2NUM(A_REVERSE));
1954
+ rb_define_const(mNcurses, "A_BLINK", INT2NUM(A_BLINK));
1955
+ rb_define_const(mNcurses, "A_DIM", INT2NUM(A_DIM));
1956
+ rb_define_const(mNcurses, "A_BOLD", INT2NUM(A_BOLD));
1957
+ rb_define_const(mNcurses, "A_ALTCHARSET", INT2NUM(A_ALTCHARSET));
1958
+ rb_define_const(mNcurses, "A_INVIS", INT2NUM(A_INVIS));
1959
+
1960
+ /* Tradeoff on 32-bit machines ('protect' vs widec). The others (e.g., left
1961
+ * highlight are not implemented in any terminal descriptions, anyway.
1962
+ */
1963
+ rb_define_const(mNcurses, "A_PROTECT", INT2NUM(A_PROTECT));
1964
+ #ifdef A_HORIZONTAL
1965
+ rb_define_const(mNcurses, "A_HORIZONTAL", INT2NUM(A_HORIZONTAL));
1966
+ #endif
1967
+ #ifdef A_LEFT
1968
+ rb_define_const(mNcurses, "A_LEFT", INT2NUM(A_LEFT));
1969
+ #endif
1970
+ #ifdef A_LOW
1971
+ rb_define_const(mNcurses, "A_LOW", INT2NUM(A_LOW));
1972
+ #endif
1973
+ #ifdef A_RIGHT
1974
+ rb_define_const(mNcurses, "A_RIGHT", INT2NUM(A_RIGHT));
1975
+ #endif
1976
+ #ifdef A_TOP
1977
+ rb_define_const(mNcurses, "A_TOP", INT2NUM(A_TOP));
1978
+ #endif
1979
+ #ifdef A_VERTICAL
1980
+ rb_define_const(mNcurses, "A_VERTICAL", INT2NUM(A_VERTICAL));
1981
+ #endif
1982
+
1983
+ /* Pseudo-character tokens outside ASCII range. The curses wgetch()
1984
+ * function will return any given one of these only if the corresponding
1985
+ * k- capability is defined in your terminal's terminfo entry. */
1986
+ #ifdef KEY_CODE_YES
1987
+ rb_define_const(mNcurses, "KEY_CODE_YES", INT2NUM(KEY_CODE_YES));
1988
+ #endif
1989
+ rb_define_const(mNcurses, "KEY_MIN", INT2NUM(KEY_MIN));
1990
+ rb_define_const(mNcurses, "KEY_BREAK", INT2NUM(KEY_BREAK));
1991
+ rb_define_const(mNcurses, "KEY_DOWN", INT2NUM(KEY_DOWN));
1992
+ rb_define_const(mNcurses, "KEY_UP", INT2NUM(KEY_UP));
1993
+ rb_define_const(mNcurses, "KEY_LEFT", INT2NUM(KEY_LEFT));
1994
+ rb_define_const(mNcurses, "KEY_RIGHT", INT2NUM(KEY_RIGHT));
1995
+ rb_define_const(mNcurses, "KEY_HOME", INT2NUM(KEY_HOME));
1996
+ rb_define_const(mNcurses, "KEY_BACKSPACE", INT2NUM(KEY_BACKSPACE));
1997
+ rb_define_const(mNcurses, "KEY_F0", INT2NUM(KEY_F(0)));
1998
+ rb_define_const(mNcurses, "KEY_F1", INT2NUM(KEY_F(1)));
1999
+ rb_define_const(mNcurses, "KEY_F2", INT2NUM(KEY_F(2)));
2000
+ rb_define_const(mNcurses, "KEY_F3", INT2NUM(KEY_F(3)));
2001
+ rb_define_const(mNcurses, "KEY_F4", INT2NUM(KEY_F(4)));
2002
+ rb_define_const(mNcurses, "KEY_F5", INT2NUM(KEY_F(5)));
2003
+ rb_define_const(mNcurses, "KEY_F6", INT2NUM(KEY_F(6)));
2004
+ rb_define_const(mNcurses, "KEY_F7", INT2NUM(KEY_F(7)));
2005
+ rb_define_const(mNcurses, "KEY_F8", INT2NUM(KEY_F(8)));
2006
+ rb_define_const(mNcurses, "KEY_F9", INT2NUM(KEY_F(9)));
2007
+ rb_define_const(mNcurses, "KEY_F10", INT2NUM(KEY_F(10)));
2008
+ rb_define_const(mNcurses, "KEY_F11", INT2NUM(KEY_F(11)));
2009
+ rb_define_const(mNcurses, "KEY_F12", INT2NUM(KEY_F(12)));
2010
+ rb_define_const(mNcurses, "KEY_F13", INT2NUM(KEY_F(13)));
2011
+ rb_define_const(mNcurses, "KEY_F14", INT2NUM(KEY_F(14)));
2012
+ rb_define_const(mNcurses, "KEY_F15", INT2NUM(KEY_F(15)));
2013
+ rb_define_const(mNcurses, "KEY_F16", INT2NUM(KEY_F(16)));
2014
+ rb_define_const(mNcurses, "KEY_F17", INT2NUM(KEY_F(17)));
2015
+ rb_define_const(mNcurses, "KEY_F18", INT2NUM(KEY_F(18)));
2016
+ rb_define_const(mNcurses, "KEY_F19", INT2NUM(KEY_F(19)));
2017
+ rb_define_const(mNcurses, "KEY_F20", INT2NUM(KEY_F(20)));
2018
+ rb_define_const(mNcurses, "KEY_F21", INT2NUM(KEY_F(21)));
2019
+ rb_define_const(mNcurses, "KEY_F22", INT2NUM(KEY_F(22)));
2020
+ rb_define_const(mNcurses, "KEY_F23", INT2NUM(KEY_F(23)));
2021
+ rb_define_const(mNcurses, "KEY_F24", INT2NUM(KEY_F(24)));
2022
+ rb_define_const(mNcurses, "KEY_F25", INT2NUM(KEY_F(25)));
2023
+ rb_define_const(mNcurses, "KEY_F26", INT2NUM(KEY_F(26)));
2024
+ rb_define_const(mNcurses, "KEY_F27", INT2NUM(KEY_F(27)));
2025
+ rb_define_const(mNcurses, "KEY_F28", INT2NUM(KEY_F(28)));
2026
+ rb_define_const(mNcurses, "KEY_F29", INT2NUM(KEY_F(29)));
2027
+ rb_define_const(mNcurses, "KEY_F30", INT2NUM(KEY_F(30)));
2028
+ rb_define_const(mNcurses, "KEY_DL", INT2NUM(KEY_DL));
2029
+ rb_define_const(mNcurses, "KEY_IL", INT2NUM(KEY_IL));
2030
+ rb_define_const(mNcurses, "KEY_DC", INT2NUM(KEY_DC));
2031
+ rb_define_const(mNcurses, "KEY_IC", INT2NUM(KEY_IC));
2032
+ rb_define_const(mNcurses, "KEY_EIC", INT2NUM(KEY_EIC));
2033
+ rb_define_const(mNcurses, "KEY_CLEAR", INT2NUM(KEY_CLEAR));
2034
+ rb_define_const(mNcurses, "KEY_EOS", INT2NUM(KEY_EOS));
2035
+ rb_define_const(mNcurses, "KEY_EOL", INT2NUM(KEY_EOL));
2036
+ rb_define_const(mNcurses, "KEY_SF", INT2NUM(KEY_SF));
2037
+ rb_define_const(mNcurses, "KEY_SR", INT2NUM(KEY_SR));
2038
+ rb_define_const(mNcurses, "KEY_NPAGE", INT2NUM(KEY_NPAGE));
2039
+ rb_define_const(mNcurses, "KEY_PPAGE", INT2NUM(KEY_PPAGE));
2040
+ rb_define_const(mNcurses, "KEY_STAB", INT2NUM(KEY_STAB));
2041
+ rb_define_const(mNcurses, "KEY_CTAB", INT2NUM(KEY_CTAB));
2042
+ rb_define_const(mNcurses, "KEY_CATAB", INT2NUM(KEY_CATAB));
2043
+ rb_define_const(mNcurses, "KEY_ENTER", INT2NUM(KEY_ENTER));
2044
+ rb_define_const(mNcurses, "KEY_SRESET", INT2NUM(KEY_SRESET));
2045
+ rb_define_const(mNcurses, "KEY_RESET", INT2NUM(KEY_RESET));
2046
+ rb_define_const(mNcurses, "KEY_PRINT", INT2NUM(KEY_PRINT));
2047
+ rb_define_const(mNcurses, "KEY_LL", INT2NUM(KEY_LL));
2048
+
2049
+ /* The keypad is arranged like this: */
2050
+ /* a1 up a3 */
2051
+ /* left b2 right */
2052
+ /* c1 down c3 */
2053
+
2054
+ rb_define_const(mNcurses, "KEY_A1", INT2NUM(KEY_A1));
2055
+ rb_define_const(mNcurses, "KEY_A3", INT2NUM(KEY_A3));
2056
+ rb_define_const(mNcurses, "KEY_B2", INT2NUM(KEY_B2));
2057
+ rb_define_const(mNcurses, "KEY_C1", INT2NUM(KEY_C1));
2058
+ rb_define_const(mNcurses, "KEY_C3", INT2NUM(KEY_C3));
2059
+ rb_define_const(mNcurses, "KEY_BTAB", INT2NUM(KEY_BTAB));
2060
+ rb_define_const(mNcurses, "KEY_BEG", INT2NUM(KEY_BEG));
2061
+ rb_define_const(mNcurses, "KEY_CANCEL", INT2NUM(KEY_CANCEL));
2062
+ rb_define_const(mNcurses, "KEY_CLOSE", INT2NUM(KEY_CLOSE));
2063
+ rb_define_const(mNcurses, "KEY_COMMAND", INT2NUM(KEY_COMMAND));
2064
+ rb_define_const(mNcurses, "KEY_COPY", INT2NUM(KEY_COPY));
2065
+ rb_define_const(mNcurses, "KEY_CREATE", INT2NUM(KEY_CREATE));
2066
+ rb_define_const(mNcurses, "KEY_END", INT2NUM(KEY_END));
2067
+ rb_define_const(mNcurses, "KEY_EXIT", INT2NUM(KEY_EXIT));
2068
+ rb_define_const(mNcurses, "KEY_FIND", INT2NUM(KEY_FIND));
2069
+ rb_define_const(mNcurses, "KEY_HELP", INT2NUM(KEY_HELP));
2070
+ rb_define_const(mNcurses, "KEY_MARK", INT2NUM(KEY_MARK));
2071
+ rb_define_const(mNcurses, "KEY_MESSAGE", INT2NUM(KEY_MESSAGE));
2072
+ rb_define_const(mNcurses, "KEY_MOVE", INT2NUM(KEY_MOVE));
2073
+ rb_define_const(mNcurses, "KEY_NEXT", INT2NUM(KEY_NEXT));
2074
+ rb_define_const(mNcurses, "KEY_OPEN", INT2NUM(KEY_OPEN));
2075
+ rb_define_const(mNcurses, "KEY_OPTIONS", INT2NUM(KEY_OPTIONS));
2076
+ rb_define_const(mNcurses, "KEY_PREVIOUS", INT2NUM(KEY_PREVIOUS));
2077
+ rb_define_const(mNcurses, "KEY_REDO", INT2NUM(KEY_REDO));
2078
+ rb_define_const(mNcurses, "KEY_REFERENCE", INT2NUM(KEY_REFERENCE));
2079
+ rb_define_const(mNcurses, "KEY_REFRESH", INT2NUM(KEY_REFRESH));
2080
+ rb_define_const(mNcurses, "KEY_REPLACE", INT2NUM(KEY_REPLACE));
2081
+ rb_define_const(mNcurses, "KEY_RESTART", INT2NUM(KEY_RESTART));
2082
+ rb_define_const(mNcurses, "KEY_RESUME", INT2NUM(KEY_RESUME));
2083
+ rb_define_const(mNcurses, "KEY_SAVE", INT2NUM(KEY_SAVE));
2084
+ rb_define_const(mNcurses, "KEY_SBEG", INT2NUM(KEY_SBEG));
2085
+ rb_define_const(mNcurses, "KEY_SCANCEL", INT2NUM(KEY_SCANCEL));
2086
+ rb_define_const(mNcurses, "KEY_SCOMMAND", INT2NUM(KEY_SCOMMAND));
2087
+ rb_define_const(mNcurses, "KEY_SCOPY", INT2NUM(KEY_SCOPY));
2088
+ rb_define_const(mNcurses, "KEY_SCREATE", INT2NUM(KEY_SCREATE));
2089
+ rb_define_const(mNcurses, "KEY_SDC", INT2NUM(KEY_SDC));
2090
+ rb_define_const(mNcurses, "KEY_SDL", INT2NUM(KEY_SDL));
2091
+ rb_define_const(mNcurses, "KEY_SELECT", INT2NUM(KEY_SELECT));
2092
+ rb_define_const(mNcurses, "KEY_SEND", INT2NUM(KEY_SEND));
2093
+ rb_define_const(mNcurses, "KEY_SEOL", INT2NUM(KEY_SEOL));
2094
+ rb_define_const(mNcurses, "KEY_SEXIT", INT2NUM(KEY_SEXIT));
2095
+ rb_define_const(mNcurses, "KEY_SFIND", INT2NUM(KEY_SFIND));
2096
+ rb_define_const(mNcurses, "KEY_SHELP", INT2NUM(KEY_SHELP));
2097
+ rb_define_const(mNcurses, "KEY_SHOME", INT2NUM(KEY_SHOME));
2098
+ rb_define_const(mNcurses, "KEY_SIC", INT2NUM(KEY_SIC));
2099
+ rb_define_const(mNcurses, "KEY_SLEFT", INT2NUM(KEY_SLEFT));
2100
+ rb_define_const(mNcurses, "KEY_SMESSAGE", INT2NUM(KEY_SMESSAGE));
2101
+ rb_define_const(mNcurses, "KEY_SMOVE", INT2NUM(KEY_SMOVE));
2102
+ rb_define_const(mNcurses, "KEY_SNEXT", INT2NUM(KEY_SNEXT));
2103
+ rb_define_const(mNcurses, "KEY_SOPTIONS", INT2NUM(KEY_SOPTIONS));
2104
+ rb_define_const(mNcurses, "KEY_SPREVIOUS", INT2NUM(KEY_SPREVIOUS));
2105
+ rb_define_const(mNcurses, "KEY_SPRINT", INT2NUM(KEY_SPRINT));
2106
+ rb_define_const(mNcurses, "KEY_SREDO", INT2NUM(KEY_SREDO));
2107
+ rb_define_const(mNcurses, "KEY_SREPLACE", INT2NUM(KEY_SREPLACE));
2108
+ rb_define_const(mNcurses, "KEY_SRIGHT", INT2NUM(KEY_SRIGHT));
2109
+ rb_define_const(mNcurses, "KEY_SRSUME", INT2NUM(KEY_SRSUME));
2110
+ rb_define_const(mNcurses, "KEY_SSAVE", INT2NUM(KEY_SSAVE));
2111
+ rb_define_const(mNcurses, "KEY_SSUSPEND", INT2NUM(KEY_SSUSPEND));
2112
+ rb_define_const(mNcurses, "KEY_SUNDO", INT2NUM(KEY_SUNDO));
2113
+ rb_define_const(mNcurses, "KEY_SUSPEND", INT2NUM(KEY_SUSPEND));
2114
+ rb_define_const(mNcurses, "KEY_UNDO", INT2NUM(KEY_UNDO));
2115
+ rb_define_const(mNcurses, "KEY_MOUSE", INT2NUM(KEY_MOUSE));
2116
+ rb_define_const(mNcurses, "KEY_RESIZE", INT2NUM(KEY_RESIZE));
2117
+ rb_define_const(mNcurses, "KEY_MAX", INT2NUM(KEY_MAX));
2118
+
2119
+ /* mouse interface */
2120
+ /* #define NCURSES_MOUSE_VERSION 1 */
2121
+
2122
+ /* event masks */
2123
+ rb_define_const(mNcurses, "BUTTON1_RELEASED", INT2NUM(BUTTON1_RELEASED));
2124
+ rb_define_const(mNcurses, "BUTTON1_PRESSED", INT2NUM(BUTTON1_PRESSED));
2125
+ rb_define_const(mNcurses, "BUTTON1_CLICKED", INT2NUM(BUTTON1_CLICKED));
2126
+ rb_define_const(mNcurses, "BUTTON1_DOUBLE_CLICKED", INT2NUM(BUTTON1_DOUBLE_CLICKED));
2127
+ rb_define_const(mNcurses, "BUTTON1_TRIPLE_CLICKED", INT2NUM(BUTTON1_TRIPLE_CLICKED));
2128
+ #ifdef BUTTON1_RESERVED_EVENT
2129
+ rb_define_const(mNcurses, "BUTTON1_RESERVED_EVENT", INT2NUM(BUTTON1_RESERVED_EVENT));
2130
+ #endif
2131
+ rb_define_const(mNcurses, "BUTTON2_RELEASED", INT2NUM(BUTTON2_RELEASED));
2132
+ rb_define_const(mNcurses, "BUTTON2_PRESSED", INT2NUM(BUTTON2_PRESSED));
2133
+ rb_define_const(mNcurses, "BUTTON2_CLICKED", INT2NUM(BUTTON2_CLICKED));
2134
+ rb_define_const(mNcurses, "BUTTON2_DOUBLE_CLICKED", INT2NUM(BUTTON2_DOUBLE_CLICKED));
2135
+ rb_define_const(mNcurses, "BUTTON2_TRIPLE_CLICKED", INT2NUM(BUTTON2_TRIPLE_CLICKED));
2136
+ #ifdef BUTTON2_RESERVED_EVENT
2137
+ rb_define_const(mNcurses, "BUTTON2_RESERVED_EVENT", INT2NUM(BUTTON2_RESERVED_EVENT));
2138
+ #endif
2139
+ rb_define_const(mNcurses, "BUTTON3_RELEASED", INT2NUM(BUTTON3_RELEASED));
2140
+ rb_define_const(mNcurses, "BUTTON3_PRESSED", INT2NUM(BUTTON3_PRESSED));
2141
+ rb_define_const(mNcurses, "BUTTON3_CLICKED", INT2NUM(BUTTON3_CLICKED));
2142
+ rb_define_const(mNcurses, "BUTTON3_DOUBLE_CLICKED", INT2NUM(BUTTON3_DOUBLE_CLICKED));
2143
+ rb_define_const(mNcurses, "BUTTON3_TRIPLE_CLICKED", INT2NUM(BUTTON3_TRIPLE_CLICKED));
2144
+ #ifdef BUTTON3_RESERVED_EVENT
2145
+ rb_define_const(mNcurses, "BUTTON3_RESERVED_EVENT", INT2NUM(BUTTON3_RESERVED_EVENT));
2146
+ #endif
2147
+ #ifdef BUTTON4_RELEASED
2148
+ rb_define_const(mNcurses, "BUTTON4_RELEASED", INT2NUM(BUTTON4_RELEASED));
2149
+ #endif
2150
+ #ifdef BUTTON4_PRESSED
2151
+ rb_define_const(mNcurses, "BUTTON4_PRESSED", INT2NUM(BUTTON4_PRESSED));
2152
+ #endif
2153
+ #ifdef BUTTON4_CLICKED
2154
+ rb_define_const(mNcurses, "BUTTON4_CLICKED", INT2NUM(BUTTON4_CLICKED));
2155
+ #endif
2156
+ #ifdef BUTTON4_DOUBLE_CLICKED
2157
+ rb_define_const(mNcurses, "BUTTON4_DOUBLE_CLICKED", INT2NUM(BUTTON4_DOUBLE_CLICKED));
2158
+ #endif
2159
+ #ifdef BUTTON4_TRIPLE_CLICKED
2160
+ rb_define_const(mNcurses, "BUTTON4_TRIPLE_CLICKED", INT2NUM(BUTTON4_TRIPLE_CLICKED));
2161
+ #endif
2162
+ #ifdef BUTTON4_RESERVED_EVENT
2163
+ rb_define_const(mNcurses, "BUTTON4_RESERVED_EVENT", INT2NUM(BUTTON4_RESERVED_EVENT));
2164
+ #endif
2165
+ #ifdef BUTTON_CTRL
2166
+ rb_define_const(mNcurses, "BUTTON_CTRL", INT2NUM(BUTTON_CTRL));
2167
+ #endif
2168
+ #ifdef BUTTON_CONTROL
2169
+ rb_define_const(mNcurses, "BUTTON_CTRL", INT2NUM(BUTTON_CONTROL));
2170
+ #endif
2171
+ rb_define_const(mNcurses, "BUTTON_SHIFT", INT2NUM(BUTTON_SHIFT));
2172
+ rb_define_const(mNcurses, "BUTTON_ALT", INT2NUM(BUTTON_ALT));
2173
+ rb_define_const(mNcurses, "ALL_MOUSE_EVENTS", INT2NUM(ALL_MOUSE_EVENTS));
2174
+ rb_define_const(mNcurses, "REPORT_MOUSE_POSITION", INT2NUM(REPORT_MOUSE_POSITION));
2175
+ }
2176
+
2177
+ /* typedef struct */
2178
+ /* { */
2179
+ /* short id; */ /* ID to distinguish multiple devices */
2180
+ /* int x, y, z; */ /* event coordinates (character-cell) */
2181
+ /* mmask_t bstate; *//* button state bits */
2182
+ /* } */
2183
+ /* MEVENT; */
2184
+ #ifdef HAVE_UNGETMOUSE
2185
+ static VALUE rbncurs_getmouse(VALUE dummy, VALUE rb_m)
2186
+ {
2187
+ MEVENT m;
2188
+ int return_value = getmouse(&m);
2189
+ if (return_value != ERR) {
2190
+ rb_iv_set(rb_m, "@id", INT2NUM(m.id));
2191
+ rb_iv_set(rb_m, "@x", INT2NUM(m.x));
2192
+ rb_iv_set(rb_m, "@y", INT2NUM(m.y));
2193
+ rb_iv_set(rb_m, "@z", INT2NUM(m.z));
2194
+ rb_iv_set(rb_m, "@bstate", INT2NUM(m.bstate));
2195
+ }
2196
+ return INT2NUM(return_value);
2197
+ }
2198
+ static VALUE rbncurs_ungetmouse(VALUE dummy, VALUE rb_m)
2199
+ {
2200
+ MEVENT m;
2201
+ m.id = NUM2INT(rb_iv_get(rb_m, "@id"));
2202
+ m.x = NUM2INT(rb_iv_get(rb_m, "@x"));
2203
+ m.y = NUM2INT(rb_iv_get(rb_m, "@y"));
2204
+ m.z = NUM2INT(rb_iv_get(rb_m, "@z"));
2205
+ m.bstate = NUM2ULONG(rb_iv_get(rb_m, "@bstate"));
2206
+ return INT2NUM(ungetmouse(&m));
2207
+ }
2208
+ #endif
2209
+ #ifdef HAVE_MOUSEMASK
2210
+ static VALUE rbncurs_mousemask(VALUE dummy, VALUE rb_newmask, VALUE rb_oldmask)
2211
+ {
2212
+ if (rb_obj_is_instance_of(rb_oldmask, rb_cArray) != Qtrue) {
2213
+ rb_raise(rb_eArgError,
2214
+ "oldmask (2nd argument) must be an empty Array");
2215
+ return Qnil;
2216
+ }
2217
+ {
2218
+ mmask_t oldmask, return_value;
2219
+ return_value = mousemask(NUM2ULONG(rb_newmask), &oldmask);
2220
+ rb_ary_push(rb_oldmask, INT2NUM(oldmask));
2221
+ return INT2NUM(return_value);
2222
+ }
2223
+ }
2224
+ #endif
2225
+ #ifdef HAVE_WENCLOSE
2226
+ static VALUE rbncurs_wenclose(VALUE dummy, VALUE rb_win, VALUE rb_y, VALUE rb_x)
2227
+ {
2228
+ return wenclose(get_window(rb_win), NUM2INT(rb_y), NUM2INT(rb_y))
2229
+ ? Qtrue : Qfalse;
2230
+ }
2231
+ #endif
2232
+ #ifdef HAVE_MOUSEINTERVAL
2233
+ static VALUE rbncurs_mouseinterval(VALUE dummy, VALUE rb_interval)
2234
+ { return INT2NUM(mouseinterval(NUM2INT(rb_interval))); }
2235
+ #endif
2236
+ #ifdef HAVE_WMOUSE_TRAFO
2237
+ static VALUE rbncurs_wmouse_trafo(VALUE dummy, VALUE rb_win, VALUE rb_pY, VALUE rb_pX,
2238
+ VALUE rb_to_screen)
2239
+ {
2240
+ if ((rb_obj_is_instance_of(rb_pY, rb_cArray) != Qtrue)
2241
+ || (rb_obj_is_instance_of(rb_pY, rb_cArray) != Qtrue)) {
2242
+ rb_raise(rb_eArgError,
2243
+ "pY and pX arguments must be Arrays, containing exactly one "
2244
+ "Integer");
2245
+ return Qnil;
2246
+ }
2247
+ {
2248
+ int X = NUM2INT(rb_ary_pop(rb_pX));
2249
+ int Y = NUM2INT(rb_ary_pop(rb_pY));
2250
+ bool return_value =
2251
+ wmouse_trafo(get_window(rb_win), &Y, &X, RTEST(rb_to_screen));
2252
+ rb_ary_push(rb_pY, INT2NUM(Y)); rb_ary_push(rb_pX, INT2NUM(X));
2253
+ return return_value ? Qtrue : Qfalse;
2254
+ }
2255
+ }
2256
+ #endif
2257
+ #ifdef HAVE_MCPRINT
2258
+ static VALUE rbncurs_mcprint(VALUE dummy, VALUE data, VALUE len)
2259
+ {
2260
+ return INT2NUM(mcprint(StringValuePtr(data), NUM2INT(len)));
2261
+ }
2262
+ #endif
2263
+ #ifdef HAVE_HAS_KEY
2264
+ static VALUE rbncurs_has_key(VALUE dummy, VALUE ch)
2265
+ {return INT2NUM(has_key(NUM2INT(ch)));}
2266
+ #endif
2267
+ static VALUE rbncurs_getyx(VALUE dummy, VALUE rb_win, VALUE rb_y, VALUE rb_x)
2268
+ {
2269
+ if ((rb_obj_is_instance_of(rb_y, rb_cArray) != Qtrue)
2270
+ || (rb_obj_is_instance_of(rb_x, rb_cArray) != Qtrue)) {
2271
+ rb_raise(rb_eArgError,
2272
+ "y and x arguments must be empty Arrays");
2273
+ return Qnil;
2274
+ }
2275
+ {
2276
+ int y,x;
2277
+ getyx(get_window(rb_win), y,x);
2278
+ rb_ary_push(rb_y, INT2NUM(y));
2279
+ rb_ary_push(rb_x, INT2NUM(x));
2280
+ return Qnil;
2281
+ }
2282
+ }
2283
+ #if defined(HAVE_GETATTRS) || defined(getattrs)
2284
+ static VALUE rbncurs_getattrs(VALUE dummy, VALUE rb_win)
2285
+ {return INT2NUM(getattrs(get_window(rb_win)));}
2286
+ #endif
2287
+ static VALUE rbncurs_getbegyx(VALUE dummy, VALUE rb_win, VALUE rb_y, VALUE rb_x)
2288
+ {
2289
+ int y,x;
2290
+ if ((rb_obj_is_instance_of(rb_y, rb_cArray) != Qtrue)
2291
+ || (rb_obj_is_instance_of(rb_x, rb_cArray) != Qtrue)) {
2292
+ rb_raise(rb_eArgError,
2293
+ "y and x arguments must be empty Arrays");
2294
+ return Qnil;
2295
+ }
2296
+ getbegyx(get_window(rb_win), y,x);
2297
+ rb_ary_push(rb_y, INT2NUM(y));
2298
+ rb_ary_push(rb_x, INT2NUM(x));
2299
+ return Qnil;
2300
+ }
2301
+ static VALUE rbncurs_getmaxyx(VALUE dummy, VALUE rb_win, VALUE rb_y, VALUE rb_x)
2302
+ {
2303
+ int y,x;
2304
+ if ((rb_obj_is_instance_of(rb_y, rb_cArray) != Qtrue)
2305
+ || (rb_obj_is_instance_of(rb_x, rb_cArray) != Qtrue)) {
2306
+ rb_raise(rb_eArgError,
2307
+ "y and x arguments must be empty Arrays");
2308
+ return Qnil;
2309
+ }
2310
+ getmaxyx(get_window(rb_win), y,x);
2311
+ rb_ary_push(rb_y, INT2NUM(y));
2312
+ rb_ary_push(rb_x, INT2NUM(x));
2313
+ return Qnil;
2314
+ }
2315
+ static VALUE rbncurs_getparyx(VALUE dummy, VALUE rb_win, VALUE rb_y, VALUE rb_x)
2316
+ {
2317
+ int y,x;
2318
+ if ((rb_obj_is_instance_of(rb_y, rb_cArray) != Qtrue)
2319
+ || (rb_obj_is_instance_of(rb_x, rb_cArray) != Qtrue)) {
2320
+ rb_raise(rb_eArgError,
2321
+ "y and x arguments must be empty Arrays");
2322
+ return Qnil;
2323
+ }
2324
+ getparyx(get_window(rb_win), y,x);
2325
+ rb_ary_push(rb_y, INT2NUM(y));
2326
+ rb_ary_push(rb_x, INT2NUM(x));
2327
+ return Qnil;
2328
+ }
2329
+ static VALUE rbncurs_getsyx(VALUE dummy, VALUE rb_y, VALUE rb_x)
2330
+ {
2331
+ int y,x;
2332
+ if ((rb_obj_is_instance_of(rb_y, rb_cArray) != Qtrue)
2333
+ || (rb_obj_is_instance_of(rb_x, rb_cArray) != Qtrue)) {
2334
+ rb_raise(rb_eArgError,
2335
+ "y and x arguments must be empty Arrays");
2336
+ return Qnil;
2337
+ }
2338
+ #ifdef getsyx
2339
+ getsyx(y,x);
2340
+ #else
2341
+ getsyx(&y,&x);
2342
+ #endif
2343
+ rb_ary_push(rb_y, INT2NUM(y));
2344
+ rb_ary_push(rb_x, INT2NUM(x));
2345
+ return Qnil;
2346
+ }
2347
+ static VALUE rbncurs_setsyx(VALUE dummy, VALUE rb_y, VALUE rb_x)
2348
+ {
2349
+ int y = NUM2INT(rb_y), x = NUM2INT(rb_x);
2350
+ setsyx(y,x);
2351
+ return Qnil;
2352
+ }
2353
+
2354
+ static VALUE rbncurs_wprintw(int argc, VALUE * argv, VALUE dummy)
2355
+ {
2356
+ if (argc < 2) {
2357
+ rb_raise(rb_eArgError, "function needs at least 2 arguments: a WINDOW"
2358
+ " and a String");
2359
+ return Qnil;
2360
+ }
2361
+ VALUE tmp = rb_funcall3(rb_mKernel, rb_intern("sprintf"), argc-1, argv + 1);
2362
+ wprintw(get_window(argv[0]), "%s", StringValuePtr(tmp));
2363
+ return Qnil;
2364
+ }
2365
+
2366
+ /* Debugging : use with libncurses_g.a */
2367
+ #ifdef HAVE__TRACEF
2368
+ static VALUE rbncurs_tracef(int argc, VALUE * argv, VALUE dummy)
2369
+ {
2370
+ (void) dummy;
2371
+ if (argc < 1) {
2372
+ rb_raise(rb_eArgError, "function needs at least 1 argument");
2373
+ return Qnil;
2374
+ }
2375
+ _tracef("%s",
2376
+ StringValuePtr(funcall3(rb_mKernel, rb_intern("sprintf"), argc, argv)));
2377
+ return Qnil;
2378
+ }
2379
+ #endif /* HAVE__TRACEF */
2380
+ #ifdef HAVE__TRACEDUMP
2381
+ static VALUE rbncurs_tracedump(VALUE dummy, VALUE rb_label, VALUE rb_win)
2382
+ {
2383
+ _tracedump(StringValuePtr(rb_label), get_window(rb_win));
2384
+ }
2385
+ #endif /* HAVE__TRACEDUMP */
2386
+ #ifdef HAVE__TRACEATTR
2387
+ static VALUE rbncurs_traceattr(VALUE dummy, VALUE attr)
2388
+ { return rb_str_new2(_traceattr(NUM2ULONG(attr))); }
2389
+ #endif /* HAVE__TRACEATTR */
2390
+ #ifdef HAVE__TRACEATTR2
2391
+ static VALUE rbncurs_traceattr2(VALUE dummy, VALUE buffer, VALUE ch)
2392
+ { return rb_str_new2(_traceattr2(NUM2INT(buffer),NUM2ULONG(ch))); }
2393
+ #endif /* HAVE__TRACEATTR2 */
2394
+ #ifdef HAVE__TRACEBITS
2395
+ static VALUE rbncurs_tracebits(VALUE dummy)
2396
+ { return rb_str_new2(_tracebits()); }
2397
+ #endif /* HAVE__TRACEBITS */
2398
+ #ifdef HAVE__TRACECHAR
2399
+ static VALUE rbncurs_tracechar(VALUE dummy, VALUE ch)
2400
+ { return rb_str_new2(_tracechar(NUM2ULONG(ch))); }
2401
+ #endif /* HAVE__TRACECHAR */
2402
+ #ifdef HAVE__TRACECHTYPE
2403
+ static VALUE rbncurs_tracechtype(VALUE dummy, VALUE ch)
2404
+ { return rb_str_new2(_tracechtype(NUM2ULONG(ch))); }
2405
+ #endif /* HAVE__TRACECHTYPE */
2406
+ #ifdef HAVE__TRACECHTYPE2
2407
+ static VALUE rbncurs_tracechtype2(VALUE dummy, VALUE buffer, VALUE ch)
2408
+ { return rb_str_new2(_tracechtype2(NUM2INT(buffer),NUM2ULONG(ch))); }
2409
+ #endif /* HAVE__TRACECHTYPE2 */
2410
+ #ifdef HAVE__TRACEMOUSE
2411
+ static VALUE rbncurs_tracemouse(VALUE dummy, VALUE rb_m)
2412
+ {
2413
+ MEVENT m;
2414
+ m.id = NUM2INT(rb_iv_get(rb_m, "@id"));
2415
+ m.x = NUM2INT(rb_iv_get(rb_m, "@x"));
2416
+ m.y = NUM2INT(rb_iv_get(rb_m, "@y"));
2417
+ m.z = NUM2INT(rb_iv_get(rb_m, "@z"));
2418
+ m.bstate = NUM2ULONG(rb_iv_get(rb_m, "@bstate"));
2419
+ return rb_str_new2(_tracemouse(&m));
2420
+ }
2421
+ #endif /* HAVE__TRACEMOUSE */
2422
+ #ifdef HAVE_TRACE
2423
+ static VALUE rbncurs_trace(VALUE dummy, VALUE param)
2424
+ { trace(NUM2ULONG(param)); return Qnil; }
2425
+ #endif /* HAVE_TRACE */
2426
+ #ifdef HAVE__NC_TRACEBITS
2427
+ static VALUE rbncurs_nc_tracebits()
2428
+ { return rb_str_new2((char*)_nc_tracebits()); }
2429
+ #endif /* HAVE__NC_TRACEBITS */
2430
+
2431
+ #ifdef HAVE_ASSUME_DEFAULT_COLORS
2432
+ static VALUE rbncurs_assume_default_colors(VALUE dummy, VALUE fg, VALUE bg)
2433
+ { return INT2NUM(assume_default_colors(NUM2INT(fg),NUM2INT(bg))); }
2434
+ #endif /* HAVE_ASSUME_DEFAULT_COLORS */
2435
+
2436
+ static void init_functions_3(void)
2437
+ {
2438
+ #ifdef HAVE_UNGETMOUSE
2439
+ NCFUNC(getmouse, 1);
2440
+ NCFUNC(ungetmouse, 1);
2441
+ #endif
2442
+ #ifdef HAVE_MOUSEMASK
2443
+ NCFUNC(mousemask, 2);
2444
+ #endif
2445
+ #ifdef HAVE_WENCLOSE
2446
+ rb_define_module_function(mNcurses, "wenclose?",
2447
+ (&rbncurs_wenclose),
2448
+ 1);
2449
+ #endif
2450
+ #ifdef HAVE_MOUSEINTERVAL
2451
+ NCFUNC(mouseinterval, 1);
2452
+ #endif
2453
+ #ifdef HAVE_WMOUSE_TRAFO
2454
+ NCFUNC(wmouse_trafo, 4);
2455
+ #endif
2456
+ #ifdef HAVE_MCPRINT
2457
+ NCFUNC(mcprint, 2);
2458
+ #endif
2459
+ #ifdef HAVE_HAS_KEY
2460
+ rb_define_module_function(mNcurses, "has_key?",
2461
+ (&rbncurs_has_key),
2462
+ 2);
2463
+ #endif
2464
+ NCFUNC(getyx, 3);
2465
+ NCFUNC(getbegyx, 3);
2466
+ NCFUNC(getmaxyx, 3);
2467
+ NCFUNC(getparyx, 3);
2468
+ NCFUNC(getsyx, 2);
2469
+ NCFUNC(setsyx, 2);
2470
+ #if defined(HAVE_GETATTRS) || defined(getattrs)
2471
+ NCFUNC(getattrs, 1);
2472
+ #endif
2473
+ #ifdef HAVE__TRACEF
2474
+ rb_define_module_function(mNcurses, "_tracef",
2475
+ (&rbncurs_tracef), -1);
2476
+ #endif /* HAVE__TRACEF */
2477
+ #ifdef HAVE__TRACEDUMP
2478
+ rb_define_module_function(mNcurses, "_tracedump",
2479
+ (&rbncurs_tracedump),
2480
+ 2);
2481
+ #endif /* HAVE__TRACEDUMP */
2482
+ #ifdef HAVE__TRACEATTR
2483
+ rb_define_module_function(mNcurses, "_traceattr",
2484
+ (&rbncurs_traceattr),
2485
+ 1);
2486
+ #endif /* HAVE__TRACEATTR */
2487
+ #ifdef HAVE__TRACEATTR2
2488
+ rb_define_module_function(mNcurses, "_traceattr2",
2489
+ (&rbncurs_traceattr2),
2490
+ 2);
2491
+ #endif /* HAVE__TRACEATTR2 */
2492
+ #ifdef HAVE__TRACEBITS
2493
+ rb_define_module_function(mNcurses, "_tracebits",
2494
+ (&rbncurs_tracebits),
2495
+ 0);
2496
+ #endif /* HAVE__TRACEBITS */
2497
+ #ifdef HAVE__TRACECHAR
2498
+ rb_define_module_function(mNcurses, "_tracechar",
2499
+ (&rbncurs_tracechar),
2500
+ 1);
2501
+ #endif /* HAVE__TRACECHAR */
2502
+ #ifdef HAVE__TRACECHTYPE
2503
+ rb_define_module_function(mNcurses, "_tracechtype",
2504
+ (&rbncurs_tracechtype),
2505
+ 1);
2506
+ #endif /* HAVE__TRACECHTYPE */
2507
+ #ifdef HAVE__TRACECHTYPE2
2508
+ rb_define_module_function(mNcurses, "_tracechtype2",
2509
+ (&rbncurs_tracechtype2), 2);
2510
+ #endif /* HAVE__TRACECHTYPE2 */
2511
+ #ifdef HAVE__TRACEMOUSE
2512
+ rb_define_module_function(mNcurses, "_tracechmouse",
2513
+ (&rbncurs_tracemouse),
2514
+ 1);
2515
+ #endif /* HAVE__TRACEMOUSE */
2516
+ #ifdef HAVE_TRACE
2517
+ NCFUNC(trace, 1);
2518
+ #endif /* HAVE_TRACE */
2519
+ #ifdef HAVE__NC_TRACEBITS
2520
+ rb_define_module_function(mNcurses, "_nc_tracebits", &rbncurs_nc_tracebits, 0);
2521
+ #endif /* HAVE__NC_TRACEBITS */
2522
+ #ifdef HAVE_ASSUME_DEFAULT_COLORS
2523
+ NCFUNC(assume_default_colors, 2);
2524
+ #endif /* HAVE_ASSUME_DEFAULT_COLORS */
2525
+ NCFUNC(wprintw, -1);
2526
+ }
2527
+
2528
+ static void init_constants_4(void)
2529
+ {
2530
+ /* trace masks */
2531
+ #ifdef TRACE_DISABLE
2532
+ rb_define_const(mNcurses, "TRACE_DISABLE", INT2NUM(TRACE_DISABLE));
2533
+ #endif
2534
+ #ifdef TRACE_TIMES
2535
+ rb_define_const(mNcurses, "TRACE_TIMES", INT2NUM(TRACE_TIMES));
2536
+ #endif
2537
+ #ifdef TRACE_TPUTS
2538
+ rb_define_const(mNcurses, "TRACE_TPUTS", INT2NUM(TRACE_TPUTS));
2539
+ #endif
2540
+ #ifdef TRACE_UPDATE
2541
+ rb_define_const(mNcurses, "TRACE_UPDATE", INT2NUM(TRACE_UPDATE));
2542
+ #endif
2543
+ #ifdef TRACE_MOVE
2544
+ rb_define_const(mNcurses, "TRACE_MOVE", INT2NUM(TRACE_MOVE));
2545
+ #endif
2546
+ #ifdef TRACE_CHARPUT
2547
+ rb_define_const(mNcurses, "TRACE_CHARPUT", INT2NUM(TRACE_CHARPUT));
2548
+ #endif
2549
+ #ifdef TRACE_ORDINARY
2550
+ rb_define_const(mNcurses, "TRACE_ORDINARY", INT2NUM(TRACE_ORDINARY));
2551
+ #endif
2552
+ #ifdef TRACE_CALLS
2553
+ rb_define_const(mNcurses, "TRACE_CALLS", INT2NUM(TRACE_CALLS));
2554
+ #endif
2555
+ #ifdef TRACE_VIRTPUT
2556
+ rb_define_const(mNcurses, "TRACE_VIRTPUT", INT2NUM(TRACE_VIRTPUT));
2557
+ #endif
2558
+ #ifdef TRACE_IEVENT
2559
+ rb_define_const(mNcurses, "TRACE_IEVENT", INT2NUM(TRACE_IEVENT));
2560
+ #endif
2561
+ #ifdef TRACE_BITS
2562
+ rb_define_const(mNcurses, "TRACE_BITS", INT2NUM(TRACE_BITS));
2563
+ #endif
2564
+ #ifdef TRACE_ICALLS
2565
+ rb_define_const(mNcurses, "TRACE_ICALLS", INT2NUM(TRACE_ICALLS));
2566
+ #endif
2567
+ #ifdef TRACE_CCALLS
2568
+ rb_define_const(mNcurses, "TRACE_CCALLS", INT2NUM(TRACE_CCALLS));
2569
+ #endif
2570
+ #ifdef TRACE_MAXIMUM
2571
+ rb_define_const(mNcurses, "TRACE_MAXIMUM", INT2NUM(TRACE_MAXIMUM));
2572
+ #endif
2573
+ }
2574
+
2575
+ /* Wrap ACS_* constants (additionally) as methods of SCREEN: */
2576
+ #define rb_ACS(ACS) \
2577
+ VALUE rb_## ACS (VALUE rb_screen) \
2578
+ { \
2579
+ VALUE current_screen = \
2580
+ rbncurs_set_term(mNcurses, rb_screen); \
2581
+ VALUE rb_ACS_CONST = INT2NUM(ACS); \
2582
+ rbncurs_set_term(mNcurses, current_screen); \
2583
+ return rb_ACS_CONST; \
2584
+ }
2585
+ #define wrap_ACS(ACS) \
2586
+ rb_define_method(cSCREEN, #ACS, \
2587
+ (&rb_ ## ACS), \
2588
+ 0)
2589
+ rb_ACS(ACS_ULCORNER)
2590
+ rb_ACS(ACS_LLCORNER)
2591
+ rb_ACS(ACS_URCORNER)
2592
+ rb_ACS(ACS_LRCORNER)
2593
+ rb_ACS(ACS_LTEE)
2594
+ rb_ACS(ACS_RTEE)
2595
+ rb_ACS(ACS_BTEE)
2596
+ rb_ACS(ACS_TTEE)
2597
+ rb_ACS(ACS_HLINE)
2598
+ rb_ACS(ACS_VLINE)
2599
+ rb_ACS(ACS_PLUS)
2600
+ rb_ACS(ACS_S1)
2601
+ rb_ACS(ACS_S9)
2602
+ rb_ACS(ACS_DIAMOND)
2603
+ rb_ACS(ACS_CKBOARD)
2604
+ rb_ACS(ACS_DEGREE)
2605
+ rb_ACS(ACS_PLMINUS)
2606
+ rb_ACS(ACS_BULLET)
2607
+ rb_ACS(ACS_LARROW)
2608
+ rb_ACS(ACS_RARROW)
2609
+ rb_ACS(ACS_DARROW)
2610
+ rb_ACS(ACS_UARROW)
2611
+ rb_ACS(ACS_BOARD)
2612
+ rb_ACS(ACS_LANTERN)
2613
+ rb_ACS(ACS_BLOCK)
2614
+ #ifdef ACS_S3
2615
+ rb_ACS(ACS_S3)
2616
+ #endif
2617
+ #ifdef ACS_S7
2618
+ rb_ACS(ACS_S7)
2619
+ #endif
2620
+ #ifdef ACS_LEQUAL
2621
+ rb_ACS(ACS_LEQUAL)
2622
+ #endif
2623
+ #ifdef ACS_GEQUAL
2624
+ rb_ACS(ACS_GEQUAL)
2625
+ #endif
2626
+ #ifdef ACS_PI
2627
+ rb_ACS(ACS_PI)
2628
+ #endif
2629
+ #ifdef ACS_NEQUAL
2630
+ rb_ACS(ACS_NEQUAL)
2631
+ #endif
2632
+ #ifdef ACS_STERLING
2633
+ rb_ACS(ACS_STERLING)
2634
+ #endif
2635
+
2636
+ void init_SCREEN_methods(void)
2637
+ {
2638
+ wrap_ACS(ACS_ULCORNER);
2639
+ wrap_ACS(ACS_LLCORNER);
2640
+ wrap_ACS(ACS_URCORNER);
2641
+ wrap_ACS(ACS_LRCORNER);
2642
+ wrap_ACS(ACS_LTEE);
2643
+ wrap_ACS(ACS_RTEE);
2644
+ wrap_ACS(ACS_BTEE);
2645
+ wrap_ACS(ACS_TTEE);
2646
+ wrap_ACS(ACS_HLINE);
2647
+ wrap_ACS(ACS_VLINE);
2648
+ wrap_ACS(ACS_PLUS);
2649
+ wrap_ACS(ACS_S1);
2650
+ wrap_ACS(ACS_S9);
2651
+ wrap_ACS(ACS_DIAMOND);
2652
+ wrap_ACS(ACS_CKBOARD);
2653
+ wrap_ACS(ACS_DEGREE);
2654
+ wrap_ACS(ACS_PLMINUS);
2655
+ wrap_ACS(ACS_BULLET);
2656
+ wrap_ACS(ACS_LARROW);
2657
+ wrap_ACS(ACS_RARROW);
2658
+ wrap_ACS(ACS_DARROW);
2659
+ wrap_ACS(ACS_UARROW);
2660
+ wrap_ACS(ACS_BOARD);
2661
+ wrap_ACS(ACS_LANTERN);
2662
+ wrap_ACS(ACS_BLOCK);
2663
+ #ifdef ACS_S3
2664
+ wrap_ACS(ACS_S3);
2665
+ #endif
2666
+ #ifdef ACS_S7
2667
+ wrap_ACS(ACS_S7);
2668
+ #endif
2669
+ #ifdef ACS_LEQUAL
2670
+ wrap_ACS(ACS_LEQUAL);
2671
+ #endif
2672
+ #ifdef ACS_GEQUAL
2673
+ wrap_ACS(ACS_GEQUAL);
2674
+ #endif
2675
+ #ifdef ACS_PI
2676
+ wrap_ACS(ACS_PI);
2677
+ #endif
2678
+ #ifdef ACS_NEQUAL
2679
+ wrap_ACS(ACS_NEQUAL);
2680
+ #endif
2681
+ #ifdef ACS_STERLING
2682
+ wrap_ACS(ACS_STERLING);
2683
+ #endif
2684
+ }
2685
+
2686
+ static void init_safe_functions(void)
2687
+ {
2688
+ NCFUNC(initscr, 0);
2689
+ NCFUNC(newterm, 3);
2690
+ NCFUNC(slk_init, 1);
2691
+ #ifdef HAVE_FILTER
2692
+ NCFUNC(filter, 0);
2693
+ #endif
2694
+ #ifdef HAVE_USE_ENV
2695
+ NCFUNC(use_env, 1);
2696
+ #endif
2697
+ }
2698
+ void Init_ncurses(void)
2699
+ {
2700
+ mNcurses = rb_define_module("Ncurses");
2701
+ eNcurses = rb_define_class_under(mNcurses, "Exception", rb_eRuntimeError);
2702
+ rb_iv_set(mNcurses, "@windows_hash", rb_hash_new());
2703
+ rb_iv_set(mNcurses, "@screens_hash", rb_hash_new());
2704
+
2705
+ /* keep track of "halfdelay" settings in the wrapper */
2706
+ rb_iv_set(mNcurses, "@halfdelay", INT2FIX(0));
2707
+ rb_iv_set(mNcurses, "@cbreak", Qfalse);
2708
+
2709
+ /* filedescriptor that transports input from terminal to application */
2710
+ rb_iv_set(mNcurses, "@infd", Qnil);
2711
+
2712
+ cWINDOW = rb_define_class_under(mNcurses, "WINDOW", rb_cObject);
2713
+ cSCREEN = rb_define_class_under(mNcurses, "SCREEN", rb_cObject);
2714
+ init_constants_1();
2715
+ init_constants_2();
2716
+ init_constants_3();
2717
+ init_constants_4();
2718
+ init_safe_functions();
2719
+ }
2720
+ static void Init_ncurses_full(void)
2721
+ {
2722
+ init_globals_1();
2723
+ init_globals_2();
2724
+ init_functions_0();
2725
+ init_functions_1();
2726
+ init_functions_2();
2727
+ init_functions_3();
2728
+
2729
+ init_SCREEN_methods();
2730
+ #ifdef HAVE_PANEL_H
2731
+ init_panel();
2732
+ #endif
2733
+ #ifdef HAVE_FORM_H
2734
+ init_form();
2735
+ #endif
2736
+ #ifdef HAVE_MENU_H
2737
+ init_menu();
2738
+ #endif
2739
+ }