mirror of https://github.com/ipxe/ipxe.git
- deprecated in favour of a split library model
parent
6d34baaef9
commit
446c1a3372
|
@ -1,834 +0,0 @@
|
||||||
#include <curses.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <vsprintf.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/** @file
|
|
||||||
*
|
|
||||||
* MuCurses: lightweight xcurses implementation for PXE ROMs
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define WRAP 0
|
|
||||||
#define NOWRAP 1
|
|
||||||
|
|
||||||
unsigned short _COLS;
|
|
||||||
unsigned short _LINES;
|
|
||||||
unsigned short _COLOURS;
|
|
||||||
unsigned int *_COLOUR_PAIRS; /* basically this is an array, but as its
|
|
||||||
length is determined only when initscr
|
|
||||||
is run, I can only think to make it a
|
|
||||||
pointer and malloc the array into being
|
|
||||||
... */
|
|
||||||
|
|
||||||
struct cursor_pos {
|
|
||||||
unsigned int y, x;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _softlabel {
|
|
||||||
/* Format of soft label
|
|
||||||
0: left justify
|
|
||||||
1: centre justify
|
|
||||||
2: right justify
|
|
||||||
*/
|
|
||||||
int fmt;
|
|
||||||
// label string
|
|
||||||
char *label;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _softlabelkeys {
|
|
||||||
struct _softlabel fkeys[12];
|
|
||||||
attr_t attrs;
|
|
||||||
unsigned int fmt;
|
|
||||||
unsigned int maxlablen;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _softlabelkeys *slks;
|
|
||||||
|
|
||||||
WINDOW _stdscr = {
|
|
||||||
.attrs = A_DEFAULT,
|
|
||||||
.ori_y = 0,
|
|
||||||
.ori_x = 0,
|
|
||||||
.curs_y = 0,
|
|
||||||
.curs_x = 0,
|
|
||||||
.scr = curscr,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Primitives
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write a single character rendition to a window
|
|
||||||
*
|
|
||||||
* @v *win window in which to write
|
|
||||||
* @v ch character rendition to write
|
|
||||||
* @v wrap wrap "switch"
|
|
||||||
*/
|
|
||||||
static void _wputch ( WINDOW *win, chtype ch, int wrap ) {
|
|
||||||
/* make sure we set the screen cursor to the right position
|
|
||||||
first! */
|
|
||||||
win->scr->movetoyx( win->scr, win->ori_y + win->curs_y,
|
|
||||||
win->ori_x + win->curs_x );
|
|
||||||
win->scr->putc(win->scr, ch);
|
|
||||||
if ( ++(win->curs_x) == win->width ) {
|
|
||||||
if ( wrap == WRAP ) {
|
|
||||||
win->curs_x = 0;
|
|
||||||
/* specification says we should really scroll,
|
|
||||||
but we have no buffer to scroll with, so we
|
|
||||||
can only overwrite back at the beginning of
|
|
||||||
the window */
|
|
||||||
if ( ++(win->curs_y) == win->height )
|
|
||||||
win->curs_y = 0;
|
|
||||||
} else {
|
|
||||||
(win->curs_x)--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write a chtype string to a window
|
|
||||||
*
|
|
||||||
* @v *win window in which to write
|
|
||||||
* @v *chstr chtype string
|
|
||||||
* @v wrap wrap "switch"
|
|
||||||
* @v n write at most n chtypes
|
|
||||||
*/
|
|
||||||
static void _wputchstr ( WINDOW *win, const chtype *chstr, int wrap, int n ) {
|
|
||||||
for ( ; *chstr && n-- ; chstr++ ) {
|
|
||||||
_wputch(win,*chstr,wrap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write a standard c-style string to a window
|
|
||||||
*
|
|
||||||
* @v *win window in which to write
|
|
||||||
* @v *str string
|
|
||||||
* @v wrap wrap "switch"
|
|
||||||
* @v n write at most n chars from *str
|
|
||||||
*/
|
|
||||||
static void _wputstr ( WINDOW *win, const char *str, int wrap, int n ) {
|
|
||||||
for ( ; *str && n-- ; str++ ) {
|
|
||||||
_wputch( win, *str | win->attrs, wrap );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Restore cursor position from encoded backup variable
|
|
||||||
*
|
|
||||||
* @v *win window on which to operate
|
|
||||||
* @v *pos pointer to struct in which original cursor position is stored
|
|
||||||
*/
|
|
||||||
static void _restore_curs_pos ( WINDOW *win, struct cursor_pos *pos ){
|
|
||||||
win->curs_y = pos->y;
|
|
||||||
win->curs_x = pos->x;
|
|
||||||
win->scr->movetoyx ( win->scr, win->curs_y, win->curs_x );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store cursor position for later restoration
|
|
||||||
*
|
|
||||||
* @v *win window on which to operate
|
|
||||||
* @v *pos pointer to struct in which to store cursor position
|
|
||||||
*/
|
|
||||||
static void _store_curs_pos ( WINDOW *win, struct cursor_pos *pos ) {
|
|
||||||
pos->y = win->curs_y;
|
|
||||||
pos->x = win->curs_x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Move a window's cursor to the specified position
|
|
||||||
*
|
|
||||||
* @v *win window to be operated on
|
|
||||||
* @v y Y position
|
|
||||||
* @v x X position
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wmove ( WINDOW *win, int y, int x ) {
|
|
||||||
/* chech for out-of-bounds errors */
|
|
||||||
if ( ( ( (unsigned)x - win->ori_x ) > win->width ) ||
|
|
||||||
( ( (unsigned)y - win->ori_y ) > win->height ) ) {
|
|
||||||
return ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
win->curs_y = y;
|
|
||||||
win->curs_x = x;
|
|
||||||
win->scr->movetoyx( win->scr, win->ori_y + win->curs_y,
|
|
||||||
win->ori_x + win->curs_x );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get terminal baud rate
|
|
||||||
*
|
|
||||||
* @ret bps return baud rate in bits per second
|
|
||||||
*/
|
|
||||||
int baudrate ( void ) {
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Audible (or visual) signal
|
|
||||||
*
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int beep ( void ) {
|
|
||||||
printf("\a");
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draw borders from single-byte characters and renditions around a
|
|
||||||
* window
|
|
||||||
*
|
|
||||||
* @v *win window to be bordered
|
|
||||||
* @v verch vertical chtype
|
|
||||||
* @v horch horizontal chtype
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int box ( WINDOW *win, chtype verch, chtype horch ) {
|
|
||||||
int corner = '+' | win->attrs; /* default corner character */
|
|
||||||
return wborder( win, verch, verch, horch, horch,
|
|
||||||
corner, corner, corner, corner );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates whether the underlying terminal device is capable of
|
|
||||||
* having colours redefined
|
|
||||||
*
|
|
||||||
* @ret bool returns boolean
|
|
||||||
*/
|
|
||||||
bool can_change_colour ( void ) {
|
|
||||||
return (bool)TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Identify the RGB components of a given colour value
|
|
||||||
*
|
|
||||||
* @v colour colour value
|
|
||||||
* @v *red address to store red component
|
|
||||||
* @v *green address to store green component
|
|
||||||
* @v *blue address to store blue component
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int colour_content ( short colour, short *red, short *green, short *blue ) {
|
|
||||||
/* we do not have a particularly large range of colours (3
|
|
||||||
primary, 3 secondary and black), so let's just put in a
|
|
||||||
basic switch... */
|
|
||||||
switch(colour) {
|
|
||||||
case COLOUR_BLACK:
|
|
||||||
*red = 0; *green = 0; *blue = 0;
|
|
||||||
break;
|
|
||||||
case COLOUR_BLUE:
|
|
||||||
*red = 0; *green = 0; *blue = 1000;
|
|
||||||
break;
|
|
||||||
case COLOUR_GREEN:
|
|
||||||
*red = 0; *green = 1000; *blue = 0;
|
|
||||||
break;
|
|
||||||
case COLOUR_CYAN:
|
|
||||||
*red = 0; *green = 1000; *blue = 1000;
|
|
||||||
break;
|
|
||||||
case COLOUR_RED:
|
|
||||||
*red = 1000; *green = 0; *blue = 0;
|
|
||||||
break;
|
|
||||||
case COLOUR_MAGENTA:
|
|
||||||
*red = 1000; *green = 0; *blue = 1000;
|
|
||||||
break;
|
|
||||||
case COLOUR_YELLOW:
|
|
||||||
*red = 1000; *green = 1000; *blue = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a window
|
|
||||||
*
|
|
||||||
* @v *win pointer to window being deleted
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int delwin ( WINDOW *win ) {
|
|
||||||
if ( win == NULL )
|
|
||||||
goto err;
|
|
||||||
/* must free descendants first, but I haven't implemented descendants yet
|
|
||||||
... */
|
|
||||||
free(win);
|
|
||||||
return OK;
|
|
||||||
err:
|
|
||||||
return ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the background rendition attributes for a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @ret ch chtype rendition representation
|
|
||||||
*/
|
|
||||||
inline chtype getbkgd ( WINDOW *win ) {
|
|
||||||
return win->attrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialise console environment
|
|
||||||
*
|
|
||||||
* @ret *win return pointer to stdscr
|
|
||||||
*/
|
|
||||||
WINDOW *initscr ( void ) {
|
|
||||||
/* determine console size */
|
|
||||||
/* initialise screen */
|
|
||||||
stdscr->width = 80;
|
|
||||||
stdscr->height = 25;
|
|
||||||
/* set previously unknown window attributes */
|
|
||||||
/* refresh screen */
|
|
||||||
return stdscr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 = calloc( 1, sizeof(WINDOW) );
|
|
||||||
win->ori_y = begin_y;
|
|
||||||
win->ori_x = begin_x;
|
|
||||||
win->height = nlines;
|
|
||||||
win->width = ncols;
|
|
||||||
win->scr = stdscr->scr;
|
|
||||||
win->parent = NULL;
|
|
||||||
win->child = NULL;
|
|
||||||
return win;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the attribute used for the soft function keys
|
|
||||||
*
|
|
||||||
* @ret attrs the current attributes of the soft function keys
|
|
||||||
*/
|
|
||||||
attr_t slk_attr ( void ) {
|
|
||||||
return ( slks == NULL ? 0 : slks->attrs );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn off soft function key attributes
|
|
||||||
*
|
|
||||||
* @v attrs attribute bit mask
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_attroff ( const chtype attrs ) {
|
|
||||||
if ( slks == NULL )
|
|
||||||
return ERR;
|
|
||||||
slks->attrs &= ~( attrs & A_ATTRIBUTES );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn on soft function key attributes
|
|
||||||
*
|
|
||||||
* @v attrs attribute bit mask
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_attron ( const chtype attrs ) {
|
|
||||||
if ( slks == NULL )
|
|
||||||
return ERR;
|
|
||||||
slks->attrs |= ( attrs & A_ATTRIBUTES );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set soft function key attributes
|
|
||||||
*
|
|
||||||
* @v attrs attribute bit mask
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_attrset ( const chtype attrs ) {
|
|
||||||
if ( slks == NULL )
|
|
||||||
return ERR;
|
|
||||||
slks->attrs = ( attrs & A_ATTRIBUTES );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn off soft function key attributes
|
|
||||||
*
|
|
||||||
* @v attrs attribute bit mask
|
|
||||||
* @v *opts undefined (for future implementation)
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_attr_off ( const attr_t attrs, void *opts __unused ) {
|
|
||||||
return slk_attroff( attrs );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn on soft function key attributes
|
|
||||||
*
|
|
||||||
* @v attrs attribute bit mask
|
|
||||||
* @v *opts undefined (for future implementation)
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_attr_on ( attr_t attrs, void *opts __unused ) {
|
|
||||||
return slk_attron( attrs );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set soft function key attributes
|
|
||||||
*
|
|
||||||
* @v attrs attribute bit mask
|
|
||||||
* @v colour_pair_number colour pair integer
|
|
||||||
* @v *opts undefined (for future implementation)
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_attr_set ( const attr_t attrs, short colour_pair_number,
|
|
||||||
void *opts __unused ) {
|
|
||||||
if ( slks == NULL )
|
|
||||||
return ERR;
|
|
||||||
|
|
||||||
if ( ( unsigned short )colour_pair_number > COLORS )
|
|
||||||
return ERR;
|
|
||||||
|
|
||||||
slks->attrs = ( (unsigned short)colour_pair_number << CPAIR_SHIFT ) |
|
|
||||||
( attrs & A_ATTRIBUTES );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear the soft function key labels from the screen
|
|
||||||
*
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_clear ( void ) {
|
|
||||||
if ( slks == NULL )
|
|
||||||
return ERR;
|
|
||||||
|
|
||||||
wmove(stdscr,stdscr->height-1,0);
|
|
||||||
wclrtoeol(stdscr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialise the soft function keys
|
|
||||||
*
|
|
||||||
* @v fmt format of keys
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_init ( int fmt ) {
|
|
||||||
if ( (unsigned)fmt > 3 ) {
|
|
||||||
return ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
slks = malloc(sizeof(struct _softlabelkeys));
|
|
||||||
slks->attrs = A_DEFAULT;
|
|
||||||
slks->fmt = fmt;
|
|
||||||
slks->maxlablen = 5;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the label for the specified soft key
|
|
||||||
*
|
|
||||||
* @v labnum soft key identifier
|
|
||||||
* @ret label return label
|
|
||||||
*/
|
|
||||||
char* slk_label ( int labnum ) {
|
|
||||||
if ( slks == NULL )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return slks->fkeys[labnum].label;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Restore soft function key labels to the screen
|
|
||||||
*
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_restore ( void ) {
|
|
||||||
if ( slks == NULL )
|
|
||||||
return ERR;
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure specified soft key
|
|
||||||
*
|
|
||||||
* @v labnum soft label position to configure
|
|
||||||
* @v *label string to use as soft key label
|
|
||||||
* @v fmt justification format of label
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int slk_set ( int labnum, const char *label, int fmt ) {
|
|
||||||
if ( slks == NULL )
|
|
||||||
return ERR;
|
|
||||||
if ( labnum == 0 || (unsigned)labnum > 12 )
|
|
||||||
return ERR;
|
|
||||||
if ( (unsigned)fmt >= 3 )
|
|
||||||
return ERR;
|
|
||||||
if ( strlen(label) > slks->maxlablen )
|
|
||||||
return ERR;
|
|
||||||
|
|
||||||
strcpy( slks->fkeys[labnum].label, label );
|
|
||||||
slks->fkeys[labnum].fmt = fmt;
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct printw_context {
|
|
||||||
struct printf_context ctx;
|
|
||||||
WINDOW *win;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void _printw_handler ( struct printf_context *ctx, unsigned int c ) {
|
|
||||||
struct printw_context *wctx =
|
|
||||||
container_of ( ctx, struct printw_context, ctx );
|
|
||||||
|
|
||||||
_wputch( wctx->win, c | wctx->win->attrs, WRAP );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Print formatted output in a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @v *fmt formatted string
|
|
||||||
* @v varglist argument list
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int vw_printw ( WINDOW *win, const char *fmt, va_list varglist ) {
|
|
||||||
struct printw_context wctx = {
|
|
||||||
.win = win,
|
|
||||||
.ctx = { .handler = _printw_handler, },
|
|
||||||
};
|
|
||||||
|
|
||||||
vcprintf ( &(wctx.ctx), fmt, varglist );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a single-byte character and rendition to a window and advance
|
|
||||||
* the cursor
|
|
||||||
*
|
|
||||||
* @v *win window to be rendered in
|
|
||||||
* @v ch character to be added at cursor
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int waddch ( WINDOW *win, const chtype ch ) {
|
|
||||||
_wputch( win, ch, WRAP );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add string of single-byte characters and renditions to a window
|
|
||||||
*
|
|
||||||
* @v *win window to be rendered in
|
|
||||||
* @v *chstr pointer to first chtype in "string"
|
|
||||||
* @v n max number of chars from chstr to render
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int waddchnstr ( WINDOW *win, const chtype *chstr, int n ) {
|
|
||||||
struct cursor_pos pos;
|
|
||||||
|
|
||||||
_store_curs_pos( win, &pos );
|
|
||||||
_wputchstr( win, chstr, NOWRAP, n );
|
|
||||||
_restore_curs_pos( win, &pos );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add string of single-byte characters to a window
|
|
||||||
*
|
|
||||||
* @v *win window to be rendered in
|
|
||||||
* @v *str standard c-style string
|
|
||||||
* @v n max number of chars from string to render
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int waddnstr ( WINDOW *win, const char *str, int n ) {
|
|
||||||
_wputstr( win, str, WRAP, n );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn off attributes in a window
|
|
||||||
*
|
|
||||||
* @v win subject window
|
|
||||||
* @v attrs attributes to enable
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wattroff ( WINDOW *win, int attrs ) {
|
|
||||||
win->attrs &= ~attrs;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn on attributes in a window
|
|
||||||
*
|
|
||||||
* @v win subject window
|
|
||||||
* @v attrs attributes to enable
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wattron ( WINDOW *win, int attrs ) {
|
|
||||||
win->attrs |= attrs;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set attributes in a window
|
|
||||||
*
|
|
||||||
* @v win subject window
|
|
||||||
* @v attrs attributes to enable
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wattrset ( WINDOW *win, int attrs ) {
|
|
||||||
win->attrs = ( attrs | ( win->attrs & A_COLOR ) );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get attributes and colour pair information
|
|
||||||
*
|
|
||||||
* @v *win window to obtain information from
|
|
||||||
* @v *attrs address in which to store attributes
|
|
||||||
* @v *pair address in which to store colour pair
|
|
||||||
* @v *opts undefined (for future implementation)
|
|
||||||
* @ret rc return status cude
|
|
||||||
*/
|
|
||||||
int wattr_get ( WINDOW *win, attr_t *attrs, short *pair,
|
|
||||||
void *opts __unused ) {
|
|
||||||
*attrs = win->attrs & A_ATTRIBUTES;
|
|
||||||
*pair = (short)(( win->attrs & A_COLOR ) >> CPAIR_SHIFT);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn off attributes in a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @v attrs attributes to toggle
|
|
||||||
* @v *opts undefined (for future implementation)
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wattr_off ( WINDOW *win, attr_t attrs,
|
|
||||||
void *opts __unused ) {
|
|
||||||
wattroff( win, attrs );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn on attributes in a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @v attrs attributes to toggle
|
|
||||||
* @v *opts undefined (for future implementation)
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wattr_on ( WINDOW *win, attr_t attrs,
|
|
||||||
void *opts __unused ) {
|
|
||||||
wattron( win, attrs );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set attributes and colour pair information in a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @v attrs attributes to set
|
|
||||||
* @v cpair colour pair to set
|
|
||||||
* @v *opts undefined (for future implementation)
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wattr_set ( WINDOW *win, attr_t attrs, short cpair,
|
|
||||||
void *opts __unused ) {
|
|
||||||
wattrset( win, attrs | ( ( (unsigned short)cpair ) << CPAIR_SHIFT ) );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draw borders from single-byte characters and renditions around a
|
|
||||||
* window
|
|
||||||
*
|
|
||||||
* @v *win window to be bordered
|
|
||||||
* @v ls left side
|
|
||||||
* @v rs right side
|
|
||||||
* @v ts top
|
|
||||||
* @v bs bottom
|
|
||||||
* @v tl top left corner
|
|
||||||
* @v tr top right corner
|
|
||||||
* @v bl bottom left corner
|
|
||||||
* @v br bottom right corner
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wborder ( WINDOW *win, chtype ls, chtype rs,
|
|
||||||
chtype ts, chtype bs, chtype tl,
|
|
||||||
chtype tr, chtype bl, chtype br ) {
|
|
||||||
|
|
||||||
wmove(win,0,0);
|
|
||||||
|
|
||||||
_wputch(win,tl,WRAP);
|
|
||||||
while ( ( win->width - 1 ) - win->curs_x ) {
|
|
||||||
_wputch(win,ts,WRAP);
|
|
||||||
}
|
|
||||||
_wputch(win,tr,WRAP);
|
|
||||||
|
|
||||||
while ( ( win->height - 1 ) - win->curs_y ) {
|
|
||||||
_wputch(win,ls,WRAP);
|
|
||||||
wmove(win,win->curs_y,(win->width)-1);
|
|
||||||
_wputch(win,rs,WRAP);
|
|
||||||
}
|
|
||||||
|
|
||||||
_wputch(win,bl,WRAP);
|
|
||||||
while ( ( win->width -1 ) - win->curs_x ) {
|
|
||||||
_wputch(win,bs,WRAP);
|
|
||||||
}
|
|
||||||
_wputch(win,br,NOWRAP); /* do not wrap last char to leave
|
|
||||||
cursor in last position */
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear a window to the bottom
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wclrtobot ( WINDOW *win ) {
|
|
||||||
struct cursor_pos pos;
|
|
||||||
|
|
||||||
_store_curs_pos( win, &pos );
|
|
||||||
do {
|
|
||||||
_wputch( win, (unsigned)' ', WRAP );
|
|
||||||
} while ( win->curs_y + win->curs_x );
|
|
||||||
_restore_curs_pos( win, &pos );
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear a window to the end of the current line
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wclrtoeol ( WINDOW *win ) {
|
|
||||||
struct cursor_pos pos;
|
|
||||||
|
|
||||||
_store_curs_pos( win, &pos );
|
|
||||||
while ( ( win->curs_y - pos.y ) == 0 ) {
|
|
||||||
_wputch( win, (unsigned)' ', WRAP );
|
|
||||||
}
|
|
||||||
_restore_curs_pos( win, &pos );
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set colour pair for a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @v colour_pair_number colour pair integer
|
|
||||||
* @v *opts undefined (for future implementation)
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wcolour_set ( WINDOW *win, short colour_pair_number,
|
|
||||||
void *opts __unused ) {
|
|
||||||
if ( ( unsigned short )colour_pair_number > COLORS )
|
|
||||||
return ERR;
|
|
||||||
|
|
||||||
win->attrs = ( (unsigned short)colour_pair_number << CPAIR_SHIFT ) |
|
|
||||||
( win->attrs & A_ATTRIBUTES );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete character under the cursor in a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wdelch ( WINDOW *win ) {
|
|
||||||
struct cursor_pos pos;
|
|
||||||
|
|
||||||
_store_curs_pos( win, &pos );
|
|
||||||
_wputch( win, (unsigned)' ', NOWRAP );
|
|
||||||
_restore_curs_pos( win, &pos );
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete line under a window's cursor
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wdeleteln ( WINDOW *win ) {
|
|
||||||
/* let's just set the cursor to the beginning of the line and
|
|
||||||
let wclrtoeol do the work :) */
|
|
||||||
wmove( win, win->curs_y, 0 );
|
|
||||||
wclrtoeol( win );
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a horizontal line in a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @v ch rendition and character
|
|
||||||
* @v n max number of chars (wide) to render
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int whline ( WINDOW *win, chtype ch, int n ) {
|
|
||||||
struct cursor_pos pos;
|
|
||||||
|
|
||||||
_store_curs_pos ( win, &pos );
|
|
||||||
while ( ( win->curs_x - win->width ) && n-- ) {
|
|
||||||
_wputch ( win, ch, NOWRAP );
|
|
||||||
}
|
|
||||||
_restore_curs_pos ( win, &pos );
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Print formatted output to a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @v *fmt formatted string
|
|
||||||
* @v ... string arguments
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wprintw ( WINDOW *win, const char *fmt, ... ) {
|
|
||||||
va_list args;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
va_start ( args, fmt );
|
|
||||||
i = vw_printw ( win, fmt, args );
|
|
||||||
va_end ( args );
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a vertical line in a window
|
|
||||||
*
|
|
||||||
* @v *win subject window
|
|
||||||
* @v ch rendition and character
|
|
||||||
* @v n max number of lines to render
|
|
||||||
* @ret rc return status code
|
|
||||||
*/
|
|
||||||
int wvline ( WINDOW *win, chtype ch, int n ) {
|
|
||||||
struct cursor_pos pos;
|
|
||||||
|
|
||||||
_store_curs_pos ( win, &pos );
|
|
||||||
while ( ( win->curs_y - win->height ) && n-- ) {
|
|
||||||
_wputch ( win, ch, NOWRAP );
|
|
||||||
wmove( win, ++(win->curs_y), pos.x);
|
|
||||||
}
|
|
||||||
_restore_curs_pos ( win, &pos );
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
Loading…
Reference in New Issue