X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Fbase%2Flib_getch.c;h=d8906daec63b7de903b3b82465e1c40a69bd813f;hb=03a795bde58b3280a4e9d80029a3b7fec13c79ad;hp=9cf42f5077d5209fa14281ace5a0e93c079a441b;hpb=55ccd2b959766810cf7db8d1c4462f338ce0afc8;p=ncurses.git diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c index 9cf42f50..d8906dae 100644 --- a/ncurses/base/lib_getch.c +++ b/ncurses/base/lib_getch.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2003,2005 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 * @@ -41,12 +41,20 @@ #include -MODULE_ID("$Id: lib_getch.c,v 1.73 2005/06/11 18:08:57 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 @@ -80,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]; @@ -90,7 +98,7 @@ fifo_peek(void) return ch; } -static inline int +static NCURSES_INLINE int fifo_pull(void) { int ch; @@ -110,7 +118,7 @@ fifo_pull(void) return ch; } -static inline int +static NCURSES_INLINE int fifo_push(EVENTLIST_0th(_nc_eventlist * evl)) { int n; @@ -206,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)); @@ -234,15 +242,16 @@ _nc_wgetch(WINDOW *win, T((T_CALLED("_nc_wgetch(%p)"), win)); *result = 0; - if (win == 0 || SP == 0) + 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)) @@ -281,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) @@ -296,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) @@ -383,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()) { @@ -492,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; @@ -559,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; }