X-Git-Url: http://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Fbase%2Flib_getch.c;h=f6520c068edc2dff613007b05723c373954a13cb;hb=3a0d9d27e0cf115ff9dcc6163c251bccaa62bd7d;hp=e228355a019ea38a9bd1aaac92a471a0698ff4f9;hpb=26522e4669dbf45cba32138b5d81c6c292e88e60;p=ncurses.git diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c index e228355a..f6520c06 100644 --- a/ncurses/base/lib_getch.c +++ b/ncurses/base/lib_getch.c @@ -42,26 +42,26 @@ #include -MODULE_ID("$Id: lib_getch.c,v 1.103 2009/05/30 15:50:47 tom Exp $") +MODULE_ID("$Id: lib_getch.c,v 1.109 2009/10/24 21:58:34 tom Exp $") #include #if USE_REENTRANT -#define GetEscdelay(sp) (sp)->_ESCDELAY +#define GetEscdelay(sp) *_nc_ptr_Escdelay(sp) +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(ESCDELAY) (void) +{ + return *(_nc_ptr_Escdelay(CURRENT_SCREEN)); +} + NCURSES_EXPORT(int *) _nc_ptr_Escdelay(SCREEN *sp) { return ptrEscdelay(sp); } -NCURSES_EXPORT(int) -NCURSES_PUBLIC_VAR(ESCDELAY) (void) -{ - return *_nc_ptr_Escdelay(CURRENT_SCREEN); -} #else #define GetEscdelay(sp) ESCDELAY -NCURSES_EXPORT_VAR (int) - ESCDELAY = 1000; /* max interval betw. chars in funkeys, in millisecs */ +NCURSES_EXPORT_VAR(int) ESCDELAY = 1000; #endif #if NCURSES_EXT_FUNCS @@ -71,7 +71,7 @@ NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value) int code = OK; #if USE_REENTRANT if (SP_PARM) { - SP_PARM->_ESCDELAY = value; + SET_ESCDELAY(value); } else { code = ERR; } @@ -86,7 +86,33 @@ NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value) NCURSES_EXPORT(int) set_escdelay(int value) { - return NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value); + int code; +#if USE_REENTRANT + code = NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value); +#else + ESCDELAY = value; + code = OK; +#endif + return code; +} +#endif +#endif /* NCURSES_EXT_FUNCS */ + +#if NCURSES_EXT_FUNCS +NCURSES_EXPORT(int) +NCURSES_SP_NAME(get_escdelay) (NCURSES_SP_DCL0) +{ +#if !USE_REENTRANT + (void) SP_PARM; +#endif + return GetEscdelay(SP_PARM); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +get_escdelay(void) +{ + return NCURSES_SP_NAME(get_escdelay) (CURRENT_SCREEN); } #endif #endif /* NCURSES_EXT_FUNCS */ @@ -115,10 +141,22 @@ check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl)) #if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail)) { - return 2; + return TW_MOUSE; } #endif - rc = _nc_timed_wait(sp, TWAIT_MASK, delay, (int *) 0 EVENTLIST_2nd(evl)); +#ifdef USE_TERM_DRIVER + rc = TCBOf(sp)->drv->twait(TCBOf(sp), + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); +#else + rc = _nc_timed_wait(sp, + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); +#endif #if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail) @@ -220,9 +258,15 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) } else #endif { /* Can block... */ +#ifdef USE_TERM_DRIVER + int buf; + n = CallDriver_1(sp, read, &buf); + ch = buf; +#else unsigned char c2 = 0; n = read(sp->_ifd, &c2, 1); ch = c2; +#endif } #ifdef HIDE_EINTR @@ -336,7 +380,7 @@ _nc_wgetch(WINDOW *win, long event_delay = -1; #endif - T((T_CALLED("_nc_wgetch(%p)"), win)); + T((T_CALLED("_nc_wgetch(%p)"), (void *) win)); *result = 0; @@ -423,7 +467,7 @@ _nc_wgetch(WINDOW *win, } #endif if (!rc) { - returnCode(ERR); + goto check_sigwinch; } } /* else go on to read data available */ @@ -485,12 +529,19 @@ _nc_wgetch(WINDOW *win, } if (ch == ERR) { + check_sigwinch: #if USE_SIZECHANGE if (_nc_handle_sigwinch(sp)) { _nc_update_screensize(sp); /* resizeterm can push KEY_RESIZE */ if (cooked_key_in_fifo()) { *result = fifo_pull(sp); + /* + * Get the ERR from queue -- it is from WINCH, + * so we should take it out, the "error" is handled. + */ + if (fifo_peek(sp) == -1) + fifo_pull(sp); returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK); } } @@ -567,7 +618,7 @@ wgetch(WINDOW *win) int code; unsigned long value; - T((T_CALLED("wgetch(%p)"), win)); + T((T_CALLED("wgetch(%p)"), (void *) win)); code = _nc_wgetch(win, &value, _nc_use_meta(win) @@ -641,7 +692,7 @@ kgetch(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) break; } TR(TRACE_IEVENT, ("ptr=%p, ch=%d, value=%d", - ptr, ptr->ch, ptr->value)); + (void *) ptr, ptr->ch, ptr->value)); if (ptr->value != 0) { /* sequence terminated */ TR(TRACE_IEVENT, ("end of sequence"));