aboutsummaryrefslogtreecommitdiffstats
path: root/src/gwin
diff options
context:
space:
mode:
authorAndrew Hannam <andrewh@inmarket.com.au>2012-11-26 18:45:26 +1000
committerAndrew Hannam <andrewh@inmarket.com.au>2012-11-26 18:45:26 +1000
commit8275c8820f230342939a2410dd0b24c0f26a14e5 (patch)
treefcb202fb077e7d78e1381e5ef531bbf96dcca3cf /src/gwin
parent6cc2bc280cc7dc4cb546d94219210d65c15df2e1 (diff)
downloaduGFX-8275c8820f230342939a2410dd0b24c0f26a14e5.tar.gz
uGFX-8275c8820f230342939a2410dd0b24c0f26a14e5.tar.bz2
uGFX-8275c8820f230342939a2410dd0b24c0f26a14e5.zip
Ginput and structure changes
GINPUT Touch including drivers GTIMER fixes GEVENT fixes GWIN button completion Structure changes to better seperate sections of a sub-system
Diffstat (limited to 'src/gwin')
-rw-r--r--src/gwin/button.c331
-rw-r--r--src/gwin/console.c210
-rw-r--r--src/gwin/gwin.mk2
-rw-r--r--src/gwin/gwin_internal.h53
4 files changed, 596 insertions, 0 deletions
diff --git a/src/gwin/button.c b/src/gwin/button.c
new file mode 100644
index 00000000..f62a86a4
--- /dev/null
+++ b/src/gwin/button.c
@@ -0,0 +1,331 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ This file is part of ChibiOS/GFX.
+
+ ChibiOS/GFX is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/GFX is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file src/gwin/button.c
+ * @brief GWIN Driver code.
+ *
+ * @addtogroup GWIN_BUTTON
+ * @{
+ */
+#include "ch.h"
+#include "hal.h"
+#include "gwin.h"
+#include "ginput.h"
+
+#if !defined(GFX_USE_GINPUT) || !GFX_USE_GINPUT
+ #error "GWIN Buttons require GFX_USE_GINPUT"
+#endif
+
+#if (GFX_USE_GWIN && GWIN_NEED_BUTTON) || defined(__DOXYGEN__)
+
+#include <string.h>
+#include "gwin_internal.h"
+
+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;
+ };
+
+// Process an event callback
+static void gwinButtonCallback(void *param, GEvent *pe) {
+ GSourceListener *psl;
+ #define gh ((GHandle)param)
+ #define gbw ((GButtonObject *)param)
+ #define gsh ((GSourceHandle)param)
+ #define pme ((GEventMouse *)pe)
+ #define pte ((GEventTouch *)pe)
+ #define pxe ((GEventToggle *)pe)
+ #define pbe ((GEventGWinButton *)pe)
+
+ switch (pe->type) {
+ #if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE
+ case GEVENT_MOUSE:
+ case GEVENT_TOUCH:
+ // Ignore anything other than the primary mouse button going up or down
+ if (!((pme->current_buttons ^ pme->last_buttons) & GINPUT_MOUSE_BTN_LEFT))
+ return;
+
+ if (gbw->state == GBTN_UP) {
+ // Our button is UP: Test for button down over the button
+ if ((pme->current_buttons & GINPUT_MOUSE_BTN_LEFT)
+ && pme->x >= gbw->gwin.x && pme->x < gbw->gwin.x + gbw->gwin.width
+ && pme->y >= gbw->gwin.y && pme->y < gbw->gwin.y + gbw->gwin.height) {
+ gbw->state = GBTN_DOWN;
+ gwinButtonDraw((GHandle)param);
+ }
+ return;
+ }
+
+ // Our button is DOWN
+
+ // Skip more mouse downs
+ if ((pme->current_buttons & GINPUT_MOUSE_BTN_LEFT))
+ return;
+
+ // This must be a mouse up - set the button as UP
+ gbw->state = GBTN_UP;
+ gwinButtonDraw((GHandle)param);
+
+ // If the mouse up was over the button then create the event
+ if (pme->x >= gbw->gwin.x && pme->x < gbw->gwin.x + gbw->gwin.width
+ && pme->y >= gbw->gwin.y && pme->y < gbw->gwin.y + gbw->gwin.height)
+ break;
+
+ return;
+ #endif
+
+ #if defined(GINPUT_NEED_TOGGLE) && GINPUT_NEED_TOGGLE
+ case GEVENT_TOGGLE:
+ // State has changed - update the button
+ gbw->state = pxe->on ? GBTN_DOWN : GBTN_UP;
+ gwinButtonDraw((GHandle)param);
+
+ // Trigger the event on button down (different than for mouse/touch)
+ if (gbw->state == GBTN_DOWN)
+ break;
+
+ return;
+ #endif
+
+ default:
+ return;
+ }
+
+ // Trigger a GWIN Button Event
+ psl = 0;
+ while ((psl = geventGetSourceListener(gsh, psl))) {
+ if (!(pe = geventGetEventBuffer(psl)))
+ continue;
+ pbe->type = GEVENT_GWIN_BUTTON;
+ pbe->button = gh;
+ geventSendEvent(psl);
+ }
+
+ #undef pbe
+ #undef pme
+ #undef pte
+ #undef pxe
+ #undef gsh
+ #undef gbw
+ #undef gh
+}
+
+/**
+ * @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 = "";
+ geventListenerInit(&gb->listener);
+ geventRegisterCallback(&gb->listener, gwinButtonCallback, gb);
+ 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
+}
+
+// Attach a source to this button. Sources recognised: Mouse, Touch and Toggle - others are ignored (returns false).
+bool_t gwinAttachButtonSource(GHandle gh, GSourceHandle gsh, GEventType type) {
+ #define gbw ((GButtonObject *)gh)
+ unsigned flags;
+
+ switch (type) {
+ #if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE
+ case GEVENT_MOUSE:
+ flags = 0;
+ break;
+ #endif
+ #if defined(GINPUT_NEED_TOUCH) && GINPUT_NEED_TOUCH
+ case GEVENT_TOUCH:
+ flags = 0;
+ break;
+ #endif
+ #if defined(GINPUT_NEED_TOGGLE) && GINPUT_NEED_TOGGLE
+ case GEVENT_TOGGLE:
+ flags = GLISTEN_TOGGLE_OFF|GLISTEN_TOGGLE_ON;
+ break;
+ #endif
+ default:
+ return FALSE;
+ }
+ return geventAttachSource(&gbw->listener, gsh, flags);
+
+ #undef gbw
+}
+
+#endif /* GFX_USE_GWIN && GWIN_NEED_BUTTON */
+/** @} */
+
diff --git a/src/gwin/console.c b/src/gwin/console.c
new file mode 100644
index 00000000..63960c23
--- /dev/null
+++ b/src/gwin/console.c
@@ -0,0 +1,210 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ This file is part of ChibiOS/GFX.
+
+ ChibiOS/GFX is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/GFX is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file src/gwin/console.c
+ * @brief GWIN Driver code.
+ *
+ * @addtogroup GWIN_CONSOLE
+ * @{
+ */
+#include "ch.h"
+#include "hal.h"
+#include "gwin.h"
+
+#if (GFX_USE_GWIN && GWIN_NEED_CONSOLE) || defined(__DOXYGEN__)
+
+#include <string.h>
+#include "gwin_internal.h"
+
+
+#define GWIN_CONSOLE_USE_CLEAR_LINES TRUE
+#define GWIN_CONSOLE_USE_FILLED_CHARS FALSE
+
+/*
+ * 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 /* GFX_USE_GWIN && GWIN_NEED_CONSOLE */
+/** @} */
+
diff --git a/src/gwin/gwin.mk b/src/gwin/gwin.mk
new file mode 100644
index 00000000..cf952580
--- /dev/null
+++ b/src/gwin/gwin.mk
@@ -0,0 +1,2 @@
+GFXSRC += $(GFXLIB)/src/gwin/console.c \
+ $(GFXLIB)/src/gwin/button.c
diff --git a/src/gwin/gwin_internal.h b/src/gwin/gwin_internal.h
new file mode 100644
index 00000000..13401a6f
--- /dev/null
+++ b/src/gwin/gwin_internal.h
@@ -0,0 +1,53 @@
+/*
+ ChibiOS/GFX - Copyright (C) 2012
+ Joel Bodenmann aka Tectu <joel@unormal.org>
+
+ This file is part of ChibiOS/GFX.
+
+ ChibiOS/GFX is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/GFX is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * @file gwin_internal.h
+ * @brief GWIN Graphic window subsystem header file.
+ *
+ * @addtogroup GWIN
+ * @{
+ */
+#ifndef _GWIN_INTERNAL_H
+#define _GWIN_INTERNAL_H
+
+#if GFX_USE_GWIN || defined(__DOXYGEN__)
+
+/*===========================================================================*/
+/* Sub-system constants. */
+/*===========================================================================*/
+
+#define GWIN_FLG_DYNAMIC 0x0001
+#define GWIN_FIRST_CONTROL_FLAG 0x0002
+#define GBTN_FLG_ALLOCTXT (GWIN_FIRST_CONTROL_FLAG<<0)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+GHandle _gwinInit(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GFX_USE_GWIN */
+
+#endif /* _GWIN_INTERNAL_H */
+/** @} */