/****************************************************************************
- * Copyright (c) 1998-2004,2006 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2007,2008 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 *
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ * and: Thomas E. Dickey 1996-on *
****************************************************************************/
/*
#include <curses.priv.h>
+#if defined __HAIKU__ && defined __BEOS__
+#undef __BEOS__
+#endif
+
#ifdef __BEOS__
#undef false
#undef true
# endif
#endif
-MODULE_ID("$Id: lib_twait.c,v 1.51 2006/05/27 21:57:43 tom Exp $")
+#undef CUR
+
+MODULE_ID("$Id: lib_twait.c,v 1.59 2008/08/30 20:08:19 tom Exp $")
static long
-_nc_gettime(bool first)
+_nc_gettime(TimeType * t0, bool first)
{
long res;
-#if HAVE_GETTIMEOFDAY
-# define PRECISE_GETTIME 1
- static struct timeval t0;
- struct timeval t1;
+#if PRECISE_GETTIME
+ TimeType t1;
gettimeofday(&t1, (struct timezone *) 0);
if (first) {
- t0 = t1;
+ *t0 = t1;
res = 0;
} else {
/* .tv_sec and .tv_usec are unsigned, be careful when subtracting */
- if (t0.tv_usec > t1.tv_usec) { /* Convert 1s in 1e6 microsecs */
- t1.tv_usec += 1000000;
+ if (t0->tv_usec > t1.tv_usec) {
+ t1.tv_usec += 1000000; /* Convert 1s in 1e6 microsecs */
t1.tv_sec--;
}
- res = (t1.tv_sec - t0.tv_sec) * 1000
- + (t1.tv_usec - t0.tv_usec) / 1000;
+ res = (t1.tv_sec - t0->tv_sec) * 1000
+ + (t1.tv_usec - t0->tv_usec) / 1000;
}
#else
-# define PRECISE_GETTIME 0
- static time_t t0;
time_t t1 = time((time_t *) 0);
if (first) {
- t0 = t1;
+ *t0 = t1;
}
- res = (t1 - t0) * 1000;
+ res = (t1 - *t0) * 1000;
#endif
TR(TRACE_IEVENT, ("%s time: %ld msec", first ? "get" : "elapsed", res));
return res;
* descriptors.
*/
NCURSES_EXPORT(int)
-_nc_timed_wait(int mode,
+_nc_timed_wait(SCREEN *sp,
+ int mode,
int milliseconds,
int *timeleft
EVENTLIST_2nd(_nc_eventlist * evl))
{
int fd;
int count;
- int result;
+ int result = 0;
+ TimeType t0;
#ifdef NCURSES_WGETCH_EVENTS
int timeout_is_event = 0;
struct pollfd *fds = fd_list;
#elif defined(__BEOS__)
#elif HAVE_SELECT
- static fd_set set;
+ fd_set set;
#endif
long starttime, returntime;
}
#endif
-#if PRECISE_GETTIME
+#if PRECISE_GETTIME && HAVE_NANOSLEEP
retry:
#endif
- starttime = _nc_gettime(TRUE);
+ starttime = _nc_gettime(&t0, TRUE);
count = 0;
#endif
if (mode & 1) {
- fds[count].fd = SP->_ifd;
+ fds[count].fd = sp->_ifd;
fds[count].events = POLLIN;
count++;
}
if ((mode & 2)
- && (fd = SP->_mouse_fd) >= 0) {
+ && (fd = sp->_mouse_fd) >= 0) {
fds[count].fd = fd;
fds[count].events = POLLIN;
count++;
FD_ZERO(&set);
if (mode & 1) {
- FD_SET(SP->_ifd, &set);
- count = SP->_ifd + 1;
+ FD_SET(sp->_ifd, &set);
+ count = sp->_ifd + 1;
}
if ((mode & 2)
- && (fd = SP->_mouse_fd) >= 0) {
+ && (fd = sp->_mouse_fd) >= 0) {
FD_SET(fd, &set);
count = max(fd, count) + 1;
}
#endif /* USE_FUNC_POLL, etc */
- returntime = _nc_gettime(FALSE);
+ returntime = _nc_gettime(&t0, FALSE);
if (milliseconds >= 0)
milliseconds -= (returntime - starttime);
result = 1; /* redundant, but simple */
#elif HAVE_SELECT
if ((mode & 2)
- && (fd = SP->_mouse_fd) >= 0
+ && (fd = sp->_mouse_fd) >= 0
&& FD_ISSET(fd, &set))
result |= 2;
if ((mode & 1)
- && FD_ISSET(SP->_ifd, &set))
+ && FD_ISSET(sp->_ifd, &set))
result |= 1;
#endif
} else