X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Fbase%2Flib_getch.c;h=0d719cfcda97649d2f671ee5ca2d0ffa7558f771;hb=461e72d1826483cb2c2cb243412f2dc5b00b2b1a;hp=5bfeb24d85632aa6b167619151983f4d57708bfc;hpb=5da4544722decdeb2bfd0c7c4581af0ea62148f9;p=ncurses.git diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c index 5bfeb24d..0d719cfc 100644 --- a/ncurses/base/lib_getch.c +++ b/ncurses/base/lib_getch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2016,2018 Free Software Foundation, Inc. * + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 1998-2015,2016 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 * @@ -40,9 +41,10 @@ ** */ +#define NEED_KEY_EVENT #include -MODULE_ID("$Id: lib_getch.c,v 1.137 2018/06/24 00:06:37 tom Exp $") +MODULE_ID("$Id: lib_getch.c,v 1.143 2021/10/23 17:06:20 tom Exp $") #include @@ -69,16 +71,20 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value) { int code = OK; -#if USE_REENTRANT - if (SP_PARM) { - SET_ESCDELAY(value); - } else { + if (value < 0) { code = ERR; - } + } else { +#if USE_REENTRANT + if (SP_PARM) { + SET_ESCDELAY(value); + } else { + code = ERR; + } #else - (void) SP_PARM; - ESCDELAY = value; + (void) SP_PARM; + ESCDELAY = value; #endif + } return code; } @@ -87,12 +93,16 @@ NCURSES_EXPORT(int) set_escdelay(int value) { int code; + if (value < 0) { + code = ERR; + } else { #if USE_REENTRANT - code = NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value); + code = NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value); #else - ESCDELAY = value; - code = OK; + ESCDELAY = value; + code = OK; #endif + } return code; } #endif @@ -125,7 +135,7 @@ _nc_use_meta(WINDOW *win) } #ifdef USE_TERM_DRIVER -# ifdef _WIN32 +# if defined(_NC_WINDOWS) && !defined(EXP_WIN32_DRIVER) static HANDLE _nc_get_handle(int fd) { @@ -146,7 +156,14 @@ check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl)) #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = TCBOf(sp); rc = TCBOf(sp)->drv->td_testmouse(TCBOf(sp), delay EVENTLIST_2nd(evl)); -# ifdef _WIN32 +# if defined(EXP_WIN32_DRIVER) + /* if we emulate terminfo on console, we have to use the console routine */ + if (IsTermInfoOnConsole(sp)) { + rc = _nc_console_testmouse(sp, + _nc_console_handle(sp->_ifd), + delay EVENTLIST_2nd(evl)); + } else +# elif defined(_NC_WINDOWS) /* if we emulate terminfo on console, we have to use the console routine */ if (IsTermInfoOnConsole(sp)) { HANDLE fd = _nc_get_handle(sp->_ifd); @@ -154,29 +171,36 @@ check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl)) } else # endif rc = TCB->drv->td_testmouse(TCB, delay EVENTLIST_2nd(evl)); -#else -#if USE_SYSMOUSE +#else /* !USE_TERM_DRIVER */ +# if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail)) { rc = TW_MOUSE; } else -#endif +# endif { +# if defined(EXP_WIN32_DRIVER) + rc = _nc_console_testmouse(sp, + _nc_console_handle(sp->_ifd), + delay + EVENTLIST_2nd(evl)); +# else rc = _nc_timed_wait(sp, TWAIT_MASK, delay, (int *) 0 EVENTLIST_2nd(evl)); -#if USE_SYSMOUSE +# endif +# if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail) && (rc == 0) && (errno == EINTR)) { rc |= TW_MOUSE; } -#endif +# endif } -#endif +#endif /* USE_TERM_DRIVER */ return rc; } @@ -281,31 +305,54 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) } else #endif { /* Can block... */ -#ifdef USE_TERM_DRIVER +#if defined(USE_TERM_DRIVER) int buf; -#ifdef _WIN32 +# if defined(EXP_WIN32_DRIVER) + if (NC_ISATTY(sp->_ifd) && IsTermInfoOnConsole(sp) && sp->_cbreak) { +# if USE_PTHREADS_EINTR + if ((pthread_self) && (pthread_kill) && (pthread_equal)) + _nc_globals.read_thread = pthread_self(); +# endif + n = _nc_console_read(sp, + _nc_console_handle(sp->_ifd), + &buf); +# if USE_PTHREADS_EINTR + _nc_globals.read_thread = 0; +# endif + } else +# elif defined(_NC_WINDOWS) if (NC_ISATTY(sp->_ifd) && IsTermInfoOnConsole(sp) && sp->_cbreak) n = _nc_mingw_console_read(sp, _nc_get_handle(sp->_ifd), &buf); else -#endif +# endif /* EXP_WIN32_DRIVER */ n = CallDriver_1(sp, td_read, &buf); ch = buf; -#else +#else /* !USE_TERM_DRIVER */ +#if defined(EXP_WIN32_DRIVER) + int buf; +#endif unsigned char c2 = 0; -# if USE_PTHREADS_EINTR -# if USE_WEAK_SYMBOLS +#if USE_PTHREADS_EINTR +#if USE_WEAK_SYMBOLS if ((pthread_self) && (pthread_kill) && (pthread_equal)) -# endif +#endif _nc_globals.read_thread = pthread_self(); -# endif +#endif +#if defined(EXP_WIN32_DRIVER) + n = _nc_console_read(sp, + _nc_console_handle(sp->_ifd), + &buf); + c2 = buf; +#else n = (int) read(sp->_ifd, &c2, (size_t) 1); +#endif #if USE_PTHREADS_EINTR _nc_globals.read_thread = 0; #endif ch = c2; -#endif +#endif /* USE_TERM_DRIVER */ } if ((n == -1) || (n == 0)) { @@ -357,7 +404,7 @@ recur_wrefresh(WINDOW *win) } else #endif if ((is_wintouched(win) || (win->_flags & _HASMOVED)) - && !(win->_flags & _ISPAD)) { + && !IS_PAD(win)) { wrefresh(win); } } @@ -504,7 +551,7 @@ _nc_wgetch(WINDOW *win, * This is tricky. We only want to get special-key * events one at a time. But we want to accumulate * mouse events until either (a) the mouse logic tells - * us it's picked up a complete gesture, or (b) + * us it has picked up a complete gesture, or (b) * there's a detectable time lapse after one. * * Note: if the mouse code starts failing to compose @@ -592,7 +639,7 @@ _nc_wgetch(WINDOW *win, * However, we provide the same visual result as Solaris, moving the * cursor to the left. */ - if (sp->_echo && !(win->_flags & _ISPAD)) { + if (sp->_echo && !IS_PAD(win)) { chtype backup = (chtype) ((ch == KEY_BACKSPACE) ? '\b' : ch); if (backup < KEY_MIN) wechochar(win, backup);