Module Name:    src
Committed By:   blymn
Date:           Mon May 20 22:17:41 UTC 2019

Modified Files:
        src/lib/libcurses: add_wch.c add_wchstr.c addbytes.c addch.c
            addchnstr.c addnstr.c addwstr.c copywin.c cr_put.c curses_private.h
            delch.c erase.c fileio.h get_wch.c get_wstr.c getch.c getstr.c
            in_wch.c in_wchstr.c inch.c inchstr.c ins_wch.c ins_wstr.c insch.c
            insstr.c instr.c inwstr.c line.c move.c newwin.c printw.c putchar.c
            refresh.c scroll.c

Log Message:
Back out incorrect fix for PR 53617 and fix it in a different way.
Keep track of the cursor location, if getch is called without a refresh
and without pending updates (dirty windows) then move the cursor to the
correct location directly.  Doing this prevents unnecessary refreshes.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/lib/libcurses/add_wch.c
cvs rdiff -u -r1.6 -r1.7 src/lib/libcurses/add_wchstr.c \
    src/lib/libcurses/addchnstr.c src/lib/libcurses/get_wstr.c \
    src/lib/libcurses/in_wchstr.c src/lib/libcurses/inwstr.c
cvs rdiff -u -r1.50 -r1.51 src/lib/libcurses/addbytes.c
cvs rdiff -u -r1.19 -r1.20 src/lib/libcurses/addch.c src/lib/libcurses/move.c
cvs rdiff -u -r1.15 -r1.16 src/lib/libcurses/addnstr.c
cvs rdiff -u -r1.4 -r1.5 src/lib/libcurses/addwstr.c
cvs rdiff -u -r1.17 -r1.18 src/lib/libcurses/copywin.c
cvs rdiff -u -r1.33 -r1.34 src/lib/libcurses/cr_put.c
cvs rdiff -u -r1.69 -r1.70 src/lib/libcurses/curses_private.h
cvs rdiff -u -r1.24 -r1.25 src/lib/libcurses/delch.c \
    src/lib/libcurses/scroll.c
cvs rdiff -u -r1.26 -r1.27 src/lib/libcurses/erase.c
cvs rdiff -u -r1.5 -r1.6 src/lib/libcurses/fileio.h \
    src/lib/libcurses/in_wch.c src/lib/libcurses/insstr.c \
    src/lib/libcurses/instr.c
cvs rdiff -u -r1.21 -r1.22 src/lib/libcurses/get_wch.c
cvs rdiff -u -r1.71 -r1.72 src/lib/libcurses/getch.c
cvs rdiff -u -r1.25 -r1.26 src/lib/libcurses/getstr.c
cvs rdiff -u -r1.12 -r1.13 src/lib/libcurses/inch.c \
    src/lib/libcurses/ins_wch.c src/lib/libcurses/ins_wstr.c
cvs rdiff -u -r1.8 -r1.9 src/lib/libcurses/inchstr.c
cvs rdiff -u -r1.23 -r1.24 src/lib/libcurses/insch.c
cvs rdiff -u -r1.9 -r1.10 src/lib/libcurses/line.c
cvs rdiff -u -r1.55 -r1.56 src/lib/libcurses/newwin.c
cvs rdiff -u -r1.27 -r1.28 src/lib/libcurses/printw.c
cvs rdiff -u -r1.22 -r1.23 src/lib/libcurses/putchar.c
cvs rdiff -u -r1.109 -r1.110 src/lib/libcurses/refresh.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libcurses/add_wch.c
diff -u src/lib/libcurses/add_wch.c:1.7 src/lib/libcurses/add_wch.c:1.8
--- src/lib/libcurses/add_wch.c:1.7	Wed Apr 24 07:09:44 2019
+++ src/lib/libcurses/add_wch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: add_wch.c,v 1.7 2019/04/24 07:09:44 blymn Exp $ */
+/*   $NetBSD: add_wch.c,v 1.8 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: add_wch.c,v 1.7 2019/04/24 07:09:44 blymn Exp $");
+__RCSID("$NetBSD: add_wch.c,v 1.8 2019/05/20 22:17:41 blymn Exp $");
 #endif /* not lint */
 
 #include <stdlib.h>
