diff options
Diffstat (limited to 'src/gwin.c')
| -rw-r--r-- | src/gwin.c | 368 | 
1 files changed, 4 insertions, 364 deletions
@@ -31,17 +31,11 @@  #if GFX_USE_GWIN || defined(__DOXYGEN__)
 -#include <string.h>
 -
 -#define GWIN_CONSOLE_USE_CLEAR_LINES			TRUE
 -#define GWIN_CONSOLE_USE_FILLED_CHARS			FALSE
 -
 -#define GWIN_FLG_DYNAMIC				0x0001
 -#define GWIN_FIRST_CONTROL_FLAG			0x0002
 -#define GBTN_FLG_ALLOCTXT				(GWIN_FIRST_CONTROL_FLAG<<0)
 +#include "gwin/gwin_internal.h"
 +// Internal routine for use by GWIN components only
  // Initialise a window creating it dynamicly if required.
 -static GHandle gwinInit(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height, size_t size) {
 +GHandle _gwinInit(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height, size_t size) {
  	coord_t	w, h;
  	// Check the window size against the screen size
 @@ -90,7 +84,7 @@ static GHandle gwinInit(GWindowObject *gw, coord_t x, coord_t y, coord_t width,   * @api
   */
  GHandle gwinCreateWindow(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height) {
 -	if (!(gw = (GWindowObject *)gwinInit((GWindowObject *)gw, x, y, width, height, sizeof(GWindowObject))))
 +	if (!(gw = (GWindowObject *)_gwinInit((GWindowObject *)gw, x, y, width, height, sizeof(GWindowObject))))
  		return 0;
  	gw->type = GW_WINDOW;
  	return (GHandle)gw;
 @@ -536,360 +530,6 @@ void gwinFillStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy,  }
  #endif
 -/*------------------------------------------------------------------------------------------------------------------------*/
 -
 -#if GWIN_NEED_CONSOLE || defined(__DOXYGEN__)
 -
 -/*
 - * Stream interface implementation. The interface is write only
 - */
 -
 -#define Stream2GWindow(ip)		((GHandle)(((char *)(ip)) - (size_t)(&(((GConsoleObject *)0)->stream))))
 -
 -static size_t GWinStreamWrite(void *ip, const uint8_t *bp, size_t n) { gwinPutCharArray(Stream2GWindow(ip), (const char *)bp, n); return RDY_OK; }
 -static size_t GWinStreamRead(void *ip, uint8_t *bp, size_t n) {	(void)ip; (void)bp; (void)n; return 0; }
 -static msg_t GWinStreamPut(void *ip, uint8_t b) { gwinPutChar(Stream2GWindow(ip), (char)b); return RDY_OK; }
 -static msg_t GWinStreamGet(void *ip) {(void)ip; return RDY_OK; }
 -static msg_t GWinStreamPutTimed(void *ip, uint8_t b, systime_t time) { (void)time; gwinPutChar(Stream2GWindow(ip), (char)b); return RDY_OK; }
 -static msg_t GWinStreamGetTimed(void *ip, systime_t timeout) { (void)ip; (void)timeout; return RDY_OK; }
 -static size_t GWinStreamWriteTimed(void *ip, const uint8_t *bp, size_t n, systime_t time) { (void)time; gwinPutCharArray(Stream2GWindow(ip), (const char *)bp, n); return RDY_OK; }
 -static size_t GWinStreamReadTimed(void *ip, uint8_t *bp, size_t n, systime_t time) { (void)ip; (void)bp; (void)n; (void)time; return 0; }
 -
 -struct GConsoleWindowVMT_t {
 -	_base_asynchronous_channel_methods
 -};
 -
 -static const struct GConsoleWindowVMT_t GWindowConsoleVMT = {
 -	GWinStreamWrite,
 -	GWinStreamRead,
 -	GWinStreamPut,
 -	GWinStreamGet,
 -	GWinStreamPutTimed,
 -	GWinStreamGetTimed,
 -	GWinStreamWriteTimed,
 -	GWinStreamReadTimed
 -};
 -
 -/**
 - * @brief   Create a console window.
 - * @details	A console window allows text to be written using chprintf() (and the console functions defined here).
 - * @brief	Text in a console window supports newlines and will wrap text as required.
 - * @return  NULL if there is no resultant drawing area, otherwise a window handle.
 - *
 - * @param[in] gc		The GConsoleObject structure to initialise. If this is NULL the structure is dynamically allocated.
 - * @param[in] x,y		The screen co-ordinates for the bottom left corner of the window
 - * @param[in] width		The width of the window
 - * @param[in] height	The height of the window
 - * @param[in] font		The font to use
 - * @note				The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color)
 - * @note				If the dispay does not support scrolling, the window will be cleared when the bottom line is reached.
 - * @note				The default drawing color gets set to White and the background drawing color to Black.
 - * @note				The dimensions and position may be changed to fit on the real screen.
 - *
 - * @api
 - */
 -GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font) {
 -	if (!(gc = (GConsoleObject *)gwinInit((GWindowObject *)gc, x, y, width, height, sizeof(GConsoleObject))))
 -		return 0;
 -	gc->gwin.type = GW_CONSOLE;
 -	gwinSetFont(&gc->gwin, font);
 -	gc->stream.vmt = &GWindowConsoleVMT;
 -	gc->cx = 0;
 -	gc->cy = 0;
 -	return (GHandle)gc;
 -}
 -
 -/**
 - * @brief   Get a stream from a console window suitable for use with chprintf().
 - * @return	The stream handle or NULL if this is not a console window.
 - *
 - * @param[in] gh	The window handle (must be a console window)
 - *
 - * @api
 - */
 -BaseSequentialStream *gwinGetConsoleStream(GHandle gh) {
 -	if (gh->type != GW_CONSOLE)
 -		return 0;
 -	return (BaseSequentialStream *)&(((GConsoleObject *)(gh))->stream);
 -}
 -
 -/**
 - * @brief   Put a character at the cursor position in the window.
 - * @note	Uses the current foreground color to draw the character and fills the background using the background drawing color
 - *
 - * @param[in] gh	The window handle (must be a console window)
 - * @param[in] c		The character to draw
 - *
 - * @api
 - */
 -void gwinPutChar(GHandle gh, char c) {
 -	uint8_t			width;
 -	#define gcw		((GConsoleObject *)gh)
 -
 -	if (gh->type != GW_CONSOLE || !gh->font) return;
 -
 -	#if GDISP_NEED_CLIP
 -		gdispSetClip(gh->x, gh->y, gh->width, gh->height);
 -	#endif
 -	
 -	if (c == '\n') {
 -		gcw->cx = 0;
 -		gcw->cy += gcw->fy;
 -		// We use lazy scrolling here and only scroll when the next char arrives
 -	} else if (c == '\r') {
 -		// gcw->cx = 0;
 -	} else {
 -		width = gdispGetCharWidth(c, gh->font) + gcw->fp;
 -		if (gcw->cx + width >= gh->width) {
 -			gcw->cx = 0;
 -			gcw->cy += gcw->fy;
 -		}
 -
 -		if (gcw->cy + gcw->fy > gh->height) {
 -#if GDISP_NEED_SCROLL
 -			/* scroll the console */
 -			gdispVerticalScroll(gh->x, gh->y, gh->width, gh->height, gcw->fy, gh->bgcolor);
 -			/* reset the cursor to the start of the last line */
 -			gcw->cx = 0;
 -			gcw->cy = (((coord_t)(gh->height/gcw->fy))-1)*gcw->fy;
 -#else
 -			/* clear the console */
 -			gdispFillArea(gh->x, gh->y, gh->width, gh->height, gh->bgcolor);
 -			/* reset the cursor to the top of the window */
 -			gcw->cx = 0;
 -			gcw->cy = 0;
 -#endif
 -		}
 -
 -#if GWIN_CONSOLE_USE_CLEAR_LINES
 -		/* clear to the end of the line */
 -		if (gcw->cx == 0)
 -			gdispFillArea(gh->x, gh->y + gcw->cy, gh->width, gcw->fy, gh->bgcolor);
 -#endif
 -#if GWIN_CONSOLE_USE_FILLED_CHARS
 -		gdispFillChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color, gh->bgcolor);
 -#else
 -		gdispDrawChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color);
 -#endif
 -
 -		/* update cursor */
 -		gcw->cx += width;
 -	}
 -	#undef gcw
 -}
 -
 -/**
 - * @brief   Put a string at the cursor position in the window. It will wrap lines as required.
 - * @note	Uses the current foreground color to draw the string and fills the background using the background drawing color
 - *
 - * @param[in] gh	The window handle (must be a console window)
 - * @param[in] str	The string to draw
 - *
 - * @api
 - */
 -void gwinPutString(GHandle gh, const char *str) {
 -	while(*str)
 -		gwinPutChar(gh, *str++);
 -}
 -
 -/**
 - * @brief   Put the character array at the cursor position in the window. It will wrap lines as required.
 - * @note	Uses the current foreground color to draw the string and fills the background using the background drawing color
 - *
 - * @param[in] gh	The window handle (must be a console window)
 - * @param[in] str	The string to draw
 - * @param[in] n		The number of characters to draw
 - *
 - * @api
 - */
 -void gwinPutCharArray(GHandle gh, const char *str, size_t n) {
 -	while(n--)
 -		gwinPutChar(gh, *str++);
 -}
 -#endif
 -
 -/*------------------------------------------------------------------------------------------------------------------------*/
 -
 -#if GWIN_NEED_BUTTON || defined(__DOXYGEN__)
 -
 -static const GButtonStyle GButtonDefaultStyle = {
 -	GBTN_3D,
 -	HTML2COLOR(0x404040),		// color_up_edge;
 -	HTML2COLOR(0xE0E0E0),		// color_up_fill;
 -	HTML2COLOR(0x000000),		// color_up_txt;
 -	HTML2COLOR(0x404040),		// color_dn_edge;
 -	HTML2COLOR(0x808080),		// color_dn_fill;
 -	HTML2COLOR(0x404040),		// color_dn_txt;
 -	};
 -
 -/**
 - * @brief   Create a button window.
 - * @return  NULL if there is no resultant drawing area, otherwise a window handle.
 - *
 - * @param[in] gb		The GConsoleWindow structure to initialise. If this is NULL the structure is dynamically allocated.
 - * @param[in] x,y		The screen co-ordinates for the bottom left corner of the window
 - * @param[in] width		The width of the window
 - * @param[in] height	The height of the window
 - * @param[in] font		The font to use
 - * @param[in] type		The type of button
 - * @note				The drawing color gets set to White and the background drawing color to Black.
 - * @note				The dimensions and position may be changed to fit on the real screen.
 - * @note				The button is not automatically drawn. Call gwinButtonDraw() after changing the button style or setting the text.
 - *
 - * @api
 - */
 -GHandle gwinCreateButton(GButtonObject *gb, coord_t x, coord_t y, coord_t width, coord_t height, font_t font, GButtonType type) {
 -	if (!(gb = (GButtonObject *)gwinInit((GWindowObject *)gb, x, y, width, height, sizeof(GButtonObject))))
 -		return 0;
 -	gb->gwin.type = GW_BUTTON;
 -	gwinSetFont(&gb->gwin, font);
 -	gwinSetButtonStyle(&gb->gwin, &GButtonDefaultStyle);
 -	gb->type = type;
 -	gb->state = GBTN_UP;
 -	gb->txt = "";
 -	gb->callback = 0;
 -	gb->inputsrc = 0;
 -	return (GHandle)gb;
 -}
 -
 -/**
 - * @brief   Set the style of a button.
 - * @details	The button style is defined by its shape and colours.
 - *
 - * @param[in] gh		The window handle (must be a button window)
 - * @param[in] style		The button style to set.
 - * @note				The button is not automatically redrawn. Call gwinButtonDraw() after changing the button style
 - *
 - * @api
 - */
 -void gwinSetButtonStyle(GHandle gh, const GButtonStyle *style) {
 -	#define gbw		((GButtonObject *)gh)
 -	if (gh->type != GW_BUTTON)
 -		return;
 -	
 -	gbw->style.shape = style->shape;
 -	gbw->style.color_up_edge = style->color_up_edge;
 -	gbw->style.color_up_fill = style->color_up_fill;
 -	gbw->style.color_dn_edge = style->color_dn_edge;
 -	gbw->style.color_dn_fill = style->color_dn_fill;
 -	gbw->style.color_up_txt = style->color_up_txt;
 -	gbw->style.color_dn_txt = style->color_dn_txt;
 -	#undef gbw
 -}
 -
 -/**
 - * @brief   Set the text of a button.
 - *
 - * @param[in] gh		The window handle (must be a button window)
 - * @param[in] txt		The button text to set. This must be a constant string unless useAlloc is set.
 - * @param[in] useAlloc	If TRUE the string specified will be copied into dynamically allocated memory.
 - * @note				The button is not automatically redrawn. Call gwinButtonDraw() after changing the button text.
 - *
 - * @api
 - */
 -void gwinSetButtonText(GHandle gh, const char *txt, bool_t useAlloc) {
 -	#define gbw		((GButtonObject *)gh)
 -	if (gh->type != GW_BUTTON)
 -		return;
 -
 -	// Dispose of the old string
 -	if ((gh->flags & GBTN_FLG_ALLOCTXT)) {
 -		gh->flags &= ~GBTN_FLG_ALLOCTXT;
 -		if (gbw->txt) {
 -			chHeapFree((void *)gbw->txt);
 -			gbw->txt = "";
 -		}
 -	}
 -	// Alloc the new text if required
 -	if (txt && useAlloc) {
 -		char *str;
 -		
 -		if ((str = (char *)chHeapAlloc(NULL, strlen(txt)+1))) {
 -			gh->flags |= GBTN_FLG_ALLOCTXT;
 -			strcpy(str, txt);
 -		}
 -		txt = (const char *)str;
 -	}
 -	
 -	gbw->txt = txt ? txt : "";
 -	#undef gbw
 -}
 -
 -/**
 - * @brief   Redraw the button.
 - *
 - * @param[in] gh		The window handle (must be a button window)
 - *
 - * @api
 - */
 -void gwinButtonDraw(GHandle gh) {
 -	color_t			cedge;
 -	color_t			cfill;
 -	color_t			ctxt;
 -	const char *	txt;
 -	#define gbw		((GButtonObject *)gh)
 -	#define RND_CNR_SIZE	5
 -	
 -	if (gh->type != GW_BUTTON)
 -		return;
 -
 -	#if GDISP_NEED_CLIP
 -		gdispSetClip(gh->x, gh->y, gh->width, gh->height);
 -	#endif
 -	
 -	// Get the text (safely)
 -	txt = gh->font && gbw->txt ? gbw->txt : "";
 -	
 -	// Determine the colors to use
 -	switch(gbw->state) {
 -	case GBTN_DOWN:
 -		cedge = gbw->style.color_dn_edge;
 -		cfill = gbw->style.color_dn_fill;
 -		ctxt = gbw->style.color_dn_txt;
 -		break;
 -	case GBTN_UP:	default:
 -		cedge = gbw->style.color_up_edge;
 -		cfill = gbw->style.color_up_fill;
 -		ctxt = gbw->style.color_up_txt;
 -		break;
 -	}
 -	
 -	// Draw according to the shape specified.
 -	switch(gbw->style.shape) {
 -#if GDISP_NEED_ARC
 -	case GBTN_ROUNDED:
 -		if (gh->width >= 2*RND_CNR_SIZE+10) {
 -			gdispFillRoundedBox(gh->x+1, gh->y+1, gh->width-2, gh->height-2, RND_CNR_SIZE-1, cfill);
 -			gdispDrawStringBox(gh->x+1, gh->y+RND_CNR_SIZE, gh->width-2, gh->height-(2*RND_CNR_SIZE), txt, gh->font, ctxt, justifyCenter);
 -			gdispDrawRoundedBox(gh->x, gh->y, gh->width, gh->height, RND_CNR_SIZE, cedge);
 -			break;
 -		}
 -		/* Fall Through */
 -#endif
 -	case GBTN_SQUARE:
 -		gdispFillStringBox(gh->x+1, gh->y+1, gh->width-2, gh->height-2, txt, gh->font, ctxt, cfill, justifyCenter);
 -		gdispDrawBox(gh->x, gh->y, gh->width, gh->height, cedge);
 -		break;
 -#if GDISP_NEED_ELLIPSE
 -	case GBTN_ELLIPSE:
 -		gdispFillEllipse(gh->x+1, gh->y+1, gh->width/2-1, gh->height/2-1, cfill);
 -		gdispDrawStringBox(gh->x+1, gh->y+1, gh->width-2, gh->height-2, txt, gh->font, ctxt, justifyCenter);
 -		gdispDrawEllipse(gh->x, gh->y, gh->width/2, gh->height/2, cedge);
 -		break;
 -#endif
 -	case GBTN_3D:	default:
 -		gdispFillStringBox(gh->x, gh->y, gh->width-1, gh->height-1, txt, gh->font, ctxt, cfill, justifyCenter);
 -		gdispDrawLine(gh->x+gh->width-1, gh->y, gh->x+gh->width-1, gh->y+gh->height-1, cedge);
 -		gdispDrawLine(gh->x, gh->y+gh->height-1, gh->x+gh->width-2, gh->y+gh->height-1, cedge);
 -		break;
 -	}
 -	#undef gbw
 -}
 -
 -//void gwinSetButtonCallback(GHandle gh, ????);
 -//void gwinSetButtonInput(GHandle gh, ????);
 -#endif
 -
  #endif /* GFX_USE_GWIN */
  /** @} */
  | 
