mirror of https://github.com/ipxe/ipxe.git
159 lines
3.6 KiB
C
159 lines
3.6 KiB
C
#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;
|
|
}
|