]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/base/lib_getch.c
ncurses 5.7 - patch 20100717
[ncurses.git] / ncurses / base / lib_getch.c
index 09d4ea1c0f6a6a1b404d5c8187f8cd6c9de85d9d..24acf055674c5a1020cc9c1c0d3616d52b8ace22 100644 (file)
@@ -42,7 +42,7 @@
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: lib_getch.c,v 1.111 2010/04/10 19:08:59 tom Exp $")
+MODULE_ID("$Id: lib_getch.c,v 1.119 2010/05/22 20:00:35 tom Exp $")
 
 #include <fifo_defs.h>
 
@@ -264,7 +264,16 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl))
        ch = buf;
 #else
        unsigned char c2 = 0;
+# if USE_PTHREADS_EINTR
+#  if USE_WEAK_SYMBOLS
+       if ((pthread_self) && (pthread_kill) && (pthread_equal))
+#  endif
+           _nc_globals.read_thread = pthread_self();
+# endif
        n = read(sp->_ifd, &c2, 1);
+#if USE_PTHREADS_EINTR
+       _nc_globals.read_thread = 0;
+#endif
        ch = c2;
 #endif
     }
@@ -279,7 +288,11 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl))
      * We don't want this difference to show.  This piece of code
      * tries to make it look like we always have restarting signals.
      */
-    if (n <= 0 && errno == EINTR)
+    if (n <= 0 && errno == EINTR
+# if USE_PTHREADS_EINTR
+       && (_nc_globals.have_sigwinch == 0)
+# endif
+       )
        goto again;
 #endif
 
@@ -376,6 +389,7 @@ _nc_wgetch(WINDOW *win,
 {
     SCREEN *sp;
     int ch;
+    int rc = 0;
 #ifdef NCURSES_WGETCH_EVENTS
     long event_delay = -1;
 #endif
@@ -411,17 +425,18 @@ _nc_wgetch(WINDOW *win,
        !sp->_cbreak &&
        !sp->_called_wgetch) {
        char buf[MAXCOLUMNS], *bufp;
-       int rc;
 
        TR(TRACE_IEVENT, ("filling queue in cooked mode"));
 
-       rc = recur_wgetnstr(win, buf);
-
        /* ungetch in reverse order */
 #ifdef NCURSES_WGETCH_EVENTS
+       rc = recur_wgetnstr(win, buf);
        if (rc != KEY_EVENT)
-#endif
            safe_ungetch(sp, '\n');
+#else
+       (void) recur_wgetnstr(win, buf);
+       safe_ungetch(sp, '\n');
+#endif
        for (bufp = buf + strlen(buf); bufp > buf; bufp--)
            safe_ungetch(sp, bufp[-1]);
 
@@ -443,7 +458,6 @@ _nc_wgetch(WINDOW *win,
     if (win->_notimeout || (win->_delay >= 0) || (sp->_cbreak > 1)) {
        if (head == -1) {       /* fifo is empty */
            int delay;
-           int rc;
 
            TR(TRACE_IEVENT, ("timed delay in wgetch()"));
            if (sp->_cbreak > 1)
@@ -486,7 +500,6 @@ _nc_wgetch(WINDOW *win,
         * increase the wait with mouseinterval().
         */
        int runcount = 0;
-       int rc = 0;
 
        do {
            ch = kgetch(sp EVENTLIST_2nd(evl));