]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/base/lib_getch.c
ncurses 5.7 - patch 20100306
[ncurses.git] / ncurses / base / lib_getch.c
index e228355a019ea38a9bd1aaac92a471a0698ff4f9..e3e4075f742ed40950812362c61f47f10fe04cc4 100644 (file)
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: lib_getch.c,v 1.103 2009/05/30 15:50:47 tom Exp $")
+MODULE_ID("$Id: lib_getch.c,v 1.110 2010/02/06 18:39:16 tom Exp $")
 
 #include <fifo_defs.h>
 
 #if USE_REENTRANT
-#define GetEscdelay(sp) (sp)->_ESCDELAY
+#define GetEscdelay(sp) *_nc_ptr_Escdelay(sp)
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(ESCDELAY) (void)
+{
+    return *(_nc_ptr_Escdelay(CURRENT_SCREEN));
+}
+
 NCURSES_EXPORT(int *)
 _nc_ptr_Escdelay(SCREEN *sp)
 {
     return ptrEscdelay(sp);
 }
-NCURSES_EXPORT(int)
-NCURSES_PUBLIC_VAR(ESCDELAY) (void)
-{
-    return *_nc_ptr_Escdelay(CURRENT_SCREEN);
-}
 #else
 #define GetEscdelay(sp) ESCDELAY
-NCURSES_EXPORT_VAR (int)
-  ESCDELAY = 1000;             /* max interval betw. chars in funkeys, in millisecs */
+NCURSES_EXPORT_VAR(int) ESCDELAY = 1000;
 #endif
 
 #if NCURSES_EXT_FUNCS
@@ -71,7 +71,7 @@ NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value)
     int code = OK;
 #if USE_REENTRANT
     if (SP_PARM) {
-       SP_PARM->_ESCDELAY = value;
+       SET_ESCDELAY(value);
     } else {
        code = ERR;
     }
@@ -86,7 +86,33 @@ NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value)
 NCURSES_EXPORT(int)
 set_escdelay(int value)
 {
-    return NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value);
+    int code;
+#if USE_REENTRANT
+    code = NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value);
+#else
+    ESCDELAY = value;
+    code = OK;
+#endif
+    return code;
+}
+#endif
+#endif /* NCURSES_EXT_FUNCS */
+
+#if NCURSES_EXT_FUNCS
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(get_escdelay) (NCURSES_SP_DCL0)
+{
+#if !USE_REENTRANT
+    (void) SP_PARM;
+#endif
+    return GetEscdelay(SP_PARM);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+get_escdelay(void)
+{
+    return NCURSES_SP_NAME(get_escdelay) (CURRENT_SCREEN);
 }
 #endif
 #endif /* NCURSES_EXT_FUNCS */
@@ -115,10 +141,22 @@ check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl))
 #if USE_SYSMOUSE
     if ((sp->_mouse_type == M_SYSMOUSE)
        && (sp->_sysmouse_head < sp->_sysmouse_tail)) {
-       return 2;
+       return TW_MOUSE;
     }
 #endif
-    rc = _nc_timed_wait(sp, TWAIT_MASK, delay, (int *) 0 EVENTLIST_2nd(evl));
+#ifdef USE_TERM_DRIVER
+    rc = TCBOf(sp)->drv->twait(TCBOf(sp),
+                              TWAIT_MASK,
+                              delay,
+                              (int *) 0
+                              EVENTLIST_2nd(evl));
+#else
+    rc = _nc_timed_wait(sp,
+                       TWAIT_MASK,
+                       delay,
+                       (int *) 0
+                       EVENTLIST_2nd(evl));
+#endif
 #if USE_SYSMOUSE
     if ((sp->_mouse_type == M_SYSMOUSE)
        && (sp->_sysmouse_head < sp->_sysmouse_tail)
@@ -218,11 +256,25 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl))
        ch = KEY_MOUSE;
        n = 1;
     } else
+#endif
+#ifdef USE_TERM_DRIVER
+       if ((sp->_mouse_type == M_TERM_DRIVER)
+           && (sp->_drv_mouse_head < sp->_drv_mouse_tail)) {
+       sp->_mouse_event(sp);
+       ch = KEY_MOUSE;
+       n = 1;
+    } else
 #endif
     {                          /* Can block... */
+#ifdef USE_TERM_DRIVER
+       int buf;
+       n = CallDriver_1(sp, read, &buf);
+       ch = buf;
+#else
        unsigned char c2 = 0;
        n = read(sp->_ifd, &c2, 1);
        ch = c2;
+#endif
     }
 
 #ifdef HIDE_EINTR
@@ -336,7 +388,7 @@ _nc_wgetch(WINDOW *win,
     long event_delay = -1;
 #endif
 
-    T((T_CALLED("_nc_wgetch(%p)"), win));
+    T((T_CALLED("_nc_wgetch(%p)"), (void *) win));
 
     *result = 0;
 
@@ -423,7 +475,7 @@ _nc_wgetch(WINDOW *win,
            }
 #endif
            if (!rc) {
-               returnCode(ERR);
+               goto check_sigwinch;
            }
        }
        /* else go on to read data available */
@@ -485,12 +537,19 @@ _nc_wgetch(WINDOW *win,
     }
 
     if (ch == ERR) {
+      check_sigwinch:
 #if USE_SIZECHANGE
        if (_nc_handle_sigwinch(sp)) {
            _nc_update_screensize(sp);
            /* resizeterm can push KEY_RESIZE */
            if (cooked_key_in_fifo()) {
                *result = fifo_pull(sp);
+               /*
+                * Get the ERR from queue -- it is from WINCH,
+                * so we should take it out, the "error" is handled.
+                */
+               if (fifo_peek(sp) == -1)
+                   fifo_pull(sp);
                returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK);
            }
        }
@@ -567,7 +626,7 @@ wgetch(WINDOW *win)
     int code;
     unsigned long value;
 
-    T((T_CALLED("wgetch(%p)"), win));
+    T((T_CALLED("wgetch(%p)"), (void *) win));
     code = _nc_wgetch(win,
                      &value,
                      _nc_use_meta(win)
@@ -641,7 +700,7 @@ kgetch(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl))
            break;
        }
        TR(TRACE_IEVENT, ("ptr=%p, ch=%d, value=%d",
-                         ptr, ptr->ch, ptr->value));
+                         (void *) ptr, ptr->ch, ptr->value));
 
        if (ptr->value != 0) {  /* sequence terminated */
            TR(TRACE_IEVENT, ("end of sequence"));