From: Ville Aine Date: 2003-11-19T09:15:03+09:00 Subject: [patch] Small additions to Curses extension --AhhlLboLdkugWU4S Content-Type: text/plain; charset=us-ascii Content-Disposition: inline The attached patch adds bindings for these functions to Curses: - def_prog_mode() as Curses.def_prog_mode - reset_prog_mode() as Curses.reset_prog_mode - timeout() as Curses.timeout= - wtimeout() as Window#timeout= - nodelay() as Window#nodelay= All of these functions are specified in the XSI Curses standard, Issue 4. The standard also specifies other possibly useful functions that aren't included in the Curses extension. I'd be very interested in knowing why they haven't been included? For the sake of simplicity? Portability? -- Ville Aine / "if.iknisleh.sc@eniav".reverse --AhhlLboLdkugWU4S Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="ruby_curses.patch" Index: curses.c =================================================================== RCS file: /src/ruby/ext/curses/curses.c,v retrieving revision 1.21 diff -u -r1.21 curses.c --- curses.c 18 Aug 2003 16:24:42 -0000 1.21 +++ curses.c 18 Nov 2003 23:43:15 -0000 @@ -679,6 +679,31 @@ #undef define_curs_mouse_member #endif /* USE_MOUSE */ +#ifdef HAVE_TIMEOUT +static VALUE +curses_timeout(VALUE obj, VALUE delay) +{ + timeout(NUM2INT(delay)); + return Qnil; +} +#endif + +#ifdef HAVE_DEF_PROG_MODE +static VALUE +curses_def_prog_mode(VALUE obj) +{ + return def_prog_mode() == OK ? Qtrue : Qfalse; +} +#endif + +#ifdef HAVE_RESET_PROG_MODE +static VALUE +curses_reset_prog_mode(VALUE obj) +{ + return reset_prog_mode() == OK ? Qtrue : Qfalse; +} +#endif + /*-------------------------- class Window --------------------------*/ /* def self.allocate */ @@ -1251,6 +1276,30 @@ } #endif /* HAVE_KEYPAD */ +#ifdef HAVE_NODELAY +static VALUE +window_nodelay(VALUE obj, VALUE val) +{ + struct windata *winp; + GetWINDOW(obj,winp); + + return nodelay(winp->window,RTEST(val) ? TRUE : FALSE) == OK ? + Qtrue : Qfalse; +} +#endif + +#ifdef HAVE_WTIMEOUT +static VALUE +window_timeout(VALUE obj, VALUE delay) +{ + struct windata *winp; + GetWINDOW(obj,winp); + + wtimeout(winp->window,NUM2INT(delay)); + return Qnil; +} +#endif + /*------------------------- Initialization -------------------------*/ void Init_curses() @@ -1332,6 +1381,15 @@ rb_define_module_function(mCurses, "mouseinterval", curses_mouseinterval, 1); rb_define_module_function(mCurses, "mousemask", curses_mousemask, 1); #endif /* USE_MOUSE */ +#ifdef HAVE_TIMEOUT + rb_define_module_function(mCurses, "timeout=", curses_timeout, 1); +#endif +#ifdef HAVE_DEF_PROG_MODE + rb_define_module_function(mCurses, "def_prog_mode", curses_def_prog_mode, 0); +#endif +#ifdef HAVE_RESET_PROG_MODE + rb_define_module_function(mCurses, "reset_prog_mode", curses_reset_prog_mode, 0); +#endif cWindow = rb_define_class_under(mCurses, "Window", rb_cData); rb_define_alloc_func(cWindow, window_s_allocate); @@ -1379,6 +1437,12 @@ rb_define_method(cWindow, "bkgd", window_bkgd, 1); rb_define_method(cWindow, "getbkgd", window_getbkgd, 0); #endif /* USE_COLOR */ +#ifdef HAVE_NODELAY + rb_define_method(cWindow, "nodelay=", window_nodelay, 1); +#endif +#ifdef HAVE_WTIMEOUT + rb_define_method(cWindow, "timeout=", window_timeout, 1); +#endif #define rb_curses_define_const(c) rb_define_const(mCurses,#c,UINT2NUM(c)) Index: extconf.rb =================================================================== RCS file: /src/ruby/ext/curses/extconf.rb,v retrieving revision 1.15 diff -u -r1.15 extconf.rb --- extconf.rb 18 Aug 2003 16:24:42 -0000 1.15 +++ extconf.rb 18 Nov 2003 23:43:15 -0000 @@ -19,7 +19,7 @@ end if make - for f in %w(isendwin ungetch beep getnstr wgetnstr doupdate flash deleteln wdeleteln keypad keyname init_color wresize resizeterm) + for f in %w(isendwin ungetch beep getnstr wgetnstr doupdate flash deleteln wdeleteln keypad keyname init_color wresize resizeterm nodelay timeout wtimeout def_prog_mode reset_prog_mode) have_func(f) end flag = "-D_XOPEN_SOURCE_EXTENDED" --AhhlLboLdkugWU4S--