ncursesw 0.9.2 → 1.2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/MANIFEST CHANGED
@@ -23,4 +23,6 @@ ncurses_wrap.h
23
23
  lib/ncurses.rb
24
24
  panel_wrap.c
25
25
  panel_wrap.h
26
+ menu_wrap.c
27
+ menu_wrap.h
26
28
 
data/README CHANGED
@@ -1,4 +1,4 @@
1
- $Id: README,v 1.14 2006/06/19 09:43:58 t-peters Exp $
1
+ $Id: README,v 1.16 2009/05/03 14:13:27 t-peters Exp $
2
2
  ------------------------------------------------------------------------
3
3
  This directory contains a ruby module for accessing the FSF's ncurses
4
4
  library.
@@ -47,9 +47,10 @@ This README is organized into the following parts:
47
47
  - The WINDOW class
48
48
  - The panel Library
49
49
  - The form Library
50
+ - The menu Library
51
+ - Locale handling
50
52
  - Ncurses and Ruby Threads
51
53
  - Example programs
52
- - Applications using ncurses-ruby
53
54
 
54
55
  General Ncurses Literature
55
56
  --------------------------
@@ -211,6 +212,10 @@ module Ncurses
211
212
  class FIELD; end
212
213
  class FIELDTYPE; end
213
214
  end
215
+ module Menu
216
+ class MENU; end
217
+ class ITEM; end
218
+ end
214
219
  end
215
220
 
216
221
 
@@ -288,6 +293,48 @@ function arguments. See the example form2.rb for more details.
288
293
  The functions form_userptr and field_userptr are not supported. Use
289
294
  form.user_object and field.user_object to store Ruby objects instead.
290
295
 
296
+ The menu Library
297
+ ================
298
+
299
+ The menu library was wrapped inside the Ncurses:Menu module. All
300
+ menu functions are implemented as module functions in the module
301
+ Ncurses::Menu. In addition, all functions for which the first
302
+ parameter is one of the objects are also implemented as an instance
303
+ method of the respective class. For example, instead of calling
304
+ post_menu(menu), you can use menu.post_menu().
305
+
306
+ Two objects are defined in the Ncurses:Menu module:
307
+ 1. MENU
308
+ 2. ITEM
309
+
310
+ They are wrapping actual ncurses pointers and should be use whenever a
311
+ pointer to one of these types is expected in function calls.
312
+
313
+ All menu constants are defined in the module as Ruby constants with
314
+ the same name as the curses constants.
315
+
316
+ Constructors for MENU and ITEM objects are also provided, and they
317
+ expect the same parameters as new_menu and new_item curses functions.
318
+
319
+ You must provide a Ruby block whenever a function pointer is expected
320
+ in curses function arguments.
321
+
322
+ The functions menu_userptr and item_userptr are not supported. Use
323
+ menu.user_object and item.user_object to store Ruby objects instead.
324
+
325
+ Locale handling
326
+ ===============
327
+
328
+ The C library function setlocale is not technically an Ncurses function.
329
+ However, it is used by many ncurses programs, and for this purpose,
330
+ a wrapper for this function is also included in ncurses-ruby.
331
+
332
+ The function is implemented as a module function Ncurses.ruby, and
333
+ expects two arguments, an Integer and a String. It returns a string.
334
+ The constants that can be used as the Integer argument are also wrapped
335
+ as constants in the Ncurses module. See the manual page for setlocale
336
+ for documentation of this function.
337
+
291
338
  Ncurses and Ruby Threads
292
339
  ========================
293
340
 
@@ -306,13 +353,3 @@ Directory "examples" contains a few example programs demonstrating how
306
353
  to use the ncurses library with ruby. Be sure to read the file
307
354
  "examples/LICENSES_for_examples".
308
355
 
309
-
310
- Applications using ncurses-ruby
311
- ===============================
312
-
313
- aeditor (v. 0.x) - Pair programming editor, http://metaeditor.sourceforge.net/
314
- raggle - RSS aggregator, http://www.raggle.org/about/
315
- ruvi - Editor, http://ruvi.rubyforge.org/
316
- diakonos - Editor, http://purepistos.net/diakonos/
317
- tpp - text-based presentation program, http://synflood.at/tpp/
318
- yapo - ports overview for CRUX linux distribution, http://jue.li/crux/yapo/
data/THANKS CHANGED
@@ -1,4 +1,4 @@
1
- $Id: THANKS,v 1.8 2006/06/19 09:39:40 t-peters Exp $
1
+ $Id: THANKS,v 1.9 2009/05/03 10:37:54 t-peters Exp $
2
2
 
3
3
  A list of people that helped me with ncurses-ruby
4
4
 
@@ -12,3 +12,4 @@ Andreas Schwarz
12
12
  Simon Strandgaard
13
13
  Paul Duncan
14
14
  Tim Sutherland
15
+ Earle Clubb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1
1
+ 1.2.4
data/extconf.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ncurses-ruby is a ruby module for accessing the FSF's ncurses library
4
4
  # (C) 2002, 2004 Tobias Peters <t-peters@users.berlios.de>
5
- # (C) 2005 Tobias Herzke
5
+ # (C) 2005, 2009 Tobias Herzke
6
6
  #
7
7
  # This module is free software; you can redistribute it and/or
8
8
  # modify it under the terms of the GNU Lesser General Public
@@ -18,7 +18,7 @@
18
18
  # License along with this module; if not, write to the Free Software
19
19
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
20
 
21
- # $Id: extconf.rb,v 1.11 2005/02/26 22:51:45 t-peters Exp $
21
+ # $Id: extconf.rb,v 1.14 2009/05/03 14:13:27 t-peters Exp $
22
22
 
23
23
  require "mkmf"
24
24
 
@@ -26,6 +26,8 @@ $CFLAGS += " -g"
26
26
  $CXXFLAGS = $CFLAGS
27
27
 
28
28
  have_header("unistd.h")
29
+ have_header("locale.h")
30
+
29
31
  if have_header("ncurses.h")
30
32
  curses_header = "ncurses.h"
31
33
  elsif have_header("ncurses/curses.h")
@@ -127,5 +129,9 @@ puts "checking for the form library..."
127
129
  if have_header("form.h")
128
130
  have_library("formw", "new_form")
129
131
  end
132
+ puts "checking for the menu library..."
133
+ if have_header("menu.h")
134
+ have_library("menu", "new_menu")
135
+ end
130
136
 
131
137
  create_makefile('ncursesw_bin')
data/form_wrap.c CHANGED
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * Changes:
8
8
  * (C) 2004 Tobias Peters
9
- * (C) 2005 Tobias Herzke
9
+ * (C) 2005 2009 Tobias Herzke
10
10
  *
11
11
  * This module is free software; you can redistribute it and/or
12
12
  * modify it under the terms of the GNU Lesser General Public
