X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_getch.c;h=ccfcc33656df68410e60deb7775c90738ebdadef;hp=22173242852452310b403dc4166abfb5e69e4766;hb=5b7f4de105080e2a715b0564ede4bb7eb6767659;hpb=78e49873c69dc0494bb34c62f897f8b446584a33;ds=sidebyside diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c index 22173242..ccfcc336 100644 --- a/ncurses/base/lib_getch.c +++ b/ncurses/base/lib_getch.c @@ -42,16 +42,21 @@ #include -MODULE_ID("$Id: lib_getch.c,v 1.100 2009/02/15 00:36:00 tom Exp $") +MODULE_ID("$Id: lib_getch.c,v 1.104 2009/07/04 20:41:13 tom Exp $") #include #if USE_REENTRANT -#define GetEscdelay(sp) (sp)->_ESCDELAY +#define GetEscdelay(sp) *_nc_ptr_Escdelay(sp) +NCURSES_EXPORT(int *) +_nc_ptr_Escdelay(SCREEN *sp) +{ + return ptrEscdelay(sp); +} NCURSES_EXPORT(int) NCURSES_PUBLIC_VAR(ESCDELAY) (void) { - return SP ? GetEscdelay(SP) : 1000; + return *(_nc_ptr_Escdelay(CURRENT_SCREEN)); } #else #define GetEscdelay(sp) ESCDELAY @@ -66,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; } @@ -81,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 */ @@ -94,9 +125,9 @@ _nc_use_meta(WINDOW *win) } #ifdef NCURSES_WGETCH_EVENTS -#define TWAIT_MASK 7 +#define TWAIT_MASK (TW_ANY | TW_EVENT) #else -#define TWAIT_MASK 3 +#define TWAIT_MASK TW_ANY #endif /* @@ -110,16 +141,28 @@ 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) && (rc == 0) && (errno == EINTR)) { - rc |= 2; + rc |= TW_MOUSE; } #endif return rc; @@ -183,9 +226,9 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) } else mask = 0; - if (mask & 4) { + if (mask & TW_EVENT) { T(("fifo_push: ungetch KEY_EVENT")); - _nc_ungetch(sp, KEY_EVENT); + safe_ungetch(sp, KEY_EVENT); return KEY_EVENT; } #elif USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE @@ -195,7 +238,7 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) #endif #if USE_GPM_SUPPORT || USE_EMX_MOUSE - if ((sp->_mouse_fd >= 0) && (mask & 2)) { + if ((sp->_mouse_fd >= 0) && (mask & TW_MOUSE)) { sp->_mouse_event(sp); ch = KEY_MOUSE; n = 1; @@ -215,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 @@ -270,12 +319,12 @@ recur_wrefresh(WINDOW *win) { #ifdef USE_PTHREADS SCREEN *sp = _nc_screen_of(win); - if (_nc_use_pthreads && sp != SP) { + if (_nc_use_pthreads && sp != CURRENT_SCREEN) { SCREEN *save_SP; /* temporarily switch to the window's screen to check/refresh */ _nc_lock_global(curses); - save_SP = SP; + save_SP = CURRENT_SCREEN; _nc_set_screen(sp); recur_wrefresh(win); _nc_set_screen(save_SP); @@ -296,12 +345,12 @@ recur_wgetnstr(WINDOW *win, char *buf) if (sp != 0) { #ifdef USE_PTHREADS - if (_nc_use_pthreads && sp != SP) { + if (_nc_use_pthreads && sp != CURRENT_SCREEN) { SCREEN *save_SP; /* temporarily switch to the window's screen to get cooked input */ _nc_lock_global(curses); - save_SP = SP; + save_SP = CURRENT_SCREEN; _nc_set_screen(sp); rc = recur_wgetnstr(win, buf); _nc_set_screen(save_SP); @@ -372,9 +421,9 @@ _nc_wgetch(WINDOW *win, #ifdef NCURSES_WGETCH_EVENTS if (rc != KEY_EVENT) #endif - _nc_ungetch(sp, '\n'); + safe_ungetch(sp, '\n'); for (bufp = buf + strlen(buf); bufp > buf; bufp--) - _nc_ungetch(sp, bufp[-1]); + safe_ungetch(sp, bufp[-1]); #ifdef NCURSES_WGETCH_EVENTS /* Return it first */ @@ -412,7 +461,7 @@ _nc_wgetch(WINDOW *win, rc = check_mouse_activity(sp, delay EVENTLIST_2nd(evl)); #ifdef NCURSES_WGETCH_EVENTS - if (rc & 4) { + if (rc & TW_EVENT) { *result = KEY_EVENT; returnCode(KEY_CODE_YES); } @@ -437,7 +486,7 @@ _nc_wgetch(WINDOW *win, * increase the wait with mouseinterval(). */ int runcount = 0; - int rc; + int rc = 0; do { ch = kgetch(sp EVENTLIST_2nd(evl)); @@ -452,11 +501,11 @@ _nc_wgetch(WINDOW *win, (ch == KEY_MOUSE && (((rc = check_mouse_activity(sp, sp->_maxclick EVENTLIST_2nd(evl))) != 0 - && !(rc & 4)) + && !(rc & TW_EVENT)) || !sp->_mouse_parse(sp, runcount))); #ifdef NCURSES_WGETCH_EVENTS - if ((rc & 4) && !ch == KEY_EVENT) { - _nc_ungetch(sp, ch); + if ((rc & TW_EVENT) && !(ch == KEY_EVENT)) { + safe_ungetch(sp, ch); ch = KEY_EVENT; } #endif @@ -464,12 +513,12 @@ _nc_wgetch(WINDOW *win, #ifdef NCURSES_WGETCH_EVENTS /* mouse event sequence ended by an event, report event */ if (ch == KEY_EVENT) { - _nc_ungetch(sp, KEY_MOUSE); /* FIXME This interrupts a gesture... */ + safe_ungetch(sp, KEY_MOUSE); /* FIXME This interrupts a gesture... */ } else #endif { /* mouse event sequence ended by keystroke, store keystroke */ - _nc_ungetch(sp, ch); + safe_ungetch(sp, ch); ch = KEY_MOUSE; } } @@ -655,7 +704,7 @@ kgetch(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) TR(TRACE_IEVENT, ("waiting for rest of sequence")); rc = check_mouse_activity(sp, timeleft EVENTLIST_2nd(evl)); #ifdef NCURSES_WGETCH_EVENTS - if (rc & 4) { + if (rc & TW_EVENT) { TR(TRACE_IEVENT, ("interrupted by a user event")); /* FIXME Should have preserved remainder timeleft for reuse... */ peek = head; /* Restart interpreting later */