X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_getch.c;h=d8906daec63b7de903b3b82465e1c40a69bd813f;hp=84700cc7a1bf20be2d0863d76781ad24b4e8a2ef;hb=a1aff38c9421e79f92cd4e8ab0587fdf3806cc28;hpb=a8987e73ec254703634802b4f7ee30d3a485524d diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c index 84700cc7..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.71 2003/05/17 23:49:28 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 @@ -79,7 +88,7 @@ check_mouse_activity(int delay EVENTLIST_2nd(_nc_eventlist * evl)) return rc; } -static inline int +static NCURSES_INLINE int fifo_peek(void) { int ch = SP->_fifo[peek]; @@ -89,7 +98,7 @@ fifo_peek(void) return ch; } -static inline int +static NCURSES_INLINE int fifo_pull(void) { int ch; @@ -109,7 +118,7 @@ fifo_pull(void) return ch; } -static inline int +static NCURSES_INLINE int fifo_push(EVENTLIST_0th(_nc_eventlist * evl)) { int n; @@ -205,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)); @@ -233,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)) @@ -280,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) @@ -295,28 +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 = check_mouse_activity(delay 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) @@ -382,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()) { @@ -466,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; @@ -491,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; @@ -558,7 +567,7 @@ kgetch(EVENTLIST_0th(_nc_eventlist * evl)) #ifdef NCURSES_WGETCH_EVENTS if (rc & 4) { TR(TRACE_IEVENT, ("interrupted by a user event")); - /* FIXME Should have preserved remainder timeleft for reusal... */ + /* FIXME Should have preserved remainder timeleft for reuse... */ peek = head; /* Restart interpreting later */ return KEY_EVENT; }