X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftty%2Flib_twait.c;h=3cd2cafc44304d7762a32f341a97d3c093c1dec9;hp=023ba70b799d303dcdc8b6d381335d87d7e94102;hb=8b06e371ed1bce3dd6f37138e6becb5e1a562fe0;hpb=03f728e5bb3630a54fffc4a2ff2f8dbfcce9088e diff --git a/ncurses/tty/lib_twait.c b/ncurses/tty/lib_twait.c index 023ba70b..3cd2cafc 100644 --- a/ncurses/tty/lib_twait.c +++ b/ncurses/tty/lib_twait.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * Copyright (c) 1998-2011,2012 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 * @@ -53,6 +53,11 @@ #include #endif +#if USE_KLIBC_KBD +#define INCL_KBD +#include +#endif + #if USE_FUNC_POLL # if HAVE_SYS_TIME_H # include @@ -70,7 +75,7 @@ #endif #undef CUR -MODULE_ID("$Id: lib_twait.c,v 1.62 2011/10/22 16:34:50 tom Exp $") +MODULE_ID("$Id: lib_twait.c,v 1.64 2012/02/18 20:32:55 tom Exp $") static long _nc_gettime(TimeType * t0, int first) @@ -184,6 +189,12 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, fd_set set; #endif +#if USE_KLIBC_KBD + fd_set saved_set; + KBDKEYINFO ki; + struct timeval tv; +#endif + long starttime, returntime; TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d", @@ -207,6 +218,7 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, starttime = _nc_gettime(&t0, TRUE); count = 0; + (void) count; #ifdef NCURSES_WGETCH_EVENTS if ((mode & TW_EVENT) && evl) @@ -329,10 +341,12 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, */ FD_ZERO(&set); +#if !USE_KLIBC_KBD if (mode & TW_INPUT) { FD_SET(sp->_ifd, &set); count = sp->_ifd + 1; } +#endif if ((mode & TW_MOUSE) && (fd = sp->_mouse_fd) >= 0) { FD_SET(fd, &set); @@ -352,6 +366,31 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, } #endif +#if USE_KLIBC_KBD + for (saved_set = set;; set = saved_set) { + if ((mode & TW_INPUT) + && (sp->_extended_key + || (KbdPeek(&ki, 0) == 0 + && (ki.fbStatus & KBDTRF_FINAL_CHAR_IN)))) { + FD_ZERO(&set); + FD_SET(sp->_ifd, &set); + result = 1; + break; + } + + tv.tv_sec = 0; + tv.tv_usec = (milliseconds == 0) ? 0 : (10 * 1000); + + if ((result = select(count, &set, NULL, NULL, &tv)) != 0) + break; + + /* Time out ? */ + if (milliseconds >= 0 && _nc_gettime(&t0, FALSE) >= milliseconds) { + result = 0; + break; + } + } +#else if (milliseconds >= 0) { struct timeval ntimeout; ntimeout.tv_sec = milliseconds / 1000; @@ -360,6 +399,7 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, } else { result = select(count, &set, NULL, NULL, NULL); } +#endif #ifdef NCURSES_WGETCH_EVENTS if ((mode & TW_EVENT) && evl) {