diff options
author | 1997-12-03 05:20:47 +0000 | |
---|---|---|
committer | 1997-12-03 05:20:47 +0000 | |
commit | 6f4099fecac342eeff29dd2bf0512f777a62a591 (patch) | |
tree | 30035276ed4d5b07245464d724dd101dc9b5efb4 /lib/libcurses/lib_mvwin.c | |
parent | merge of ncurses-4.1-971129 (diff) | |
download | wireguard-openbsd-6f4099fecac342eeff29dd2bf0512f777a62a591.tar.xz wireguard-openbsd-6f4099fecac342eeff29dd2bf0512f777a62a591.zip |
Merge of ncurses-4.1-971129
Diffstat (limited to 'lib/libcurses/lib_mvwin.c')
-rw-r--r-- | lib/libcurses/lib_mvwin.c | 77 |
1 files changed, 73 insertions, 4 deletions
diff --git a/lib/libcurses/lib_mvwin.c b/lib/libcurses/lib_mvwin.c index 22bdb4a2604..acc84ead00d 100644 --- a/lib/libcurses/lib_mvwin.c +++ b/lib/libcurses/lib_mvwin.c @@ -1,3 +1,5 @@ +/* $OpenBSD: lib_mvwin.c,v 1.3 1997/12/03 05:21:24 millert Exp $ */ + /*************************************************************************** * COPYRIGHT NOTICE * @@ -30,27 +32,94 @@ #include <curses.priv.h> -MODULE_ID("Id: lib_mvwin.c,v 1.3 1997/02/02 00:20:41 tom Exp $") +MODULE_ID("Id: lib_mvwin.c,v 1.5 1997/09/20 15:02:34 juergen Exp $") int mvwin(WINDOW *win, int by, int bx) { T((T_CALLED("mvwin(%p,%d,%d)"), win, by, bx)); - if (win->_flags & _SUBWIN) + if (!win || (win->_flags & _ISPAD)) returnCode(ERR); + /* Copying subwindows is allowed, but it is expensive... */ + if (win->_flags & _SUBWIN) { + int err = ERR; + WINDOW *parent = win->_parent; + if (parent) + { /* Now comes the complicated and costly part, you should really + * try to avoid to move subwindows. Because a subwindow shares + * the text buffers with its parent, one can't do a simple + * memmove of the text buffers. One has to create a copy, then + * to relocate the subwindow and then to do a copy. + */ + if ((by - parent->_begy == win->_pary) && + (bx - parent->_begx == win->_parx)) + err=OK; /* we don't actually move */ + else { + WINDOW* clone = dupwin(win); + if (clone) { + /* now we have the clone, so relocate win */ + + werase(win); /* Erase the original place */ + wbkgd(win,parent->_bkgd);/* fill with parents background */ + wsyncup(win); /* Tell the parent(s) */ + + err = mvderwin(win, + by - parent->_begy, + bx - parent->_begx); + if (err!=ERR) { + err = copywin(clone,win, + 0, 0, 0, 0, win->_maxy, win->_maxx, 0); + if (ERR!=err) + wsyncup(win); + } + if (ERR==delwin(clone)) + err=ERR; + } + } + } + returnCode(err); + } + if (by + win->_maxy > screen_lines - 1 || bx + win->_maxx > screen_columns - 1 || by < 0 || bx < 0) returnCode(ERR); - + else { /* We have to clear the area on the virtual screen where the + * window is currently. Actually the following code is + * equivalent to erase() the window at it's current place and + * then to call a wnoutrefresh(). We can't do it this easy way, + * because we still need the content of the window at its new + * place:-) + * N.B.: Its not worth to think about an optimization to + * clear only the parts that are not overlapped by the new + * location of the window. The overlapped region will already + * be replaced by the next wnoutrefresh() for this window. + */ + int x,y; + for(y=0;y<=win->_maxy;y++) { + struct ldat* nline = &(newscr->_line[y+win->_begy+win->_yoffset]); + for(x=0;x<=win->_maxx;x++) { + nline->text[x+win->_begx] = newscr->_bkgd; + } + if (nline->firstchar==_NOCHANGE) { + nline->firstchar = win->_begx; + nline->lastchar = win->_begx + win->_maxx; + } else { + if (nline->firstchar > win->_begx) + nline->firstchar = win->_begx; + if (nline->lastchar < (win->_begx + win->_maxx)) + nline->lastchar = (win->_begx + win->_maxx); + } + } + } /* * Whether or not the window is moved, touch the window's contents so * that a following call to 'wrefresh()' will paint the window at the * new location. This ensures that if the caller has refreshed another * window at the same location, that this one will be displayed. - */ + */ win->_begy = by; win->_begx = bx; returnCode(touchwin(win)); |