]> ncurses.scripts.mit.edu Git - ncurses.git/commitdiff
ncurses 5.7 - patch 20090905
authorThomas E. Dickey <dickey@invisible-island.net>
Sun, 6 Sep 2009 00:18:02 +0000 (00:18 +0000)
committerThomas E. Dickey <dickey@invisible-island.net>
Sun, 6 Sep 2009 00:18:02 +0000 (00:18 +0000)
+ build-fix for building outside source-tree (report by Sven Joachim).
+ fix Debian lintian warning for man/tabs.1 by making section number
  agree with file-suffix (report by Sven Joachim).
+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).

14 files changed:
NEWS
dist.mk
include/headers
man/tabs.1
ncurses/base/lib_newterm.c
ncurses/base/lib_newwin.c
ncurses/base/lib_restart.c
ncurses/base/lib_set_term.c
ncurses/base/resizeterm.c
ncurses/curses.priv.h
ncurses/tinfo/lib_cur_term.c
ncurses/tinfo/lib_setup.c
ncurses/tinfo/lib_termcap.c
ncurses/tty/lib_mvcur.c

diff --git a/NEWS b/NEWS
index 50bc6dbb116248902f768871419306b45b72e69f..d5957d2287b46596b4a01663f4904b19001d8a24 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -25,7 +25,7 @@
 -- sale, use or other dealings in this Software without prior written        --
 -- authorization.                                                            --
 -------------------------------------------------------------------------------
--- $Id: NEWS,v 1.1425 2009/08/29 18:33:51 tom Exp $
+-- $Id: NEWS,v 1.1428 2009/09/05 17:51:48 tom Exp $
 -------------------------------------------------------------------------------
 
 This is a log of changes that ncurses has gone through since Zeyd started
@@ -45,6 +45,12 @@ See the AUTHORS file for the corresponding full names.
 Changes through 1.9.9e did not credit all contributions;
 it is not possible to add this information.
 
