X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_getch.c;h=773ed15763800434decaece70e8414d6bea59049;hp=cdc965fec5e0b4518e9a477ebd0094c86c51c2c0;hb=41677b308e138027b7e435f741ee7fe5651237b0;hpb=bbb7fd37298f7d81386a4cf868417b9e084d7d90 diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c index cdc965fe..773ed157 100644 --- a/ncurses/base/lib_getch.c +++ b/ncurses/base/lib_getch.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -42,7 +42,7 @@ #include -MODULE_ID("$Id: lib_getch.c,v 1.107 2009/08/15 20:41:24 Clemens.Ladisch Exp $") +MODULE_ID("$Id: lib_getch.c,v 1.118 2010/05/15 21:31:12 tom Exp $") #include @@ -124,12 +124,6 @@ _nc_use_meta(WINDOW *win) return (sp ? sp->_use_meta : 0); } -#ifdef NCURSES_WGETCH_EVENTS -#define TWAIT_MASK (TW_ANY | TW_EVENT) -#else -#define TWAIT_MASK TW_ANY -#endif - /* * Check for mouse activity, returning nonzero if we find any. */ @@ -138,31 +132,29 @@ check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl)) { int rc; +#ifdef USE_TERM_DRIVER + rc = TCBOf(sp)->drv->testmouse(TCBOf(sp), delay); +#else #if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail)) { - return TW_MOUSE; - } -#endif -#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)); + rc = TW_MOUSE; + } else #endif + { + rc = _nc_timed_wait(sp, + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); #if USE_SYSMOUSE - if ((sp->_mouse_type == M_SYSMOUSE) - && (sp->_sysmouse_head < sp->_sysmouse_tail) - && (rc == 0) - && (errno == EINTR)) { - rc |= TW_MOUSE; + if ((sp->_mouse_type == M_SYSMOUSE) + && (sp->_sysmouse_head < sp->_sysmouse_tail) + && (rc == 0) + && (errno == EINTR)) { + rc |= TW_MOUSE; + } +#endif } #endif return rc; @@ -256,6 +248,14 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) ch = KEY_MOUSE; n = 1; } else +#endif +#ifdef USE_TERM_DRIVER + if ((sp->_mouse_type == M_TERM_DRIVER) + && (sp->_drv_mouse_head < sp->_drv_mouse_tail)) { + sp->_mouse_event(sp); + ch = KEY_MOUSE; + n = 1; + } else #endif { /* Can block... */ #ifdef USE_TERM_DRIVER @@ -264,7 +264,14 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) ch = buf; #else unsigned char c2 = 0; +# if USE_PTHREADS_EINTR + if ((pthread_self) && (pthread_kill) && (pthread_equal)) + _nc_globals.read_thread = pthread_self(); +# endif n = read(sp->_ifd, &c2, 1); +#if USE_PTHREADS_EINTR + _nc_globals.read_thread = 0; +#endif ch = c2; #endif } @@ -279,7 +286,11 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) * We don't want this difference to show. This piece of code * tries to make it look like we always have restarting signals. */ - if (n <= 0 && errno == EINTR) + if (n <= 0 && errno == EINTR +# if USE_PTHREADS_EINTR + && (_nc_globals.have_sigwinch == 0) +# endif + ) goto again; #endif @@ -376,11 +387,12 @@ _nc_wgetch(WINDOW *win, { SCREEN *sp; int ch; + int rc = 0; #ifdef NCURSES_WGETCH_EVENTS long event_delay = -1; #endif - T((T_CALLED("_nc_wgetch(%p)"), win)); + T((T_CALLED("_nc_wgetch(%p)"), (void *) win)); *result = 0; @@ -411,17 +423,18 @@ _nc_wgetch(WINDOW *win, !sp->_cbreak && !sp->_called_wgetch) { char buf[MAXCOLUMNS], *bufp; - int rc; TR(TRACE_IEVENT, ("filling queue in cooked mode")); - rc = recur_wgetnstr(win, buf); - /* ungetch in reverse order */ #ifdef NCURSES_WGETCH_EVENTS + rc = recur_wgetnstr(win, buf); if (rc != KEY_EVENT) -#endif safe_ungetch(sp, '\n'); +#else + (void) recur_wgetnstr(win, buf); + safe_ungetch(sp, '\n'); +#endif for (bufp = buf + strlen(buf); bufp > buf; bufp--) safe_ungetch(sp, bufp[-1]); @@ -443,7 +456,6 @@ _nc_wgetch(WINDOW *win, if (win->_notimeout || (win->_delay >= 0) || (sp->_cbreak > 1)) { if (head == -1) { /* fifo is empty */ int delay; - int rc; TR(TRACE_IEVENT, ("timed delay in wgetch()")); if (sp->_cbreak > 1) @@ -486,7 +498,6 @@ _nc_wgetch(WINDOW *win, * increase the wait with mouseinterval(). */ int runcount = 0; - int rc = 0; do { ch = kgetch(sp EVENTLIST_2nd(evl)); @@ -536,6 +547,12 @@ _nc_wgetch(WINDOW *win, /* 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); } } @@ -612,7 +629,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) @@ -686,7 +703,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"));