snowleopard-ncurses 1.2.4

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