xref: /minix3/lib/libcurses/refresh.c (revision b706112487045bc1efd01e3d4d53d9a6b04a0bca)
1 /* refresh.c */
2 
3 #include <curses.h>
4 #include "curspriv.h"
5 
6 /* Wrefresh() updates window win's area of the physical screen.	*/
7 void wrefresh(win)
8 WINDOW *win;
9 {
10   if (win == curscr)
11 	curscr->_clear = TRUE;
12   else
13 	wnoutrefresh(win);
14   doupdate();
15 }
16 
17 /****************************************************************/
18 /* Wnoutrefresh() updates the image of the desired screen,	*/
19 /* Without doing physical update (copies window win's image to	*/
20 /* The _cursvar.tmpwin window, which is hidden from the user).	*/
21 /****************************************************************/
22 
23 void wnoutrefresh(win)
24 register WINDOW *win;
25 {
26   register int *dst;		/* start destination in temp window */
27   register int *end;		/* end destination in temp window */
28   register int *src;		/* source in user window */
29   register int first;		/* first changed char on line */
30   register int last;		/* last changed char on line */
31   WINDOW *nscr;
32   int begy;			/* window's place on screen */
33   int begx;
34   int i;
35   int j;
36 
37   nscr = _cursvar.tmpwin;
38   begy = win->_begy;
39   begx = win->_begx;
40 
41   for (i = 0, j = begy; i <= win->_maxy; i++, j++) {
42 	if (win->_minchng[i] != _NO_CHANGE) {
43 		first = win->_minchng[i];
44 		last = win->_maxchng[i];
45 		dst = &(nscr->_line[j][begx + first]);
46 		end = &(nscr->_line[j][begx + last]);
47 		src = &(win->_line[i][first]);
48 
49 		while (dst <= end)	/* copy user line to temp window */
50 			*dst++ = *src++;
51 
52 		first += begx;	/* nscr's min/max change positions */
53 		last += begx;
54 
55 		if ((nscr->_minchng[j] == _NO_CHANGE) || (nscr->_minchng[j] > first))
56 			nscr->_minchng[j] = first;
57 		if (last > nscr->_maxchng[j]) nscr->_maxchng[j] = last;
58 
59 		win->_minchng[i] = _NO_CHANGE;	/* updated now */
60 	}			/* if */
61 	win->_maxchng[i] = _NO_CHANGE;	/* updated now */
62   }				/* for */
63 
64   if (win->_clear) {
65 	win->_clear = FALSE;
66 	nscr->_clear = TRUE;
67   }				/* if */
68   if (!win->_leave) {
69 	nscr->_cury = win->_cury + begy;
70 	nscr->_curx = win->_curx + begx;
71   }				/* if */
72 }				/* wnoutrefresh */
73