X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_getch.c;h=d8906daec63b7de903b3b82465e1c40a69bd813f;hp=757703d8afeaebb756eda4f400257651e307c170;hb=7a27c7d49c2e8b4a1ecbe85b4423d647cbc75ea5;hpb=46722468f47c2b77b3987729b4bcf2321cccfd01 diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c index 757703d8..d8906dae 100644 --- a/ncurses/base/lib_getch.c +++ b/ncurses/base/lib_getch.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2001,2002 Free Software Foundation, Inc. * + * Copyright (c) 1998-2006,2007 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 * @@ -29,6 +29,7 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim 1992,1995 * * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * ****************************************************************************/ /* @@ -40,12 +41,20 @@ #include -MODULE_ID("$Id: lib_getch.c,v 1.67 2002/09/07 17:17:59 tom Exp $") +MODULE_ID("$Id: lib_getch.c,v 1.79 2007/04/19 20:57:49 tom Exp $") #include +#if USE_REENTRANT +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(ESCDELAY) (void) +{ + return SP ? SP->_ESCDELAY : 1000; +} +#else NCURSES_EXPORT_VAR(int) ESCDELAY = 1000; /* max interval betw. chars in funkeys, in millisecs */ +#endif #ifdef NCURSES_WGETCH_EVENTS #define TWAIT_MASK 7 @@ -53,7 +62,33 @@ ESCDELAY = 1000; /* max interval betw. chars in funkeys, in millisecs */ #define TWAIT_MASK 3 #endif -static inline int +/* + * Check for mouse activity, returning nonzero if we find any. + */ +static int +check_mouse_activity(int delay EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int rc; + +#if USE_SYSMOUSE + if ((SP->_mouse_type == M_SYSMOUSE) + && (SP->_sysmouse_head < SP->_sysmouse_tail)) { + return 2; + } +#endif + rc = _nc_timed_wait(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 |= 2; + } +#endif + return rc; +} + +static NCURSES_INLINE int fifo_peek(void) { int ch = SP->_fifo[peek]; @@ -63,7 +98,7 @@ fifo_peek(void) return ch; } -static inline int +static NCURSES_INLINE int fifo_pull(void) { int ch; @@ -83,12 +118,12 @@ fifo_pull(void) return ch; } -static inline int +static NCURSES_INLINE int fifo_push(EVENTLIST_0th(_nc_eventlist * evl)) { int n; int ch = 0; - int mask; + int mask = 0; (void) mask; if (tail == -1) @@ -101,11 +136,11 @@ fifo_push(EVENTLIST_0th(_nc_eventlist * evl)) #ifdef NCURSES_WGETCH_EVENTS if (evl -#if USE_GPM_SUPPORT || defined(USE_EMX_MOUSE) +#if USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE || (SP->_mouse_fd >= 0) #endif ) { - mask = _nc_timed_wait(TWAIT_MASK, -1, (int *) 0, evl); + mask = check_mouse_activity(-1 EVENTLIST_2nd(evl)); } else mask = 0; @@ -114,17 +149,31 @@ fifo_push(EVENTLIST_0th(_nc_eventlist * evl)) ungetch(KEY_EVENT); return KEY_EVENT; } -#elif USE_GPM_SUPPORT || defined(USE_EMX_MOUSE) - if (SP->_mouse_fd >= 0) - mask = _nc_timed_wait(TWAIT_MASK, -1, (int *) 0 EVENTLIST_2nd(evl)); +#elif USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE + if (SP->_mouse_fd >= 0) { + mask = check_mouse_activity(-1 EVENTLIST_2nd(evl)); + } #endif -#if USE_GPM_SUPPORT || defined(USE_EMX_MOUSE) +#if USE_GPM_SUPPORT || USE_EMX_MOUSE if ((SP->_mouse_fd >= 0) && (mask & 2)) { SP->_mouse_event(SP); ch = KEY_MOUSE; n = 1; } else +#endif +#if USE_SYSMOUSE + if ((SP->_mouse_type == M_SYSMOUSE) + && (SP->_sysmouse_head < SP->_sysmouse_tail)) { + SP->_mouse_event(SP); + ch = KEY_MOUSE; + n = 1; + } else if ((SP->_mouse_type == M_SYSMOUSE) + && (mask <= 0) && errno == EINTR) { + SP->_mouse_event(SP); + ch = KEY_MOUSE; + n = 1; + } else #endif { /* Can block... */ unsigned char c2 = 0; @@ -165,7 +214,7 @@ fifo_push(EVENTLIST_0th(_nc_eventlist * evl)) return ch; } -static inline void +static NCURSES_INLINE void fifo_clear(void) { memset(SP->_fifo, 0, sizeof(SP->_fifo)); @@ -193,15 +242,16 @@ _nc_wgetch(WINDOW *win, T((T_CALLED("_nc_wgetch(%p)"), win)); *result = 0; - if (!win) + if (win == 0 || SP == 0) { returnCode(ERR); + } if (cooked_key_in_fifo()) { if (wgetch_should_refresh(win)) wrefresh(win); *result = fifo_pull(); - returnCode(OK); + returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK); } #ifdef NCURSES_WGETCH_EVENTS if (evl && (evl->count == 0)) @@ -214,13 +264,19 @@ _nc_wgetch(WINDOW *win, * stuff its contents in the FIFO queue, and pop off * the first character to return it. */ - if (head == -1 && !SP->_raw && !SP->_cbreak) { + if (head == -1 && + !SP->_notty && + !SP->_raw && + !SP->_cbreak && + !SP->_called_wgetch) { char buf[MAXCOLUMNS], *sp; int rc; TR(TRACE_IEVENT, ("filling queue in cooked mode")); + SP->_called_wgetch = TRUE; rc = wgetnstr(win, buf, MAXCOLUMNS); + SP->_called_wgetch = FALSE; /* ungetch in reverse order */ #ifdef NCURSES_WGETCH_EVENTS @@ -234,12 +290,10 @@ _nc_wgetch(WINDOW *win, /* Return it first */ if (rc == KEY_EVENT) { *result = rc; - returnCode(OK); - } + } else #endif - - *result = fifo_pull(); - returnCode(OK); + *result = fifo_pull(); + returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK); } if (win->_use_keypad != SP->_keypad_on) @@ -249,31 +303,29 @@ _nc_wgetch(WINDOW *win, wrefresh(win); if (!win->_notimeout && (win->_delay >= 0 || SP->_cbreak > 1)) { - int delay; + if (head == -1) { /* fifo is empty */ + int delay; + int rc; - TR(TRACE_IEVENT, ("timed delay in wgetch()")); - if (SP->_cbreak > 1) - delay = (SP->_cbreak - 1) * 100; - else - delay = win->_delay; + TR(TRACE_IEVENT, ("timed delay in wgetch()")); + if (SP->_cbreak > 1) + delay = (SP->_cbreak - 1) * 100; + else + delay = win->_delay; #ifdef NCURSES_WGETCH_EVENTS - if (event_delay >= 0 && delay > event_delay) - delay = event_delay; + if (event_delay >= 0 && delay > event_delay) + delay = event_delay; #endif - TR(TRACE_IEVENT, ("delay is %d milliseconds", delay)); + TR(TRACE_IEVENT, ("delay is %d milliseconds", delay)); - if (head == -1) { /* fifo is empty */ - int rc = _nc_timed_wait(TWAIT_MASK, - delay, - (int *) 0 - EVENTLIST_2nd(evl)); + rc = check_mouse_activity(delay EVENTLIST_2nd(evl)); #ifdef NCURSES_WGETCH_EVENTS if (rc & 4) { *result = KEY_EVENT; - returnCode(OK); + returnCode(KEY_CODE_YES); } #endif if (!rc) @@ -308,10 +360,8 @@ _nc_wgetch(WINDOW *win, break; } while (ch == KEY_MOUSE - && (((rc = _nc_timed_wait(TWAIT_MASK, - SP->_maxclick, - (int *) 0 - EVENTLIST_2nd(evl))) != 0 + && (((rc = check_mouse_activity(SP->_maxclick + EVENTLIST_2nd(evl))) != 0 && !(rc & 4)) || !SP->_mouse_parse(runcount))); #ifdef NCURSES_WGETCH_EVENTS @@ -341,7 +391,7 @@ _nc_wgetch(WINDOW *win, if (ch == ERR) { #if USE_SIZECHANGE - if (SP->_sig_winch) { + if (_nc_handle_sigwinch(FALSE)) { _nc_update_screensize(); /* resizeterm can push KEY_RESIZE */ if (cooked_key_in_fifo()) { @@ -425,7 +475,7 @@ wgetch(WINDOW *win) T((T_CALLED("wgetch(%p)"), win)); code = _nc_wgetch(win, &value, - SP->_use_meta + (SP ? SP->_use_meta : 0) EVENTLIST_2nd((_nc_eventlist *) 0)); if (code != ERR) code = value; @@ -450,7 +500,7 @@ wgetch(WINDOW *win) static int kgetch(EVENTLIST_0th(_nc_eventlist * evl)) { - struct tries *ptr; + TRIES *ptr; int ch = 0; int timeleft = ESCDELAY; @@ -513,14 +563,11 @@ kgetch(EVENTLIST_0th(_nc_eventlist * evl)) int rc; TR(TRACE_IEVENT, ("waiting for rest of sequence")); - rc = _nc_timed_wait(TWAIT_MASK, - timeleft, - &timeleft - EVENTLIST_2nd(evl)); + rc = check_mouse_activity(timeleft EVENTLIST_2nd(evl)); #ifdef NCURSES_WGETCH_EVENTS if (rc & 4) { TR(TRACE_IEVENT, ("interrupted by a user event")); - /* FIXME Should have preserved timeleft for reusal... */ + /* FIXME Should have preserved remainder timeleft for reuse... */ peek = head; /* Restart interpreting later */ return KEY_EVENT; }