@@ -394,7 +394,7 @@ static void reg_proc(void* owner, int hook, VALUE proc) {
394
394
  */
395
395
  static VALUE rbncurs_m_new_form(VALUE dummy, VALUE rb_field_array)
396
396
  {
397
- long n = RARRAY_LEN(rb_field_array);
397
+ long n = rbncurs_array_length(rb_field_array);
398
398
  /* Will ncurses free this array? If not, must do it after calling free_form(). */
399
399
  FIELD** fields = ALLOC_N(FIELD*, (n+1));
400
400
  long i;
@@ -618,7 +618,7 @@ static VALUE rbncurs_c_set_field_type(int argc, VALUE* argv, VALUE rb_field) {
618
618
  rb_raise(rb_eArgError, "TYPE_ENUM requires three additional arguments");
619
619
  }
620
620
  else {
621
- int n = RARRAY_LEN(arg3);
621
+ int n = rbncurs_array_length(arg3);
622
622
  /* Will ncurses free this array of strings in free_field()? */
623
623
  char** list = ALLOC_N(char*, n+1);
624
624
  int i;
@@ -777,7 +777,7 @@ static VALUE rbncurs_m_set_max_field(VALUE dummy, VALUE rb_field, VALUE max)
777
777
  * form_field
778
778
  */
779
779
  static VALUE rbncurs_c_set_form_fields(VALUE rb_form, VALUE rb_field_array) {
780
- long n = RARRAY_LEN(rb_field_array);
780
+ long n = rbncurs_array_length(rb_field_array);
781
781
  /* If ncurses does not free memory used by the previous array of strings, */
782
782
  /* we will have to do it now. */
783
783
  FIELD** fields = ALLOC_N(FIELD*, (n+1));
@@ -1125,11 +1125,11 @@ static void* make_arg(va_list* ap) {
1125
1125
  VALUE argc = rb_funcall(proc, rb_intern("arity"),0);
1126
1126
  VALUE args = get_proc(field, FIELDTYPE_ARGS);
1127
1127
  if (args != Qnil) {
1128
- if (NUM2INT(argc)-1 != RARRAY_LEN(args)) {
1128
+ if (NUM2INT(argc)-1 != rbncurs_array_length(args)) {
1129
1129
  char msg[500];
1130
1130
  snprintf(msg, 500, "The validation functions for this field type need %d additional arguments.",NUM2INT(argc)-1);
1131
1131
  msg[499]=0;
1132
- rb_raise(rb_eArgError, "%s", msg);
1132
+ rb_raise(rb_eArgError, msg);
1133
1133
  }
1134
1134
  }
1135
1135
  }
@@ -1258,12 +1258,12 @@ void init_form(void)
1258
1258
  FORM_SNG_FUNC(data_ahead,1);
1259
1259
  FORM_SNG_FUNC(data_behind,1);
1260
1260
  FORM_SNG_FUNC(dup_field,3);
1261
- FORM_SNG_FUNC(dynamic_field_info,3);
1261
+ FORM_SNG_FUNC(dynamic_field_info,4);
1262
1262
  FORM_SNG_FUNC(field_arg,1);
1263
- FORM_SNG_FUNC(field_back,2);
1263
+ FORM_SNG_FUNC(field_back,1);
1264
1264
  FORM_SNG_FUNC(field_buffer,2);
1265
1265
  FORM_SNG_FUNC(field_count,1);
1266
- FORM_SNG_FUNC(field_fore,2);
1266
+ FORM_SNG_FUNC(field_fore,1);
1267
1267
  FORM_SNG_FUNC(field_index,1);
1268
1268
  FORM_SNG_FUNC(field_info,7);
1269
1269
  FORM_SNG_FUNC(field_init,1);
@@ -1271,7 +1271,7 @@ void init_form(void)
1271
1271
  FORM_SNG_FUNC(field_opts,1);
1272
1272
  FORM_SNG_FUNC(field_opts_off,2);
1273
1273
  FORM_SNG_FUNC(field_opts_on,2);
1274
- FORM_SNG_FUNC(field_pad,2);
1274
+ FORM_SNG_FUNC(field_pad,1);
1275
1275
  FORM_SNG_FUNC(field_status,1);
1276
1276
  FORM_SNG_FUNC(field_term,1);
1277
1277
  FORM_SNG_FUNC(field_type,1);
@@ -1349,40 +1349,40 @@ void init_form(void)
1349
1349
  rb_define_singleton_method(cFORM, "new",
1350
1350
  (&rbncurs_m_new_form),
1351
1351
  1);
1352
- RB_CLASS_METH(cFORM, current_field,0);
1353
- RB_CLASS_METH(cFORM, data_ahead,0);
1354
- RB_CLASS_METH(cFORM, data_behind,0);
1355
- RB_CLASS_METH(cFORM, dup_field,2);
1356
- RB_CLASS_METH(cFORM, field_count,0);
1357
- RB_CLASS_METH(cFORM, field_init,0);
1358
- RB_CLASS_METH(cFORM, field_term,0);
1359
- RB_CLASS_METH(cFORM, form_driver,1);
1360
- RB_CLASS_METH(cFORM, form_fields,0);
1361
- RB_CLASS_METH(cFORM, form_init,0);
1362
- RB_CLASS_METH(cFORM, form_opts,0);
1363
- RB_CLASS_METH(cFORM, form_opts_off,1);
1364
- RB_CLASS_METH(cFORM, form_opts_on,1);
1365
- RB_CLASS_METH(cFORM, form_page,0);
1366
- RB_CLASS_METH(cFORM, form_sub,0);
1367
- RB_CLASS_METH(cFORM, form_term,0);
1368
- /* RB_CLASS_METH(cFORM, form_userptr,0); */
1369
- RB_CLASS_METH(cFORM, form_win,0);
1370
- RB_CLASS_METH(cFORM, free_form,0);
1371
- RB_CLASS_METH(cFORM, pos_form_cursor,0);
1372
- RB_CLASS_METH(cFORM, post_form,0);
1373
- RB_CLASS_METH(cFORM, scale_form,2);
1374
- RB_CLASS_METH(cFORM, set_current_field,1);
1375
- RB_CLASS_METH(cFORM, set_field_init,1);
1376
- RB_CLASS_METH(cFORM, set_field_term,1);
1377
- RB_CLASS_METH(cFORM, set_form_fields,1);
1378
- RB_CLASS_METH(cFORM, set_form_init,1);
1379
- RB_CLASS_METH(cFORM, set_form_opts,1);
1380
- RB_CLASS_METH(cFORM, set_form_page,1);
1381
- RB_CLASS_METH(cFORM, set_form_sub,1);
1382
- RB_CLASS_METH(cFORM, set_form_term,1);
1383
- /* RB_CLASS_METH(cFORM, set_form_userptr,1); */
1384
- RB_CLASS_METH(cFORM, set_form_win,1);
1385
- RB_CLASS_METH(cFORM, unpost_form,0);
1352
+ RB_CLASS_METH(cFORM, NULL, current_field,0);
1353
+ RB_CLASS_METH(cFORM, NULL, data_ahead,0);
1354
+ RB_CLASS_METH(cFORM, NULL, data_behind,0);
1355
+ RB_CLASS_METH(cFORM, NULL, dup_field,2);
1356
+ RB_CLASS_METH(cFORM, NULL, field_count,0);
1357
+ RB_CLASS_METH(cFORM, NULL, field_init,0);
1358
+ RB_CLASS_METH(cFORM, NULL, field_term,0);
1359
+ RB_CLASS_METH(cFORM, "driver", form_driver,1);
1360
+ RB_CLASS_METH(cFORM, "fields", form_fields,0);
1361
+ RB_CLASS_METH(cFORM, "init", form_init,0);
1362
+ RB_CLASS_METH(cFORM, "opts", form_opts,0);
1363
+ RB_CLASS_METH(cFORM, "opts_off", form_opts_off,1);
1364
+ RB_CLASS_METH(cFORM, "opts_on", form_opts_on,1);
1365
+ RB_CLASS_METH(cFORM, "page", form_page,0);
1366
+ RB_CLASS_METH(cFORM, "sub", form_sub,0);
1367
+ RB_CLASS_METH(cFORM, "term", form_term,0);
1368
+ /* RB_CLASS_METH(cFORM, "userptr", form_userptr,0); */
1369
+ RB_CLASS_METH(cFORM, "win", form_win,0);
1370
+ RB_CLASS_METH(cFORM, "free", free_form,0);
1371
+ RB_CLASS_METH(cFORM, "pos_cursor", pos_form_cursor,0);
1372
+ RB_CLASS_METH(cFORM, "post", post_form,0);
1373
+ RB_CLASS_METH(cFORM, "scale", scale_form,2);
1374
+ RB_CLASS_METH(cFORM, "current_field=", set_current_field,1);
1375
+ RB_CLASS_METH(cFORM, "field_init=", set_field_init,1);
1376
+ RB_CLASS_METH(cFORM, "field_term=", set_field_term,1);
1377
+ RB_CLASS_METH(cFORM, "fields=", set_form_fields,1);
1378
+ RB_CLASS_METH(cFORM, "init=", set_form_init,1);
1379
+ RB_CLASS_METH(cFORM, "opts=", set_form_opts,1);
1380
+ RB_CLASS_METH(cFORM, "page=", set_form_page,1);
1381
+ RB_CLASS_METH(cFORM, "sub=", set_form_sub,1);
1382
+ RB_CLASS_METH(cFORM, "term=", set_form_term,1);
1383
+ /* RB_CLASS_METH(cFORM, "userptr=", set_form_userptr,1); */
1384
+ RB_CLASS_METH(cFORM, "win=", set_form_win,1);
1385
+ RB_CLASS_METH(cFORM, "unpost", unpost_form,0);
1386
1386
 
1387
1387
  /* Fields */
1388
1388
  rb_iv_set(mForm, "@fields_hash", rb_hash_new());
@@ -1390,37 +1390,37 @@ void init_form(void)
1390
1390
  rb_define_singleton_method(cFIELD, "new",
1391
1391
  (&rbncurs_m_new_field),
1392
1392
  6);
1393
- RB_CLASS_METH(cFIELD, dup_field,2);
1394
- RB_CLASS_METH(cFIELD, dynamic_field_info,2);
1395
- RB_CLASS_METH(cFIELD, field_arg,0);
1396
- RB_CLASS_METH(cFIELD, field_back,1);
1397
- RB_CLASS_METH(cFIELD, field_buffer,1);
1398
- RB_CLASS_METH(cFIELD, field_fore,1);
1399
- RB_CLASS_METH(cFIELD, field_index,0);
1400
- RB_CLASS_METH(cFIELD, field_info,6);
1401
- RB_CLASS_METH(cFIELD, field_just,0);
1402
- RB_CLASS_METH(cFIELD, field_opts,0);
1403
- RB_CLASS_METH(cFIELD, field_opts_off,1);
1404
- RB_CLASS_METH(cFIELD, field_opts_on,1);
1405
- RB_CLASS_METH(cFIELD, field_pad,1);
1406
- RB_CLASS_METH(cFIELD, field_status,0);
1407
- RB_CLASS_METH(cFIELD, field_type,0);
1408
- /* RB_CLASS_METH(cFIELD, field_userptr,0); */
1409
- RB_CLASS_METH(cFIELD, free_field,0);
1410
- RB_CLASS_METH(cFIELD, link_field,2);
1411
- RB_CLASS_METH(cFIELD, move_field,2);
1412
- RB_CLASS_METH(cFIELD, new_page,0);
1413
- RB_CLASS_METH(cFIELD, set_field_back,1);
1414
- RB_CLASS_METH(cFIELD, set_field_buffer,2);
1415
- RB_CLASS_METH(cFIELD, set_field_fore,1);
1416
- RB_CLASS_METH(cFIELD, set_field_just,1);
1417
- RB_CLASS_METH(cFIELD, set_field_opts,1);
1418
- RB_CLASS_METH(cFIELD, set_field_pad,1);
1419
- RB_CLASS_METH(cFIELD, set_field_status,1);
1420
- RB_CLASS_METH(cFIELD, set_field_type,-1);
1421
- /* RB_CLASS_METH(cFIELD, set_field_userptr,1); */
1422
- RB_CLASS_METH(cFIELD, set_max_field,1);
1423
- RB_CLASS_METH(cFIELD, set_new_page,1);
1393
+ RB_CLASS_METH(cFIELD, "dup", dup_field,2);
1394
+ RB_CLASS_METH(cFIELD, "dynamic_info", dynamic_field_info,3);
1395
+ RB_CLASS_METH(cFIELD, "arg", field_arg,0);
1396
+ RB_CLASS_METH(cFIELD, "back", field_back,1);
1397
+ RB_CLASS_METH(cFIELD, "buffer", field_buffer,1);
1398
+ RB_CLASS_METH(cFIELD, "fore", field_fore,1);
1399
+ RB_CLASS_METH(cFIELD, "index", field_index,0);
1400
+ RB_CLASS_METH(cFIELD, "info", field_info,6);
1401
+ RB_CLASS_METH(cFIELD, "just", field_just,0);
1402
+ RB_CLASS_METH(cFIELD, "opts", field_opts,0);
1403
+ RB_CLASS_METH(cFIELD, "opts_off", field_opts_off,1);
1404
+ RB_CLASS_METH(cFIELD, "opts_on", field_opts_on,1);
1405
+ RB_CLASS_METH(cFIELD, "pad", field_pad,1);
1406
+ RB_CLASS_METH(cFIELD, "status", field_status,0);
1407
+ RB_CLASS_METH(cFIELD, "type", field_type,0);
1408
+ /* RB_CLASS_METH(cFIELD, "userptr", field_userptr,0); */
1409
+ RB_CLASS_METH(cFIELD, "free", free_field,0);
1410
+ RB_CLASS_METH(cFIELD, "link", link_field,2);
1411
+ RB_CLASS_METH(cFIELD, "move", move_field,2);
1412
+ RB_CLASS_METH(cFIELD, NULL, new_page,0);
1413
+ RB_CLASS_METH(cFIELD, "back=", set_field_back,1);
1414
+ RB_CLASS_METH(cFIELD, "set_buffer", set_field_buffer,2);
1415
+ RB_CLASS_METH(cFIELD, "fore=", set_field_fore,1);
1416
+ RB_CLASS_METH(cFIELD, "just=", set_field_just,1);
1417
+ RB_CLASS_METH(cFIELD, "opts=", set_field_opts,1);
1418
+ RB_CLASS_METH(cFIELD, "pad=", set_field_pad,1);
1419
+ RB_CLASS_METH(cFIELD, "status=", set_field_status,1);
1420
+ RB_CLASS_METH(cFIELD, "set_type", set_field_type,-1);
1421
+ /* RB_CLASS_METH(cFIELD, "userptr=", set_field_userptr,1); */
1422
+ RB_CLASS_METH(cFIELD, "max_field=", set_max_field,1);
1423
+ RB_CLASS_METH(cFIELD, "new_page=", set_new_page,1);
1424
1424
 
1425
1425
 
1426
1426
 
@@ -1431,9 +1431,9 @@ void init_form(void)
1431
1431
  rb_define_singleton_method(cFIELDTYPE, "new",
1432
1432
  (&rbncurs_m_new_fieldtype),
1433
1433
  2);
1434
- RB_CLASS_METH(cFIELDTYPE, free_fieldtype,0);
1435
- RB_CLASS_METH(cFIELDTYPE, link_fieldtype,1);
1436
- RB_CLASS_METH(cFIELDTYPE, set_fieldtype_choice,2);
1434
+ RB_CLASS_METH(cFIELDTYPE, "free", free_fieldtype,0);
1435
+ RB_CLASS_METH(cFIELDTYPE, "link", link_fieldtype,1);
1436
+ RB_CLASS_METH(cFIELDTYPE, "set_choice", set_fieldtype_choice,2);
1437
1437
 
1438
1438
  /* Create predefined types */
1439
1439
  rb_define_const(mForm, "TYPE_ALNUM", wrap_fieldtype(TYPE_ALNUM));
data/form_wrap.h CHANGED
@@ -47,11 +47,10 @@ typedef struct {
47
47
  #name, \
48
48
  &rbncurs_m_ ## name, \
49
49
  nargs)
50
- #define RB_CLASS_METH(class, name, nargs) \
51
- rb_define_method(class, \
52
- #name, \
53
- (&rbncurs_c_ ## name), \
54
- nargs);
50
+ #define RB_CLASS_METH(class, alt_name, name, nargs) \
51
+ rb_define_method(class, #name, (&rbncurs_c_ ## name), nargs); \
52
+ if (alt_name != NULL) \
53
+ rb_define_method(class, alt_name, (&rbncurs_c_ ## name), nargs); \
55
54
 
56
55
  void init_req_constants();
57
56
  void init_just_constants();
data/lib/ncursesw.rb CHANGED
@@ -17,7 +17,7 @@
17
17
  # License along with this module; if not, write to the Free Software
18
18
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
19
 
20
- # $Id: ncurses.rb,v 1.7 2005/02/26 22:51:29 t-peters Exp $
20
+ # $Id: ncurses.rb,v 1.8 2009/05/03 10:37:54 t-peters Exp $
21
21
 
22
22
  require "ncursesw_bin.so"
23
23
 
@@ -109,7 +109,7 @@ module Ncurses
109
109
  class FORM
110
110
  attr_reader :user_object
111
111
 
112
- # This placeholder replaces the field_userptr function in curses
112
+ # This placeholder replaces the form_userptr function in curses
113
113
  def user_object=(obj)
114
114
  @user_object = obj
115
115
  end
@@ -127,6 +127,26 @@ module Ncurses
127
127
  class FIELDTYPE
128
128
  end
129
129
  end
130
+
131
+ module Menu
132
+ class MENU
133
+ attr_reader :user_object
134
+
135
+ # This placeholder replaces the menu_userptr function in curses
136
+ def user_object=(obj)
137
+ @user_object = obj
138
+ end
139
+ end
140
+
141
+ class ITEM
142
+ attr_reader :user_object
143
+
144
+ # This placeholder replaces the item_userptr function in curses
145
+ def user_object=(obj)
146
+ @user_object = obj
147
+ end
148
+ end
149
+ end
130
150
  end
131
151
  def Ncurses.inchnstr(str,n)
132
152
  Ncurses.winchnstr(Ncurses.stdscr, str, n)
data/menu_wrap.c ADDED
@@ -0,0 +1,1144 @@
1
+ /*
2
+ * This is a curses menu wrapper as part of ncurses-ruby.
3
+ * It borrows heavily from form_wrap.c.
4
+ * Contributed by Earle Clubb <eclubb@valcom.com>
5
+ * Valcom Inc. <http://www.valcom.com>
6
+ * Copyright 2007
7
+ *
8
+ * Modifications
9
+ * (C) 2009 Tobias Herzke
10
+ *
11
+ * This module is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2 of the License, or (at your option) any later version.
15
+ *
16
+ * This module is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19
+ * Lesser General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU Lesser General Public
22
+ * License along with this module; if not, write to the Free Software
23
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24
+ *
25
+ */
26
+
27
+ #ifdef HAVE_MENU_H
28
+
29
+ #include "menu_wrap.h"
30
+ #include "ncurses_wrap.h"
31
+
32
+ VALUE mMenu;
33
+ VALUE cITEM;
34
+ VALUE cMENU;
35
+
36
+ void init_menu_err_codes(void)
37
+ {
38
+ /* The routine succeeded. */
39
+ MENU_DEF_CONST(E_OK);
40
+ /* System error occurred (see errno). */
41
+ MENU_DEF_CONST(E_SYSTEM_ERROR);
42
+ /* Routine detected an incorrect or out-of-range argument. */
43
+ MENU_DEF_CONST(E_BAD_ARGUMENT);
44
+ /* The menu is already posted. */
45
+ MENU_DEF_CONST(E_POSTED);
46
+ /* Routine was called from an initialization or termination function. */
47
+ MENU_DEF_CONST(E_BAD_STATE);
48
+ /* Menu is too large for its window. */
49
+ MENU_DEF_CONST(E_NO_ROOM);
50
+ /* The menu has not been posted. */
51
+ MENU_DEF_CONST(E_NOT_POSTED);
52
+ /* The menu driver code saw an unknown request code. */
53
+ MENU_DEF_CONST(E_UNKNOWN_COMMAND);
54
+ /* Character failed to match. */
55
+ MENU_DEF_CONST(E_NO_MATCH);
56
+ /* The designated item cannot be selected. */
57
+ MENU_DEF_CONST(E_NOT_SELECTABLE);
58
+ /* No items are connected to the menu. */
59
+ MENU_DEF_CONST(E_NOT_CONNECTED);
60
+ /* The menu driver could not process the request.} */
61
+ MENU_DEF_CONST(E_REQUEST_DENIED);
62
+ }
63
+
64
+
65
+ /*
66
+ * Menu driver request characters - menu_driver(3x) man page
67
+ */
68
+ void init_menu_req_constants(void)
69
+ {
70
+ /* Move left to an item. */
71
+ MENU_DEF_CONST(REQ_LEFT_ITEM);
72
+ /* Move right to an item. */
73
+ MENU_DEF_CONST(REQ_RIGHT_ITEM);
74
+ /* Move up to an item. */
75
+ MENU_DEF_CONST(REQ_UP_ITEM);
76
+ /* Move down to an item. */
77
+ MENU_DEF_CONST(REQ_DOWN_ITEM);
78
+ /* Scroll up a line. */
79
+ MENU_DEF_CONST(REQ_SCR_ULINE);
80
+ /* Scroll down a line. */
81
+ MENU_DEF_CONST(REQ_SCR_DLINE);
82
+ /* Scroll up a page. */
83
+ MENU_DEF_CONST(REQ_SCR_UPAGE);
84
+ /* Scroll down a page. */
85
+ MENU_DEF_CONST(REQ_SCR_DPAGE);
86
+ /* Move to the first item. */
87
+ MENU_DEF_CONST(REQ_FIRST_ITEM);
88
+ /* Move to the last item. */
89
+ MENU_DEF_CONST(REQ_LAST_ITEM);
90
+ /* Move to the next item. */
91
+ MENU_DEF_CONST(REQ_NEXT_ITEM);
92
+ /* Move to the previous item. */
93
+ MENU_DEF_CONST(REQ_PREV_ITEM);
94
+ /* Select/deselect an item. */
95
+ MENU_DEF_CONST(REQ_TOGGLE_ITEM);
96
+ /* Clear the menu pattern buffer. */
97
+ MENU_DEF_CONST(REQ_CLEAR_PATTERN);
98
+ /* Delete the previous character from the pattern buffer. */
99
+ MENU_DEF_CONST(REQ_BACK_PATTERN);
100
+ /* Move to the next item matching the pattern match. */
101
+ MENU_DEF_CONST(REQ_NEXT_MATCH);
102
+ /* Move to the previous item matching the pattern match. */
103
+ MENU_DEF_CONST(REQ_PREV_MATCH);
104
+ }
105
+
106
+
107
+ /*
108
+ * Item options - mitem_opts(3x) man page
109
+ */
110
+ void init_item_opts_constants(void)
111
+ {
112
+ /* Item may be selected during menu processing. */
113
+ MENU_DEF_CONST(O_SELECTABLE);
114
+ }
115
+
116
+
117
+ /*
118
+ * Menu options - menu_opts(3x) man page
119
+ */
120
+ void init_menu_opts_constants(void)
121
+ {
122
+ /* Only one item can be selected for this menu. */
123
+ MENU_DEF_CONST(O_ONEVALUE);
124
+ /* Display the item descriptions when the menu is posted. */
125
+ MENU_DEF_CONST(O_SHOWDESC);
126
+ /* Display the menu in row-major order. */
127
+ MENU_DEF_CONST(O_ROWMAJOR);
128
+ /* Ignore the case when pattern-matching. */
129
+ MENU_DEF_CONST(O_IGNORECASE);
130
+ /* Move the cursor to within the item name while pattern-matching. */
131
+ MENU_DEF_CONST(O_SHOWMATCH);
132
+ /* Don’t wrap around next-item and previous-item, requests to the other end of the menu. */
133
+ MENU_DEF_CONST(O_NONCYCLIC);
134
+ }
135
+
136
+
137
+ /*
138
+ * ITEM wrapper
139
+ */
140
+ static VALUE wrap_item(ITEM *item)
141
+ {
142
+ if (item == 0) return Qnil;
143
+ {
144
+ VALUE items_hash = rb_iv_get(mMenu, "@items_hash");
145
+ VALUE item_address = INT2NUM((long)(item));
146
+ VALUE rb_item = rb_hash_aref(items_hash, item_address);
147
+
148
+ if (rb_item == Qnil)
149
+ {
150
+ rb_item = Data_Wrap_Struct(cITEM, 0, 0, item);
151
+ rb_iv_set(rb_item, "@destroyed", Qfalse);
152
+ rb_hash_aset(items_hash, item_address, rb_item);
153
+ }
154
+ return rb_item;
155
+ }
156
+ }
157
+ static ITEM *get_item(VALUE rb_item)
158
+ {
159
+ ITEM *item;
160
+
161
+ if (rb_item == Qnil) return 0;
162
+ if (rb_iv_get(rb_item, "@destroyed") == Qtrue)
163
+ {
164
+ rb_raise(rb_eRuntimeError, "Attempt to access a destroyed item");
165
+ return 0;
166
+ }
167
+ Data_Get_Struct(rb_item, ITEM, item);
168
+ return item;
169
+ }
170
+
171
+
172
+ /*
173
+ * MENU wrapper
174
+ */
175
+ static VALUE wrap_menu(MENU *menu)
176
+ {
177
+ if (menu == 0) return Qnil;
178
+ {
179
+ VALUE menus_hash = rb_iv_get(mMenu, "@menus_hash");
180
+ VALUE menu_address = INT2NUM((long)(menu));
181
+ VALUE rb_menu = rb_hash_aref(menus_hash, menu_address);
182
+
183
+ if (rb_menu == Qnil)
184
+ {
185
+ rb_menu = Data_Wrap_Struct(cMENU, 0, 0, menu);
186
+ rb_iv_set(rb_menu, "@destroyed", Qfalse);
187
+ rb_hash_aset(menus_hash, menu_address, rb_menu);
188
+ }
189
+ return rb_menu;
190
+ }
191
+ }
192
+ static MENU *get_menu(VALUE rb_menu)
193
+ {
194
+ MENU *menu;
195
+
196
+ if (rb_menu == Qnil) return 0;
197
+ if (rb_iv_get(rb_menu, "@destroyed") == Qtrue)
198
+ {
199
+ rb_raise(rb_eRuntimeError, "Attempt to access a destroyed menu");
200
+ return 0;
201
+ }
202
+ Data_Get_Struct(rb_menu, MENU, menu);
203
+ return menu;
204
+ }
205
+
206
+
207
+ /*
208
+ * Proc objects are registered using hashes (one for each type of hook)
209
+ * The key in the hash is the address of the ncurses "object" and the value is
210
+ * the Proc object.
211
+ */
212
+ #define ITEM_INIT_HOOK 0
213
+ #define ITEM_TERM_HOOK 1
214
+ #define MENU_INIT_HOOK 2
215
+ #define MENU_TERM_HOOK 3
216
+ #define PROC_HASHES_COUNT 4
217
+ static VALUE get_proc_hash(int hook)
218
+ {
219
+ VALUE arr = rb_iv_get(mMenu, "@proc_hashes");
220
+ VALUE hash = rb_ary_entry(arr, (long)hook);
221
+
222
+ if (hash == Qnil)
223
+ rb_raise(rb_eRuntimeError, "Invalid proc hash.");
224
+ return hash;
225
+ }
226
+
227
+ /*
228
+ * Returns an existing Ruby Proc for a given owning "object" and hook type.
229
+ * Qnil will be returned if no Proc was associated with the owner
230
+ */
231
+ static VALUE get_proc(void *owner, int hook)
232
+ {
233
+ if (owner == 0) return Qnil;
234
+ {
235
+ VALUE owner_address = INT2NUM((long)(owner));
236
+ VALUE proc_hash = get_proc_hash(hook);
237
+ VALUE proc = rb_hash_aref(proc_hash, owner_address);
238
+
239
+ return proc;
240
+ }
241
+ }
242
+
243
+ /*
244
+ * Registers the Proc object with a given owner "object" and hook type.
245
+ * If proc is Qnil, the hook is unregistered instead.
246
+ */
247
+ static void reg_proc(void *owner, int hook, VALUE proc)
248
+ {
249
+ if (owner == NULL) return;
250
+ {
251
+ VALUE proc_hash = get_proc_hash(hook);
252
+ VALUE owner_address = INT2NUM((long)(owner));
253
+
254
+ if (proc == Qnil)
255
+ rb_hash_delete(proc_hash, owner_address);
256
+ else
257
+ rb_hash_aset(proc_hash, owner_address, proc);
258
+ }
259
+ }
260
+
261
+
262
+ /*
263
+ * Menu creation/destruction functions - menu_new(3X) man page
264
+ */
265
+ static VALUE rbncurs_m_new_menu(VALUE dummy, VALUE rb_item_array)
266
+ {
267
+ long n = rbncurs_array_length(rb_item_array);
268
+ /* Will ncurses free this array? If not, must do it after calling free_menu(). */
269
+ ITEM **items = ALLOC_N(ITEM*, (n+1));
270
+ long i;
271
+
272
+ for (i=0; i<n; i++)
273
+ items[i] = get_item(rb_ary_entry(rb_item_array, i));
274
+ items[n] = NULL;
275
+ return wrap_menu(new_menu(items));
276
+ }
277
+
278
+ static VALUE rbncurs_c_free_menu(VALUE rb_menu)
279
+ {
280
+ VALUE menus_hash = rb_iv_get(mMenu, "@menus_hash");
281
+ MENU *menu = get_menu(rb_menu);
282
+ VALUE menu_address = INT2NUM((long)(menu));
283
+
284
+ rb_funcall(menus_hash, rb_intern("delete"), 1, menu_address);
285
+ rb_iv_set(rb_menu, "@destroyed", Qtrue);
286
+ return INT2NUM(free_menu(menu));
287
+ }
288
+ static VALUE rbncurs_m_free_menu(VALUE dummy, VALUE rb_menu)
289
+ { return rbncurs_c_free_menu(rb_menu); }
290
+
291
+
292
+ /*
293
+ * Menu post/unpost functions - menu_post(3X) man page
294
+ */
295
+ static VALUE rbncurs_c_post_menu(VALUE rb_menu)
296
+ {
297
+ MENU *menu = get_menu(rb_menu);
298
+ return INT2NUM(post_menu(menu));
299
+ }
300
+ static VALUE rbncurs_m_post_menu(VALUE dummy, VALUE rb_menu)
301
+ { return rbncurs_c_post_menu(rb_menu); }
302
+
303
+ static VALUE rbncurs_c_unpost_menu(VALUE rb_menu)
304
+ {
305
+ MENU *menu = get_menu(rb_menu);
306
+ return INT2NUM(unpost_menu(menu));
307
+ }
308
+ static VALUE rbncurs_m_unpost_menu(VALUE dummy, VALUE rb_menu)
309
+ { return rbncurs_c_unpost_menu(rb_menu); }
310
+
311
+
312
+ /*
313
+ * Menu driver - menu_driver(3X) man page
314
+ */
315
+ static VALUE rbncurs_c_menu_driver(VALUE rb_menu, VALUE c)
316
+ {
317
+ MENU *menu = get_menu(rb_menu);
318
+ return INT2NUM(menu_driver(menu, NUM2INT(c)));
319
+ }
320
+ static VALUE rbncurs_m_menu_driver(VALUE dummy, VALUE rb_menu, VALUE c)
321
+ { return rbncurs_c_menu_driver(rb_menu, c); }
322
+
323
+
324
+ /*
325
+ * Current menu item get/set functions - mitem_current(3X) man page
326
+ */
327
+ static VALUE rbncurs_c_current_item(VALUE rb_menu)
328
+ {
329
+ MENU *menu = get_menu(rb_menu);
330
+ return wrap_item(current_item(menu));
331
+ }
332
+ static VALUE rbncurs_m_current_item(VALUE dummy, VALUE rb_menu)
333
+ { return rbncurs_c_current_item(rb_menu); }
334
+
335
+ static VALUE rbncurs_c_set_current_item(VALUE rb_menu, VALUE rb_item)
336
+ {
337
+ MENU *menu = get_menu(rb_menu);
338
+ ITEM *item = get_item(rb_item);
339
+ return INT2NUM(set_current_item(menu, item));
340
+ }
341
+ static VALUE rbncurs_m_set_current_item(VALUE dummy, VALUE rb_menu, VALUE rb_item)
342
+ { return rbncurs_c_set_current_item(rb_menu, rb_item); }
343
+
344
+ static VALUE rbncurs_c_top_row(VALUE rb_menu)
345
+ {
346
+ MENU *menu = get_menu(rb_menu);
347
+ return INT2NUM(top_row(menu));
348
+ }
349
+ static VALUE rbncurs_m_top_row(VALUE dummy, VALUE rb_menu)
350
+ { return rbncurs_c_top_row(rb_menu); }
351
+
352
+ static VALUE rbncurs_c_set_top_row(VALUE rb_menu, VALUE n)
353
+ {
354
+ MENU *menu = get_menu(rb_menu);
355
+ return INT2NUM(set_top_row(menu, NUM2INT(n)));
356
+ }
357
+ static VALUE rbncurs_m_set_top_row(VALUE dummy, VALUE rb_menu, VALUE rb_item)
358
+ { return rbncurs_c_set_top_row(rb_menu, rb_item); }
359
+
360
+ static VALUE rbncurs_c_item_index(VALUE rb_item)
361
+ {
362
+ ITEM *item = get_item(rb_item);
363
+ return INT2NUM(item_index(item));
364
+ }
365
+ static VALUE rbncurs_m_item_index(VALUE dummy, VALUE rb_item)
366
+ { return rbncurs_c_item_index(rb_item); }
367
+
368
+
369
+ /*
370
+ * Item creation/destruction functions - mitem_new(3X) man page
371
+ */
372
+ static VALUE rbncurs_m_new_item(VALUE dummy, VALUE name, VALUE description)
373
+ { return wrap_item(new_item(STR2CSTR(name), STR2CSTR(description))); }
374
+
375
+ static VALUE rbncurs_c_free_item(VALUE rb_item)
376
+ {
377
+ VALUE items_hash = rb_iv_get(mMenu, "@items_hash");
378
+ ITEM *item = get_item(rb_item);
379
+ VALUE item_address = INT2NUM((long)(item));
380
+ rb_funcall(items_hash, rb_intern("delete"), 1, item_address);
381
+ rb_iv_set(rb_item, "@destroyed", Qtrue);
382
+ return INT2NUM(free_item(item));
383
+ }
384
+ static VALUE rbncurs_m_free_item(VALUE dummy, VALUE rb_item)
385
+ { return rbncurs_c_free_item(rb_item); }
386
+
387
+
388
+ /*
389
+ * Item-menu connection make/break functions - menu_items(3X) man page
390
+ */
391
+ static VALUE rbncurs_c_set_menu_items(VALUE rb_menu, VALUE rb_item_array)
392
+ {
393
+ long n = rbncurs_array_length(rb_item_array);
394
+ /* If ncurses does not free memory used by the previous array of strings, */
395
+ /* we will have to do it now. */
396
+ ITEM **items = ALLOC_N(ITEM*, (n+1));
397
+ long i;
398
+ MENU *menu = NULL;
399
+
400
+ for (i=0; i<n; i++)
401
+ items[i] = get_item(rb_ary_entry(rb_item_array, i));
402
+ items[n] = NULL;
403
+ menu = get_menu(rb_menu);
404
+ return INT2NUM(set_menu_items(menu, items));
405
+ }
406
+ static VALUE rbncurs_m_set_menu_items(VALUE dummy, VALUE rb_menu, VALUE rb_item_array)
407
+ { return rbncurs_c_set_menu_items(rb_menu, rb_item_array); }
408
+
409
+ static VALUE rbncurs_c_menu_items(VALUE rb_menu)
410
+ {
411
+ MENU *menu = get_menu(rb_menu);
412
+ ITEM **items = menu_items(menu);
413
+ VALUE arr = Qundef;
414
+ int i;
415
+
416
+ if (items == NULL)
417
+ rb_raise(rb_eRuntimeError, "Error retrieving menu items");
418
+ arr = rb_ary_new();
419
+ i=0;
420
+ while (items[i] != NULL)
421
+ rb_ary_push(arr, wrap_item(items[i++]));
422
+ return arr;
423
+ }
424
+ static VALUE rbncurs_m_menu_items(VALUE dummy, VALUE rb_menu)
425
+ { return rbncurs_c_menu_items(rb_menu); }
426
+
427
+ static VALUE rbncurs_c_item_count(VALUE rb_menu)
428
+ {
429
+ MENU *menu = get_menu(rb_menu);
430
+ return INT2NUM(item_count(menu));
431
+ }
432
+ static VALUE rbncurs_m_item_count(VALUE dummy, VALUE rb_menu)
433
+ { return rbncurs_c_item_count(rb_menu); }
434
+
435
+
436
+ /*
437
+ * Item/menu hook get/set functions - menu_hook(3X) man page
438
+ */
439
+ static void item_init_hook(MENU *menu)
440
+ {
441
+ /* Find the Proc object associated with this menu */
442
+ VALUE proc = get_proc(menu, ITEM_INIT_HOOK);
443
+
444
+ if (proc != Qnil)
445
+ {
446
+ VALUE rb_menu = wrap_menu(menu);
447
+ rb_funcall(proc, rb_intern("call"), 1, rb_menu);
448
+ }
449
+ }
450
+ static VALUE rbncurs_c_set_item_init(VALUE rb_menu, VALUE proc)
451
+ {
452
+ MENU *menu = NULL;
453
+
454
+ if (!rb_obj_is_kind_of(rb_menu, cMENU))
455
+ rb_raise(rb_eArgError, "arg1 must be a MENU object");
456
+ if (!rb_obj_is_kind_of(proc, rb_cProc))
457
+ rb_raise(rb_eArgError, "arg2 must be a Proc object");
458
+ menu = get_menu(rb_menu);
459
+ reg_proc(menu, ITEM_INIT_HOOK, proc);
460
+ if (proc != Qnil)
461
+ return INT2NUM(set_item_init(menu, item_init_hook));
462
+ else
463
+ return INT2NUM(set_item_init(menu, NULL));
464
+ }
465
+ static VALUE rbncurs_m_set_item_init(VALUE dummy, VALUE rb_menu, VALUE proc)
466
+ { return rbncurs_c_set_item_init(rb_menu, proc); }
467
+
468
+ static VALUE rbncurs_c_item_init(VALUE rb_menu)
469
+ {
470
+ MENU *menu = get_menu(rb_menu);
471
+ return get_proc(menu, ITEM_INIT_HOOK);
472
+ }
473
+ static VALUE rbncurs_m_item_init(VALUE dummy, VALUE rb_menu)
474
+ { return rbncurs_c_item_init(rb_menu); }
475
+
476
+ static void item_term_hook(MENU *menu)
477
+ {
478
+ /* Find the Proc object associated with this menu */
479
+ VALUE proc = get_proc(menu, ITEM_TERM_HOOK);
480
+
481
+ if (proc != Qnil)
482
+ {
483
+ VALUE rb_menu = wrap_menu(menu);
484
+ rb_funcall(proc, rb_intern("call"), 1, rb_menu);
485
+ }
486
+ }
487
+ static VALUE rbncurs_c_set_item_term(VALUE rb_menu, VALUE proc)
488
+ {
489
+ MENU *menu = NULL;
490
+
491
+ if (!rb_obj_is_kind_of(rb_menu, cMENU))
492
+ rb_raise(rb_eArgError, "arg1 must be a MENU object");
493
+ if (!rb_obj_is_kind_of(proc, rb_cProc))
494
+ rb_raise(rb_eArgError, "arg2 must be a Proc object");
495
+ menu = get_menu(rb_menu);
496
+ reg_proc(menu, ITEM_TERM_HOOK, proc);
497
+ if (proc != Qnil)
498
+ return INT2NUM(set_item_term(menu, item_term_hook));
499
+ else
500
+ return INT2NUM(set_item_term(menu, NULL));
501
+ }
502
+ static VALUE rbncurs_m_set_item_term(VALUE dummy, VALUE rb_menu, VALUE proc)
503
+ { return rbncurs_c_set_item_term(rb_menu, proc); }
504
+
505
+ static VALUE rbncurs_c_item_term(VALUE rb_menu)
506
+ {
507
+ MENU *menu = get_menu(rb_menu);
508
+ return get_proc(menu, ITEM_TERM_HOOK);
509
+ }
510
+ static VALUE rbncurs_m_item_term(VALUE dummy, VALUE rb_menu)
511
+ { return rbncurs_c_item_term(rb_menu); }
512
+
513
+ static void menu_init_hook(MENU *menu)
514
+ {
515
+ /* Find the Proc object associated with this menu */
516
+ VALUE proc = get_proc(menu, MENU_INIT_HOOK);
517
+
518
+ if (proc != Qnil)
519
+ {
520
+ VALUE rb_menu = wrap_menu(menu);
521
+ rb_funcall(proc, rb_intern("call"), 1, rb_menu);
522
+ }
523
+ }
524
+ static VALUE rbncurs_c_set_menu_init(VALUE rb_menu, VALUE proc) {
525
+ MENU *menu = NULL;
526
+
527
+ if (!rb_obj_is_kind_of(rb_menu, cMENU))
528
+ rb_raise(rb_eArgError, "arg1 must be a MENU object");
529
+ if (!rb_obj_is_kind_of(proc, rb_cProc))
530
+ rb_raise(rb_eArgError, "arg2 must be a Proc object");
531
+ menu = get_menu(rb_menu);
532
+ reg_proc(menu, MENU_INIT_HOOK, proc);
533
+ if (proc != Qnil)
534
+ return INT2NUM(set_menu_init(menu, menu_init_hook));
535
+ else
536
+ return INT2NUM(set_menu_init(menu, NULL));
537
+ }
538
+ static VALUE rbncurs_m_set_menu_init(VALUE dummy, VALUE rb_menu, VALUE proc)
539
+ { return rbncurs_c_set_menu_init(rb_menu, proc); }
540
+
541
+ static VALUE rbncurs_c_menu_init(VALUE rb_menu)
542
+ {
543
+ MENU *menu = get_menu(rb_menu);
544
+ return get_proc(menu, MENU_INIT_HOOK);
545
+ }
546
+ static VALUE rbncurs_m_menu_init(VALUE dummy, VALUE rb_menu)
547
+ { return rbncurs_c_menu_init(rb_menu); }
548
+
549
+ static void menu_term_hook(MENU *menu)
550
+ {
551
+ /* Find the Proc object associated with this menu */
552
+ VALUE proc = get_proc(menu, MENU_TERM_HOOK);
553
+
554
+ if (proc != Qnil)
555
+ {
556
+ VALUE rb_menu = wrap_menu(menu);
557
+ rb_funcall(proc, rb_intern("call"), 1, rb_menu);
558
+ }
559
+ }
560
+ static VALUE rbncurs_c_set_menu_term(VALUE rb_menu, VALUE proc)
561
+ {
562
+ MENU *menu = NULL;
563
+
564
+ if (!rb_obj_is_kind_of(rb_menu, cMENU))
565
+ rb_raise(rb_eArgError, "arg1 must be a MENU object");
566
+ if (!rb_obj_is_kind_of(proc, rb_cProc))
567
+ rb_raise(rb_eArgError, "arg2 must be a Proc object");
568
+ menu = get_menu(rb_menu);
569
+ reg_proc(menu, MENU_TERM_HOOK, proc);
570
+ if (proc != Qnil)
571
+ return INT2NUM(set_menu_term(menu, menu_term_hook));
572
+ else
573
+ return INT2NUM(set_menu_term(menu, NULL));
574
+ }
575
+ static VALUE rbncurs_m_set_menu_term(VALUE dummy, VALUE rb_menu, VALUE proc)
576
+ { return rbncurs_c_set_menu_term(rb_menu, proc); }
577
+
578
+ static VALUE rbncurs_c_menu_term(VALUE rb_menu)
579
+ {
580
+ MENU *menu = get_menu(rb_menu);
581
+ return get_proc(menu, MENU_TERM_HOOK);
582
+ }
583
+ static VALUE rbncurs_m_menu_term(VALUE dummy, VALUE rb_menu)
584
+ { return rbncurs_c_menu_term(rb_menu); }
585
+
586
+
587
+ /*
588
+ * Item option get/set functions - mitem_opts(3X) man page
589
+ */
590
+ static VALUE rbncurs_c_set_item_opts(VALUE rb_item, VALUE opts)
591
+ {
592
+ ITEM *item = get_item(rb_item);
593
+ return INT2NUM(set_item_opts(item, NUM2INT(opts)));
594
+ }
595
+ static VALUE rbncurs_m_set_item_opts(VALUE dummy, VALUE rb_item, VALUE opts)
596
+ { return rbncurs_c_set_item_opts(rb_item, opts); }
597
+
598
+ static VALUE rbncurs_c_item_opts_on(VALUE rb_item, VALUE opts)
599
+ {
600
+ ITEM *item = get_item(rb_item);
601
+ return INT2NUM(item_opts_on(item, NUM2INT(opts)));
602
+ }
603
+ static VALUE rbncurs_m_item_opts_on(VALUE dummy, VALUE rb_item, VALUE opts)
604
+ { return rbncurs_c_item_opts_on(rb_item, opts); }
605
+
606
+ static VALUE rbncurs_c_item_opts_off(VALUE rb_item, VALUE opts)
607
+ {
608
+ ITEM *item = get_item(rb_item);
609
+ return INT2NUM(item_opts_off(item, NUM2INT(opts)));
610
+ }
611
+ static VALUE rbncurs_m_item_opts_off(VALUE dummy, VALUE rb_item, VALUE opts)
612
+ { return rbncurs_c_item_opts_off(rb_item, opts); }
613
+
614
+ static VALUE rbncurs_c_item_opts(VALUE rb_item)
615
+ {
616
+ ITEM *item = get_item(rb_item);
617
+ return INT2NUM(item_opts(item));
618
+ }
619
+ static VALUE rbncurs_m_item_opts(VALUE dummy, VALUE rb_item)
620
+ { return rbncurs_c_item_opts(rb_item); }
621
+
622
+
623
+ /*
624
+ * Menu option get/set functions - menu_opts(3X) man page
625
+ */
626
+ static VALUE rbncurs_c_set_menu_opts(VALUE rb_menu, VALUE opts)
627
+ {
628
+ MENU *menu = get_menu(rb_menu);
629
+ return INT2NUM(set_menu_opts(menu, NUM2INT(opts)));
630
+ }
631
+ static VALUE rbncurs_m_set_menu_opts(VALUE dummy, VALUE rb_menu, VALUE opts)
632
+ { return rbncurs_c_set_menu_opts(rb_menu, opts); }
633
+
634
+ static VALUE rbncurs_c_menu_opts_on(VALUE rb_menu, VALUE opts)
635
+ {
636
+ MENU *menu = get_menu(rb_menu);
637
+ return INT2NUM(menu_opts_on(menu, NUM2INT(opts)));
638
+ }
639
+ static VALUE rbncurs_m_menu_opts_on(VALUE dummy, VALUE rb_menu, VALUE opts)
640
+ { return rbncurs_c_menu_opts_on(rb_menu, opts); }
641
+
642
+ static VALUE rbncurs_c_menu_opts_off(VALUE rb_menu, VALUE opts)
643
+ {
644
+ MENU *menu = get_menu(rb_menu);
645
+ return INT2NUM(menu_opts_off(menu, NUM2INT(opts)));
646
+ }
647
+ static VALUE rbncurs_m_menu_opts_off(VALUE dummy, VALUE rb_menu, VALUE opts)
648
+ { return rbncurs_c_menu_opts_off(rb_menu, opts); }
649
+
650
+ static VALUE rbncurs_c_menu_opts(VALUE rb_menu)
651
+ {
652
+ MENU *menu = get_menu(rb_menu);
653
+ return INT2NUM(menu_opts(menu));
654
+ }
655
+ static VALUE rbncurs_m_menu_opts(VALUE dummy, VALUE rb_menu)
656
+ { return rbncurs_c_menu_opts(rb_menu); }
657
+
658
+
659
+ /*
660
+ * Printable menu request name handling functions - menu_requestname(3X) man page
661
+ */
662
+ static VALUE rbncurs_c_menu_request_name(VALUE request)
663
+ {
664
+ return rb_str_new2(menu_request_name(NUM2INT(request)));
665
+ }
666
+ static VALUE rbncurs_m_menu_request_name(VALUE dummy, VALUE request)
667
+ { return rbncurs_c_menu_request_name(request); }
668
+
669
+ static VALUE rbncurs_c_menu_request_by_name(VALUE name)
670
+ {
671
+ return INT2NUM(menu_request_by_name(STR2CSTR(name)));
672
+ }
673
+ static VALUE rbncurs_m_menu_request_by_name(VALUE dummy, VALUE name)
674
+ { return rbncurs_c_menu_request_by_name(name); }
675
+
676
+
677
+ /*
678
+ * (Sub)window association make/break functions - menu_win(3X) man page
679
+ */
680
+ static VALUE rbncurs_c_set_menu_win(VALUE rb_menu, VALUE rb_win)
681
+ {
682
+ MENU *menu = get_menu(rb_menu);
683
+ WINDOW *win = get_window(rb_win);
684
+ return INT2NUM(set_menu_win(menu, win));
685
+ }
686
+ static VALUE rbncurs_m_set_menu_win(VALUE dummy, VALUE rb_menu, VALUE rb_win)
687
+ { return rbncurs_c_set_menu_win(rb_menu, rb_win); }
688
+
689
+ static VALUE rbncurs_c_menu_win(VALUE rb_menu)
690
+ {
691
+ MENU *menu = get_menu(rb_menu);
692
+ return wrap_window(menu_win(menu));
693
+ }
694
+ static VALUE rbncurs_m_menu_win(VALUE dummy, VALUE rb_menu)
695
+ { return rbncurs_c_menu_win(rb_menu); }
696
+
697
+ static VALUE rbncurs_c_set_menu_sub(VALUE rb_menu, VALUE rb_sub)
698
+ {
699
+ MENU *menu = get_menu(rb_menu);
700
+ WINDOW *win = get_window(rb_sub);
701
+ return INT2NUM(set_menu_sub(menu, win));
702
+ }
703
+ static VALUE rbncurs_m_set_menu_sub(VALUE dummy, VALUE rb_menu, VALUE rb_sub)
704
+ { return rbncurs_c_set_menu_sub(rb_menu, rb_sub); }
705
+
706
+ static VALUE rbncurs_c_menu_sub(VALUE rb_menu)
707
+ {
708
+ MENU *menu = get_menu(rb_menu);
709
+ return wrap_window(menu_sub(menu));
710
+ }
711
+ static VALUE rbncurs_m_menu_sub(VALUE dummy, VALUE rb_menu)
712
+ { return rbncurs_c_menu_sub(rb_menu); }
713
+
714
+ static VALUE rbncurs_c_scale_menu(VALUE rb_menu, VALUE rows, VALUE columns)
715
+ {
716
+ MENU *menu = get_menu(rb_menu);
717
+
718
+ if (rb_obj_is_instance_of(rows, rb_cArray) != Qtrue ||
719
+ rb_obj_is_instance_of(columns, rb_cArray) != Qtrue)
720
+ {
721
+ rb_raise(rb_eArgError, "rows and columns arguments must be empty Arrays");
722
+ return Qnil;
723
+ }
724
+ else
725
+ {
726
+ int vals[2] = {0,0};
727
+ int result = scale_menu(menu, &vals[0],&vals[1]);
728
+
729
+ rb_ary_push(rows, INT2NUM(vals[0]));
730
+ rb_ary_push(columns, INT2NUM(vals[1]));
731
+ return INT2NUM(result);
732
+ }
733
+ }
734
+ static VALUE rbncurs_m_scale_menu(VALUE dummy, VALUE rb_menu, VALUE rows, VALUE columns)
735
+ { return rbncurs_c_scale_menu(rb_menu, rows, columns); }
736
+
737
+
738
+ /*
739
+ * Menu cursor positioning functions - menu_cursor(3X) man page
740
+ */
741
+ static VALUE rbncurs_c_pos_menu_cursor(VALUE rb_menu)
742
+ {
743
+ MENU *menu = get_menu(rb_menu);
744
+ return INT2NUM(pos_menu_cursor(menu));
745
+ }
746
+ static VALUE rbncurs_m_pos_menu_cursor(VALUE dummy, VALUE rb_menu)
747
+ { return rbncurs_c_pos_menu_cursor(rb_menu); }
748
+
749
+
750
+ /*
751
+ * Item name/description retrieval functions - mitem_name(3X) man page
752
+ */
753
+ static VALUE rbncurs_c_item_name(VALUE rb_item)
754
+ {
755
+ ITEM *item = get_item(rb_item);
756
+ return rb_str_new2(item_name(item));
757
+ }
758
+ static VALUE rbncurs_m_item_name(VALUE dummy, VALUE rb_item)
759
+ { return rbncurs_c_item_name(rb_item); }
760
+
761
+ static VALUE rbncurs_c_item_description(VALUE rb_item)
762
+ {
763
+ ITEM *item = get_item(rb_item);
764
+ return rb_str_new2(item_description(item));
765
+ }
766
+ static VALUE rbncurs_m_item_description(VALUE dummy, VALUE rb_item)
767
+ { return rbncurs_c_item_description(rb_item); }
768
+
769
+
770
+ /*
771
+ * Item value get/set functions - mitem_value(3X) man page
772
+ */
773
+ static VALUE rbncurs_c_set_item_value(VALUE rb_item, VALUE value)
774
+ {
775
+ ITEM *item = get_item(rb_item);
776
+ return INT2NUM(set_item_value(item, RTEST(value)));
777
+ }
778
+ static VALUE rbncurs_m_set_item_value(VALUE dummy, VALUE rb_item, VALUE value)
779
+ { return rbncurs_c_set_item_value(rb_item, value); }
780
+
781
+ static VALUE rbncurs_c_item_value(VALUE rb_item)
782
+ {
783
+ ITEM *item = get_item(rb_item);
784
+ return (item_value(item)) ? Qtrue: Qfalse;
785
+ }
786
+ static VALUE rbncurs_m_item_value(VALUE dummy, VALUE rb_item)
787
+ { return rbncurs_c_item_value(rb_item); }
788
+
789
+
790
+ /*
791
+ * Item visibility retrieval function - mitem_visible(3X) man page
792
+ */
793
+ static VALUE rbncurs_c_item_visible(VALUE rb_item)
794
+ {
795
+ ITEM *item = get_item(rb_item);
796
+ return (item_visible(item)) ? Qtrue: Qfalse;
797
+ }
798
+ static VALUE rbncurs_m_item_visible(VALUE dummy, VALUE rb_item)
799
+ { return rbncurs_c_item_visible(rb_item); }
800
+
801
+
802
+ /*
803
+ * Menu attribute get/set functions - menu_attributes(3X) man page
804
+ */
805
+ static VALUE rbncurs_c_set_menu_fore(VALUE rb_menu, VALUE attr)
806
+ {
807
+ MENU *menu = get_menu(rb_menu);
808
+ return INT2NUM(set_menu_fore(menu, NUM2ULONG(attr)));
809
+ }
810
+ static VALUE rbncurs_m_set_menu_fore(VALUE dummy, VALUE rb_menu, VALUE attr)
811
+ { return rbncurs_c_set_menu_fore(rb_menu, attr); }
812
+
813
+ static VALUE rbncurs_c_menu_fore(VALUE rb_menu)
814
+ {
815
+ MENU *menu = get_menu(rb_menu);
816
+ return ULONG2NUM(menu_fore(menu));
817
+ }
818
+ static VALUE rbncurs_m_menu_fore(VALUE dummy, VALUE rb_menu)
819
+ { return rbncurs_c_menu_fore(rb_menu); }
820
+
821
+ static VALUE rbncurs_c_set_menu_back(VALUE rb_menu, VALUE attr)
822
+ {
823
+ MENU *menu = get_menu(rb_menu);
824
+ return INT2NUM(set_menu_back(menu, NUM2ULONG(attr)));
825
+ }
826
+ static VALUE rbncurs_m_set_menu_back(VALUE dummy, VALUE rb_menu, VALUE attr)
827
+ { return rbncurs_c_set_menu_back(rb_menu, attr); }
828
+
829
+ static VALUE rbncurs_c_menu_back(VALUE rb_menu)
830
+ {
831
+ MENU *menu = get_menu(rb_menu);
832
+ return ULONG2NUM(menu_back(menu));
833
+ }
834
+ static VALUE rbncurs_m_menu_back(VALUE dummy, VALUE rb_menu)
835
+ { return rbncurs_c_menu_back(rb_menu); }
836
+
837
+ static VALUE rbncurs_c_set_menu_grey(VALUE rb_menu, VALUE attr)
838
+ {
839
+ MENU *menu = get_menu(rb_menu);
840
+ return INT2NUM(set_menu_grey(menu, NUM2ULONG(attr)));
841
+ }
842
+ static VALUE rbncurs_m_set_menu_grey(VALUE dummy, VALUE rb_menu, VALUE attr)
843
+ { return rbncurs_c_set_menu_grey(rb_menu, attr); }
844
+
845
+ static VALUE rbncurs_c_menu_grey(VALUE rb_menu)
846
+ {
847
+ MENU *menu = get_menu(rb_menu);
848
+ return ULONG2NUM(menu_grey(menu));
849
+ }
850
+ static VALUE rbncurs_m_menu_grey(VALUE dummy, VALUE rb_menu)
851
+ { return rbncurs_c_menu_grey(rb_menu); }
852
+
853
+ static VALUE rbncurs_c_set_menu_pad(VALUE rb_menu, VALUE pad)
854
+ {
855
+ MENU *menu = get_menu(rb_menu);
856
+ return INT2NUM(set_menu_pad(menu, NUM2INT(pad)));
857
+ }
858
+ static VALUE rbncurs_m_set_menu_pad(VALUE dummy, VALUE rb_menu, VALUE pad)
859
+ { return rbncurs_c_set_menu_pad(rb_menu, pad); }
860
+
861
+ static VALUE rbncurs_c_menu_pad(VALUE rb_menu)
862
+ {
863
+ MENU *menu = get_menu(rb_menu);
864
+ return INT2NUM(menu_pad(menu));
865
+ }
866
+ static VALUE rbncurs_m_menu_pad(VALUE dummy, VALUE rb_menu)
867
+ { return rbncurs_c_menu_pad(rb_menu); }
868
+
869
+
870
+ /*
871
+ * Menu format get/set functions - menu_format(3X) man page
872
+ */
873
+ static VALUE rbncurs_c_set_menu_format(VALUE rb_menu, VALUE rows, VALUE cols)
874
+ {
875
+ MENU *menu = get_menu(rb_menu);
876
+ return INT2NUM(set_menu_format(menu, NUM2INT(rows), NUM2INT(cols)));
877
+ }
878
+ static VALUE rbncurs_m_set_menu_format(VALUE dummy, VALUE rb_menu, VALUE rows, VALUE cols)
879
+ { return rbncurs_c_set_menu_format(rb_menu, rows, cols); }
880
+
881
+ static VALUE rbncurs_c_menu_format(VALUE rb_menu, VALUE rows, VALUE cols)
882
+ {
883
+ if (rb_obj_is_instance_of(rows, rb_cArray) != Qtrue ||
884
+ rb_obj_is_instance_of(cols, rb_cArray) != Qtrue)
885
+ {
886
+ rb_raise(rb_eArgError, "rows and cols arguments must be empty Arrays");
887
+ return Qnil;
888
+ }
889
+ else
890
+ {
891
+ MENU *menu = get_menu(rb_menu);
892
+ int vals[2] = {0,0};
893
+
894
+ menu_format(menu, &vals[0], &vals[1]);
895
+ rb_ary_push(rows, INT2NUM(vals[0]));
896
+ rb_ary_push(cols, INT2NUM(vals[1]));
897
+ return Qnil;
898
+ }
899
+ }
900
+ static VALUE rbncurs_m_menu_format(VALUE dummy, VALUE rb_menu, VALUE rows, VALUE cols)
901
+ { return rbncurs_c_menu_format(rb_menu, rows, cols); }
902
+
903
+
904
+ /*
905
+ * Menu mark get/set functions - menu_mark(3X) man page
906
+ */
907
+ static VALUE rbncurs_c_set_menu_mark(VALUE rb_menu, VALUE value)
908
+ {
909
+ MENU *menu = get_menu(rb_menu);
910
+ return INT2NUM(set_menu_mark(menu, STR2CSTR(value)));
911
+ }
912
+ static VALUE rbncurs_m_set_menu_mark(VALUE dummy, VALUE rb_field, VALUE value)
913
+ { return rbncurs_c_set_menu_mark(rb_field, value); }
914
+
915
+ static VALUE rbncurs_c_menu_mark(VALUE rb_menu)
916
+ {
917
+ MENU *menu = get_menu(rb_menu);
918
+ return rb_str_new2(menu_mark(menu));
919
+ }
920
+ static VALUE rbncurs_m_menu_mark(VALUE dummy, VALUE rb_menu)
921
+ { return rbncurs_c_menu_mark(rb_menu); }
922
+
923
+
924
+ /*
925
+ * Menu pattern get/set functions - menu_pattern(3X) man page
926
+ */
927
+ static VALUE rbncurs_c_set_menu_pattern(VALUE rb_menu, VALUE pattern)
928
+ {
929
+ MENU *menu = get_menu(rb_menu);
930
+ return INT2NUM(set_menu_pattern(menu, STR2CSTR(pattern)));
931
+ }
932
+ static VALUE rbncurs_m_set_menu_pattern(VALUE dummy, VALUE rb_menu, VALUE pattern)
933
+ { return rbncurs_c_set_menu_pattern(rb_menu, pattern); }
934
+
935
+ static VALUE rbncurs_c_menu_pattern(VALUE rb_menu)
936
+ {
937
+ MENU *menu = get_menu(rb_menu);
938
+ return rb_str_new2(menu_pattern(menu));
939
+ }
940
+ static VALUE rbncurs_m_menu_pattern(VALUE dummy, VALUE rb_menu)
941
+ { return rbncurs_c_menu_pattern(rb_menu); }
942
+
943
+
944
+ /*
945
+ * Menu spacing get/set functions - menu_spacing(3X) man page
946
+ */
947
+ static VALUE rbncurs_c_set_menu_spacing(VALUE rb_menu, VALUE spc_description,
948
+ VALUE spc_rows, VALUE spc_cols)
949
+ {
950
+ MENU *menu = get_menu(rb_menu);
951
+ return INT2NUM(set_menu_spacing(menu, NUM2INT(spc_description),
952
+ NUM2INT(spc_rows), NUM2INT(spc_cols)));
953
+ }
954
+ static VALUE rbncurs_m_set_menu_spacing(VALUE dummy, VALUE rb_menu, VALUE spc_description,
955
+ VALUE spc_rows, VALUE spc_cols)
956
+ { return rbncurs_c_set_menu_spacing(rb_menu, spc_description, spc_rows, spc_cols); }
957
+
958
+ static VALUE rbncurs_c_menu_spacing(VALUE rb_menu, VALUE spc_description,
959
+ VALUE spc_rows, VALUE spc_cols)
960
+ {
961
+ if (rb_obj_is_instance_of(spc_description, rb_cArray) != Qtrue ||
962
+ rb_obj_is_instance_of(spc_rows, rb_cArray) != Qtrue ||
963
+ rb_obj_is_instance_of(spc_cols, rb_cArray) != Qtrue)
964
+ {
965
+ rb_raise(rb_eArgError, "spc_description, spc_rows, and spc_cols arguments must be empty Arrays");
966
+ return Qnil;
967
+ }
968
+ else
969
+ {
970
+ MENU *menu = get_menu(rb_menu);
971
+ int vals[3] = {0,0,0};
972
+
973
+ int result = menu_spacing(menu, &vals[0], &vals[1], &vals[2]);
974
+ rb_ary_push(spc_description, INT2NUM(vals[0]));
975
+ rb_ary_push(spc_rows, INT2NUM(vals[1]));
976
+ rb_ary_push(spc_cols, INT2NUM(vals[2]));
977
+ return INT2NUM(result);
978
+ }
979
+ }
980
+ static VALUE rbncurs_m_menu_spacing(VALUE dummy, VALUE rb_menu, VALUE spc_description,
981
+ VALUE spc_rows, VALUE spc_cols)
982
+ { return rbncurs_c_menu_spacing(rb_menu, spc_description, spc_rows, spc_cols); }
983
+
984
+
985
+ /*
986
+ * Menu initialization function
987
+ */
988
+ void init_menu(void)
989
+ {
990
+ mMenu = rb_define_module_under(mNcurses, "Menu");
991
+
992
+ MENU_SNG_FUNC(current_item, 1);
993
+ MENU_SNG_FUNC(free_item, 1);
994
+ MENU_SNG_FUNC(free_menu, 1);
995
+ MENU_SNG_FUNC(item_count, 1);
996
+ MENU_SNG_FUNC(item_description, 1);
997
+ MENU_SNG_FUNC(item_index, 1);
998
+ MENU_SNG_FUNC(item_init, 1);
999
+ MENU_SNG_FUNC(item_name, 1);
1000
+ MENU_SNG_FUNC(item_opts, 1);
1001
+ MENU_SNG_FUNC(item_opts_off, 2);
1002
+ MENU_SNG_FUNC(item_opts_on, 2);
1003
+ MENU_SNG_FUNC(item_term, 1);
1004
+ /* MENU_SNG_FUNC(item_userptr, 1); */
1005
+ MENU_SNG_FUNC(item_value, 1);
1006
+ MENU_SNG_FUNC(item_visible, 1);
1007
+ MENU_SNG_FUNC(menu_back, 1);
1008
+ MENU_SNG_FUNC(menu_driver, 2);
1009
+ MENU_SNG_FUNC(menu_fore, 1);
1010
+ MENU_SNG_FUNC(menu_format, 3);
1011
+ MENU_SNG_FUNC(menu_grey, 1);
1012
+ MENU_SNG_FUNC(menu_init, 1);
1013
+ MENU_SNG_FUNC(menu_items, 1);
1014
+ MENU_SNG_FUNC(menu_mark, 1);
1015
+ MENU_SNG_FUNC(menu_opts, 1);
1016
+ MENU_SNG_FUNC(menu_opts_off, 2);
1017
+ MENU_SNG_FUNC(menu_opts_on, 2);
1018
+ MENU_SNG_FUNC(menu_pad, 1);
1019
+ MENU_SNG_FUNC(menu_pattern, 1);
1020
+ MENU_SNG_FUNC(menu_request_by_name, 1);
1021
+ MENU_SNG_FUNC(menu_request_name, 1);
1022
+ MENU_SNG_FUNC(menu_sub, 1);
1023
+ MENU_SNG_FUNC(menu_spacing, 4);
1024
+ MENU_SNG_FUNC(menu_term, 1);
1025
+ /* MENU_SNG_FUNC(menu_userptr, 1); */
1026
+ MENU_SNG_FUNC(menu_win, 1);
1027
+ MENU_SNG_FUNC(new_item, 2);
1028
+ MENU_SNG_FUNC(new_menu, 1);
1029
+ MENU_SNG_FUNC(pos_menu_cursor, 1);
1030
+ MENU_SNG_FUNC(post_menu, 1);
1031
+ MENU_SNG_FUNC(scale_menu, 3);
1032
+ MENU_SNG_FUNC(set_current_item, 2);
1033
+ MENU_SNG_FUNC(set_item_init, 2);
1034
+ MENU_SNG_FUNC(set_item_opts, 2);
1035
+ MENU_SNG_FUNC(set_item_term, 2);
1036
+ /* MENU_SNG_FUNC(set_item_userptr, 2); */
1037
+ MENU_SNG_FUNC(set_item_value, 2);
1038
+ MENU_SNG_FUNC(set_menu_back, 2);
1039
+ MENU_SNG_FUNC(set_menu_fore, 2);
1040
+ MENU_SNG_FUNC(set_menu_format, 3);
1041
+ MENU_SNG_FUNC(set_menu_grey, 2);
1042
+ MENU_SNG_FUNC(set_menu_init, 2);
1043
+ MENU_SNG_FUNC(set_menu_items, 2);
1044
+ MENU_SNG_FUNC(set_menu_mark, 2);
1045
+ MENU_SNG_FUNC(set_menu_opts, 2);
1046
+ MENU_SNG_FUNC(set_menu_pad, 2);
1047
+ MENU_SNG_FUNC(set_menu_pattern, 2);
1048
+ MENU_SNG_FUNC(set_menu_sub, 2);
1049
+ MENU_SNG_FUNC(set_menu_spacing, 4);
1050
+ MENU_SNG_FUNC(set_menu_term, 2);
1051
+ /* MENU_SNG_FUNC(set_menu_userptr, 2); */
1052
+ MENU_SNG_FUNC(set_menu_win, 2);
1053
+ MENU_SNG_FUNC(set_top_row, 2);
1054
+ MENU_SNG_FUNC(top_row, 1);
1055
+ MENU_SNG_FUNC(unpost_menu, 1);
1056
+
1057
+ init_menu_err_codes();
1058
+ init_menu_req_constants();
1059
+ init_menu_opts_constants();
1060
+ init_item_opts_constants();
1061
+
1062
+ /* Hashes to store registered blocks (Proc) */
1063
+ {
1064
+ VALUE hashes = rb_iv_set(mMenu, "@proc_hashes", rb_ary_new());
1065
+ int i;
1066
+
1067
+ for (i = 0; i < PROC_HASHES_COUNT; i++)
1068
+ rb_ary_push(hashes, rb_hash_new());
1069
+ }
1070
+
1071
+ /* Menus */
1072
+ rb_iv_set(mMenu, "@menus_hash", rb_hash_new());
1073
+ cMENU = rb_define_class_under(mMenu, "MENU", rb_cObject);
1074
+ rb_define_singleton_method(cMENU, "new", (&rbncurs_m_new_menu), 1);
1075
+
1076
+ RB_CLASS_METH(cMENU, NULL, current_item, 0);
1077
+ RB_CLASS_METH(cMENU, "free", free_menu, 0);
1078
+ RB_CLASS_METH(cMENU, NULL, item_count, 0);
1079
+ RB_CLASS_METH(cMENU, NULL, item_init, 0);
1080
+ RB_CLASS_METH(cMENU, NULL, item_term, 0);
1081
+ RB_CLASS_METH(cMENU, "back", menu_back, 0);
1082
+ RB_CLASS_METH(cMENU, "driver", menu_driver, 1);
1083
+ RB_CLASS_METH(cMENU, "fore", menu_fore, 0);
1084
+ RB_CLASS_METH(cMENU, "format", menu_format, 2);
1085
+ RB_CLASS_METH(cMENU, "grey", menu_grey, 0);
1086
+ RB_CLASS_METH(cMENU, "init", menu_init, 0);
1087
+ RB_CLASS_METH(cMENU, "items", menu_items, 0);
1088
+ RB_CLASS_METH(cMENU, "mark", menu_mark, 0);
1089
+ RB_CLASS_METH(cMENU, "opts", menu_opts, 0);
1090
+ RB_CLASS_METH(cMENU, "opts_off", menu_opts_off, 1);
1091
+ RB_CLASS_METH(cMENU, "opts_on", menu_opts_on, 1);
1092
+ RB_CLASS_METH(cMENU, "pad", menu_pad, 0);
1093
+ RB_CLASS_METH(cMENU, "pattern", menu_pattern, 0);
1094
+ RB_CLASS_METH(cMENU, "sub", menu_sub, 0);
1095
+ RB_CLASS_METH(cMENU, "spacing", menu_spacing, 3);
1096
+ RB_CLASS_METH(cMENU, "term", menu_term, 0);
1097
+ /* RB_CLASS_METH(cMENU, "userptr", menu_userptr, 0); */
1098
+ RB_CLASS_METH(cMENU, "win", menu_win, 0);
1099
+ RB_CLASS_METH(cMENU, "pos_cursor", pos_menu_cursor, 0);
1100
+ RB_CLASS_METH(cMENU, "post", post_menu, 0);
1101
+ RB_CLASS_METH(cMENU, "scale", scale_menu, 2);
1102
+ RB_CLASS_METH(cMENU, "current_item=", set_current_item, 1);
1103
+ RB_CLASS_METH(cMENU, "item_init=", set_item_init, 1);
1104
+ RB_CLASS_METH(cMENU, "item_term=", set_item_term, 1);
1105
+ RB_CLASS_METH(cMENU, "back=", set_menu_back, 1);
1106
+ RB_CLASS_METH(cMENU, "fore=", set_menu_fore, 1);
1107
+ RB_CLASS_METH(cMENU, "set_format", set_menu_format, 2);
1108
+ RB_CLASS_METH(cMENU, "grey=", set_menu_grey, 1);
1109
+ RB_CLASS_METH(cMENU, "init=", set_menu_init, 1);
1110
+ RB_CLASS_METH(cMENU, "items=", set_menu_items, 1);
1111
+ RB_CLASS_METH(cMENU, "mark=", set_menu_mark, 1);
1112
+ RB_CLASS_METH(cMENU, "opts=", set_menu_opts, 1);
1113
+ RB_CLASS_METH(cMENU, "pad=", set_menu_pad, 1);
1114
+ RB_CLASS_METH(cMENU, "pattern=", set_menu_pattern, 1);
1115
+ RB_CLASS_METH(cMENU, "sub=", set_menu_sub, 1);
1116
+ RB_CLASS_METH(cMENU, "set_spacing", set_menu_spacing, 3);
1117
+ RB_CLASS_METH(cMENU, "term=", set_menu_term, 1);
1118
+ /* RB_CLASS_METH(cMENU, "userptr=", set_menu_userptr, 1); */
1119
+ RB_CLASS_METH(cMENU, "win=", set_menu_win, 1);
1120
+ RB_CLASS_METH(cMENU, "top_row=", set_top_row, 1);
1121
+ RB_CLASS_METH(cMENU, NULL, top_row, 0);
1122
+ RB_CLASS_METH(cMENU, "unpost", unpost_menu, 0);
1123
+
1124
+ /* Items */
1125
+ rb_iv_set(mMenu, "@items_hash", rb_hash_new());
1126
+ cITEM = rb_define_class_under(mMenu, "ITEM", rb_cObject);
1127
+ rb_define_singleton_method(cITEM, "new", (&rbncurs_m_new_item), 2);
1128
+
1129
+ RB_CLASS_METH(cITEM, "free", free_item, 0);
1130
+ RB_CLASS_METH(cITEM, "description", item_description, 0);
1131
+ RB_CLASS_METH(cITEM, "index", item_index, 0);
1132
+ RB_CLASS_METH(cITEM, "name", item_name, 0);
1133
+ RB_CLASS_METH(cITEM, "opts", item_opts, 0);
1134
+ RB_CLASS_METH(cITEM, "opts_off", item_opts_off, 1);
1135
+ RB_CLASS_METH(cITEM, "opts_on", item_opts_on, 1);
1136
+ /* RB_CLASS_METH(cITEM, "userptr", item_userptr, 0); */
1137
+ RB_CLASS_METH(cITEM, "value", item_value, 0);
1138
+ RB_CLASS_METH(cITEM, "visible?", item_visible, 0);
1139
+ RB_CLASS_METH(cITEM, "opts=", set_item_opts, 1);
1140
+ /* RB_CLASS_METH(cITEM, "userptr=", set_item_userptr, 1); */
1141
+ RB_CLASS_METH(cITEM, "value=", set_item_value, 1);
1142
+ }
1143
+
1144
+ #endif