#include <curses.h>
#include <stddef.h>
#include <stdlib.h>
#include "mucurses.h"
/** @file
*
* MuCurses windows instance functions
*
*/
/**
* Delete a window
*
* @v *win pointer to window being deleted
* @ret rc return status code
*/
int delwin ( WINDOW *win ) {
if ( win == NULL )
return ERR;
/* I think we should blank the region covered by the window -
ncurses doesn't do this, but they have a buffer, so they
may just be deleting from an offscreen context whereas we
are guaranteed to be deleting something onscreen */
wmove( win, 0, 0 );
chtype killch = (chtype)' ';
do {
_wputch( win, killch, WRAP );
} while ( win->curs_x + win->curs_y );
free( win );
wmove ( stdscr, 0, 0 );
return OK;
}
/**
* Create a new derived window
*
* @v parent parent window
* @v nlines window height
* @v ncols window width
* @v begin_y window y origin (relative to parent)
* @v begin_x window x origin (relative to parent)
* @ret ptr return pointer to child window
*/
WINDOW *derwin ( WINDOW *parent, int nlines, int ncols,
int begin_y, int begin_x ) {
WINDOW *child;
if ( parent == NULL )
return NULL;
if ( ( child = malloc( sizeof( WINDOW ) ) ) == NULL )
return NULL;
if ( ( (unsigned)ncols > parent->width ) ||
( (unsigned)nlines > parent->height ) )
return NULL;
child->ori_y = parent->ori_y + begin_y;
child->ori_x = parent->ori_x + begin_x;
child->height = nlines;
child->width = ncols;
child->parent = parent;
child->scr = parent->scr;
return child;
}
/**
* Create a duplicate of the specified window
*
* @v orig original window
* @ret ptr pointer to duplicate window
*/
WINDOW *dupwin ( WINDOW *orig ) {
WINDOW *copy;
if ( orig == NULL )
return NULL;
if ( ( copy = malloc( sizeof( WINDOW ) ) ) == NULL )
return NULL;
copy->scr = orig->scr;
copy->attrs = orig->attrs;
copy->ori_y = orig->ori_y;
copy->ori_x = orig->ori_x;
copy->curs_y = orig->curs_y;
copy->curs_x = orig->curs_x;
copy->height = orig->height;
copy->width = orig->width;
return copy;
}
/**
* Move window origin to specified coordinates
*
* @v *win window to move
* @v y Y position
* @v x X position
* @ret rc return status code
*/
int mvwin ( WINDOW *win, int y, int x ) {
if ( win == NULL )
return ERR;
if ( ( ( (unsigned)y + win->height ) > LINES ) ||
( ( (unsigned)x + win->width ) > COLS ) )
return ERR;
win->ori_y = y;
win->ori_x = x;
return OK;
}
/**
* Create new WINDOW
*
* @v nlines number of lines
* @v ncols number of columns
* @v begin_y column origin
* @v begin_x line origin
* @ret *win return pointer to new window
*/
WINDOW *newwin ( int nlines, int ncols, int begin_y, int begin_x ) {
WINDOW *win;
if ( ( win = malloc( sizeof(WINDOW) ) ) == NULL )
return NULL;
if ( ( (unsigned)( begin_y + nlines ) > stdscr->height ) &&
( (unsigned)( begin_x + ncols ) > stdscr->width ) )
return NULL;
win->ori_y = begin_y;
win->ori_x = begin_x;
win->height = nlines;
win->width = ncols;
win->scr = stdscr->scr;
win->parent = stdscr;
return win;
}
/**
* Create a new sub-window
*
* @v orig parent window
* @v nlines window height
* @v ncols window width
* @v begin_y window y origin (absolute)
* @v begin_x window x origin (absolute)
* @ret ptr return pointer to child window
*/
WINDOW *subwin ( WINDOW *parent, int nlines, int ncols,
int begin_y, int begin_x ) {
WINDOW *child;
if ( parent == NULL )
return NULL;
if ( ( child = malloc( sizeof( WINDOW ) ) ) == NULL )
return NULL;
child = newwin( nlines, ncols, begin_y, begin_x );
child->parent = parent;
child->scr = parent->scr;
return child;
}