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