+20090905
+       + build-fix for building outside source-tree (report by Sven Joachim).
+       + fix Debian lintian warning for man/tabs.1 by making section number
+         agree with file-suffix (report by Sven Joachim).
+       + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
 20090829
        + workaround for bug in g++ 4.1-4.4 warnings for wattrset() macro on
          amd64 (Debian #542031).
diff --git a/dist.mk b/dist.mk
index a0dba85fb89fa0d874c95572487d1c4119b2f282..bba8c5659599649a3ea271d743a56431bbaf76aa 100644 (file)
--- a/dist.mk
+++ b/dist.mk
@@ -25,7 +25,7 @@
 # use or other dealings in this Software without prior written               #
 # authorization.                                                             #
 ##############################################################################
-# $Id: dist.mk,v 1.717 2009/08/29 18:07:46 tom Exp $
+# $Id: dist.mk,v 1.718 2009/08/30 18:12:44 tom Exp $
 # Makefile for creating ncurses distributions.
 #
 # This only needs to be used directly as a makefile by developers, but
@@ -37,7 +37,7 @@ SHELL = /bin/sh
 # These define the major/minor/patch versions of ncurses.
 NCURSES_MAJOR = 5
 NCURSES_MINOR = 7
-NCURSES_PATCH = 20090829
+NCURSES_PATCH = 20090905
 
 # We don't append the patch to the version, since this only applies to releases
 VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
index a24bd90923fffa2d1b3cb34a98a75b9398cc90f9..6c367950c9f427fd7c669a6d5115286e134ee0bb 100644 (file)
@@ -1,6 +1,6 @@
-# $Id: headers,v 1.9 2007/01/20 19:57:04 Miroslav.Lichvar Exp $
+# $Id: headers,v 1.10 2009/09/05 17:46:30 tom Exp $
 ##############################################################################
-# Copyright (c) 1998-2006,2007 Free Software Foundation, Inc.                #
+# Copyright (c) 1998-2007,2009 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 "Software"), #
@@ -33,7 +33,7 @@ term.h
 curses.h
 unctrl.h
 termcap.h
-$(srcdir)/ncurses_dll.h
+ncurses_dll.h
 @ ticlib
 $(srcdir)/tic.h
 $(srcdir)/term_entry.h
index f8b88195f5d71a22d8a7e052dfd76b365428e438..4a0a46b001c5ef5419eeddc79b17ff3bf383754d 100644 (file)
@@ -1,5 +1,5 @@
 .\"***************************************************************************
-.\" Copyright (c) 2008 Free Software Foundation, Inc.                        *
+.\" Copyright (c) 2008,2009 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            *
@@ -26,8 +26,8 @@
 .\" authorization.                                                           *
 .\"***************************************************************************
 .\"
-.\" $Id: tabs.1,v 1.2 2008/11/15 23:03:45 tom Exp $
-.TH @TABS@ 1M ""
+.\" $Id: tabs.1,v 1.3 2009/09/05 17:06:08 tom Exp $
+.TH @TABS@ 1 ""
 .ds n 5
 .SH NAME
 \fBtabs\fR - set tabs on a terminal
index 11397fba6629ebd5b37c846c7b1f745c0863334a..e09b8409d9745c15d9501339f2241e6d1b75f0d3 100644 (file)
 #endif
 
 #ifndef CUR
-#define CUR SP_TERMTYPE 
+#define CUR SP_TERMTYPE
 #endif
 
-#include <term.h>              /* clear_screen, cup & friends, cur_term */
 #include <tic.h>
 
-MODULE_ID("$Id: lib_newterm.c,v 1.77 2009/05/10 00:48:29 tom Exp $")
+MODULE_ID("$Id: lib_newterm.c,v 1.78 2009/08/30 19:02:28 tom Exp $")
+
+#ifdef USE_TERM_DRIVER
+#define NumLabels      InfoOf(SP_PARM).numlabels
+#else
+#define NumLabels      num_labels
+#endif
 
 #ifndef ONLCR                  /* Allows compilation under the QNX 4.2 OS */
 #define ONLCR 0
@@ -68,16 +73,17 @@ MODULE_ID("$Id: lib_newterm.c,v 1.77 2009/05/10 00:48:29 tom Exp $")
  * is supposed to behave as if it calls newterm, we do it here.
  */
 static NCURSES_INLINE int
-_nc_initscr(void)
+_nc_initscr(NCURSES_SP_DCL0)
 {
     int result = ERR;
+    TERMINAL *term = TerminalOf(SP_PARM);
 
     /* for extended XPG4 conformance requires cbreak() at this point */
     /* (SVr4 curses does this anyway) */
-    if (cbreak() == OK) {
+    if (NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG) == OK) {
        TTY buf;
 
-       buf = cur_term->Nttyb;
+       buf = term->Nttyb;
 #ifdef TERMIOS
        buf.c_lflag &= ~(ECHO | ECHONL);
        buf.c_iflag &= ~(ICRNL | INLCR | IGNCR);
@@ -87,8 +93,9 @@ _nc_initscr(void)
 #else
        memset(&buf, 0, sizeof(buf));
 #endif
-       if ((result = _nc_set_tty_mode(&buf)) == OK)
-           cur_term->Nttyb = buf;
+       result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+       if (result == OK)
+           term->Nttyb = buf;
     }
     return result;
 }
@@ -103,8 +110,14 @@ NCURSES_EXPORT(void)
 NCURSES_SP_NAME(filter) (NCURSES_SP_DCL0)
 {
     START_TRACE();
-    T((T_CALLED("filter")));
+    T((T_CALLED("filter(%p)"), SP_PARM));
+#if NCURSES_SP_FUNCS
+    if (IsPreScreen(SP_PARM)) {
+       SP_PARM->_filtered = TRUE;
+    }
+#else
     _nc_prescreen.filter_mode = TRUE;
+#endif
     returnVoid;
 }
 
@@ -112,7 +125,10 @@ NCURSES_SP_NAME(filter) (NCURSES_SP_DCL0)
 NCURSES_EXPORT(void)
 filter(void)
 {
-    NCURSES_SP_NAME(filter) (CURRENT_SCREEN);
+    START_TRACE();
+    T((T_CALLED("filter()")));
+    _nc_prescreen.filter_mode = TRUE;
+    returnVoid;
 }
 #endif
 
@@ -125,8 +141,14 @@ NCURSES_EXPORT(void)
 NCURSES_SP_NAME(nofilter) (NCURSES_SP_DCL0)
 {
     START_TRACE();
-    T((T_CALLED("nofilter")));
+    T((T_CALLED("nofilter(%p)"), SP_PARM));
+#if NCURSES_SP_FUNCS
+    if (IsPreScreen(SP_PARM)) {
+       SP_PARM->_filtered = FALSE;
+    }
+#else
     _nc_prescreen.filter_mode = FALSE;
+#endif
     returnVoid;
 }
 
@@ -134,7 +156,10 @@ NCURSES_SP_NAME(nofilter) (NCURSES_SP_DCL0)
 NCURSES_EXPORT(void)
 nofilter(void)
 {
-    NCURSES_SP_NAME(nofilter) (CURRENT_SCREEN);
+    START_TRACE();
+    T((T_CALLED("nofilter()")));
+    _nc_prescreen.filter_mode = FALSE;
+    returnVoid;
 }
 #endif
 #endif /* NCURSES_EXT_FUNCS */
@@ -147,12 +172,19 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx
 {
     int value;
     int errret;
-    SCREEN *current;
     SCREEN *result = 0;
+    SCREEN *current;
     TERMINAL *its_term;
+    FILE *_ofp = ofp ? ofp : stdout;
+    FILE *_ifp = ifp ? ifp : stdin;
+    int cols;
+    int numlab;
+#ifdef USE_TERM_DRIVER
+    TERMINAL *new_term;
+#endif
 
     START_TRACE();
-    T((T_CALLED("newterm(\"%s\",%p,%p)"), name, ofp, ifp));
+    T((T_CALLED("newterm(%p, \"%s\", %p,%p)"), SP_PARM, name, ofp, ifp));
 
     _nc_init_pthreads();
     _nc_lock_global(curses);
@@ -161,34 +193,48 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx
     its_term = (SP_PARM ? SP_PARM->_term : 0);
 
     /* this loads the capability entry, then sets LINES and COLS */
-    if (setupterm(name, fileno(ofp), &errret) != ERR) {
+    if (setupterm(name, fileno(_ofp), &errret) != ERR) {
        int slk_format = _nc_globals.slk_format;
 
-       /*
-        * This actually allocates the screen structure, and saves the original
-        * terminal settings.
-        */
        _nc_set_screen(0);
+#ifdef USE_TERM_DRIVER
+       assert(new_term != 0);
+#endif
 
        /* allow user to set maximum escape delay from the environment */
        if ((value = _nc_getenv_num("ESCDELAY")) >= 0) {
            set_escdelay(value);
        }
 
+       /*
+        * This actually allocates the screen structure, and saves the original
+        * terminal settings.
+        */
        if (_nc_setupscreen(LINES,
                            COLS,
-                           ofp,
+                           _ofp,
                            _nc_prescreen.filter_mode,
                            slk_format) == ERR) {
            _nc_set_screen(current);
            result = 0;
        } else {
+#ifdef USE_TERM_DRIVER
+           TERMINAL_CONTROL_BLOCK *TCB;
+#endif
            assert(SP_PARM != 0);
+           cols = *(ptrCols(SP_PARM));
+#ifdef USE_TERM_DRIVER
+           TCB = (TERMINAL_CONTROL_BLOCK *) new_term;
+           TCB->csp = SP_PARM;
+#endif
+           numlab = NumLabels;
+
            /*
             * In setupterm() we did a set_curterm(), but it was before we set
-            * SP.  So the "current" screen's terminal pointer was overwritten
-            * with a different terminal.  Later, in _nc_setupscreen(), we set
-            * SP and the terminal pointer in the new screen.
+            * CURRENT_SCREEN.  So the "current" screen's terminal pointer was
+            * overwritten with a different terminal.  Later, in
+            * _nc_setupscreen(), we set CURRENT_SCREEN and the terminal
+            * pointer in the new screen.
             *
             * Restore the terminal-pointer for the pre-existing screen, if
             * any.
@@ -200,33 +246,38 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx
            if (slk_format && num_labels > 0 && SLK_STDFMT(slk_format))
                _nc_slk_initialize(stdscr, COLS);
 
-           SP->_ifd = fileno(ifp);
-           typeahead(fileno(ifp));
+           SP_PARM->_ifd = fileno(_ifp);
+           NCURSES_SP_NAME(typeahead) (NCURSES_SP_ARGx fileno(_ifp));
 #ifdef TERMIOS
-           SP->_use_meta = ((cur_term->Ottyb.c_cflag & CSIZE) == CS8 &&
-                            !(cur_term->Ottyb.c_iflag & ISTRIP));
+           SP_PARM->_use_meta = ((cur_term->Ottyb.c_cflag & CSIZE) == CS8 &&
+                                 !(cur_term->Ottyb.c_iflag & ISTRIP));
 #else
-           SP->_use_meta = FALSE;
+           SP_PARM->_use_meta = FALSE;
 #endif
-           SP->_endwin = FALSE;
-
+           SP_PARM->_endwin = FALSE;
+#ifndef USE_TERM_DRIVER
            /*
             * Check whether we can optimize scrolling under dumb terminals in
             * case we do not have any of these capabilities, scrolling
             * optimization will be useless.
             */
-           SP->_scrolling = ((scroll_forward && scroll_reverse) ||
-                             ((parm_rindex ||
-                               parm_insert_line ||
-                               insert_line) &&
-                              (parm_index ||
-                               parm_delete_line ||
-                               delete_line)));
+           SP_PARM->_scrolling = ((scroll_forward && scroll_reverse) ||
+                                  ((parm_rindex ||
+                                    parm_insert_line ||
+                                    insert_line) &&
+                                   (parm_index ||
+                                    parm_delete_line ||
+                                    delete_line)));
+#endif
 
-           baudrate();         /* sets a field in the SP structure */
+           NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG);         /* sets a field in the screen structure */
 
-           SP->_keytry = 0;
+           SP_PARM->_keytry = 0;
 
+           /* compute movement costs so we can do better move optimization */
+#ifdef USE_TERM_DRIVER
+           TCBOf(SP_PARM)->drv->scinit(SP_PARM);
+#else
            /*
             * Check for mismatched graphic-rendition capabilities.  Most SVr4
             * terminfo trees contain entries that have rmul or rmso equated to
@@ -237,21 +288,21 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx
             * shouldn't be looking at this detail.
             */
 #define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode))
-           SP->_use_rmso = SGR0_TEST(exit_standout_mode);
-           SP->_use_rmul = SGR0_TEST(exit_underline_mode);
+           SP_PARM->_use_rmso = SGR0_TEST(exit_standout_mode);
+           SP_PARM->_use_rmul = SGR0_TEST(exit_underline_mode);
 
            /* compute movement costs so we can do better move optimization */
            _nc_mvcur_init();
 
            /* initialize terminal to a sane state */
            _nc_screen_init();
+#endif
 
            /* Initialize the terminal line settings. */
-           _nc_initscr();
+           _nc_initscr(NCURSES_SP_ARG);
 
            _nc_signal_handler(TRUE);
-
-           result = SP;
+           result = SP_PARM;
        }
     }
     _nc_unlock_global(curses);
index 26090828e3bf3ac67bf0a27ee499b1d5ca091b85..14beb65ae6855cd033f27faeda9a1290f1737cc4 100644 (file)
@@ -43,7 +43,7 @@
 #include <curses.priv.h>
 #include <stddef.h>
 
-MODULE_ID("$Id: lib_newwin.c,v 1.58 2009/06/06 17:53:11 tom Exp $")
+MODULE_ID("$Id: lib_newwin.c,v 1.59 2009/08/30 16:35:23 tom Exp $")
 
 #define window_is(name) ((sp)->_##name == win)
 
@@ -62,6 +62,17 @@ remove_window_from_screen(WINDOW *win)
 {
     SCREEN *sp;
 
+#ifdef USE_SP_WINDOWLIST
+    if ((sp = _nc_screen_of(win)) != 0) {
+       if (window_is(curscr)) {
+           remove_window(curscr);
+       } else if (window_is(stdscr)) {
+           remove_window(stdscr);
+       } else if (window_is(newscr)) {
+           remove_window(newscr);
+       }
+    }
+#else
     for (each_screen(sp)) {
        if (window_is(curscr)) {
            remove_window(curscr);
@@ -74,6 +85,7 @@ remove_window_from_screen(WINDOW *win)
            break;
        }
     }
+#endif
 }
 
 NCURSES_EXPORT(int)
@@ -82,17 +94,20 @@ _nc_freewin(WINDOW *win)
     WINDOWLIST *p, *q;
     int i;
     int result = ERR;
+#ifdef USE_SP_WINDOWLIST
+    SCREEN *sp = _nc_screen_of(win);   /* pretend this is parameter */
+#endif
 
     T((T_CALLED("_nc_freewin(%p)"), win));
 
     if (win != 0) {
-       if (_nc_try_global(curses) == 0) {
+       if (_nc_nonsp_try_global(curses) == 0) {
            q = 0;
-           for (each_window(SP, p)) {
+           for (each_window(SP_PARM, p)) {
                if (&(p->win) == win) {
                    remove_window_from_screen(win);
                    if (q == 0)
-                       WindowList(SP) = p->next;
+                       WindowList(SP_PARM) = p->next;
                    else
                        q->next = p->next;
 
@@ -109,7 +124,7 @@ _nc_freewin(WINDOW *win)
                }
                q = p;
            }
-           _nc_unlock_global(curses);
+           _nc_nonsp_unlock_global(curses);
        }
     }
     returnCode(result);
@@ -123,7 +138,8 @@ NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx
     NCURSES_CH_T *ptr;
     int i;
 
-    T((T_CALLED("newwin(%d,%d,%d,%d)"), num_lines, num_columns, begy, begx));
+    T((T_CALLED("newwin(%p, %d,%d,%d,%d)"), SP_PARM, num_lines, num_columns,
+       begy, begx));
 
     if (begy < 0 || begx < 0 || num_lines < 0 || num_columns < 0)
        returnWin(0);
@@ -157,21 +173,24 @@ NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx
 NCURSES_EXPORT(WINDOW *)
 newwin(int num_lines, int num_columns, int begy, int begx)
 {
-    return NCURSES_SP_NAME(newwin) (CURRENT_SCREEN,
-                                   num_lines, num_columns,
-                                   begy, begx);
+    WINDOW *win;
+    _nc_sp_lock_global(curses);
+    win = NCURSES_SP_NAME(newwin) (CURRENT_SCREEN,
+                                  num_lines, num_columns, begy, begx);
+    _nc_sp_unlock_global(curses);
+    return (win);
 }
 #endif
 
 NCURSES_EXPORT(WINDOW *)
 derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx)
 {
-#if NCURSES_SP_FUNCS
-    SCREEN *sp = CURRENT_SCREEN;
-#endif
     WINDOW *win;
     int i;
     int flags = _SUBWIN;
+#if NCURSES_SP_FUNCS
+    SCREEN *sp = _nc_screen_of(orig);
+#endif
 
     T((T_CALLED("derwin(%p,%d,%d,%d,%d)"), orig, num_lines, num_columns,
        begy, begx));
@@ -261,7 +280,7 @@ NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx
        returnWin(0);
     }
 
-    _nc_lock_global(curses);
+    _nc_nonsp_lock_global(curses);
 
     win->_curx = 0;
     win->_cury = 0;
@@ -343,20 +362,10 @@ NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx
 
     T((T_CREATE("window %p"), win));
 
-    _nc_unlock_global(curses);
+    _nc_nonsp_unlock_global(curses);
     returnWin(win);
 }
 
-#if NCURSES_SP_FUNCS
-NCURSES_EXPORT(WINDOW *)
-_nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags)
-{
-    return NCURSES_SP_NAME(_nc_makenew) (CURRENT_SCREEN,
-                                        num_lines, num_columns,
-                                        begy, begx, flags);
-}
-#endif
-
 /*
  * wgetch() and other functions with a WINDOW* parameter may use a SCREEN*
  * internally, and it is useful to allow those to be invoked without switching
index 55b1cc09cfa7eeaf20485825dfd434ec6e3187c6..5be5c08372940b617ee56ef7136bcb60669b4883 100644 (file)
@@ -45,7 +45,7 @@
 #define _POSIX_SOURCE
 #endif
 
-MODULE_ID("$Id: lib_restart.c,v 1.11 2009/05/02 20:47:42 tom Exp $")
+MODULE_ID("$Id: lib_restart.c,v 1.12 2009/08/30 17:59:13 tom Exp $")
 
 NCURSES_EXPORT(int)
 NCURSES_SP_NAME(restartterm) (NCURSES_SP_DCLx
@@ -54,10 +54,13 @@ NCURSES_SP_NAME(restartterm) (NCURSES_SP_DCLx
                              int *errret)
 {
     int result;
+#ifdef USE_TERM_DRIVER
+    TERMINAL *new_term;
+#endif
 
     T((T_CALLED("restartterm(%p,%s,%d,%p)"), SP_PARM, termp, filenum, errret));
 
-    if (setupterm(termp, filenum, errret) != OK) {
+    if (TINFO_SETUP_TERM(&new_term, termp, filenum, errret, FALSE) != OK) {
        result = ERR;
     } else if (SP_PARM != 0) {
        int saveecho = SP_PARM->_echo;
@@ -65,6 +68,9 @@ NCURSES_SP_NAME(restartterm) (NCURSES_SP_DCLx
        int saveraw = SP_PARM->_raw;
        int savenl = SP_PARM->_nl;
 
+#ifdef USE_TERM_DRIVER
+       SP_PARM->_term = new_term;
+#endif
        if (saveecho) {
            NCURSES_SP_NAME(echo) (NCURSES_SP_ARG);
        } else {
index 7bf6ea4db581cc348090f65c043da686340301b2..e673524df076a2372a9abc9e43253c51056cfc7d 100644 (file)
 
 #include <curses.priv.h>
 
-#include <term.h>              /* cur_term */
 #include <tic.h>
 
 #ifndef CUR
 #define CUR SP_TERMTYPE
 #endif
 
-MODULE_ID("$Id: lib_set_term.c,v 1.124 2009/06/27 21:36:14 tom Exp $")
+MODULE_ID("$Id: lib_set_term.c,v 1.126 2009/09/05 18:18:10 tom Exp $")
+
+#ifdef USE_TERM_DRIVER
+#define MaxColors      InfoOf(sp).maxcolors
+#define NumLabels      InfoOf(sp).numlabels
+#else
+#define MaxColors      max_colors
+#define NumLabels      num_labels
+#endif
 
 NCURSES_EXPORT(SCREEN *)
 set_term(SCREEN *screenp)
@@ -66,7 +73,7 @@ set_term(SCREEN *screenp)
     newSP = SP;
 
     if (newSP != 0) {
-       set_curterm(newSP->_term);
+       TINFO_SET_CURTERM(newSP, newSP->_term);
 #if !USE_REENTRANT
        curscr = newSP->_curscr;
        newscr = newSP->_newscr;
@@ -75,7 +82,7 @@ set_term(SCREEN *screenp)
        COLOR_PAIRS = newSP->_pair_count;
 #endif
     } else {
-       set_curterm(0);
+       TINFO_SET_CURTERM(oldSP, 0);
 #if !USE_REENTRANT
        curscr = 0;
        newscr = 0;
@@ -134,6 +141,19 @@ delscreen(SCREEN *sp)
 
     _nc_lock_global(curses);
     if (delink_screen(sp)) {
+#ifdef USE_SP_RIPOFF
+       ripoff_t *rop;
+       if (safe_ripoff_sp && safe_ripoff_sp != safe_ripoff_stack) {
+           for (rop = safe_ripoff_stack;
+                rop != safe_ripoff_sp && (rop - safe_ripoff_stack) < N_RIPS;
+                rop++) {
+               if (rop->win) {
+                   (void) delwin(rop->win);
+                   rop->win = 0;
+               }
+           }
+       }
+#endif
 
        (void) _nc_freewin(sp->_curscr);
        (void) _nc_freewin(sp->_newscr);
@@ -181,7 +201,7 @@ delscreen(SCREEN *sp)
            free(sp->_setbuf);
        }
 
-       del_curterm(sp->_term);
+       NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx sp->_term);
        free(sp);
 
        /*
@@ -253,6 +273,41 @@ extract_fgbg(char *src, int *result)
 }
 #endif
 
+#if NCURSES_SP_FUNCS
+/*
+ * In case of handling multiple screens, we need to have a screen before
+ * initialization in setupscreen takes place.  This is to extend the substitute
+ * for some of the stuff in _nc_prescreen, especially for slk and ripoff
+ * handling which should be done per screen.
+ */
+NCURSES_EXPORT(SCREEN *)
+new_prescr(void)
+{
+    SCREEN *sp = _nc_alloc_screen_sp();
+    if (sp) {
+       sp->rsp = sp->rippedoff;
+       sp->_filtered = _nc_prescreen.filter_mode;
+       sp->_use_env = _nc_prescreen.use_env;
+#if NCURSES_NO_PADDING
+       sp->_no_padding = _nc_prescreen._no_padding;
+#endif
+       sp->slk_format = 0;
+       sp->_slk = 0;
+       sp->_prescreen = TRUE;
+       SP_PRE_INIT(sp);
+#if USE_REENTRANT
+       sp->_TABSIZE = _nc_prescreen._TABSIZE;
+       sp->_ESCDELAY = _nc_prescreen._ESCDELAY;
+#endif
+       _nc_set_screen(sp);
+    }
+    return sp;
+}
+#endif
+
+#define ReturnScreenError() _nc_set_screen(0); \
+                            returnCode(ERR)
+
 /* OS-independent screen initializations */
 NCURSES_EXPORT(int)
 _nc_setupscreen(int slines GCC_UNUSED,
@@ -303,6 +358,9 @@ _nc_setupscreen(int slines GCC_UNUSED,
     if (filtered) {
        slines = 1;
        SET_LINES(slines);
+#ifdef USE_TERM_DRIVER
+       CallDriver(sp, setfilter);
+#else
        clear_screen = 0;
        cursor_down = parm_down_cursor = 0;
        cursor_address = 0;
@@ -310,6 +368,7 @@ _nc_setupscreen(int slines GCC_UNUSED,
        row_address = 0;
 
        cursor_home = carriage_return;
+#endif
        T(("filter screensize %dx%d", LINES, COLS));
     }
 #ifdef __DJGPP__
@@ -375,9 +434,9 @@ _nc_setupscreen(int slines GCC_UNUSED,
        char sep1, sep2;
        int count = sscanf(env, "%d%c%d%c", &fg, &sep1, &bg, &sep2);
        if (count >= 1) {
-           SP->_default_fg = (fg >= 0 && fg < max_colors) ? fg : C_MASK;
+           SP->_default_fg = (fg >= 0 && fg < MaxColors) ? fg : C_MASK;
            if (count >= 3) {
-               SP->_default_bg = (bg >= 0 && bg < max_colors) ? bg : C_MASK;
+               SP->_default_bg = (bg >= 0 && bg < MaxColors) ? bg : C_MASK;
            }
            TR(TRACE_CHARPUT | TRACE_MOVE,
               ("from environment assumed fg=%d, bg=%d",
@@ -401,20 +460,20 @@ _nc_setupscreen(int slines GCC_UNUSED,
            p = extract_fgbg(p, &(SP->_default_bg));
        TR(TRACE_CHARPUT | TRACE_MOVE, ("decoded fg=%d, bg=%d",
                                        SP->_default_fg, SP->_default_bg));
-       if (SP->_default_fg >= max_colors) {
+       if (SP->_default_fg >= MaxColors) {
            if (set_a_foreground != ABSENT_STRING
                && !strcmp(set_a_foreground, "\033[3%p1%dm")) {
                set_a_foreground = "\033[3%?%p1%{8}%>%t9%e%p1%d%;m";
            } else {
-               SP->_default_fg %= max_colors;
+               SP->_default_fg %= MaxColors;
            }
        }
-       if (SP->_default_bg >= max_colors) {
+       if (SP->_default_bg >= MaxColors) {
            if (set_a_background != ABSENT_STRING
                && !strcmp(set_a_background, "\033[4%p1%dm")) {
                set_a_background = "\033[4%?%p1%{8}%>%t9%e%p1%d%;m";
            } else {
-               SP->_default_bg %= max_colors;
+               SP->_default_bg %= MaxColors;
            }
        }
     }
@@ -575,7 +634,7 @@ _nc_setupscreen(int slines GCC_UNUSED,
           formats (4-4 or 3-2-3) for which there may be some hardware
           support. */
        if (rop->hook == _nc_slk_initialize)
-           if (!(num_labels <= 0 || !SLK_STDFMT(slk_format)))
+           if (!(NumLabels <= 0 || !SLK_STDFMT(slk_format)))
                continue;
        if (rop->hook) {
            int count;
index 494f429dfb665c972be86fab5edb5e733f0d5134..5ec3df6b35e4bf78ae810fe4315ffe1787d49fa7 100644 (file)
@@ -45,7 +45,7 @@
 #define CUR SP_TERMTYPE
 #endif
 
-MODULE_ID("$Id: resizeterm.c,v 1.40 2009/07/04 18:38:49 tom Exp $")
+MODULE_ID("$Id: resizeterm.c,v 1.41 2009/08/30 16:18:58 tom Exp $")
 
 /*
  * If we're trying to be reentrant, do not want any local statics.
@@ -230,9 +230,9 @@ adjust_window(WINDOW *win, int ToLines, int ToCols, int stolen EXTRA_DCLS)
        if (rop->hook == _nc_slk_initialize)
            _nc_format_slks(
 #if NCURSES_SP_FUNCS
-               _nc_screen_of(win),
+                              _nc_screen_of(win),
 #endif
-               ToCols);
+                              ToCols);
     } else if (win->_begy >= bottom) {
        /*
         * If it is below the bottom of the new screen, move up by the same
@@ -351,7 +351,7 @@ NCURSES_SP_NAME(resize_term) (NCURSES_SP_DCLx int ToLines, int ToCols)
        returnCode(ERR);
     }
 
-    _nc_lock_global(curses);
+    _nc_nonsp_lock_global(curses);
 
     was_stolen = (screen_lines(SP_PARM) - SP_PARM->_lines_avail);
     if (NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_ARGx ToLines, ToCols)) {
@@ -418,7 +418,7 @@ NCURSES_SP_NAME(resize_term) (NCURSES_SP_DCLx int ToLines, int ToCols)
     SET_LINES(ToLines - was_stolen);
     SET_COLS(ToCols);
 
-    _nc_unlock_global(curses);
+    _nc_nonsp_unlock_global(curses);
 
     returnCode(result);
 }
@@ -428,9 +428,9 @@ NCURSES_EXPORT(int)
 resize_term(int ToLines, int ToCols)
 {
     int res = ERR;
-    _nc_lock_global(curses);
+    _nc_sp_lock_global(curses);
     res = NCURSES_SP_NAME(resize_term) (CURRENT_SCREEN, ToLines, ToCols);
-    _nc_unlock_global(curses);
+    _nc_sp_unlock_global(curses);
     return (res);
 }
 #endif
index 31f41a885c150036b2de6824794b9f3848cb27e2..444ad558ba244a045f65067bd7366e4e9e271448 100644 (file)
@@ -35,7 +35,7 @@
 
 
 /*
- * $Id: curses.priv.h,v 1.435 2009/08/22 22:33:25 tom Exp $
+ * $Id: curses.priv.h,v 1.436 2009/08/30 18:13:54 tom Exp $
  *
  *     curses.priv.h
  *
@@ -481,6 +481,36 @@ extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *);
 
 #endif /* USE_PTHREADS */
 
+/*
+ * When using sp-funcs, locks are targeted to SCREEN-level granularity.
+ * So the locking is done in the non-sp-func (which calls the sp-func) rather
+ * than in the sp-func itself.
+ *
+ * Use the _nc_nonsp_XXX functions in the function using "NCURSES_SP_NAME()".
+ * Use the _nc_sp_XXX functions in the function using "#if NCURSES_SP_FUNCS".
+ */
+#if NCURSES_SP_FUNCS
+
+#define _nc_nonsp_lock_global(name)    /* nothing */
+#define _nc_nonsp_try_global(name)    0
+#define _nc_nonsp_unlock_global(name)  /* nothing */
+
+#define _nc_sp_lock_global(name)       _nc_lock_global(name)
+#define _nc_sp_try_global(name)         _nc_try_global(name)
+#define _nc_sp_unlock_global(name)     _nc_unlock_global(name)
+
+#else
+
+#define _nc_nonsp_lock_global(name)    _nc_lock_global(name)
+#define _nc_nonsp_try_global(name)      _nc_try_global(name)
+#define _nc_nonsp_unlock_global(name)  _nc_unlock_global(name)
+
+#define _nc_sp_lock_global(name)       /* nothing */
+#define _nc_sp_try_global(name)    0
+#define _nc_sp_unlock_global(name)     /* nothing */
+
+#endif
+
 #if HAVE_GETTIMEOFDAY
 # define PRECISE_GETTIME 1
 # define TimeType struct timeval
@@ -2057,7 +2087,6 @@ extern NCURSES_EXPORT(WINDOW *) _nc_stdscr_of(SCREEN*);
 extern NCURSES_EXPORT(int)      _nc_outc_wrapper(SCREEN*,int);
 
 #if USE_REENTRANT
-extern NCURSES_EXPORT(char *)    NCURSES_SP_NAME(_nc_ttytype)(SCREEN*);
 extern NCURSES_EXPORT(int)       NCURSES_SP_NAME(_nc_TABSIZE)(SCREEN*);
 extern NCURSES_EXPORT(char *)    NCURSES_SP_NAME(longname)(SCREEN*);
 #endif
index d2562767f7fbae132d62e466dd85bfe4b005da1d..8c016eaaaa21a50c58d398c084d8f4f8339b83ea 100644 (file)
@@ -40,7 +40,7 @@
 #include <term_entry.h>                /* TTY, cur_term */
 #include <termcap.h>           /* ospeed */
 
-MODULE_ID("$Id: lib_cur_term.c,v 1.24 2009/08/22 22:37:13 tom Exp $")
+MODULE_ID("$Id: lib_cur_term.c,v 1.26 2009/09/05 18:05:27 tom Exp $")
 
 #undef CUR
 #define CUR termp->type.
index 2cab9baf18ffcd0df5a9194d60e6c888cee1e43c..1cc367cd4c4e62c6b40b503a31282d1cf32d7a16 100644 (file)
@@ -52,9 +52,7 @@
 #include <locale.h>
 #endif
 
-#include <term.h>              /* lines, columns, cur_term */
-
-MODULE_ID("$Id: lib_setup.c,v 1.117 2009/06/06 17:56:31 tom Exp $")
+MODULE_ID("$Id: lib_setup.c,v 1.119 2009/09/05 20:10:02 tom Exp $")
 
 /****************************************************************************
  *
@@ -110,37 +108,58 @@ MODULE_ID("$Id: lib_setup.c,v 1.117 2009/06/06 17:56:31 tom Exp $")
  * Wrap global variables in this module.
  */
 #if USE_REENTRANT
+
 NCURSES_EXPORT(char *)
 NCURSES_PUBLIC_VAR(ttytype) (void)
 {
     static char empty[] = "";
-    return cur_term ? cur_term->type.term_names : empty;
+    char *result = empty;
+
+#if NCURSES_SP_FUNCS
+    if (CURRENT_SCREEN) {
+       TERMINAL *termp = TerminalOf(CURRENT_SCREEN);
+       if (termp != 0) {
+           result = termp->type.term_names;
+       }
+    }
+#else
+    if (cur_term != 0) {
+       result = cur_term->type.term_names;
+    }
+#endif
+    return result;
 }
+
 NCURSES_EXPORT(int *)
 _nc_ptr_Lines(SCREEN *sp)
 {
     return ptrLines(sp);
 }
+
 NCURSES_EXPORT(int)
 NCURSES_PUBLIC_VAR(LINES) (void)
 {
     return *_nc_ptr_Lines(CURRENT_SCREEN);
 }
+
 NCURSES_EXPORT(int *)
 _nc_ptr_Cols(SCREEN *sp)
 {
     return ptrCols(sp);
 }
+
 NCURSES_EXPORT(int)
 NCURSES_PUBLIC_VAR(COLS) (void)
 {
     return *_nc_ptr_Cols(CURRENT_SCREEN);
 }
+
 NCURSES_EXPORT(int *)
 _nc_ptr_Tabsize(SCREEN *sp)
 {
     return ptrTabsize(sp);
 }
+
 NCURSES_EXPORT(int)
 NCURSES_PUBLIC_VAR(TABSIZE) (void)
 {
@@ -205,12 +224,14 @@ _nc_handle_sigwinch(SCREEN *sp)
 NCURSES_EXPORT(void)
 NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f)
 {
-    T((T_CALLED("use_env()")));
+    T((T_CALLED("use_env(%p,%d)"), SP_PARM, (int) f));
+#if NCURSES_SP_FUNCS
     if (IsPreScreen(SP_PARM)) {
        SP_PARM->_use_env = f;
-    } else {
-       _nc_prescreen.use_env = f;
     }
+#else
+    _nc_prescreen.use_env = f;
+#endif
     returnVoid;
 }
 
@@ -218,14 +239,39 @@ NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f)
 NCURSES_EXPORT(void)
 use_env(bool f)
 {
-    NCURSES_SP_NAME(use_env) (CURRENT_SCREEN, f);
+    T((T_CALLED("use_env(%d)"), (int) f));
+    _nc_prescreen.use_env = f;
+    returnVoid;
 }
 #endif
 
 NCURSES_EXPORT(void)
-_nc_get_screensize(SCREEN *sp, int *linep, int *colp)
+_nc_get_screensize(SCREEN *sp,
+#ifdef USE_TERM_DRIVER
+                  TERMINAL * termp,
+#endif
+                  int *linep, int *colp)
 /* Obtain lines/columns values from the environment and/or terminfo entry */
 {
+#ifdef USE_TERM_DRIVER
+    TERMINAL_CONTROL_BLOCK *TCB;
+    int my_tabsize;
+
+    assert(termp != 0 && linep != 0 && colp != 0);
+    TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+
+    my_tabsize = TCB->info.tabsize;
+    TCB->drv->size(TCB, linep, colp);
+
+#if USE_REENTRANT
+    if (sp != 0) {
+       sp->_TABSIZE = my_tabsize;
+    }
+#else
+    TABSIZE = my_tabsize;
+#endif
+    T(("TABSIZE = %d", my_tabsize));
+#else /* !USE_TERM_DRIVER */
     TERMINAL *termp = cur_term;
     int my_tabsize;
 
@@ -325,19 +371,31 @@ _nc_get_screensize(SCREEN *sp, int *linep, int *colp)
     TABSIZE = my_tabsize;
 #endif
     T(("TABSIZE = %d", TABSIZE));
+#endif /* USE_TERM_DRIVER */
 }
 
 #if USE_SIZECHANGE
 NCURSES_EXPORT(void)
 _nc_update_screensize(SCREEN *sp)
 {
+    int new_lines;
+    int new_cols;
+
+#ifdef USE_TERM_DRIVER
+    int old_lines;
+    int old_cols;
+
+    assert(sp != 0);
+
+    CallDriver_2(sp, getsize, &old_lines, &old_cols);
+
+#else
     TERMINAL *termp = cur_term;
     int old_lines = lines;
-    int new_lines;
     int old_cols = columns;
-    int new_cols;
+#endif
 
-    _nc_get_screensize(sp, &new_lines, &new_cols);
+    TINFO_GET_SIZE(sp, sp->_term, &new_lines, &new_cols);
 
     /*
      * See is_term_resized() and resizeterm().
@@ -375,6 +433,7 @@ _nc_update_screensize(SCREEN *sp)
                                            exit(EXIT_FAILURE);\
                                        }
 
+#ifndef USE_TERM_DRIVER
 #if USE_DATABASE || USE_TERMCAP
 /*
  * Return 1 if entry found, 0 if not found, -1 if database not accessible,
@@ -434,6 +493,7 @@ do_prototype(TERMINAL * termp)
        }
     }
 }
+#endif /* !USE_TERM_DRIVER */
 
 /*
  * Find the locale which is in effect.
@@ -513,18 +573,37 @@ _nc_locale_breaks_acs(TERMINAL * termp)
     return 0;
 }
 
-/*
- * This entrypoint is called from tgetent() to allow a special case of reusing
- * the same TERMINAL data (see comment).
- */
 NCURSES_EXPORT(int)
-_nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse)
+TINFO_SETUP_TERM(TERMINAL ** tp,
+                NCURSES_CONST char *tname,
+                int Filedes,
+                int *errret,
+                bool reuse)
 {
-    TERMINAL *termp;
+#ifdef USE_TERM_DRIVER
+    TERMINAL_CONTROL_BLOCK *TCB = 0;
+#else
     int status;
+#endif
+    TERMINAL *termp;
+    SCREEN *sp = 0;
+    int code = ERR;
 
     START_TRACE();
+
+#ifdef USE_TERM_DRIVER
+    T((T_CALLED("_nc_setupterm_ex(%p,%s,%d,%p)"),
+       tp, _nc_visbuf(tname), Filedes, errret));
+
+    if (tp == 0) {
+       ret_error0(TGETENT_ERR,
+                  "Invalid parameter, internal error.\n");
+    } else
+       termp = *tp;
+#else
+    termp = cur_term;
     T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, errret));
+#endif
 
     if (tname == 0) {
        tname = getenv("TERM");
@@ -565,20 +644,34 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse)
      * properly with this feature).
      */
     if (reuse
-       && (termp = cur_term) != 0
+       && (termp != 0)
        && termp->Filedes == Filedes
        && termp->_termname != 0
        && !strcmp(termp->_termname, tname)
        && _nc_name_match(termp->type.term_names, tname, "|")) {
        T(("reusing existing terminal information and mode-settings"));
+       code = OK;
     } else {
-
+#ifdef USE_TERM_DRIVER
+       termp = (TERMINAL *) typeCalloc(TERMINAL_CONTROL_BLOCK, 1);
+#else
        termp = typeCalloc(TERMINAL, 1);
-
+#endif
        if (termp == 0) {
            ret_error0(TGETENT_ERR,
                       "Not enough memory to create terminal structure.\n");
        }
+#ifdef USE_TERM_DRIVER
+       TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+       code = _nc_get_driver(TCB, tname, errret);
+       if (code == OK) {
+           termp->Filedes = Filedes;
+           termp->_termname = strdup(tname);
+       } else {
+           ret_error0(TGETENT_ERR,
+                      "Could not find any driver to handle this terminal.\n");
+       }
+#else
 #if USE_DATABASE || USE_TERMCAP
        status = grab_entry(tname, &termp->type);
 #else
@@ -626,25 +719,57 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse)
            def_prog_mode();
            baudrate();
        }
+       code = OK;
+#endif
     }
 
+#ifdef USE_TERM_DRIVER
+    *tp = termp;
+    NCURSES_SP_NAME(set_curterm) (sp, termp);
+    TCB->drv->init(TCB);
+#else
+    sp = SP;
+#endif
+
     /*
      * We should always check the screensize, just in case.
      */
-    _nc_get_screensize(SP, ptrLines(SP), ptrCols(SP));
+    TINFO_GET_SIZE(sp, termp, ptrLines(sp), ptrCols(sp));
 
     if (errret)
        *errret = TGETENT_YES;
 
+#ifndef USE_TERM_DRIVER
     if (generic_type) {
        ret_error(TGETENT_NO, "'%s': I need something more specific.\n", tname);
     }
     if (hard_copy) {
        ret_error(TGETENT_YES, "'%s': I can't handle hardcopy terminals.\n", tname);
     }
-    returnCode(OK);
+#endif
+    returnCode(code);
 }
 
+#ifdef USE_TERM_DRIVER
+/*
+ * This entrypoint is called from tgetent() to allow a special case of reusing
+ * the same TERMINAL data (see comment).
+ */
+NCURSES_EXPORT(int)
+_nc_setupterm(NCURSES_CONST char *tname,
+             int Filedes,
+             int *errret,
+             bool reuse)
+{
+    int res;
+    TERMINAL *termp;
+    res = TINFO_SETUP_TERM(&termp, tname, Filedes, errret, reuse);
+    if (ERR != res)
+       NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN_PRE, termp);
+    return res;
+}
+#endif
+
 /*
  *     setupterm(termname, Filedes, errret)
  *
index 064383dbd5cca12b47fea85f9d83611b35c5de04..92cd451b878d9e492e2457eff4f6ee0961878073 100644 (file)
@@ -50,7 +50,7 @@
 #define CUR SP_TERMTYPE
 #endif
 
-MODULE_ID("$Id: lib_termcap.c,v 1.69 2009/07/11 18:14:21 tom Exp $")
+MODULE_ID("$Id: lib_termcap.c,v 1.70 2009/08/30 17:16:00 tom Exp $")
 
 NCURSES_EXPORT_VAR(char *) UP = 0;
 NCURSES_EXPORT_VAR(char *) BC = 0;
@@ -93,15 +93,13 @@ NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name)
     START_TRACE();
     T((T_CALLED("tgetent()")));
 
-#ifdef USE_TERM_DRIVER
-    _nc_setupterm_ex(&termp, (NCURSES_CONST char *) name,
+    TINFO_SETUP_TERM(&termp, (NCURSES_CONST char *) name,
                     STDOUT_FILENO, &errcode, TRUE);
 
+#ifdef USE_TERM_DRIVER
     if (termp == 0 ||
        !((TERMINAL_CONTROL_BLOCK *) termp)->drv->isTerminfo)
        return (errcode);
-#else
-    _nc_setupterm((NCURSES_CONST char *) name, STDOUT_FILENO, &errcode, TRUE);
 #endif
 
     /*
index c4f482384730e6a5d66e879d80afe44fe84048a7..2b6ea7aefec766c34cb71a8fc4baabb9ae7dfb8f 100644 (file)
 #define CUR SP_TERMTYPE
 #endif
 
-MODULE_ID("$Id: lib_mvcur.c,v 1.120 2009/05/10 00:52:29 tom Exp $")
+MODULE_ID("$Id: lib_mvcur.c,v 1.121 2009/08/30 16:52:00 tom Exp $")
 
 #define WANT_CHAR(sp, y, x) (sp)->_newscr->_line[y].text[x]    /* desired state */
+
+#if NCURSES_SP_FUNCS
+#define BAUDRATE(sp)   sp->_term->_baudrate    /* bits per second */
+#else
 #define BAUDRATE(sp)   cur_term->_baudrate     /* bits per second */
+#endif
 
 #if defined(MAIN) || defined(NCURSES_TEST)
 #include <sys/time.h>
@@ -279,6 +284,9 @@ NCURSES_EXPORT(void)
 NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_DCL0)
 /* what to do at initialization time and after each shellout */
 {
+    if (SP_PARM && !IsTermInfo(SP_PARM))
+       return;
+
     /* initialize screen for cursor access */
     if (enter_ca_mode) {
        NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx
@@ -451,7 +459,6 @@ NCURSES_EXPORT(void)
 _nc_mvcur_init(void)
 {
     NCURSES_SP_NAME(_nc_mvcur_init) (CURRENT_SCREEN);
-    _nc_mvcur_resume();
 }
 #endif
 
@@ -460,7 +467,10 @@ NCURSES_SP_NAME(_nc_mvcur_wrap) (NCURSES_SP_DCL0)
 /* wrap up cursor-addressing mode */
 {
     /* leave cursor at screen bottom */
-    mvcur(-1, -1, screen_lines(CURRENT_SCREEN) - 1, 0);
+    TINFO_MVCUR(NCURSES_SP_ARGx -1, -1, screen_lines(SP_PARM) - 1, 0);
+
+    if (SP_PARM && !IsTermInfo(SP_PARM))
+       return;
 
     /* set cursor to normal mode */
     if (SP_PARM->_cursor != -1) {
@@ -932,16 +942,15 @@ onscreen_mvcur(NCURSES_SP_DCLx int yold, int xold, int ynew, int xnew, bool ovw)
        return (ERR);
 }
 
-/* optimized cursor move from (yold, xold) to (ynew, xnew) */
 NCURSES_EXPORT(int)
-NCURSES_SP_NAME(mvcur) (NCURSES_SP_DCLx
-                       int yold, int xold, int ynew, int xnew)
+TINFO_MVCUR(NCURSES_SP_DCLx int yold, int xold, int ynew, int xnew)
+/* optimized cursor move from (yold, xold) to (ynew, xnew) */
 {
     NCURSES_CH_T oldattr;
     int code;
 
-    TR(TRACE_CALLS | TRACE_MOVE, (T_CALLED("mvcur(%d,%d,%d,%d)"),
-                                 yold, xold, ynew, xnew));
+    TR(TRACE_CALLS | TRACE_MOVE, (T_CALLED("_nc_tinfo_mvcur(%p,%d,%d,%d,%d)"),
+                                 SP_PARM, yold, xold, ynew, xnew));
 
     if (SP_PARM == 0) {
        code = ERR;
@@ -1032,7 +1041,7 @@ NCURSES_SP_NAME(mvcur) (NCURSES_SP_DCLx
     returnCode(code);
 }
 
-#if NCURSES_SP_FUNCS
+#if NCURSES_SP_FUNCS && !defined(USE_TERM_DRIVER)
 NCURSES_EXPORT(int)
 mvcur(int yold, int xold, int ynew, int xnew)
 {