@@ -76,7 +76,7 @@ mvadd_wch(int y, int x, const cchar_t *w
 int
 mvwadd_wch(WINDOW *win, int y, int x, const cchar_t *wch)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wadd_wch(win, wch);
@@ -92,11 +92,12 @@ mvwadd_wch(WINDOW *win, int y, int x, co
 int
 wadd_wch(WINDOW *win, const cchar_t *wch)
 {
-	int x = win->curx, y = win->cury;
+	int y = win->cury;
 	__LINE *lnp = NULL;
 
 #ifdef DEBUG
 	int i;
+	int x = win->curx;
 
 	for (i = 0; i < win->maxy; i++) {
 		assert(win->alines[i]->sentinel == SENTINEL_VALUE);
@@ -105,5 +106,5 @@ wadd_wch(WINDOW *win, const cchar_t *wch
 	    win, x, y);
 #endif
 	lnp = win->alines[y];
-	return _cursesi_addwchar(win, &lnp, &y, &x, wch, 1);
+	return _cursesi_addwchar(win, &lnp, &(win->cury), &(win->curx), wch, 1);
 }

Index: src/lib/libcurses/add_wchstr.c
diff -u src/lib/libcurses/add_wchstr.c:1.6 src/lib/libcurses/add_wchstr.c:1.7
--- src/lib/libcurses/add_wchstr.c:1.6	Thu Nov 22 22:16:45 2018
+++ src/lib/libcurses/add_wchstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: add_wchstr.c,v 1.6 2018/11/22 22:16:45 uwe Exp $ */
+/*   $NetBSD: add_wchstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: add_wchstr.c,v 1.6 2018/11/22 22:16:45 uwe Exp $");
+__RCSID("$NetBSD: add_wchstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $");
 #endif				/* not lint */
 
 #include <stdlib.h>
@@ -120,7 +120,7 @@ mvadd_wchnstr(int y, int x, const cchar_
 int
 mvwadd_wchnstr(WINDOW *win, int y, int x, const cchar_t *wchstr, int n)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wadd_wchnstr(win, wchstr, n);
Index: src/lib/libcurses/addchnstr.c
diff -u src/lib/libcurses/addchnstr.c:1.6 src/lib/libcurses/addchnstr.c:1.7
--- src/lib/libcurses/addchnstr.c:1.6	Sat Nov  9 11:16:59 2013
+++ src/lib/libcurses/addchnstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: addchnstr.c,v 1.6 2013/11/09 11:16:59 blymn Exp $	*/
+/*	$NetBSD: addchnstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: addchnstr.c,v 1.6 2013/11/09 11:16:59 blymn Exp $");
+__RCSID("$NetBSD: addchnstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $");
 #endif				/* not lint */
 
 #include <stdlib.h>
@@ -111,7 +111,7 @@ mvaddchnstr(int y, int x, const chtype *
 int
 mvwaddchnstr(WINDOW *win, int y, int x, const chtype *chstr, int n)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return waddchnstr(win, chstr, n);
@@ -180,6 +180,6 @@ waddchnstr(WINDOW *win, const chtype *ch
 	*cp = '\0';
 	ret = _cursesi_waddbytes(win, start, i, attr, 0);
 	free(ocp);
-	wmove(win, oy, ox);
+	_cursesi_wmove(win, oy, ox, 1);
 	return ret;
 }
Index: src/lib/libcurses/get_wstr.c
diff -u src/lib/libcurses/get_wstr.c:1.6 src/lib/libcurses/get_wstr.c:1.7
--- src/lib/libcurses/get_wstr.c:1.6	Sun Feb 24 20:20:18 2019
+++ src/lib/libcurses/get_wstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: get_wstr.c,v 1.6 2019/02/24 20:20:18 roy Exp $ */
+/*   $NetBSD: get_wstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: get_wstr.c,v 1.6 2019/02/24 20:20:18 roy Exp $");
+__RCSID("$NetBSD: get_wstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include "curses.h"
@@ -98,7 +98,7 @@ mvget_wstr(int y, int x, wchar_t *wstr)
 int
 mvwgetn_wstr(WINDOW *win, int y, int x, wchar_t *wstr, int n)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wgetn_wstr(win, wstr, n);
@@ -113,7 +113,7 @@ __warn_references(mvget_wstr,
 int
 mvwget_wstr(WINDOW *win, int y, int x, wchar_t *wstr)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wget_wstr(win, wstr);
@@ -188,7 +188,7 @@ __wgetn_wstr(WINDOW *win, wchar_t *wstr,
 				if ((wchar_t)wc == ec) {
 					mvwadd_wch(win, win->cury,
 						win->curx, &cc);
-					wmove(win, win->cury, win->curx - 1);
+					_cursesi_wmove(win, win->cury, win->curx - 1, 1);
 				}
 				if (wc == KEY_BACKSPACE || wc == KEY_LEFT) {
 					/* getch() displays the key sequence */
@@ -196,7 +196,7 @@ __wgetn_wstr(WINDOW *win, wchar_t *wstr,
 						win->curx - 1, &cc);
 					mvwadd_wch(win, win->cury,
 						win->curx - 2, &cc);
-					wmove(win, win->cury, win->curx - 1);
+					_cursesi_wmove(win, win->cury, win->curx - 1, 1);
 				}
 				wstr--;
 				if (n != -1) {
@@ -208,7 +208,7 @@ __wgetn_wstr(WINDOW *win, wchar_t *wstr,
 					/* getch() displays the other keys */
 					mvwadd_wch(win, win->cury,
 						win->curx - 1, &cc);
-				wmove(win, win->cury, oldx);
+				_cursesi_wmove(win, win->cury, oldx, 1);
 			}
 		} else if (wc == kc) {
 			*wstr = L'\0';
@@ -219,29 +219,29 @@ __wgetn_wstr(WINDOW *win, wchar_t *wstr,
 				while (wstr != ostr) {
 					mvwadd_wch(win, win->cury,
 						win->curx - 1, &cc);
-					wmove(win, win->cury, win->curx - 1);
+					_cursesi_wmove(win, win->cury, win->curx - 1, 1);
 					wstr--;
 					if (n != -1)
 						/* We're counting chars */
 						remain++;
 				}
 				mvwadd_wch(win, win->cury, win->curx - 1, &cc);
-				wmove(win, win->cury, win->curx - 1);
+				_cursesi_wmove(win, win->cury, win->curx - 1, 1);
 			} else
 				/* getch() displays the kill character */
 				mvwadd_wch( win, win->cury, oldx, &cc );
-			wmove(win, win->cury, oldx);
+			_cursesi_wmove(win, win->cury, oldx, 0);
 		} else if (wc >= KEY_MIN && wc <= KEY_MAX) {
 			/* get_wch() displays these characters */
 			mvwadd_wch( win, win->cury, win->curx - 1, &cc );
-			wmove(win, win->cury, win->curx - 1);
+			_cursesi_wmove(win, win->cury, win->curx - 1, 1);
 		} else {
 			if (remain) {
 				wstr++;
 				remain--;
 			} else {
 				mvwadd_wch(win, win->cury, win->curx - 1, &cc);
-				wmove(win, win->cury, win->curx - 1);
+				_cursesi_wmove(win, win->cury, win->curx - 1, 1);
 			}
 		}
 	}
Index: src/lib/libcurses/in_wchstr.c
diff -u src/lib/libcurses/in_wchstr.c:1.6 src/lib/libcurses/in_wchstr.c:1.7
--- src/lib/libcurses/in_wchstr.c:1.6	Sun Feb 24 20:20:18 2019
+++ src/lib/libcurses/in_wchstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: in_wchstr.c,v 1.6 2019/02/24 20:20:18 roy Exp $ */
+/*   $NetBSD: in_wchstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: in_wchstr.c,v 1.6 2019/02/24 20:20:18 roy Exp $");
+__RCSID("$NetBSD: in_wchstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include "curses.h"
@@ -87,7 +87,7 @@ __warn_references(mvwin_wchstr,
 int
 mvwin_wchstr(WINDOW *win, int y, int x, cchar_t *wchstr)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return win_wchstr(win, wchstr);
@@ -96,7 +96,7 @@ mvwin_wchstr(WINDOW *win, int y, int x, 
 int
 mvwin_wchnstr(WINDOW *win, int y, int x, cchar_t *wchstr, int n)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return win_wchnstr(win, wchstr, n);
Index: src/lib/libcurses/inwstr.c
diff -u src/lib/libcurses/inwstr.c:1.6 src/lib/libcurses/inwstr.c:1.7
--- src/lib/libcurses/inwstr.c:1.6	Sun Feb 24 20:20:18 2019
+++ src/lib/libcurses/inwstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: inwstr.c,v 1.6 2019/02/24 20:20:18 roy Exp $ */
+/*   $NetBSD: inwstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: inwstr.c,v 1.6 2019/02/24 20:20:18 roy Exp $");
+__RCSID("$NetBSD: inwstr.c,v 1.7 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include "curses.h"
@@ -87,7 +87,7 @@ __warn_references(mvwinwstr,
 int
 mvwinwstr(WINDOW *win, int y, int x, wchar_t *wstr)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winwstr(win, wstr);
@@ -96,7 +96,7 @@ mvwinwstr(WINDOW *win, int y, int x, wch
 int
 mvwinnwstr(WINDOW *win, int y, int x, wchar_t *wstr, int n)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winnwstr(win, wstr, n);

Index: src/lib/libcurses/addbytes.c
diff -u src/lib/libcurses/addbytes.c:1.50 src/lib/libcurses/addbytes.c:1.51
--- src/lib/libcurses/addbytes.c:1.50	Sun May 12 02:29:00 2019
+++ src/lib/libcurses/addbytes.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: addbytes.c,v 1.50 2019/05/12 02:29:00 blymn Exp $	*/
+/*	$NetBSD: addbytes.c,v 1.51 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1987, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)addbytes.c	8.4 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: addbytes.c,v 1.50 2019/05/12 02:29:00 blymn Exp $");
+__RCSID("$NetBSD: addbytes.c,v 1.51 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -47,9 +47,9 @@ __RCSID("$NetBSD: addbytes.c,v 1.50 2019
 #endif
 
 #define	SYNCH_IN	{y = win->cury; x = win->curx;}
-#define	SYNCH_OUT	{win->cury = y; win->curx = x;}
+#define	SYNCH_OUT	{win->cury = y; win->curx = x; win->ocury = y; win->ocurx = x;}
 #define	PSYNCH_IN	{*y = win->cury; *x = win->curx;}
-#define	PSYNCH_OUT	{win->cury = *y; win->curx = *x;}
+#define	PSYNCH_OUT	{win->cury = *y; win->curx = *x; win->ocury = *y; win->ocurx = *x;}
 
 #ifndef _CURSES_USE_MACROS
 
@@ -94,7 +94,7 @@ int
 mvwaddbytes(WINDOW *win, int y, int x, const char *bytes, int count)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return _cursesi_waddbytes(win, bytes, count, 0, 1);
@@ -241,12 +241,14 @@ _cursesi_addbyte(WINDOW *win, __LINE **l
 		case '\r':
 			*x = 0;
 			win->curx = *x;
+			win->ocurx = *x;
 			return OK;
 
 		case '\b':
 			if (--(*x) < 0)
 				*x = 0;
 			win->curx = *x;
+			win->ocurx = *x;
 			return OK;
 		}
 	}
@@ -362,10 +364,12 @@ _cursesi_addwchar(WINDOW *win, __LINE **
 			if (--*x < 0)
 				*x = 0;
 			win->curx = *x;
+			win->ocurx = *x;
 			return OK;
 		case L'\r':
 			*x = 0;
 			win->curx = *x;
+			win->ocurx = *x;
 			return OK;
 		case L'\n':
 			wclrtoeol(win);
@@ -508,6 +512,7 @@ _cursesi_addwchar(WINDOW *win, __LINE **
 		(*lnp) = win->alines[*y];
 	}
 	win->cury = *y;
+	win->ocury = *y;
 
 	/* add spacing character */
 #ifdef DEBUG
@@ -597,10 +602,11 @@ _cursesi_addwchar(WINDOW *win, __LINE **
 		}
 		lp = &win->alines[*y]->line[0];
 		(*lnp) = win->alines[*y];
-		win->curx = *x;
-		win->cury = *y;
+		win->curx = win->ocurx = *x;
+		win->cury = win->ocury = *y;
 	} else {
 		win->curx = *x;
+		win->ocurx = *x;
 
 		/* clear the remining of the current characer */
 		if (*x && *x < win->maxx) {

Index: src/lib/libcurses/addch.c
diff -u src/lib/libcurses/addch.c:1.19 src/lib/libcurses/addch.c:1.20
--- src/lib/libcurses/addch.c:1.19	Mon Oct 29 01:19:54 2018
+++ src/lib/libcurses/addch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: addch.c,v 1.19 2018/10/29 01:19:54 uwe Exp $	*/
+/*	$NetBSD: addch.c,v 1.20 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)addch.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: addch.c,v 1.19 2018/10/29 01:19:54 uwe Exp $");
+__RCSID("$NetBSD: addch.c,v 1.20 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -74,7 +74,7 @@ int
 mvwaddch(WINDOW *win, int y, int x, chtype ch)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return waddch(win, ch);
Index: src/lib/libcurses/move.c
diff -u src/lib/libcurses/move.c:1.19 src/lib/libcurses/move.c:1.20
--- src/lib/libcurses/move.c:1.19	Wed Sep 26 18:51:45 2018
+++ src/lib/libcurses/move.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: move.c,v 1.19 2018/09/26 18:51:45 kamil Exp $	*/
+/*	$NetBSD: move.c,v 1.20 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)move.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: move.c,v 1.19 2018/09/26 18:51:45 kamil Exp $");
+__RCSID("$NetBSD: move.c,v 1.20 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -50,7 +50,7 @@ int
 move(int y, int x)
 {
 
-	return wmove(stdscr, y, x);
+	return _cursesi_wmove(stdscr, y, x, 1);
 }
 
 #endif
@@ -62,20 +62,34 @@ move(int y, int x)
 int
 wmove(WINDOW *win, int y, int x)
 {
+	return _cursesi_wmove(win, y, x, 1);
+}
+
+
+/*
+ * _cursesi_wmove:
+ *	Moves the cursor to the given point, if keep_old == 0 then
+ * update the old cursor position.
+ */
+int
+_cursesi_wmove(WINDOW *win, int y, int x, int keep_old)
+{
 
 #ifdef DEBUG
-	__CTRACE(__CTRACE_MISC, "wmove: (%d, %d)\n", y, x);
+	__CTRACE(__CTRACE_MISC, "_cursesi_wmove: (%d, %d), keep_old: %d\n", y, x, keep_old);
 #endif
 	if (x < 0 || y < 0)
 		return ERR;
 	if (x >= win->maxx || y >= win->maxy)
 		return ERR;
+
 	win->curx = x;
-	win->alines[win->cury]->flags &= ~__ISPASTEOL;
-	win->alines[win->cury]->flags |= __ISDIRTY;
 	win->cury = y;
-	win->alines[y]->flags &= ~__ISPASTEOL;
-	win->alines[y]->flags |= __ISDIRTY;
+	if (keep_old == 0) {
+		win->ocurx = x;
+		win->ocury = y;
+	}
+
 	return OK;
 }
 
@@ -84,8 +98,8 @@ wcursyncup(WINDOW *win)
 {
 
 	while (win->orig) {
-		wmove(win->orig, win->cury + win->begy - win->orig->begy,
-		      win->curx + win->begx - win->orig->begx);
+		_cursesi_wmove(win->orig, win->cury + win->begy - win->orig->begy,
+		      win->curx + win->begx - win->orig->begx, 0);
 		win = win->orig;
 	}
 }

Index: src/lib/libcurses/addnstr.c
diff -u src/lib/libcurses/addnstr.c:1.15 src/lib/libcurses/addnstr.c:1.16
--- src/lib/libcurses/addnstr.c:1.15	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/addnstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: addnstr.c,v 1.15 2017/01/06 13:53:18 roy Exp $	*/
+/*	$NetBSD: addnstr.c,v 1.16 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)addnstr.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: addnstr.c,v 1.15 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: addnstr.c,v 1.16 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -115,7 +115,7 @@ mvaddnstr(int y, int x, const char *str,
 int
 mvwaddnstr(WINDOW *win, int y, int x, const char *str, int count)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return waddnstr(win, str, count);

Index: src/lib/libcurses/addwstr.c
diff -u src/lib/libcurses/addwstr.c:1.4 src/lib/libcurses/addwstr.c:1.5
--- src/lib/libcurses/addwstr.c:1.4	Thu Nov 22 22:16:45 2018
+++ src/lib/libcurses/addwstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: addwstr.c,v 1.4 2018/11/22 22:16:45 uwe Exp $ */
+/*   $NetBSD: addwstr.c,v 1.5 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: addwstr.c,v 1.4 2018/11/22 22:16:45 uwe Exp $");
+__RCSID("$NetBSD: addwstr.c,v 1.5 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include <string.h>
@@ -114,7 +114,7 @@ mvaddnwstr(int y, int x, const wchar_t *
 int
 mvwaddnwstr(WINDOW *win, int y, int x, const wchar_t *str, int count)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return waddnwstr(win, str, count);

Index: src/lib/libcurses/copywin.c
diff -u src/lib/libcurses/copywin.c:1.17 src/lib/libcurses/copywin.c:1.18
--- src/lib/libcurses/copywin.c:1.17	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/copywin.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: copywin.c,v 1.17 2017/01/06 13:53:18 roy Exp $	*/
+/*	$NetBSD: copywin.c,v 1.18 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*-
  * Copyright (c) 1998-1999 Brett Lymn
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: copywin.c,v 1.17 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: copywin.c,v 1.18 2019/05/20 22:17:41 blymn Exp $");
 #endif				/* not lint */
 
 #include <ctype.h>
@@ -119,7 +119,7 @@ int copywin(const WINDOW *srcwin, WINDOW
 			 * background character
 			 */
 			if ((dooverlay && !isspace(sp->ch)) || !dooverlay) {
-				wmove(dstwin, dminrow, dcol);
+				_cursesi_wmove(dstwin, dminrow, dcol, 0);
 #ifdef DEBUG
 	__CTRACE(__CTRACE_WINDOW, "copywin: dcol = %d\n", dcol);
 #endif

Index: src/lib/libcurses/cr_put.c
diff -u src/lib/libcurses/cr_put.c:1.33 src/lib/libcurses/cr_put.c:1.34
--- src/lib/libcurses/cr_put.c:1.33	Mon Mar 20 18:19:34 2017
+++ src/lib/libcurses/cr_put.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: cr_put.c,v 1.33 2017/03/20 18:19:34 christos Exp $	*/
+/*	$NetBSD: cr_put.c,v 1.34 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)cr_put.c	8.3 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: cr_put.c,v 1.33 2017/03/20 18:19:34 christos Exp $");
+__RCSID("$NetBSD: cr_put.c,v 1.34 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -75,7 +75,7 @@ __mvcur(int ly, int lx, int y, int x, in
 {
 #ifdef DEBUG
 	__CTRACE(__CTRACE_OUTPUT,
-	    "mvcur: moving cursor from (%d, %d) to (%d, %d)\n", ly, lx, y, x);
+	    "mvcur: moving cursor from (%d, %d) to (%d, %d) in refresh %d\n", ly, lx, y, x, in_refresh);
 #endif
 	destcol = x;
 	destline = y;

Index: src/lib/libcurses/curses_private.h
diff -u src/lib/libcurses/curses_private.h:1.69 src/lib/libcurses/curses_private.h:1.70
--- src/lib/libcurses/curses_private.h:1.69	Mon Apr  1 11:39:15 2019
+++ src/lib/libcurses/curses_private.h	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: curses_private.h,v 1.69 2019/04/01 11:39:15 roy Exp $	*/
+/*	$NetBSD: curses_private.h,v 1.70 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*-
  * Copyright (c) 1998-2000 Brett Lymn
@@ -111,6 +111,7 @@ struct __window {		/* Window structure. 
 	struct __window	*nextp, *orig;	/* Subwindows list and parent. */
 	int begy, begx;			/* Window home. */
 	int cury, curx;			/* Current x, y coordinates. */
+	int ocury, ocurx;		/* Previous x, y coordinates. */
 	int maxy, maxx;			/* Maximum values for curx, cury. */
 	int reqy, reqx;			/* Size requested when created */
 	int ch_off;			/* x offset for firstch/lastch. */
@@ -351,6 +352,7 @@ void     _cursesi_reset_wacs(SCREEN *);
 #endif /* HAVE_WCHAR */
 void     _cursesi_resetterm(SCREEN *);
 int      _cursesi_setterm(char *, SCREEN *);
+int	_cursesi_wmove(WINDOW *, int, int, int);
 int	 __delay(void);
 unsigned int	 __hash_more(const void *, size_t, unsigned int);
 #define	__hash(s, len)	__hash_more((s), (len), 0u)

Index: src/lib/libcurses/delch.c
diff -u src/lib/libcurses/delch.c:1.24 src/lib/libcurses/delch.c:1.25
--- src/lib/libcurses/delch.c:1.24	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/delch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: delch.c,v 1.24 2017/01/06 13:53:18 roy Exp $	*/
+/*	$NetBSD: delch.c,v 1.25 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)delch.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: delch.c,v 1.24 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: delch.c,v 1.25 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -72,7 +72,7 @@ mvdelch(int y, int x)
 int
 mvwdelch(WINDOW *win, int y, int x)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wdelch(win);
Index: src/lib/libcurses/scroll.c
diff -u src/lib/libcurses/scroll.c:1.24 src/lib/libcurses/scroll.c:1.25
--- src/lib/libcurses/scroll.c:1.24	Fri Feb 10 06:25:28 2017
+++ src/lib/libcurses/scroll.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: scroll.c,v 1.24 2017/02/10 06:25:28 blymn Exp $	*/
+/*	$NetBSD: scroll.c,v 1.25 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)scroll.c	8.3 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: scroll.c,v 1.24 2017/02/10 06:25:28 blymn Exp $");
+__RCSID("$NetBSD: scroll.c,v 1.25 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -100,9 +100,9 @@ wscrl(WINDOW *win, int nlines)
 #ifdef DEBUG
 	__CTRACE(__CTRACE_WINDOW, "wscrl: y=%d\n", oy);
 #endif
-	wmove(win, win->scr_t, 0);
+	wmove(win, win->scr_t, 1);
 	winsdelln(win, 0 - nlines);
-	wmove(win, oy, ox);
+	_cursesi_wmove(win, oy, ox, 1);
 
 	if (win == curscr) {
 		__cputchar('\n');

Index: src/lib/libcurses/erase.c
diff -u src/lib/libcurses/erase.c:1.26 src/lib/libcurses/erase.c:1.27
--- src/lib/libcurses/erase.c:1.26	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/erase.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: erase.c,v 1.26 2017/01/06 13:53:18 roy Exp $	*/
+/*	$NetBSD: erase.c,v 1.27 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)erase.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: erase.c,v 1.26 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: erase.c,v 1.27 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -105,6 +105,6 @@ werase(WINDOW *win)
 	 * windows - this will result in the (intended) clearing of the
 	 * screen over the area covered by the window. */
 	__touchwin(win);
-	wmove(win, 0, 0);
+	_cursesi_wmove(win, 0, 0, 0);
 	return OK;
 }

Index: src/lib/libcurses/fileio.h
diff -u src/lib/libcurses/fileio.h:1.5 src/lib/libcurses/fileio.h:1.6
--- src/lib/libcurses/fileio.h:1.5	Fri Nov 16 10:12:00 2018
+++ src/lib/libcurses/fileio.h	Mon May 20 22:17:41 2019
@@ -1,6 +1,6 @@
 /*
  * Do not edit!  Automatically generated file:
- *   from: NetBSD: shlib_version,v 1.42 2017/01/02 12:38:16 roy Exp 
+ *   from: NetBSD: shlib_version,v 1.43 2018/11/16 10:12:00 blymn Exp 
  *   by  : NetBSD: genfileioh.awk,v 1.2 2008/05/02 11:13:02 martin Exp 
  */
 
Index: src/lib/libcurses/in_wch.c
diff -u src/lib/libcurses/in_wch.c:1.5 src/lib/libcurses/in_wch.c:1.6
--- src/lib/libcurses/in_wch.c:1.5	Thu Nov 22 22:16:45 2018
+++ src/lib/libcurses/in_wch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: in_wch.c,v 1.5 2018/11/22 22:16:45 uwe Exp $ */
+/*   $NetBSD: in_wch.c,v 1.6 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: in_wch.c,v 1.5 2018/11/22 22:16:45 uwe Exp $");
+__RCSID("$NetBSD: in_wch.c,v 1.6 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include "curses.h"
@@ -69,7 +69,7 @@ mvin_wch(int y, int x, cchar_t *wcval)
 int
 mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return win_wch(win, wcval);
Index: src/lib/libcurses/insstr.c
diff -u src/lib/libcurses/insstr.c:1.5 src/lib/libcurses/insstr.c:1.6
--- src/lib/libcurses/insstr.c:1.5	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/insstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: insstr.c,v 1.5 2017/01/06 13:53:18 roy Exp $ */
+/*   $NetBSD: insstr.c,v 1.6 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: insstr.c,v 1.5 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: insstr.c,v 1.6 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include <string.h>
@@ -100,7 +100,7 @@ int
 mvwinsstr(WINDOW *win, int y, int x, const char *str)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winsstr(stdscr, str);
@@ -114,7 +114,7 @@ int
 mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winsnstr(stdscr, str, n);
Index: src/lib/libcurses/instr.c
diff -u src/lib/libcurses/instr.c:1.5 src/lib/libcurses/instr.c:1.6
--- src/lib/libcurses/instr.c:1.5	Sun Feb 24 20:20:18 2019
+++ src/lib/libcurses/instr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: instr.c,v 1.5 2019/02/24 20:20:18 roy Exp $	*/
+/*	$NetBSD: instr.c,v 1.6 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: instr.c,v 1.5 2019/02/24 20:20:18 roy Exp $");
+__RCSID("$NetBSD: instr.c,v 1.6 2019/05/20 22:17:41 blymn Exp $");
 #endif				/* not lint */
 
 #include "curses.h"
@@ -92,7 +92,7 @@ __warn_references(mvwinstr,
 int
 mvwinstr(WINDOW *win, int y, int x, char *str)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winstr(win, str);
@@ -101,7 +101,7 @@ mvwinstr(WINDOW *win, int y, int x, char
 int
 mvwinnstr(WINDOW *win, int y, int x, char *str, int n)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winnstr(win, str, n);

Index: src/lib/libcurses/get_wch.c
diff -u src/lib/libcurses/get_wch.c:1.21 src/lib/libcurses/get_wch.c:1.22
--- src/lib/libcurses/get_wch.c:1.21	Thu Mar 14 00:36:06 2019
+++ src/lib/libcurses/get_wch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: get_wch.c,v 1.21 2019/03/14 00:36:06 rin Exp $ */
+/*   $NetBSD: get_wch.c,v 1.22 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: get_wch.c,v 1.21 2019/03/14 00:36:06 rin Exp $");
+__RCSID("$NetBSD: get_wch.c,v 1.22 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include <errno.h>
@@ -473,7 +473,7 @@ mvget_wch(int y, int x, wint_t *ch)
 int
 mvwget_wch(WINDOW *win, int y, int x, wint_t *ch)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wget_wch(win, ch);
@@ -608,7 +608,7 @@ wget_wch(WINDOW *win, wint_t *ch)
 					( inp == KEY_DC ||
 					  inp == KEY_BACKSPACE ||
 					  inp == KEY_LEFT )) {
-				wmove( win, win->cury, win->curx - 1 );
+				_cursesi_wmove( win, win->cury, win->curx - 1, 0 );
 				wdelch( win );
 			}
 		} else {

Index: src/lib/libcurses/getch.c
diff -u src/lib/libcurses/getch.c:1.71 src/lib/libcurses/getch.c:1.72
--- src/lib/libcurses/getch.c:1.71	Thu Mar 14 00:36:06 2019
+++ src/lib/libcurses/getch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: getch.c,v 1.71 2019/03/14 00:36:06 rin Exp $	*/
+/*	$NetBSD: getch.c,v 1.72 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)getch.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: getch.c,v 1.71 2019/03/14 00:36:06 rin Exp $");
+__RCSID("$NetBSD: getch.c,v 1.72 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif					/* not lint */
 
@@ -716,7 +716,7 @@ mvgetch(int y, int x)
 int
 mvwgetch(WINDOW *win, int y, int x)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wgetch(win);
@@ -820,6 +820,28 @@ wgetch(WINDOW *win)
 
 	if (is_wintouched(win))
 		wrefresh(win);
+	else {
+		if ((win->ocury != win->cury) || (win->ocurx != win->curx)) {
+#ifdef DEBUG
+			__CTRACE(__CTRACE_INPUT, "wgetch: ocury %d cury %d ocurx %d curx %d\n",
+			win->ocury, win->cury, win->ocurx, win->curx);
+#endif
+			/*
+			 * Just in case the window is not dirty but the
+			 * cursor was  moved, check and update the 
+			 * cursor location.
+			 */
+			mvcur(win->ocury + win->begy, win->ocurx + win->begx,
+		      	win->cury + win->begy, win->curx + win->begx);
+			_cursesi_screen->curscr->cury =
+			    win->cury + _cursesi_screen->curscr->begy;
+			_cursesi_screen->curscr->curx =
+			    win->curx + _cursesi_screen->curscr->begx;
+			win->ocurx = win->curx;
+			win->ocury = win->cury;
+		}
+	}
+
 #ifdef DEBUG
 	__CTRACE(__CTRACE_INPUT, "wgetch: __echoit = %d, "
 	    "__rawmode = %d, __nl = %d, flags = %#.4x, delay = %d\n",

Index: src/lib/libcurses/getstr.c
diff -u src/lib/libcurses/getstr.c:1.25 src/lib/libcurses/getstr.c:1.26
--- src/lib/libcurses/getstr.c:1.25	Sun Feb 24 20:20:18 2019
+++ src/lib/libcurses/getstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: getstr.c,v 1.25 2019/02/24 20:20:18 roy Exp $	*/
+/*	$NetBSD: getstr.c,v 1.26 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -35,7 +35,7 @@
 #if 0
 static char sccsid[] = "@(#)getstr.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: getstr.c,v 1.25 2019/02/24 20:20:18 roy Exp $");
+__RCSID("$NetBSD: getstr.c,v 1.26 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -98,7 +98,7 @@ mvgetstr(int y, int x, char *str)
 int
 mvwgetnstr(WINDOW *win, int y, int x, char *str, int n)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wgetnstr(win, str, n);
@@ -113,7 +113,7 @@ __warn_references(mvgetstr,
 int
 mvwgetstr(WINDOW *win, int y, int x, char *str)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wgetstr(win, str);
@@ -188,7 +188,7 @@ __wgetnstr(WINDOW *win, char *str, int n
 						mvwaddch(win, win->cury,
 						    xpos - 1, ' ');
 					if (win->curx > xpos - 1)
-						wmove(win, win->cury, xpos - 1);
+						_cursesi_wmove(win, win->cury, xpos - 1, 1);
 					xpos--;
 				}
 				if (c == KEY_BACKSPACE || c == KEY_LEFT) {
@@ -198,7 +198,7 @@ __wgetnstr(WINDOW *win, char *str, int n
 					mvwaddch(win, win->cury, win->curx - 1,
 					    ' ');
 					if (win->curx > xpos)
-						wmove(win, win->cury, xpos - 1);
+						_cursesi_wmove(win, win->cury, xpos - 1, 1);
 					xpos--;
 				}
 				str--;
@@ -211,7 +211,7 @@ __wgetnstr(WINDOW *win, char *str, int n
 				if (win->curx > oldx)
 					mvwaddch(win, win->cury, win->curx - 1,
 					    ' ');
-				wmove(win, win->cury, oldx);
+				_cursesi_wmove(win, win->cury, oldx, 1);
 				xpos = oldx;
 			}
 		} else if (c == kc) {
@@ -223,22 +223,22 @@ __wgetnstr(WINDOW *win, char *str, int n
 				while (str != ostr) {
 					mvwaddch(win, win->cury, win->curx - 1,
 					    ' ');
-					wmove(win, win->cury, win->curx - 1);
+					_cursesi_wmove(win, win->cury, win->curx - 1, 1);
 					str--;
 					if (n != -1)
 						/* We're counting chars */
 						remain++;
 				}
 				mvwaddch(win, win->cury, win->curx - 1, ' ');
-				wmove(win, win->cury, win->curx - 1);
+				_cursesi_wmove(win, win->cury, win->curx - 1, 1);
 			} else
 				/* getch() displays the kill character */
 				mvwaddch(win, win->cury, oldx, ' ');
-			wmove(win, win->cury, oldx);
+			_cursesi_wmove(win, win->cury, oldx, 1);
 		} else if (c >= KEY_MIN && c <= KEY_MAX) {
 			/* getch() displays these characters */
 			mvwaddch(win, win->cury, xpos, ' ');
-			wmove(win, win->cury, xpos);
+			_cursesi_wmove(win, win->cury, xpos, 1);
 		} else {
 			if (remain) {
 				if (iscntrl((unsigned char)c))
@@ -248,7 +248,7 @@ __wgetnstr(WINDOW *win, char *str, int n
 				remain--;
 			} else
 				mvwaddch(win, win->cury, xpos, ' ');
-			wmove(win, win->cury, xpos);
+			_cursesi_wmove(win, win->cury, xpos, 1);
 		}
 	}
 

Index: src/lib/libcurses/inch.c
diff -u src/lib/libcurses/inch.c:1.12 src/lib/libcurses/inch.c:1.13
--- src/lib/libcurses/inch.c:1.12	Sun Nov 18 22:34:32 2018
+++ src/lib/libcurses/inch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: inch.c,v 1.12 2018/11/18 22:34:32 uwe Exp $	*/
+/*	$NetBSD: inch.c,v 1.13 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: inch.c,v 1.12 2018/11/18 22:34:32 uwe Exp $");
+__RCSID("$NetBSD: inch.c,v 1.13 2019/05/20 22:17:41 blymn Exp $");
 #endif				/* not lint */
 
 #include "curses.h"
@@ -69,7 +69,7 @@ chtype
 mvwinch(WINDOW *win, int y, int x)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winch(win);
Index: src/lib/libcurses/ins_wch.c
diff -u src/lib/libcurses/ins_wch.c:1.12 src/lib/libcurses/ins_wch.c:1.13
--- src/lib/libcurses/ins_wch.c:1.12	Thu Nov 22 22:16:45 2018
+++ src/lib/libcurses/ins_wch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: ins_wch.c,v 1.12 2018/11/22 22:16:45 uwe Exp $ */
+/*   $NetBSD: ins_wch.c,v 1.13 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ins_wch.c,v 1.12 2018/11/22 22:16:45 uwe Exp $");
+__RCSID("$NetBSD: ins_wch.c,v 1.13 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include <string.h>
@@ -72,7 +72,7 @@ mvins_wch(int y, int x, const cchar_t *w
 int
 mvwins_wch(WINDOW *win, int y, int x, const cchar_t *wch)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wins_wch(stdscr, wch);
Index: src/lib/libcurses/ins_wstr.c
diff -u src/lib/libcurses/ins_wstr.c:1.12 src/lib/libcurses/ins_wstr.c:1.13
--- src/lib/libcurses/ins_wstr.c:1.12	Thu Nov 22 22:16:45 2018
+++ src/lib/libcurses/ins_wstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*   $NetBSD: ins_wstr.c,v 1.12 2018/11/22 22:16:45 uwe Exp $ */
+/*   $NetBSD: ins_wstr.c,v 1.13 2019/05/20 22:17:41 blymn Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ins_wstr.c,v 1.12 2018/11/22 22:16:45 uwe Exp $");
+__RCSID("$NetBSD: ins_wstr.c,v 1.13 2019/05/20 22:17:41 blymn Exp $");
 #endif						  /* not lint */
 
 #include <string.h>
@@ -93,7 +93,7 @@ mvins_nwstr(int y, int x, const wchar_t 
 int
 mvwins_wstr(WINDOW *win, int y, int x, const wchar_t *wstr)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wins_wstr(stdscr, wstr);
@@ -106,7 +106,7 @@ mvwins_wstr(WINDOW *win, int y, int x, c
 int
 mvwins_nwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n)
 {
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wins_nwstr(stdscr, wstr, n);

Index: src/lib/libcurses/inchstr.c
diff -u src/lib/libcurses/inchstr.c:1.8 src/lib/libcurses/inchstr.c:1.9
--- src/lib/libcurses/inchstr.c:1.8	Sun Feb 24 20:20:18 2019
+++ src/lib/libcurses/inchstr.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: inchstr.c,v 1.8 2019/02/24 20:20:18 roy Exp $	*/
+/*	$NetBSD: inchstr.c,v 1.9 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: inchstr.c,v 1.8 2019/02/24 20:20:18 roy Exp $");
+__RCSID("$NetBSD: inchstr.c,v 1.9 2019/05/20 22:17:41 blymn Exp $");
 #endif				/* not lint */
 
 #include "curses.h"
@@ -95,7 +95,7 @@ int
 mvwinchstr(WINDOW *win, int y, int x, chtype *chstr)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winchstr(win, chstr);
@@ -105,7 +105,7 @@ int
 mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winchnstr(win, chstr, n);

Index: src/lib/libcurses/insch.c
diff -u src/lib/libcurses/insch.c:1.23 src/lib/libcurses/insch.c:1.24
--- src/lib/libcurses/insch.c:1.23	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/insch.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: insch.c,v 1.23 2017/01/06 13:53:18 roy Exp $	*/
+/*	$NetBSD: insch.c,v 1.24 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)insch.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: insch.c,v 1.23 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: insch.c,v 1.24 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -76,7 +76,7 @@ int
 mvwinsch(WINDOW *win, int y, int x, chtype ch)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return winsch(stdscr, ch);
@@ -126,6 +126,7 @@ winsch(WINDOW *win, chtype ch)
 			wrefresh(win);
 			scroll(win);
 			win->cury--;
+			win->ocury = win->cury;
 		} else
 			return ERR;
 	}

Index: src/lib/libcurses/line.c
diff -u src/lib/libcurses/line.c:1.9 src/lib/libcurses/line.c:1.10
--- src/lib/libcurses/line.c:1.9	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/line.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: line.c,v 1.9 2017/01/06 13:53:18 roy Exp $	*/
+/*	$NetBSD: line.c,v 1.10 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*-
  * Copyright (c) 1998-1999 Brett Lymn
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: line.c,v 1.9 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: line.c,v 1.10 2019/05/20 22:17:41 blymn Exp $");
 #endif				/* not lint */
 
 #include <string.h>
@@ -71,7 +71,7 @@ int
 mvwhline(WINDOW *win, int y, int x, chtype ch, int count)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return whline(win, ch, count);
@@ -97,7 +97,7 @@ whline(WINDOW *win, chtype ch, int count
 	for (i = 0; i < n; i++)
 		mvwaddch(win, win->cury, ocurx + i, ch);
 
-	wmove(win, win->cury, ocurx);
+	_cursesi_wmove(win, win->cury, ocurx, 1);
 	return OK;
 #else
 	cchar_t cch, *cchp;
@@ -143,7 +143,7 @@ int
 mvwvline(WINDOW *win, int y, int x, chtype ch, int count)
 {
 
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wvline(win, ch, count);
@@ -170,7 +170,7 @@ wvline(WINDOW *win, chtype ch, int count
 	for (i = 0; i < n; i++)
 		mvwaddch(win, ocury + i, ocurx, ch);
 
-	wmove(win, ocury, ocurx);
+	_cursesi_wmove(win, ocury, ocurx, 1);
 	return OK;
 #else
 	cchar_t cch, *cchp;
@@ -208,7 +208,7 @@ int mvwhline_set(WINDOW *win, int y, int
 #ifndef HAVE_WCHAR
 	return ERR;
 #else
-	if ( wmove( win, y , x ) == ERR )
+	if ( _cursesi_wmove( win, y , x , 0) == ERR )
 		return ERR;
 
 	return whline_set( win, wch, n );
@@ -245,7 +245,7 @@ int whline_set(WINDOW *win, const cchar_
 		mvwadd_wch(win, win->cury, ocurx + i * cw, &cc);
 	}
 
-	wmove(win, win->cury, ocurx);
+	_cursesi_wmove(win, win->cury, ocurx, 1);
 	__sync(win);
 	return OK;
 #endif /* HAVE_WCHAR */
@@ -274,7 +274,7 @@ int mvwvline_set(WINDOW *win, int y, int
 #ifndef HAVE_WCHAR
 	return ERR;
 #else
-	if (wmove(win, y, x) == ERR)
+	if (_cursesi_wmove(win, y, x, 0) == ERR)
 		return ERR;
 
 	return wvline_set(win, wch, n);
@@ -307,7 +307,7 @@ int wvline_set(WINDOW *win, const cchar_
 #endif /* DEBUG */
 	}
 
-	wmove(win, ocury, ocurx);
+	_cursesi_wmove(win, ocury, ocurx, 1);
 	__sync(win);
 	return OK;
 #endif /* HAVE_WCHAR */

Index: src/lib/libcurses/newwin.c
diff -u src/lib/libcurses/newwin.c:1.55 src/lib/libcurses/newwin.c:1.56
--- src/lib/libcurses/newwin.c:1.55	Mon Apr  1 11:39:15 2019
+++ src/lib/libcurses/newwin.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: newwin.c,v 1.55 2019/04/01 11:39:15 roy Exp $	*/
+/*	$NetBSD: newwin.c,v 1.56 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)newwin.c	8.3 (Berkeley) 7/27/94";
 #else
-__RCSID("$NetBSD: newwin.c,v 1.55 2019/04/01 11:39:15 roy Exp $");
+__RCSID("$NetBSD: newwin.c,v 1.56 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -375,7 +375,7 @@ __makenew(SCREEN *screen, int nlines, in
 	__CTRACE(__CTRACE_WINDOW, "makenew: ncols = %d\n", ncols);
 #endif
 	win->screen = screen;
-	win->cury = win->curx = 0;
+	win->cury = win->curx = win->ocurx = win->ocury = 0;
 	win->maxy = nlines;
 	win->maxx = ncols;
 	win->reqy = nlines;

Index: src/lib/libcurses/printw.c
diff -u src/lib/libcurses/printw.c:1.27 src/lib/libcurses/printw.c:1.28
--- src/lib/libcurses/printw.c:1.27	Mon Apr  1 11:39:15 2019
+++ src/lib/libcurses/printw.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: printw.c,v 1.27 2019/04/01 11:39:15 roy Exp $	*/
+/*	$NetBSD: printw.c,v 1.28 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)printw.c	8.3 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: printw.c,v 1.27 2019/04/01 11:39:15 roy Exp $");
+__RCSID("$NetBSD: printw.c,v 1.28 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -102,7 +102,7 @@ mvwprintw(WINDOW * win, int y, int x, co
 	va_list ap;
 	int     ret;
 
-	if (wmove(win, y, x) != OK)
+	if (_cursesi_wmove(win, y, x, 0) != OK)
 		return ERR;
 
 	va_start(ap, fmt);

Index: src/lib/libcurses/putchar.c
diff -u src/lib/libcurses/putchar.c:1.22 src/lib/libcurses/putchar.c:1.23
--- src/lib/libcurses/putchar.c:1.22	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/putchar.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: putchar.c,v 1.22 2017/01/06 13:53:18 roy Exp $	*/
+/*	$NetBSD: putchar.c,v 1.23 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)putchar.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: putchar.c,v 1.22 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: putchar.c,v 1.23 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -48,7 +48,7 @@ __cputchar(int ch)
 #ifdef DEBUG
 	__CTRACE(__CTRACE_OUTPUT, "__cputchar: %s\n", unctrl(ch));
 #endif
-	return putc(ch, _cursesi_screen->outfd);
+	return __cputchar_args(ch, _cursesi_screen->outfd);
 }
 
 /*
@@ -60,12 +60,15 @@ int
 __cputchar_args(int ch, void *args)
 {
 	FILE *outfd = (FILE *)args;
+	int status;
 
 #ifdef DEBUG
 	__CTRACE(__CTRACE_OUTPUT, "__cputchar_args: %s on fd %d\n",
 	    unctrl(ch), outfd->_file);
 #endif
-	return putc(ch, outfd);
+	status = putc(ch, outfd);
+	fflush(outfd);
+	return status;
 }
 
 #ifdef HAVE_WCHAR
@@ -75,7 +78,7 @@ __cputwchar(wchar_t wch)
 #ifdef DEBUG
 	__CTRACE(__CTRACE_OUTPUT, "__cputwchar: 0x%x\n", wch);
 #endif
-	return putwc(wch, _cursesi_screen->outfd);
+	return __cputwchar_args(wch, _cursesi_screen->outfd);
 }
 
 /*
@@ -87,11 +90,14 @@ int
 __cputwchar_args(wchar_t wch, void *args)
 {
 	FILE *outfd = (FILE *)args;
+	int status;
 
 #ifdef DEBUG
 	__CTRACE(__CTRACE_OUTPUT, "__cputwchar_args: 0x%x on fd %d\n",
 	    wch, outfd->_file);
 #endif
-	return putwc(wch, outfd);
+	status = putwc(wch, outfd);
+	fflush(outfd);
+	return status;
 }
 #endif /* HAVE_WCHAR */

Index: src/lib/libcurses/refresh.c
diff -u src/lib/libcurses/refresh.c:1.109 src/lib/libcurses/refresh.c:1.110
--- src/lib/libcurses/refresh.c:1.109	Sun May 12 02:19:23 2019
+++ src/lib/libcurses/refresh.c	Mon May 20 22:17:41 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: refresh.c,v 1.109 2019/05/12 02:19:23 blymn Exp $	*/
+/*	$NetBSD: refresh.c,v 1.110 2019/05/20 22:17:41 blymn Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)refresh.c	8.7 (Berkeley) 8/13/94";
 #else
-__RCSID("$NetBSD: refresh.c,v 1.109 2019/05/12 02:19:23 blymn Exp $");
+__RCSID("$NetBSD: refresh.c,v 1.110 2019/05/20 22:17:41 blymn Exp $");
 #endif
 #endif				/* not lint */
 
@@ -45,7 +45,7 @@ __RCSID("$NetBSD: refresh.c,v 1.109 2019
 #include "curses.h"
 #include "curses_private.h"
 
-static void	domvcur(const WINDOW *, int, int, int, int);
+static void	domvcur(WINDOW *, int, int, int, int);
 static void	putattr(__LDATA *);
 static void	putattr_out(__LDATA *);
 static int	putch(__LDATA *, __LDATA *, int, int);
@@ -1431,7 +1431,7 @@ makech(int wy)
  *	Do a mvcur, leaving attributes if necessary.
  */
 static void
-domvcur(const WINDOW *win, int oy, int ox, int ny, int nx)
+domvcur(WINDOW *win, int oy, int ox, int ny, int nx)
 {
 
 #ifdef DEBUG
@@ -1452,6 +1452,10 @@ domvcur(const WINDOW *win, int oy, int o
 	win->alines[oy]->flags &= ~__ISPASTEOL;
 	win->alines[ny]->flags &= ~__ISPASTEOL;
 
+	/* Update old cursor positions to current location */
+	win->ocury = ny;
+	win->ocurx = nx;
+
 	__mvcur(oy, ox, ny, nx, 1);
 }
 

Reply via email to