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); }