2
0
mirror of https://github.com/xcat2/xNBA.git synced 2024-11-26 11:19:17 +00:00

- made _wputch wrap lines as well as cols (wraps back to line 0, as we have not way to scroll...)

- implemented color_content, wborder, wblrtobot, wclrtoeol, wcolor_set and several small functions
- added rest of expected global variables
This commit is contained in:
Dan Lynch 2006-05-19 16:18:08 +00:00
parent d48d0fb1bb
commit d166dc57ab

View File

@ -1,6 +1,7 @@
#include <curses.h>
#include <malloc.h>
#include <stddef.h>
#include <vsprintf.h>
/** @file
*
@ -11,26 +12,53 @@
#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;
};
WINDOW _stdscr = {
.attrs = A_DEFAULT,
.ori_y = 0,
.ori_x = 0,
.curs_y = 0,
.curs_x = 0,
};
/*
Primitives
*/
* 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;
(win->curs_y)++;
/* 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 */
win->curs_y += ( ( win->curs_y - win->height ) == 0 ?
-(win->curs_y) : 1 );
} else {
(win->curs_x)--;
}
@ -45,7 +73,7 @@ static void _wputch ( WINDOW *win, chtype ch, int wrap ) {
* @v wrap wrap "switch"
* @v n write at most n chtypes
*/
static void _wputchstr ( WINDOW *win, chtype *chstr, int wrap, int n ) {
static void _wputchstr ( WINDOW *win, const chtype *chstr, int wrap, int n ) {
for ( ; *chstr && n-- ; chstr++ ) {
_wputch(win,*chstr,wrap);
}
@ -53,12 +81,13 @@ static void _wputchstr ( WINDOW *win, chtype *chstr, int wrap, int n ) {
/**
* 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, char *str, int wrap, int n ) {
static void _wputstr ( WINDOW *win, const char *str, int wrap, int n ) {
for ( ; *str && n-- ; str++ ) {
_wputch( win, *str | win->attrs, wrap );
}
@ -106,16 +135,6 @@ int wmove ( WINDOW *win, int y, int x ) {
}
WINDOW _stdscr = {
.attrs = A_DEFAULT,
.ori_y = 0,
.ori_x = 0,
.curs_y = 0,
.curs_x = 0,
};
/**
* get terminal baud rate
*
@ -131,11 +150,7 @@ int baudrate ( void ) {
* @ret rc return status code
*/
int beep ( void ) {
/* ok, so I can't waste memory buffering the screen (or in
this case, backing up the background colours of the screen
elements), but maybe I can buffer the border and flash that
- or maybe even just the top and bottom? Assuming I can't
make the system speaker beep, of course... */
printf("\a");
return OK;
}
@ -149,42 +164,57 @@ int beep ( void ) {
* @ret rc return status code
*/
int box ( WINDOW *win, chtype verch, chtype horch ) {
return OK;
err:
return ERR;
int corner = '+' | win->attrs; /* default corner character */
return wborder( win, verch, verch, horch, horch,
corner, corner, corner, corner );
}
/**
* Indicates whether the attached terminal is capable of having
* colours redefined
* Indicates whether the underlying terminal device is capable of
* having colours redefined
*
* @ret bool returns boolean dependent on colour changing caps of terminal
* @ret bool returns boolean
*/
bool can_change_colour ( void ) {
return (bool)TRUE;
err:
return (bool)FALSE;
}
/**
* Identifies the intensity components of colour number "colour" and
* stores the RGB intensity values in the respective addresses pointed
* to by "red", "green" and "blue" respectively
* 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 ) {
return OK;
err:
return ERR;
}
/**
* Window colour attribute control function
*
* @v colour_pair_number colour pair integer
* @v *opts pointer to options
* @ret rc return status code
*/
int colour_set ( short colour_pair_number, void *opts ) {
/* 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;
}
@ -205,6 +235,16 @@ int delwin ( WINDOW *win ) {
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
*
@ -246,9 +286,8 @@ WINDOW *newwin ( int nlines, int ncols, int begin_y, int begin_x ) {
* @ret rc return status code
*/
int waddch ( WINDOW *win, const chtype ch ) {
_wputch( win, ch, WRAP );
return OK;
err:
return ERR;
}
/**
@ -277,20 +316,12 @@ int waddchnstr ( WINDOW *win, const chtype *chstr, int n ) {
* @ret rc return status code
*/
int waddnstr ( WINDOW *win, const char *str, int n ) {
unsigned int ch, count = 0;
char *strptr = str;
while ( ( ( ch = *strptr ) != '\0' )
&& ( count++ < (unsigned)n ) ) {
}
_wputstr( win, str, WRAP, n );
return OK;
err:
return ERR;
}
/**
* Turn off attributes
* Turn off attributes in a window
*
* @v win subject window
* @v attrs attributes to enable
@ -302,7 +333,7 @@ int wattroff ( WINDOW *win, int attrs ) {
}
/**
* Turn on attributes
* Turn on attributes in a window
*
* @v win subject window
* @v attrs attributes to enable
@ -314,14 +345,69 @@ int wattron ( WINDOW *win, int attrs ) {
}
/**
* Set attributes
* 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 = ( 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 ) {
*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 ) {
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 ) {
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 ) {
wattrset( win, attrs | ( ( (unsigned short)cpair ) << CPAIR_SHIFT ) );
return OK;
}
@ -343,8 +429,81 @@ int wattrset ( WINDOW *win, int attrs ) {
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 - 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 - 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 );
while ( win->curs_y + win->curs_x ) {
_wputch( win, (unsigned)' ', WRAP );
}
_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 ) {
if ( ( unsigned short )colour_pair_number > COLORS )
return ERR;
win->attrs = ( (unsigned short)colour_pair_number << CPAIR_SHIFT ) |
( win->attrs & A_ATTRIBUTES );
return OK;
err:
return ERR;
}