NAME | SYNOPSIS | PARAMETERS | DESCRIPTION | RETURN VALUES | ERRORS | SEE ALSO
#include <curses.h>int overlay(WINDOW *const srcwin, WINDOW *dstwin);
Is a pointer to the source window to be copied.
Is a pointer to the destination window to be overlayed or overwritten.
The overwrite() and overlay() functions copy the overlapping portion of srcwin to destwin. srcwin and dstwin do not have to be the same size.
The overwrite() function copies the characters from the overlapping portion to dstwin; thus, destroying the previous contents of the window. The overlay() function only copies non-blank characters, leaving blank characters intact. Thus, if the background character of the original window was set to something other than a blank, this original background could be preserved.
The following example shows how to use overwrite() to implement a pop-up dialog box.
#include <curses.h> /* * Pop-up a window on top of curscr. If row and/or col * are -1 then that dimension will be centered within * curscr. Return 0 for success or -1 if malloc() failed. * Pass back the working window and the saved window for the * pop-up. The saved window should not be modified. */ int popup(work, save, nrows, ncols, row, col) WINDOW **work, **save; int nrows, ncols, row, col; { int mr, mc; getmaxyx(curscr, mr, mc); /* Windows are limited to the size of curscr. */ if (mr < nrows) nrows = mr; if (mc < ncols) ncols = mc; /* Center dimensions. */ if (row == -1) row = (mr-nrows)/2; if (col == -1) col = (mc-ncols)/2; /* The window must fit entirely in curscr. */ if (mr < row+nrows) row = 0; if (mc < col+ncols) col = 0; *work = newwin(nrows, ncols, row, col); if (*work == NULL) return (-1); if ((*save = dupwin(*work)) == NULL) { delwin(*work); return (-1); } overwrite(curscr, *save); return (0); } /* * Restore the region covered by a pop-up window. * Delete the working window and the saved window. * This function is the complement to popup(). Return * 0 for success or -1 for an error. */ int popdown(work, save) WINDOW *work, *save; { (void) wnoutrefresh(save); (void) delwin(save); (void) delwin(work); return (0); } /* * Compute the size of a dialog box that would fit around * the string. */ void dialsize(str, nrows, ncols) char *str; int *nrows, *ncols; { int rows, cols, col; for (rows = 1, cols = col = 0; *str != '\0'; ++str) { if (*str == '\n') { if (cols < col) cols = col; col = 0; ++rows; } else { ++col; } } if (cols < col) cols = col; *nrows = rows; *ncols = cols; } /* * Write a string into a dialog box. */ void dialfill(w, s) WINDOW *w; char *s; { int row; (void) wmove(w, 1, 1); for (row = 1; *s != '\0'; ++s) { (void) waddch(w, *((unsigned char*) s)); if (*s == '\n') wmove(w, ++row, 1); } box(w, 0, 0); } void dialog(str) char *str; { WINDOW *work, *save; int nrows, ncols, row, col; /* Figure out size of window. */ dialsize(str, &nrows, &ncols); /* Create a centered working window with extra */ /* room for a border. */ (void) popup(&work, &save, nrows+2, ncols+2, -1, -1); /* Write text into the working window. */ dialfill(work, str); /* Pause. Remember that wgetch() will do a wrefresh() */ /* for us. */ (void) wgetch(work); /* Restore curscr and free windows. */ (void) popdown(work, save); /* Redraw curscr to remove window from physical screen. */ (void) doupdate(); }
On success, these functions return OK. Otherwise, they return ERR.
None.
NAME | SYNOPSIS | PARAMETERS | DESCRIPTION | RETURN VALUES | ERRORS | SEE ALSO