aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/gwin/button.h40
-rw-r--r--include/gwin/checkbox.h30
-rw-r--r--include/gwin/class_gwin.h5
-rw-r--r--include/gwin/console.h10
-rw-r--r--include/gwin/graph.h4
-rw-r--r--include/gwin/gwidget.h124
-rw-r--r--include/gwin/gwin.h83
-rw-r--r--include/gwin/image.h16
-rw-r--r--include/gwin/label.h6
-rw-r--r--include/gwin/radio.h41
-rw-r--r--include/gwin/slider.h36
-rw-r--r--src/gwin/button.c150
-rw-r--r--src/gwin/checkbox.c76
-rw-r--r--src/gwin/console.c4
-rw-r--r--src/gwin/gimage.c8
-rw-r--r--src/gwin/graph.c2
-rw-r--r--src/gwin/gwidget.c138
-rw-r--r--src/gwin/gwin.c74
-rw-r--r--src/gwin/gwm.c41
-rw-r--r--src/gwin/label.c26
-rw-r--r--src/gwin/radio.c111
-rw-r--r--src/gwin/slider.c90
22 files changed, 588 insertions, 527 deletions
diff --git a/include/gwin/button.h b/include/gwin/button.h
index afe6d0cc..a78a0a71 100644
--- a/include/gwin/button.h
+++ b/include/gwin/button.h
@@ -41,26 +41,14 @@ typedef struct GEventGWinButton {
} GEventGWinButton;
/**
- * @brief Button colors
- */
-typedef struct GButtonColors {
- color_t color_edge;
- color_t color_fill;
- color_t color_txt;
-} GButtonColors;
-
-/**
* @brief The button widget structure
* @note Do not use the members directly - treat it as a black-box.
*/
-typedef struct GButtonObject_t {
+typedef struct GButtonObject {
GWidgetObject w;
#if GINPUT_NEED_TOGGLE
- uint16_t toggle;
+ uint16_t toggle;
#endif
- GButtonColors c_up;
- GButtonColors c_dn;
- GButtonColors c_dis;
} GButtonObject;
#ifdef __cplusplus
@@ -86,26 +74,7 @@ extern "C" {
*
* @api
*/
-GHandle gwinCreateButton(GButtonObject *gb, const GWidgetInit *pInit);
-
-/**
- * @brief Set the colors of a button.
- *
- * @param[in] gh The window handle (must be a button widget)
- * @param[in] pUp The colors for the button when in the up state.
- * @param[in] pDown The colors for the button when in the down state.
- * @param[in] pDisabled The colors for the button when it is disabled.
- *
- * @note The button is not automatically redrawn. Call gwinButtonDraw() after changing the button style
- * @note The button style is copied into the internal button structure - there is no need to
- * maintain static style structures (they can be temporary structures on the stack).
- * @note The pUp, pDown and pDisabled parameters can be NULL. If they are then the existing color styles
- * are not changed for that button state.
- * @note Some custom drawn buttons will ignore he specified colors
- *
- * @api
- */
-void gwinSetButtonColors(GHandle gh, const GButtonColors *pUp, const GButtonColors *pDown, const GButtonColors *pDisabled);
+GHandle gwinButtonCreate(GButtonObject *gb, const GWidgetInit *pInit);
/**
* @brief Is the button current pressed
@@ -115,7 +84,7 @@ void gwinSetButtonColors(GHandle gh, const GButtonColors *pUp, const GButtonColo
*
* @api
*/
-bool_t gwinIsButtonPressed(GHandle gh);
+bool_t gwinButtonIsPressed(GHandle gh);
/**
* @brief Some custom button drawing routines
@@ -141,7 +110,6 @@ bool_t gwinIsButtonPressed(GHandle gh);
* @{
*/
void gwinButtonDraw_3D(GWidgetObject *gw, void *param); // @< A standard 3D button
-void gwinButtonDraw_Box(GWidgetObject *gw, void *param); // @< A very simple box style button
#if GDISP_NEED_ARC || defined(__DOXYGEN__)
void gwinButtonDraw_Rounded(GWidgetObject *gw, void *param); // @< A rounded rectangle button
#endif
diff --git a/include/gwin/checkbox.h b/include/gwin/checkbox.h
index 679a5d9c..fcd0549d 100644
--- a/include/gwin/checkbox.h
+++ b/include/gwin/checkbox.h
@@ -34,26 +34,18 @@
/* Type definitions */
/*===========================================================================*/
-typedef struct GEventGWinCheckbox_t {
+typedef struct GEventGWinCheckbox {
GEventType type; // The type of this event (GEVENT_GWIN_CHECKBOX)
GHandle checkbox; // The checkbox that has been depressed (actually triggered on release)
bool_t isChecked; // Is the checkbox currently checked or unchecked?
} GEventGWinCheckbox;
-typedef struct GCheckboxColors {
- color_t color_border;
- color_t color_checked;
- color_t color_bg;
- color_t color_txt;
-} GCheckboxColors;
-
/* A Checkbox window */
-typedef struct GCheckboxObject_t {
+typedef struct GCheckboxObject {
GWidgetObject w;
#if GINPUT_NEED_TOGGLE
uint16_t toggle;
#endif
- GCheckboxColors c;
} GCheckboxObject;
/**
@@ -75,27 +67,27 @@ typedef struct GCheckboxObject_t {
*
* @api
*/
-GHandle gwinCreateCheckbox(GCheckboxObject *gb, const GWidgetInit *pInit);
+GHandle gwinCheckboxCreate(GCheckboxObject *gb, const GWidgetInit *pInit);
/**
- * @brief Get the state of a checkbox
- * @return TRUE if the checkbox is currently checked
+ * @brief Set the state of a checkbox
*
- * @param[in] gh The window handle (must be a checkbox window)
+ * @param[in] gh The window handle (must be a checkbox window)
+ * @param[in] isChecked TRUE to set the check, FALSE to uncheck.
*
* @api
*/
-bool_t gwinIsCheckboxChecked(GHandle gh);
+void gwinCheckboxCheck(GHandle gh, bool_t isChecked);
/**
- * @brief Set the colors used to draw the checkbox
+ * @brief Get the state of a checkbox
+ * @return TRUE if the checkbox is currently checked
*
- * @param[in] gh The window handle (must be a checkbox window)
- * @param[in] pColors The colors to use
+ * @param[in] gh The window handle (must be a checkbox window)
*
* @api
*/
-void gwinCheckboxSetColors(GHandle gh, GCheckboxColors *pColors);
+bool_t gwinCheckboxIsChecked(GHandle gh);
/**
* @brief Some custom checkbox drawing routines
diff --git a/include/gwin/class_gwin.h b/include/gwin/class_gwin.h
index 1a4de5b9..3be496b1 100644
--- a/include/gwin/class_gwin.h
+++ b/include/gwin/class_gwin.h
@@ -136,6 +136,11 @@ typedef struct gwinVMT {
* @brief The list of all windows in the system
*/
extern gfxQueueASync _GWINList;
+
+ /**
+ * @brief The current window manager
+ */
+ extern GWindowManager * _GWINwm;
#endif
#ifdef __cplusplus
diff --git a/include/gwin/console.h b/include/gwin/console.h
index a3b3697c..b32c3628 100644
--- a/include/gwin/console.h
+++ b/include/gwin/console.h
@@ -27,7 +27,7 @@
/* This file is included within "gwin/gwin.h" */
// A console window. Supports wrapped text writing and a cursor.
-typedef struct GConsoleObject_t {
+typedef struct GConsoleObject {
GWindowObject g;
coord_t cx, cy; // Cursor position
@@ -46,8 +46,8 @@ extern "C" {
/**
* @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.
+ * @details A console window allows text to be written.
+ * @note 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.
@@ -64,7 +64,7 @@ extern "C" {
*
* @api
*/
-GHandle gwinCreateConsole(GConsoleObject *gc, const GWindowInit *pInit);
+GHandle gwinConsoleCreate(GConsoleObject *gc, const GWindowInit *pInit);
#if GFX_USE_OS_CHIBIOS && GWIN_CONSOLE_USE_BASESTREAM
/**
@@ -77,7 +77,7 @@ GHandle gwinCreateConsole(GConsoleObject *gc, const GWindowInit *pInit);
*
* @api
*/
- BaseSequentialStream *gwinGetConsoleStream(GHandle gh);
+ BaseSequentialStream *gwinConsoleGetStream(GHandle gh);
#endif
/**
diff --git a/include/gwin/graph.h b/include/gwin/graph.h
index b5fc1405..8bc33edf 100644
--- a/include/gwin/graph.h
+++ b/include/gwin/graph.h
@@ -71,7 +71,7 @@ typedef struct GGraphStyle_t {
} GGraphStyle;
// A graph window
-typedef struct GGraphObject_t {
+typedef struct GGraphObject {
GWindowObject g;
GGraphStyle style;
coord_t xorigin, yorigin;
@@ -107,7 +107,7 @@ extern "C" {
*
* @api
*/
-GHandle gwinCreateGraph(GGraphObject *gg, const GWindowInit *pInit);
+GHandle gwinGraphCreate(GGraphObject *gg, const GWindowInit *pInit);
/**
* @brief Set the style of the graphing operations.
diff --git a/include/gwin/gwidget.h b/include/gwin/gwidget.h
index ffd8e26f..222a3af5 100644
--- a/include/gwin/gwidget.h
+++ b/include/gwin/gwidget.h
@@ -31,28 +31,50 @@
struct GWidgetObject;
/**
- * @brief Defines a custom drawing function for a widget
+ * @brief The GColorSet structure
+ * @{
*/
-typedef void (*CustomWidgetDrawFunction)(struct GWidgetObject *gw, void *param);
+typedef struct GColorSet {
+ color_t text; // @< The text color
+ color_t edge; // @< The edge color
+ color_t fill; // @< The fill color
+ color_t progress; // @< The color of progress bars
+} GColorSet;
+/* @} */
/**
- * @brief The GWIN Widget structure
- * @note A widget is a GWIN window that accepts user input.
- * It also has a number of other properties such as its ability
- * to redraw itself (a widget maintains drawing state).
- * @note Do not access the members directly. Treat it as a black-box and use the method functions.
- *
+ * @brief The GWidgetStyle structure
+ * @details A GWidgetStyle is a set of colors that together form a "style".
+ * These colors should not be confused with the GWindow foreground
+ * and background colors which are used for drawing operations.
* @{
*/
-typedef struct GWidgetObject {
- GWindowObject g; // @< This is still a GWIN
- const char * txt; // @< The widget text
- CustomWidgetDrawFunction fnDraw; // @< The current draw function
- void * fnParam; // @< A parameter for the current draw function
-} GWidgetObject;
+typedef struct GWidgetStyle {
+ color_t background; // @< The window background color
+ GColorSet enabled; // @< The colors when enabled
+ GColorSet disabled; // @< The colors when disabled
+ GColorSet pressed; // @< The colors when pressed
+} GWidgetStyle;
/* @} */
/**
+ * @brief We define a couple of GWidgetStyle's that you can use in your
+ * application. The Black style is the default style if you don't
+ * specify one.
+ * @note BlackWidgetStyle means that it is designed for a Black background.
+ * Similarly WhiteWidgetStyle is designed for a White background.
+ * @{
+ */
+extern const GWidgetStyle BlackWidgetStyle;
+extern const GWidgetStyle WhiteWidgetStyle;
+/* @} */
+
+/**
+ * @brief Defines a custom drawing function for a widget
+ */
+typedef void (*CustomWidgetDrawFunction)(struct GWidgetObject *gw, void *param);
+
+/**
* @brief The structure to initialise a widget.
*
* @note Some widgets may have extra parameters.
@@ -63,12 +85,33 @@ typedef struct GWidgetObject {
* @{
*/
typedef struct GWidgetInit {
- GWindowInit g; // @< The GWIN initializer
- const char * text; // @< The initial text
+ GWindowInit g; // @< The GWIN initializer
+ const char * text; // @< The initial text
+ CustomWidgetDrawFunction customDraw; // @< A custom draw function - use NULL for the standard
+ void * customParam; // @< A parameter for the custom draw function (default = NULL)
+ const GWidgetStyle * customStyle; // @< A custom style to use - use NULL for the default style
} GWidgetInit;
/* @} */
/**
+ * @brief The GWIN Widget structure
+ * @note A widget is a GWIN window that accepts user input.
+ * It also has a number of other properties such as its ability
+ * to redraw itself (a widget maintains drawing state).
+ * @note Do not access the members directly. Treat it as a black-box and use the method functions.
+ *
+ * @{
+ */
+typedef struct GWidgetObject {
+ GWindowObject g; // @< This is still a GWIN
+ const char * text; // @< The widget text
+ CustomWidgetDrawFunction fnDraw; // @< The current draw function
+ void * fnParam; // @< A parameter for the current draw function
+ const GWidgetStyle * pstyle; // @< The current widget style colors
+} GWidgetObject;
+/* @} */
+
+/**
* A comment/rant on the above structure:
* We would really like the GWindowObject member to be anonymous. While this is
* allowed under the C11, C99, GNU and various other standards which have been
@@ -84,10 +127,31 @@ extern "C" {
#endif
/**
+ * @brief Set the default style for widgets created hereafter.
+ *
+ * @param[in] pstyle The default style. Passing NULL uses the system compiled style.
+ * @param[in] updateAll If TRUE then all existing widgets that are using the current default style
+ * will be updated to use this new style. Widgets that have custom styles different
+ * from the default style will not be updated.
+ *
+ * @note The style must be allocated statically (not on the stack) as only the pointer is stored.
+ *
+ * @api
+ */
+void gwinSetDefaultStyle(const GWidgetStyle *pstyle, bool_t updateAll);
+
+/**
+ * @brief Get the current default style.
+ *
+ * @api
+ */
+const GWidgetStyle *gwinGetDefaultStyle(void);
+
+/**
* @brief Set the text of a widget.
*
* @param[in] gh The widget handle
- * @param[in] txt The text to set. This must be a constant string unless useAlloc is set.
+ * @param[in] text The 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 widget is automatically redrawn
@@ -95,7 +159,7 @@ extern "C" {
*
* @api
*/
-void gwinSetText(GHandle gh, const char *txt, bool_t useAlloc);
+void gwinSetText(GHandle gh, const char *text, bool_t useAlloc);
/**
* @brief Get the text of a widget.
@@ -108,6 +172,30 @@ void gwinSetText(GHandle gh, const char *txt, bool_t useAlloc);
const char *gwinGetText(GHandle gh);
/**
+ * @brief Set the style of a widget.
+ *
+ * @param[in] gh The widget handle
+ * @param[in] pstyle The style to set. This must be a static structure (not allocated on a transient stack).
+ * Use NULL to reset to the default style.
+ *
+ * @note The widget is automatically redrawn
+ * @note Non-widgets will ignore this call.
+ *
+ * @api
+ */
+void gwinSetStyle(GHandle gh, const GWidgetStyle *pstyle);
+
+/**
+ * @brief Get the style of a widget.
+ * @return The widget style or NULL if it isn't a widget
+ *
+ * @param[in] gh The widget handle
+ *
+ * @api
+ */
+const GWidgetStyle *gwinGetStyle(GHandle gh);
+
+/**
* @brief Set the routine to perform a custom widget drawing.
*
* @param[in] gh The widget handle
diff --git a/include/gwin/gwin.h b/include/gwin/gwin.h
index 4d0deaf0..37c2a4e8 100644
--- a/include/gwin/gwin.h
+++ b/include/gwin/gwin.h
@@ -174,7 +174,7 @@ extern "C" {
*
* @api
*/
- GHandle gwinCreateWindow(GWindowObject *pgw, const GWindowInit *pInit);
+ GHandle gwinWindowCreate(GWindowObject *pgw, const GWindowInit *pInit);
/**
* @brief Destroy a window (of any type). Releases any dynamically allocated memory.
@@ -357,46 +357,63 @@ extern "C" {
void gwinResize(GHandle gh, coord_t width, coord_t height);
/**
- * @brief Minimize, Maximize or Restore a window
+ * @brief Redraw a window
*
* @param[in] gh The window
- * @param[in] minmax The new minimized/maximized state
*
- * @note The final window state may not be the requested state. Window Managers
- * do not need to implement changing the minmax state. If there is no
- * window manager this call is ignored.
- * @note The window is redrawn if it is changed. See the comments in @p gwinSetVisible()
- * with regard to what can be redrawn and what can't.
- * @note It is up to the window manager to determine what happens with any screen area
- * uncovered by resizing the window.
- * @note When a window is minimised it may be asked to draw the window or the window
- * manager may draw the minimised window.
+ * @note This is normally never required as windows and widgets will redraw as required.
+ * Note that some windows are incapable of redrawing themselves as they don't save
+ * their drawing state.
*
* @api
*/
- void gwinSetMinMax(GHandle gh, GWindowMinMax minmax);
+ void gwinRedraw(GHandle gh);
- /**
- * @brief Get the Minimized/Maximized state of a window
- *
- * @param[in] gh The window
- *
- * @api
- */
- GWindowMinMax gwinGetMinMax(GHandle gh);
+ #if GWIN_NEED_WINDOWMANAGER
+ /**
+ * @brief Minimize, Maximize or Restore a window
+ * @pre GWIN_NEED_WINDOWMANAGER must be TRUE
+ *
+ * @param[in] gh The window
+ * @param[in] minmax The new minimized/maximized state
+ *
+ * @note The final window state may not be the requested state. Window Managers
+ * do not need to implement changing the minmax state. If there is no
+ * window manager this call is ignored.
+ * @note The window is redrawn if it is changed. See the comments in @p gwinSetVisible()
+ * with regard to what can be redrawn and what can't.
+ * @note It is up to the window manager to determine what happens with any screen area
+ * uncovered by resizing the window.
+ * @note When a window is minimised it may be asked to draw the window or the window
+ * manager may draw the minimised window.
+ *
+ * @api
+ */
+ void gwinSetMinMax(GHandle gh, GWindowMinMax minmax);
- /**
- * @brief Raise a window to the top of the z-order
- *
- * @param[in] gh The window
- *
- * @note The window z-order is only supported by some window managers. If there is no
- * window manager this call simple tries to redraw the window. See the comments
- * in @p gwinSetVisible() with regard to what can be redrawn and what can't.
- *
- * @api
- */
- void gwinRaise(GHandle gh);
+ /**
+ * @brief Get the Minimized/Maximized state of a window
+ * @pre GWIN_NEED_WINDOWMANAGER must be TRUE
+ *
+ * @param[in] gh The window
+ *
+ * @api
+ */
+ GWindowMinMax gwinGetMinMax(GHandle gh);
+
+ /**
+ * @brief Raise a window to the top of the z-order
+ * @pre GWIN_NEED_WINDOWMANAGER must be TRUE
+ *
+ * @param[in] gh The window
+ *
+ * @note The window z-order is only supported by some window managers. See the comments
+ * in @p gwinSetVisible() with regard to what can be redrawn and what can't.
+ *
+ * @api
+ */
+ void gwinRaise(GHandle gh);
+ #endif
#if GDISP_NEED_TEXT || defined(__DOXYGEN__)
/**
diff --git a/include/gwin/image.h b/include/gwin/image.h
index d32e9a0c..7eb2d969 100644
--- a/include/gwin/image.h
+++ b/include/gwin/image.h
@@ -30,10 +30,10 @@
// This file is included within "gwin/gwin.h"
// An image window
-typedef struct GImageWidget_t {
+typedef struct GImageObject {
GWindowObject g;
gdispImage image;
-} GImageWidget;
+} GImageObject;
#ifdef __cplusplus
extern "C" {
@@ -41,7 +41,7 @@ extern "C" {
/**
* @brief Create an image widget.
- * @details A console widget allows to display a picture.
+ * @details Display's a picture.
* @return NULL if there is no resultant drawing area, otherwise the widget handle.
*
* @param[in] widget The image widget structure to initialise. If this is NULL, the structure is dynamically allocated.
@@ -52,10 +52,10 @@ extern "C" {
*
* @api
*/
-GHandle gwinImageCreate(GImageWidget *widget, GWindowInit *pInit);
+GHandle gwinImageCreate(GImageObject *widget, GWindowInit *pInit);
/**
- * @brief Sets the sets the io fields in the image structure to routines that support reading from an image stored
+ * @brief Sets the input routines that support reading the image from memory
* in RAM or flash.
* @return TRUE if the IO open function succeeds
*
@@ -68,8 +68,7 @@ bool_t gwinImageOpenMemory(GHandle gh, const void* memory);
#if defined(WIN32) || GFX_USE_OS_WIN32 || GFX_USE_OS_POSIX || defined(__DOXYGEN__)
/**
- * @brief Sets the sets the io fields in the image structure to routines that support reading from an image stored
- * in a simulators native file system.
+ * @brief Sets the input routines that support reading the image from a file
* @return TRUE if the IO open function succeeds
*
* @param[in] gh The widget (must be an image widget)
@@ -82,8 +81,7 @@ bool_t gwinImageOpenMemory(GHandle gh, const void* memory);
#if GFX_USE_OS_CHIBIOS || defined(__DOXYGEN__)
/**
- * @brief Sets the sets the io fields in the image structure to routines that support reading from an image stored
- * on a BaseFileStream (eg. an SD-Card).
+ * @brief Sets the input routines that support reading the image from a BaseFileStream (eg. an SD-Card).
* @return TRUE if the IO open function succeeds
*
* @param[in] gh The widget (must be an image widget)
diff --git a/include/gwin/label.h b/include/gwin/label.h
index d387345d..4362b035 100644
--- a/include/gwin/label.h
+++ b/include/gwin/label.h
@@ -30,9 +30,9 @@
// This file is included within "gwin/gwin.h"
// An label window
-typedef struct GLabelWidget_t {
+typedef struct GLabelObject {
GWidgetObject w;
-} GLabelWidget;
+} GLabelObject;
#ifdef __cplusplus
extern "C" {
@@ -49,7 +49,7 @@ extern "C" {
*
* @api
*/
-GHandle gwinLabelCreate(GLabelWidget *widget, GWidgetInit *pInit);
+GHandle gwinLabelCreate(GLabelObject *widget, GWidgetInit *pInit);
#ifdef __cplusplus
}
diff --git a/include/gwin/radio.h b/include/gwin/radio.h
index 8d4e32a7..1e0a2dd6 100644
--- a/include/gwin/radio.h
+++ b/include/gwin/radio.h
@@ -40,27 +40,15 @@ typedef struct GEventGWinRadio {
} GEventGWinRadio;
/**
- * @brief Button colors
- */
-typedef struct GRadioColors {
- color_t color_edge;
- color_t color_fill;
- color_t color_txt;
-} GRadioColors;
-
-/**
* @brief The radio button widget structure
* @note Do not use the members directly - treat it as a black-box.
*/
-typedef struct GRadioObject_t {
+typedef struct GRadioObject {
GWidgetObject w;
#if GINPUT_NEED_TOGGLE
uint16_t toggle;
#endif
uint16_t group;
- GRadioColors c_up;
- GRadioColors c_dn;
- GRadioColors c_dis;
} GRadioObject;
#ifdef __cplusplus
@@ -89,26 +77,7 @@ extern "C" {
*
* @api
*/
-GHandle gwinCreateRadio(GRadioObject *gb, const GWidgetInit *pInit, uint16_t group);
-
-/**
- * @brief Set the colors of a button.
- *
- * @param[in] gh The window handle (must be a radio widget)
- * @param[in] pUp The colors for the button when in the up state.
- * @param[in] pDown The colors for the button when in the down state.
- * @param[in] pDisabled The colors for the button when it is disabled.
- *
- * @note The button is not automatically redrawn. Call gwinButtonDraw() after changing the button style
- * @note The button style is copied into the internal button structure - there is no need to
- * maintain static style structures (they can be temporary structures on the stack).
- * @note The pUp, pDown and pDisabled parameters can be NULL. If they are then the existing color styles
- * are not changed for that button state.
- * @note Some custom drawn buttons will ignore he specified colors
- *
- * @api
- */
-void gwinSetRadioColors(GHandle gh, const GRadioColors *pUp, const GRadioColors *pDown, const GRadioColors *pDisabled);
+GHandle gwinRadioCreate(GRadioObject *gb, const GWidgetInit *pInit, uint16_t group);
/**
* @brief Press this radio button (and by definition unset any others in the group)
@@ -117,7 +86,7 @@ void gwinSetRadioColors(GHandle gh, const GRadioColors *pUp, const GRadioColors
*
* @api
*/
-void gwinPressRadio(GHandle gh);
+void gwinRadioPress(GHandle gh);
/**
* @brief Is the radio button currently pressed
@@ -127,7 +96,7 @@ void gwinPressRadio(GHandle gh);
*
* @api
*/
-bool_t gwinIsRadioPressed(GHandle gh);
+bool_t gwinRadioIsPressed(GHandle gh);
/**
* @brief Find the currently pressed radio button in the specified group
@@ -137,7 +106,7 @@ bool_t gwinIsRadioPressed(GHandle gh);
*
* @api
*/
-GHandle gwinActiveRadio(uint16_t group);
+GHandle gwinRadioGetActive(uint16_t group);
/**
* @brief Some custom radio button drawing routines
diff --git a/include/gwin/slider.h b/include/gwin/slider.h
index a8cf7ecf..f4ab8750 100644
--- a/include/gwin/slider.h
+++ b/include/gwin/slider.h
@@ -26,7 +26,7 @@
#define GEVENT_GWIN_SLIDER (GEVENT_GWIN_FIRST+1)
-typedef struct GEventGWinSlider_t {
+typedef struct GEventGWinSlider {
GEventType type; // The type of this event (GEVENT_GWIN_BUTTON)
GHandle slider; // The slider that is returning results
int position;
@@ -34,16 +34,8 @@ typedef struct GEventGWinSlider_t {
// There are currently no GEventGWinSlider listening flags - use 0
-typedef struct GSliderColors {
- color_t color_edge;
- color_t color_thumb;
- color_t color_active;
- color_t color_inactive;
- color_t color_txt;
-} GSliderColors;
-
// A slider window
-typedef struct GSliderObject_t {
+typedef struct GSliderObject {
GWidgetObject w;
#if GINPUT_NEED_TOGGLE
uint16_t t_dn;
@@ -56,7 +48,6 @@ typedef struct GSliderObject_t {
int min;
int max;
int pos;
- GSliderColors c;
} GSliderObject;
#ifdef __cplusplus
@@ -86,7 +77,7 @@ extern "C" {
*
* @api
*/
-GHandle gwinCreateSlider(GSliderObject *gb, const GWidgetInit *pInit);
+GHandle gwinSliderCreate(GSliderObject *gb, const GWidgetInit *pInit);
/**
* @brief Set the slider range.
@@ -99,7 +90,7 @@ GHandle gwinCreateSlider(GSliderObject *gb, const GWidgetInit *pInit);
*
* @api
*/
-void gwinSetSliderRange(GHandle gh, int min, int max);
+void gwinSliderSetRange(GHandle gh, int min, int max);
/**
* @brief Set the slider position.
@@ -112,22 +103,7 @@ void gwinSetSliderRange(GHandle gh, int min, int max);
*
* @api
*/
-void gwinSetSliderPosition(GHandle gh, int pos);
-
-/**
- * @brief Set the style of a slider.
- * @details The slider style is defined by its colours.
- *
- * @param[in] gh The window handle (must be a slider window)
- * @param[in] pStyle The styling for the slider.
- *
- * @note The slider is not automatically redrawn. Call gwinSliderDraw() after changing the slider style
- * @note The slider style is copied into the internal slider structure - there is no need to
- * maintain a static style structure.
- *
- * @api
- */
-void gwinSetSliderColors(GHandle gh, const GSliderColors *pStyle);
+void gwinSliderSetPosition(GHandle gh, int pos);
/**
* @brief Get the current slider position.
@@ -140,7 +116,7 @@ void gwinSetSliderColors(GHandle gh, const GSliderColors *pStyle);
*
* @api
*/
-#define gwinGetSliderPosition(gh) (((GSliderObject *)(gh))->pos)
+#define gwinSliderGetPosition(gh) (((GSliderObject *)(gh))->pos)
/**
* @brief Some custom slider drawing routines
diff --git a/src/gwin/button.c b/src/gwin/button.c
index 73f56c2e..e6f628c3 100644
--- a/src/gwin/button.c
+++ b/src/gwin/button.c
@@ -29,23 +29,6 @@
// Our pressed state
#define GBUTTON_FLG_PRESSED (GWIN_FIRST_CONTROL_FLAG<<0)
-// Default color scheme
-static const GButtonColors GButtonDefaultColorsUp = {
- HTML2COLOR(0x404040), // color_up_edge;
- HTML2COLOR(0xE0E0E0), // color_up_fill;
- HTML2COLOR(0x000000), // color_up_txt;
-};
-static const GButtonColors GButtonDefaultColorsDown = {
- HTML2COLOR(0x404040), // color_dn_edge;
- HTML2COLOR(0x808080), // color_dn_fill;
- HTML2COLOR(0x404040), // color_dn_txt;
-};
-static const GButtonColors GButtonDefaultColorsDisabled = {
- HTML2COLOR(0x808080), // color_dis_edge;
- HTML2COLOR(0xE0E0E0), // color_dis_fill;
- HTML2COLOR(0xC0C0C0), // color_dis_txt;
-};
-
// Send the button event
static void SendButtonEvent(GWidgetObject *gw) {
GSourceListener * psl;
@@ -153,30 +136,18 @@ static const gwidgetVMT buttonVMT = {
#endif
};
-GHandle gwinCreateButton(GButtonObject *gw, const GWidgetInit *pInit) {
+GHandle gwinButtonCreate(GButtonObject *gw, const GWidgetInit *pInit) {
if (!(gw = (GButtonObject *)_gwidgetCreate(&gw->w, pInit, &buttonVMT)))
return 0;
#if GINPUT_NEED_TOGGLE
gw->toggle = GWIDGET_NO_INSTANCE;
#endif
- gw->c_up = GButtonDefaultColorsUp;
- gw->c_dn = GButtonDefaultColorsDown;
- gw->c_dis = GButtonDefaultColorsDisabled;
gwinSetVisible((GHandle)gw, pInit->g.show);
return (GHandle)gw;
}
-void gwinSetButtonColors(GHandle gh, const GButtonColors *pUp, const GButtonColors *pDown, const GButtonColors *pDisabled) {
- if (gh->vmt != (gwinVMT *)&buttonVMT)
- return;
-
- if (pUp) ((GButtonObject *)gh)->c_up = *pUp;
- if (pDown) ((GButtonObject *)gh)->c_dn = *pDown;
- if (pDisabled) ((GButtonObject *)gh)->c_dis = *pDisabled;
-}
-
-bool_t gwinIsButtonPressed(GHandle gh) {
+bool_t gwinButtonIsPressed(GHandle gh) {
if (gh->vmt != (gwinVMT *)&buttonVMT)
return FALSE;
@@ -187,73 +158,64 @@ bool_t gwinIsButtonPressed(GHandle gh) {
* Custom Draw Routines
*----------------------------------------------------------*/
-static GButtonColors *getDrawColors(GWidgetObject *gw) {
- if (!(gw->g.flags & GWIN_FLG_ENABLED)) return &((GButtonObject *)gw)->c_dis;
- if ((gw->g.flags & GBUTTON_FLG_PRESSED)) return &((GButtonObject *)gw)->c_dn;
- return &((GButtonObject *)gw)->c_up;
+static const GColorSet *getDrawColors(GWidgetObject *gw) {
+ if (!(gw->g.flags & GWIN_FLG_ENABLED)) return &gw->pstyle->disabled;
+ if ((gw->g.flags & GBUTTON_FLG_PRESSED)) return &gw->pstyle->pressed;
+ return &gw->pstyle->enabled;
}
void gwinButtonDraw_3D(GWidgetObject *gw, void *param) {
- (void) param;
- GButtonColors * pcol;
+ const GColorSet * pcol;
+ (void) param;
if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
pcol = getDrawColors(gw);
- gdispFillStringBox(gw->g.x, gw->g.y, gw->g.width-1, gw->g.height-1, gw->txt, gw->g.font, pcol->color_txt, pcol->color_fill, justifyCenter);
- gdispDrawLine(gw->g.x+gw->g.width-1, gw->g.y, gw->g.x+gw->g.width-1, gw->g.y+gw->g.height-1, pcol->color_edge);
- gdispDrawLine(gw->g.x, gw->g.y+gw->g.height-1, gw->g.x+gw->g.width-2, gw->g.y+gw->g.height-1, pcol->color_edge);
-}
-
-void gwinButtonDraw_Box(GWidgetObject *gw, void *param) {
- (void) param;
- GButtonColors * pcol;
-
- if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
- pcol = getDrawColors(gw);
-
- gdispFillStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, pcol->color_fill, justifyCenter);
- gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->color_edge);
+ gdispFillStringBox(gw->g.x, gw->g.y, gw->g.width-1, gw->g.height-1, gw->text, gw->g.font, pcol->text, pcol->fill, justifyCenter);
+ gdispDrawLine(gw->g.x+gw->g.width-1, gw->g.y, gw->g.x+gw->g.width-1, gw->g.y+gw->g.height-1, pcol->edge);
+ gdispDrawLine(gw->g.x, gw->g.y+gw->g.height-1, gw->g.x+gw->g.width-2, gw->g.y+gw->g.height-1, pcol->edge);
}
#if GDISP_NEED_ARC
void gwinButtonDraw_Rounded(GWidgetObject *gw, void *param) {
- (void) param;
- GButtonColors * pcol;
+ const GColorSet * pcol;
+ (void) param;
if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
pcol = getDrawColors(gw);
+ gdispFillArea(gw->g.x, gw->g.y, ld, ld, gw->pstyle->background);
if (gw->g.width >= 2*RND_CNR_SIZE+10) {
- gdispFillRoundedBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, RND_CNR_SIZE-1, pcol->color_fill);
- gdispDrawStringBox(gw->g.x+1, gw->g.y+RND_CNR_SIZE, gw->g.width-2, gw->g.height-(2*RND_CNR_SIZE), gw->txt, gw->g.font, pcol->color_txt, justifyCenter);
- gdispDrawRoundedBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, RND_CNR_SIZE, pcol->color_edge);
+ gdispFillRoundedBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, RND_CNR_SIZE-1, pcol->fill);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+RND_CNR_SIZE, gw->g.width-2, gw->g.height-(2*RND_CNR_SIZE), gw->text, gw->g.font, pcol->text, justifyCenter);
+ gdispDrawRoundedBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, RND_CNR_SIZE, pcol->edge);
} else {
- gdispFillStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, pcol->color_fill, justifyCenter);
- gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->color_edge);
+ gdispFillStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, pcol->fill, justifyCenter);
+ gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge);
}
}
#endif
#if GDISP_NEED_ELLIPSE
void gwinButtonDraw_Ellipse(GWidgetObject *gw, void *param) {
- (void) param;
- GButtonColors * pcol;
+ const GColorSet * pcol;
+ (void) param;
if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
pcol = getDrawColors(gw);
- gdispFillEllipse(gw->g.x+1, gw->g.y+1, gw->g.width/2-1, gw->g.height/2-1, pcol->color_fill);
- gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, justifyCenter);
- gdispDrawEllipse(gw->g.x, gw->g.y, gw->g.width/2, gw->g.height/2, pcol->color_edge);
+ gdispFillArea(gw->g.x, gw->g.y, ld, ld, gw->pstyle->background);
+ gdispFillEllipse(gw->g.x+1, gw->g.y+1, gw->g.width/2-1, gw->g.height/2-1, pcol->fill);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);
+ gdispDrawEllipse(gw->g.x, gw->g.y, gw->g.width/2, gw->g.height/2, pcol->edge);
}
#endif
#if GDISP_NEED_CONVEX_POLYGON
void gwinButtonDraw_ArrowUp(GWidgetObject *gw, void *param) {
- (void) param;
- GButtonColors * pcol;
- point arw[7];
+ const GColorSet * pcol;
+ (void) param;
+ point arw[7];
if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
pcol = getDrawColors(gw);
@@ -266,15 +228,16 @@ void gwinButtonDraw_Box(GWidgetObject *gw, void *param) {
arw[5].x = (gw->g.width - gw->g.width/ARROWBODY_DIVIDER)/2; arw[5].y = gw->g.height/ARROWHEAD_DIVIDER;
arw[6].x = 0; arw[6].y = gw->g.height/ARROWHEAD_DIVIDER;
- gdispFillConvexPoly(gw->g.x, gw->g.y, arw, 7, pcol->color_fill);
- gdispDrawPoly(gw->g.x, gw->g.y, arw, 7, pcol->color_edge);
- gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, justifyCenter);
+ gdispFillArea(gw->g.x, gw->g.y, ld, ld, gw->pstyle->background);
+ gdispFillConvexPoly(gw->g.x, gw->g.y, arw, 7, pcol->fill);
+ gdispDrawPoly(gw->g.x, gw->g.y, arw, 7, pcol->edge);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);
}
void gwinButtonDraw_ArrowDown(GWidgetObject *gw, void *param) {
- (void) param;
- GButtonColors * pcol;
- point arw[7];
+ const GColorSet * pcol;
+ (void) param;
+ point arw[7];
if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
pcol = getDrawColors(gw);
@@ -287,15 +250,16 @@ void gwinButtonDraw_Box(GWidgetObject *gw, void *param) {
arw[5].x = (gw->g.width - gw->g.width/ARROWBODY_DIVIDER)/2; arw[5].y = gw->g.height-1-gw->g.height/ARROWHEAD_DIVIDER;
arw[6].x = 0; arw[6].y = gw->g.height-1-gw->g.height/ARROWHEAD_DIVIDER;
- gdispFillConvexPoly(gw->g.x, gw->g.y, arw, 7, pcol->color_fill);
- gdispDrawPoly(gw->g.x, gw->g.y, arw, 7, pcol->color_edge);
- gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, justifyCenter);
+ gdispFillArea(gw->g.x, gw->g.y, ld, ld, gw->pstyle->background);
+ gdispFillConvexPoly(gw->g.x, gw->g.y, arw, 7, pcol->fill);
+ gdispDrawPoly(gw->g.x, gw->g.y, arw, 7, pcol->edge);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);
}
void gwinButtonDraw_ArrowLeft(GWidgetObject *gw, void *param) {
- (void) param;
- GButtonColors * pcol;
- point arw[7];
+ const GColorSet * pcol;
+ (void) param;
+ point arw[7];
if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
pcol = getDrawColors(gw);
@@ -308,15 +272,16 @@ void gwinButtonDraw_Box(GWidgetObject *gw, void *param) {
arw[5].x = gw->g.width/ARROWHEAD_DIVIDER; arw[5].y = (gw->g.height + gw->g.height/ARROWBODY_DIVIDER)/2;
arw[6].x = gw->g.width/ARROWHEAD_DIVIDER; arw[6].y = gw->g.height-1;
- gdispFillConvexPoly(gw->g.x, gw->g.y, arw, 7, pcol->color_fill);
- gdispDrawPoly(gw->g.x, gw->g.y, arw, 7, pcol->color_edge);
- gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, justifyCenter);
+ gdispFillArea(gw->g.x, gw->g.y, ld, ld, gw->pstyle->background);
+ gdispFillConvexPoly(gw->g.x, gw->g.y, arw, 7, pcol->fill);
+ gdispDrawPoly(gw->g.x, gw->g.y, arw, 7, pcol->edge);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);
}
void gwinButtonDraw_ArrowRight(GWidgetObject *gw, void *param) {
- (void) param;
- GButtonColors * pcol;
- point arw[7];
+ const GColorSet * pcol;
+ (void) param;
+ point arw[7];
if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
pcol = getDrawColors(gw);
@@ -329,32 +294,31 @@ void gwinButtonDraw_Box(GWidgetObject *gw, void *param) {
arw[5].x = gw->g.width-1-gw->g.width/ARROWHEAD_DIVIDER; arw[5].y = (gw->g.height + gw->g.height/ARROWBODY_DIVIDER)/2;
arw[6].x = gw->g.width-1-gw->g.width/ARROWHEAD_DIVIDER; arw[6].y = gw->g.height-1;
- gdispFillConvexPoly(gw->g.x, gw->g.y, arw, 7, pcol->color_fill);
- gdispDrawPoly(gw->g.x, gw->g.y, arw, 7, pcol->color_edge);
- gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, justifyCenter);
+ gdispFillArea(gw->g.x, gw->g.y, ld, ld, gw->pstyle->background);
+ gdispFillConvexPoly(gw->g.x, gw->g.y, arw, 7, pcol->fill);
+ gdispDrawPoly(gw->g.x, gw->g.y, arw, 7, pcol->edge);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);
}
#endif
#if GDISP_NEED_IMAGE || defined(__DOXYGEN__)
void gwinButtonDraw_Image(GWidgetObject *gw, void *param) {
- GButtonColors * pcol;
- coord_t sy;
+ const GColorSet * pcol;
+ coord_t sy;
if (gw->g.vmt != (gwinVMT *)&buttonVMT) return;
+ pcol = getDrawColors(gw);
if (!(gw->g.flags & GWIN_FLG_ENABLED)) {
- pcol = &((GButtonObject *)gw)->c_dis;
sy = 2 * gw->g.height;
} else if ((gw->g.flags & GBUTTON_FLG_PRESSED)) {
- pcol = &((GButtonObject *)gw)->c_dn;
sy = gw->g.height;
} else {
- pcol = &((GButtonObject *)gw)->c_up;
sy = 0;
}
gdispImageDraw((gdispImage *)param, gw->g.x, gw->g.y, gw->g.width, gw->g.height, 0, sy);
- gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, justifyCenter);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);
}
#endif
diff --git a/src/gwin/checkbox.c b/src/gwin/checkbox.c
index 74d612d2..84eb3b9f 100644
--- a/src/gwin/checkbox.c
+++ b/src/gwin/checkbox.c
@@ -24,13 +24,6 @@
// Our checked state
#define GCHECKBOX_FLG_CHECKED (GWIN_FIRST_CONTROL_FLAG<<0)
-static const GCheckboxColors defaultColors = {
- Black, // border
- Grey, // selected
- White, // background
- Black, // text
-};
-
// Send the checkbox event
static void SendCheckboxEvent(GWidgetObject *gw) {
GSourceListener * psl;
@@ -115,70 +108,89 @@ static const gwidgetVMT checkboxVMT = {
#endif
};
-GHandle gwinCreateCheckbox(GCheckboxObject *gb, const GWidgetInit *pInit) {
+GHandle gwinCheckboxCreate(GCheckboxObject *gb, const GWidgetInit *pInit) {
if (!(gb = (GCheckboxObject *)_gwidgetCreate(&gb->w, pInit, &checkboxVMT)))
return 0;
#if GINPUT_NEED_TOGGLE
gb->toggle = GWIDGET_NO_INSTANCE;
#endif
- gb->c = defaultColors; // assign the default colors
gwinSetVisible((GHandle)gb, pInit->g.show);
return (GHandle)gb;
}
-bool_t gwinIsCheckboxChecked(GHandle gh) {
+void gwinCheckboxCheck(GHandle gh, bool_t isChecked) {
+ if (gh->vmt != (gwinVMT *)&checkboxVMT)
+ return;
+
+ if (isChecked) {
+ if ((gh->flags & GCHECKBOX_FLG_CHECKED)) return;
+ gh->flags |= GCHECKBOX_FLG_CHECKED;
+ } else {
+ if (!(gh->flags & GCHECKBOX_FLG_CHECKED)) return;
+ gh->flags &= ~GCHECKBOX_FLG_CHECKED;
+ }
+ _gwidgetRedraw(gh);
+ SendCheckboxEvent((GWidgetObject *)gh);
+}
+
+bool_t gwinCheckboxIsChecked(GHandle gh) {
if (gh->vmt != (gwinVMT *)&checkboxVMT)
return FALSE;
return (gh->flags & GCHECKBOX_FLG_CHECKED) ? TRUE : FALSE;
}
-void gwinCheckboxSetColors(GHandle gh, GCheckboxColors *pColors) {
- if (gh->vmt != (gwinVMT *)&checkboxVMT)
- return;
+/*----------------------------------------------------------
+ * Custom Draw Routines
+ *----------------------------------------------------------*/
- ((GCheckboxObject *)gh)->c = *pColors;
+static const GColorSet *getDrawColors(GWidgetObject *gw) {
+ if (!(gw->g.flags & GWIN_FLG_ENABLED)) return &gw->pstyle->disabled;
+ if ((gw->g.flags & GCHECKBOX_FLG_CHECKED)) return &gw->pstyle->pressed;
+ return &gw->pstyle->enabled;
}
void gwinCheckboxDraw_CheckOnLeft(GWidgetObject *gw, void *param) {
- #define gcw ((GCheckboxObject *)gw)
- coord_t ld, df;
- (void) param;
+ #define gcw ((GCheckboxObject *)gw)
+ coord_t ld, df;
+ const GColorSet * pcol;
+ (void) param;
- if (gw->g.vmt != (gwinVMT *)&checkboxVMT)
- return;
+ if (gw->g.vmt != (gwinVMT *)&checkboxVMT) return;
+ pcol = getDrawColors(gw);
ld = gw->g.width < gw->g.height ? gw->g.width : gw->g.height;
- gdispFillArea(gw->g.x+1, gw->g.y+1, ld, ld-2, gcw->c.color_bg);
- gdispDrawBox(gw->g.x, gw->g.y, ld, ld, gcw->c.color_border);
+ gdispFillArea(gw->g.x+1, gw->g.y+1, ld, ld-2, gw->pstyle->background);
+ gdispDrawBox(gw->g.x, gw->g.y, ld, ld, pcol->edge);
df = ld < 4 ? 1 : 2;
if (gw->g.flags & GCHECKBOX_FLG_CHECKED)
- gdispFillArea(gw->g.x+df, gw->g.y+df, ld-2*df, ld-2*df, gcw->c.color_checked);
+ gdispFillArea(gw->g.x+df, gw->g.y+df, ld-2*df, ld-2*df, pcol->fill);
- gdispFillStringBox(gw->g.x+ld+1, gw->g.y, gw->g.width-ld-1, gw->g.height, gw->txt, gw->g.font, gcw->c.color_txt, gcw->c.color_bg, justifyLeft);
+ gdispFillStringBox(gw->g.x+ld+1, gw->g.y, gw->g.width-ld-1, gw->g.height, gw->text, gw->g.font, pcol->text, gw->pstyle->background, justifyLeft);
#undef gcw
}
void gwinCheckboxDraw_CheckOnRight(GWidgetObject *gw, void *param) {
- #define gcw ((GCheckboxObject *)gw)
- coord_t ep, ld, df;
- (void) param;
+ #define gcw ((GCheckboxObject *)gw)
+ coord_t ep, ld, df;
+ const GColorSet * pcol;
+ (void) param;
- if (gw->g.vmt != (gwinVMT *)&checkboxVMT)
- return;
+ if (gw->g.vmt != (gwinVMT *)&checkboxVMT) return;
+ pcol = getDrawColors(gw);
ld = gw->g.width < gw->g.height ? gw->g.width : gw->g.height;
ep = gw->g.width-ld-1;
- gdispFillArea(gw->g.x+ep-1, gw->g.y+1, ld, ld-2, gcw->c.color_bg);
- gdispDrawBox(gw->g.x+ep, gw->g.y, ld, ld, gcw->c.color_border);
+ gdispFillArea(gw->g.x+ep-1, gw->g.y+1, ld, ld-2, gw->pstyle->background);
+ gdispDrawBox(gw->g.x+ep, gw->g.y, ld, ld, pcol->edge);
df = ld < 4 ? 1 : 2;
if (gw->g.flags & GCHECKBOX_FLG_CHECKED)
- gdispFillArea(gw->g.x+ep+df, gw->g.y+df, ld-2*df, ld-2*df, gcw->c.color_checked);
+ gdispFillArea(gw->g.x+ep+df, gw->g.y+df, ld-2*df, ld-2*df, pcol->fill);
- gdispFillStringBox(gw->g.x, gw->g.y, ep, gw->g.height, gw->txt, gw->g.font, gcw->c.color_txt, gcw->c.color_bg, justifyRight);
+ gdispFillStringBox(gw->g.x, gw->g.y, ep, gw->g.height, gw->text, gw->g.font, pcol->text, gw->pstyle->background, justifyRight);
#undef gcw
}
diff --git a/src/gwin/console.c b/src/gwin/console.c
index 105cc79d..06648e9b 100644
--- a/src/gwin/console.c
+++ b/src/gwin/console.c
@@ -66,7 +66,7 @@ static const gwinVMT consoleVMT = {
AfterClear, // The after-clear routine
};
-GHandle gwinCreateConsole(GConsoleObject *gc, const GWindowInit *pInit) {
+GHandle gwinConsoleCreate(GConsoleObject *gc, const GWindowInit *pInit) {
if (!(gc = (GConsoleObject *)_gwindowCreate(&gc->g, pInit, &consoleVMT, 0)))
return 0;
#if GFX_USE_OS_CHIBIOS && GWIN_CONSOLE_USE_BASESTREAM
@@ -79,7 +79,7 @@ GHandle gwinCreateConsole(GConsoleObject *gc, const GWindowInit *pInit) {
}
#if GFX_USE_OS_CHIBIOS && GWIN_CONSOLE_USE_BASESTREAM
- BaseSequentialStream *gwinGetConsoleStream(GHandle gh) {
+ BaseSequentialStream *gwinConsoleGetStream(GHandle gh) {
if (gh->vmt != &consoleVMT)
return 0;
return (BaseSequentialStream *)&(((GConsoleObject *)(gh))->stream);
diff --git a/src/gwin/gimage.c b/src/gwin/gimage.c
index 464bc595..eef47dc7 100644
--- a/src/gwin/gimage.c
+++ b/src/gwin/gimage.c
@@ -16,7 +16,7 @@
#include "gwin/class_gwin.h"
-#define widget(gh) ((GImageWidget*)gh)
+#define widget(gh) ((GImageObject *)gh)
static void _destroy(GWindowObject *gh) {
if (gdispImageIsOpen(&widget(gh)->image))
@@ -80,14 +80,14 @@ static void _redraw(GHandle gh) {
static const gwinVMT imageVMT = {
"Image", // The class name
- sizeof(GImageWidget), // The object size
+ sizeof(GImageObject), // The object size
_destroy, // The destroy routine
_redraw, // The redraw routine
0, // The after-clear routine
};
-GHandle gwinImageCreate(GImageWidget *gobj, GWindowInit *pInit) {
- if (!(gobj = (GImageWidget *)_gwindowCreate(&gobj->g, pInit, &imageVMT, 0)))
+GHandle gwinImageCreate(GImageObject *gobj, GWindowInit *pInit) {
+ if (!(gobj = (GImageObject *)_gwindowCreate(&gobj->g, pInit, &imageVMT, 0)))
return 0;
// Ensure the gdispImageIsOpen() gives valid results
diff --git a/src/gwin/graph.c b/src/gwin/graph.c
index 049f52e0..de447f4f 100644
--- a/src/gwin/graph.c
+++ b/src/gwin/graph.c
@@ -165,7 +165,7 @@ static void lineto(GGraphObject *gg, coord_t x0, coord_t y0, coord_t x1, coord_t
}
}
-GHandle gwinCreateGraph(GGraphObject *gg, const GWindowInit *pInit) {
+GHandle gwinGraphCreate(GGraphObject *gg, const GWindowInit *pInit) {
if (!(gg = (GGraphObject *)_gwindowCreate(&gg->g, pInit, &graphVMT, 0)))
return 0;
gg->xorigin = gg->yorigin = 0;
diff --git a/src/gwin/gwidget.c b/src/gwin/gwidget.c
index 6440f171..8fc6ba77 100644
--- a/src/gwin/gwidget.c
+++ b/src/gwin/gwidget.c
@@ -14,7 +14,67 @@
#include "gwin/class_gwin.h"
/* Our listener for events for widgets */
-static GListener gl;
+static GListener gl;
+
+/* Our default style - a white background theme */
+const GWidgetStyle WhiteWidgetStyle = {
+ HTML2COLOR(0xFFFFFF), // window background
+
+ // enabled color set
+ {
+ HTML2COLOR(0x000000), // text
+ HTML2COLOR(0x404040), // edge
+ HTML2COLOR(0xE0E0E0), // fill
+ HTML2COLOR(0xE0E0E0), // progress - inactive area
+ },
+
+ // disabled color set
+ {
+ HTML2COLOR(0xC0C0C0), // text
+ HTML2COLOR(0x808080), // edge
+ HTML2COLOR(0xE0E0E0), // fill
+ HTML2COLOR(0xC0E0C0), // progress - active area
+ },
+
+ // pressed color set
+ {
+ HTML2COLOR(0x404040), // text
+ HTML2COLOR(0x404040), // edge
+ HTML2COLOR(0x808080), // fill
+ HTML2COLOR(0x00E000), // progress - active area
+ },
+};
+
+/* Our black style */
+const GWidgetStyle BlackWidgetStyle = {
+ HTML2COLOR(0x000000), // window background
+
+ // enabled color set
+ {
+ HTML2COLOR(0xC0C0C0), // text
+ HTML2COLOR(0xC0C0C0), // edge
+ HTML2COLOR(0x606060), // fill
+ HTML2COLOR(0x404040), // progress - inactive area
+ },
+
+ // disabled color set
+ {
+ HTML2COLOR(0x808080), // text
+ HTML2COLOR(0x404040), // edge
+ HTML2COLOR(0x404040), // fill
+ HTML2COLOR(0x004000), // progress - active area
+ },
+
+ // pressed color set
+ {
+ HTML2COLOR(0xFFFFFF), // text
+ HTML2COLOR(0xC0C0C0), // edge
+ HTML2COLOR(0xE0E0E0), // fill
+ HTML2COLOR(0x008000), // progress - active area
+ },
+};
+
+static const GWidgetStyle * defaultStyle = &BlackWidgetStyle;
/* We use these everywhere in this file */
#define gw ((GWidgetObject *)gh)
@@ -169,9 +229,10 @@ GHandle _gwidgetCreate(GWidgetObject *pgw, const GWidgetInit *pInit, const gwidg
if (!(pgw = (GWidgetObject *)_gwindowCreate(&pgw->g, &pInit->g, &vmt->g, GWIN_FLG_WIDGET|GWIN_FLG_ENABLED)))
return 0;
- pgw->txt = pInit->text ? pInit->text : "";
- pgw->fnDraw = vmt->DefaultDraw;
- pgw->fnParam = 0;
+ pgw->text = pInit->text ? pInit->text : "";
+ pgw->fnDraw = pInit->customDraw ? pInit->customDraw : vmt->DefaultDraw;
+ pgw->fnParam = pInit->customParam;
+ pgw->pstyle = pInit->customStyle ? pInit->customStyle : defaultStyle;
return &pgw->g;
}
@@ -184,7 +245,7 @@ void _gwidgetDestroy(GHandle gh) {
// Deallocate the text (if necessary)
if ((gh->flags & GWIN_FLG_ALLOCTXT)) {
gh->flags &= ~GWIN_FLG_ALLOCTXT;
- gfxFree((void *)gw->txt);
+ gfxFree((void *)gw->text);
}
#if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
@@ -226,32 +287,60 @@ void _gwidgetRedraw(GHandle gh) {
gw->fnDraw(gw, gw->fnParam);
}
-void gwinSetText(GHandle gh, const char *txt, bool_t useAlloc) {
+void gwinSetDefaultStyle(const GWidgetStyle *pstyle, bool_t updateAll) {
+ if (!pstyle)
+ pstyle = &BlackWidgetStyle;
+
+ if (updateAll) {
+ const gfxQueueASyncItem * qi;
+ GHandle gh;
+
+ for(qi = gfxQueueASyncPeek(&_GWINList); qi; qi = gfxQueueASyncNext(qi)) {
+ gh = QItem2GWindow(qi);
+ if ((gh->flags & GWIN_FLG_WIDGET) && ((GWidgetObject *)gh)->pstyle == defaultStyle)
+ gwinSetStyle(gh, pstyle);
+ }
+ }
+ gwinSetDefaultBgColor(pstyle->background);
+ defaultStyle = pstyle;
+}
+
+/**
+ * @brief Get the current default style.
+ *
+ * @api
+ */
+const GWidgetStyle *gwinGetDefaultStyle(void) {
+ return defaultStyle;
+}
+
+
+void gwinSetText(GHandle gh, const char *text, bool_t useAlloc) {
if (!(gh->flags & GWIN_FLG_WIDGET))
return;
// Dispose of the old string
if ((gh->flags & GWIN_FLG_ALLOCTXT)) {
gh->flags &= ~GWIN_FLG_ALLOCTXT;
- if (gw->txt) {
- gfxFree((void *)gw->txt);
- gw->txt = "";
+ if (gw->text) {
+ gfxFree((void *)gw->text);
+ gw->text = "";
}
}
// Alloc the new text if required
- if (txt && !*txt) txt = 0;
- if (txt && useAlloc) {
+ if (!text || !*text)
+ gw->text = "";
+ else if (useAlloc) {
char *str;
- if ((str = (char *)gfxAlloc(strlen(txt)+1))) {
+ if ((str = (char *)gfxAlloc(strlen(text)+1))) {
gh->flags |= GWIN_FLG_ALLOCTXT;
- strcpy(str, txt);
+ strcpy(str, text);
}
- txt = (const char *)str;
- }
-
- gw->txt = txt ? txt : "";
+ gw->text = (const char *)str;
+ } else
+ gw->text = text;
_gwidgetRedraw(gh);
}
@@ -259,7 +348,20 @@ const char *gwinGetText(GHandle gh) {
if (!(gh->flags & GWIN_FLG_WIDGET))
return 0;
- return gw->txt;
+ return gw->text;
+}
+
+void gwinSetStyle(GHandle gh, const GWidgetStyle *pstyle) {
+ if (!(gh->flags & GWIN_FLG_WIDGET))
+ return;
+ gw->pstyle = pstyle ? pstyle : defaultStyle;
+ gh->bgcolor = pstyle->background;
+ gh->color = pstyle->enabled.text;
+ _gwidgetRedraw(gh);
+}
+
+const GWidgetStyle *gwinGetStyle(GHandle gh) {
+ return gw->pstyle;
}
void gwinSetCustomDraw(GHandle gh, CustomWidgetDrawFunction fn, void *param) {
diff --git a/src/gwin/gwin.c b/src/gwin/gwin.c
index 92b6cc03..2fd0c905 100644
--- a/src/gwin/gwin.c
+++ b/src/gwin/gwin.c
@@ -32,11 +32,6 @@ static color_t defaultBgColor = Black;
#if GDISP_NEED_TEXT
static font_t defaultFont;
#endif
-#if GWIN_NEED_WINDOWMANAGER
- gfxQueueASync _GWINList;
- extern GWindowManager GNullWindowManager;
- static GWindowManager * cwm;
-#endif
/*-----------------------------------------------
* Helper Routines
@@ -52,9 +47,9 @@ static color_t defaultBgColor = Black;
} else
gwinClear(gh);
}
- static void _gwm_redim(GHandle gh, const GWindowInit *pInit) {
- gh->x = pInit->x; gh->y = pInit->y;
- gh->width = pInit->width; gh->height = pInit->height;
+ static void _gwm_redim(GHandle gh, coord_t x, coord_t y, coord_t width, coord_t height) {
+ gh->x = x; gh->y = y;
+ gh->width = width; gh->height = height;
if (gh->x < 0) { gh->width += gh->x; gh->x = 0; }
if (gh->y < 0) { gh->height += gh->y; gh->y = 0; }
if (gh->x > gdispGetWidth()-MIN_WIN_WIDTH) gh->x = gdispGetWidth()-MIN_WIN_WIDTH;
@@ -87,9 +82,9 @@ void _gwinInit(void) {
_gwidgetInit();
#endif
#if GWIN_NEED_WINDOWMANAGER
- gfxQueueASyncInit(&_GWINList);
- cwm = &GNullWindowManager;
- cwm->vmt->Init();
+ extern void _gwmInit(void);
+
+ _gwmInit();
#endif
}
@@ -113,7 +108,7 @@ GHandle _gwindowCreate(GWindowObject *pgw, const GWindowInit *pInit, const gwinV
#endif
#if GWIN_NEED_WINDOWMANAGER
- if (!cwm->vmt->Add(pgw, pInit)) {
+ if (!_GWINwm->vmt->Add(pgw, pInit)) {
if ((pgw->flags & GWIN_FLG_DYNAMIC))
gfxFree(pgw);
return 0;
@@ -129,18 +124,6 @@ GHandle _gwindowCreate(GWindowObject *pgw, const GWindowInit *pInit, const gwinV
* Routines that affect all windows
*-----------------------------------------------*/
-#if GWIN_NEED_WINDOWMANAGER
- void gwinSetWindowManager(struct GWindowManager *gwm) {
- if (!gwm)
- gwm = &GNullWindowManager;
- if (cwm != gwm) {
- cwm->vmt->DeInit();
- cwm = gwm;
- cwm->vmt->Init();
- }
- }
-#endif
-
void gwinSetDefaultColor(color_t clr) {
defaultFgColor = clr;
}
@@ -171,7 +154,7 @@ color_t gwinGetDefaultBgColor(void) {
* The GWindow Routines
*-----------------------------------------------*/
-GHandle gwinCreateWindow(GWindowObject *pgw, const GWindowInit *pInit) {
+GHandle gwinWindowCreate(GWindowObject *pgw, const GWindowInit *pInit) {
if (!(pgw = _gwindowCreate(pgw, pInit, &basegwinVMT, 0)))
return 0;
gwinSetVisible(pgw, pInit->show);
@@ -181,7 +164,7 @@ GHandle gwinCreateWindow(GWindowObject *pgw, const GWindowInit *pInit) {
void gwinDestroy(GHandle gh) {
// Remove from the window manager
#if GWIN_NEED_WINDOWMANAGER
- cwm->vmt->Delete(gh);
+ _GWINwm->vmt->Delete(gh);
#endif
// Class destroy routine
@@ -204,7 +187,7 @@ void gwinSetVisible(GHandle gh, bool_t visible) {
if (!(gh->flags & GWIN_FLG_VISIBLE)) {
gh->flags |= GWIN_FLG_VISIBLE;
#if GWIN_NEED_WINDOWMANAGER
- cwm->vmt->Visible(gh);
+ _GWINwm->vmt->Visible(gh);
#else
_gwm_vis(gh);
#endif
@@ -213,7 +196,7 @@ void gwinSetVisible(GHandle gh, bool_t visible) {
if ((gh->flags & GWIN_FLG_VISIBLE)) {
gh->flags &= ~GWIN_FLG_VISIBLE;
#if GWIN_NEED_WINDOWMANAGER
- cwm->vmt->Visible(gh);
+ _GWINwm->vmt->Visible(gh);
#endif
}
}
@@ -253,7 +236,7 @@ bool_t gwinGetEnabled(GHandle gh) {
void gwinMove(GHandle gh, coord_t x, coord_t y) {
#if GWIN_NEED_WINDOWMANAGER
- cwm->vmt->Redim(gh, x, y, gh->width, gh->height);
+ _GWINwm->vmt->Redim(gh, x, y, gh->width, gh->height);
#else
_gwm_redim(gh, x, y, gh->width, gh->height);
#endif
@@ -261,44 +244,21 @@ void gwinMove(GHandle gh, coord_t x, coord_t y) {
void gwinResize(GHandle gh, coord_t width, coord_t height) {
#if GWIN_NEED_WINDOWMANAGER
- cwm->vmt->Redim(gh, gh->x, gh->y, width, height);
+ _GWINwm->vmt->Redim(gh, gh->x, gh->y, width, height);
#else
_gwm_redim(gh, gh->x, gh->y, width, height);
#endif
}
-void gwinSetMinMax(GHandle gh, GWindowMinMax minmax) {
+void gwinRedraw(GHandle gh) {
#if GWIN_NEED_WINDOWMANAGER
- cwm->vmt->MinMax(gh, minmax);
+ gwinRaise(gh);
#else
- (void) gh;
- (void) minmax;
+ if ((gh->flags & GWIN_FLG_VISIBLE))
+ _gwm_vis(gh);
#endif
}
-void gwinRaise(GHandle gh) {
- #if GWIN_NEED_WINDOWMANAGER
- cwm->vmt->Raise(gh);
- #else
- if ((gh->flags & GWIN_FLG_VISIBLE)) {
- if (gh->vmt->Redraw) {
- #if GDISP_NEED_CLIP
- gdispSetClip(gh->x, gh->y, gh->width, gh->height);
- #endif
- gh->vmt->Redraw(gh);
- }
- }
- #endif
-}
-
-GWindowMinMax gwinGetMinMax(GHandle gh) {
- if (gh->flags & GWIN_FLG_MINIMIZED)
- return GWIN_MINIMIZE;
- if (gh->flags & GWIN_FLG_MAXIMIZED)
- return GWIN_MAXIMIZE;
- return GWIN_NORMAL;
-}
-
#if GDISP_NEED_TEXT
void gwinSetFont(GHandle gh, font_t font) {
gh->font = font;
diff --git a/src/gwin/gwm.c b/src/gwin/gwm.c
index 88d61a21..f9f56838 100644
--- a/src/gwin/gwm.c
+++ b/src/gwin/gwm.c
@@ -43,10 +43,49 @@ static const gwmVMT GNullWindowManagerVMT = {
WM_MinMax,
};
-const GWindowManager GNullWindowManager = {
+static const GWindowManager GNullWindowManager = {
&GNullWindowManagerVMT,
};
+gfxQueueASync _GWINList;
+GWindowManager * _GWINwm;
+
+/*-----------------------------------------------
+ * Window Routines
+ *-----------------------------------------------*/
+
+void _gwmInit(void) {
+ gfxQueueASyncInit(&_GWINList);
+ _GWINwm = (GWindowManager *)&GNullWindowManager;
+ _GWINwm->vmt->Init();
+}
+
+void gwinSetWindowManager(struct GWindowManager *gwm) {
+ if (!gwm)
+ gwm = (GWindowManager *)&GNullWindowManager;
+ if (_GWINwm != gwm) {
+ _GWINwm->vmt->DeInit();
+ _GWINwm = gwm;
+ _GWINwm->vmt->Init();
+ }
+}
+
+void gwinSetMinMax(GHandle gh, GWindowMinMax minmax) {
+ _GWINwm->vmt->MinMax(gh, minmax);
+}
+
+void gwinRaise(GHandle gh) {
+ _GWINwm->vmt->Raise(gh);
+}
+
+GWindowMinMax gwinGetMinMax(GHandle gh) {
+ if (gh->flags & GWIN_FLG_MINIMIZED)
+ return GWIN_MINIMIZE;
+ if (gh->flags & GWIN_FLG_MAXIMIZED)
+ return GWIN_MAXIMIZE;
+ return GWIN_NORMAL;
+}
+
/*-----------------------------------------------
* Window Manager Routines
*-----------------------------------------------*/
diff --git a/src/gwin/label.c b/src/gwin/label.c
index cd469210..71ed18eb 100644
--- a/src/gwin/label.c
+++ b/src/gwin/label.c
@@ -25,38 +25,40 @@
#define GLABEL_FLG_HAUTO (GWIN_FIRST_CONTROL_FLAG<<1)
// Simple: single line with no wrapping
-static coord_t getwidth(const char *txt, font_t font, coord_t maxwidth) {
+static coord_t getwidth(const char *text, font_t font, coord_t maxwidth) {
(void) maxwidth;
- return gdispGetStringWidth(txt, font)+2; // Allow one pixel of padding on each side
+ return gdispGetStringWidth(text, font)+2; // Allow one pixel of padding on each side
}
// Simple: single line with no wrapping
-static coord_t getheight(const char *txt, font_t font, coord_t maxwidth) {
- (void) txt;
+static coord_t getheight(const char *text, font_t font, coord_t maxwidth) {
+ (void) text;
(void) maxwidth;
return gdispGetFontMetric(font, fontHeight);
}
static void gwinLabelDefaultDraw(GWidgetObject *gw, void *param) {
- (void) param;
- coord_t w, h;
+ coord_t w, h;
+ (void) param;
- w = (gw->g.flags & GLABEL_FLG_WAUTO) ? getwidth(gw->txt, gw->g.font, gdispGetWidth() - gw->g.x) : gw->g.width;
- h = (gw->g.flags & GLABEL_FLG_HAUTO) ? getheight(gw->txt, gw->g.font, gdispGetWidth() - gw->g.x) : gw->g.height;
+ w = (gw->g.flags & GLABEL_FLG_WAUTO) ? getwidth(gw->text, gw->g.font, gdispGetWidth() - gw->g.x) : gw->g.width;
+ h = (gw->g.flags & GLABEL_FLG_HAUTO) ? getheight(gw->text, gw->g.font, gdispGetWidth() - gw->g.x) : gw->g.height;
if (gw->g.width != w || gw->g.height != h) {
gwinResize(&gw->g, w, h);
return;
}
- gdispFillStringBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, gw->txt, gw->g.font, gw->g.color, gw->g.bgcolor, justifyLeft);
+ gdispFillStringBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, gw->text, gw->g.font,
+ (gw->g.flags & GWIN_FLG_ENABLED) ? gw->pstyle->enabled.text : gw->pstyle->disabled.text, gw->pstyle->background,
+ justifyLeft);
}
static const gwidgetVMT labelVMT = {
{
"Label", // The class name
- sizeof(GLabelWidget), // The object size
+ sizeof(GLabelObject), // The object size
_gwidgetDestroy, // The destroy routine
_gwidgetRedraw, // The redraw routine
0, // The after-clear routine
@@ -88,7 +90,7 @@ static const gwidgetVMT labelVMT = {
#endif
};
-GHandle gwinLabelCreate(GLabelWidget *widget, GWidgetInit *pInit) {
+GHandle gwinLabelCreate(GLabelObject *widget, GWidgetInit *pInit) {
uint16_t flags = 0;
// auto assign width
@@ -103,7 +105,7 @@ GHandle gwinLabelCreate(GLabelWidget *widget, GWidgetInit *pInit) {
pInit->g.height = getheight(pInit->text, gwinGetDefaultFont(), gdispGetWidth() - pInit->g.x);
}
- if (!(widget = (GLabelWidget *)_gwidgetCreate(&widget->w, pInit, &labelVMT)))
+ if (!(widget = (GLabelObject *)_gwidgetCreate(&widget->w, pInit, &labelVMT)))
return 0;
widget->w.g.flags |= flags;
diff --git a/src/gwin/radio.c b/src/gwin/radio.c
index d1c65dbc..26ff0b83 100644
--- a/src/gwin/radio.c
+++ b/src/gwin/radio.c
@@ -24,25 +24,8 @@
// Our pressed state
#define GRADIO_FLG_PRESSED (GWIN_FIRST_CONTROL_FLAG<<0)
-// Default color scheme
-static const GRadioColors GRadioDefaultColorsUp = {
- HTML2COLOR(0x404040), // color_up_edge;
- HTML2COLOR(0xE0E0E0), // color_up_fill;
- HTML2COLOR(0x000000), // color_up_txt;
-};
-static const GRadioColors GRadioDefaultColorsDown = {
- HTML2COLOR(0x404040), // color_dn_edge;
- HTML2COLOR(0x808080), // color_dn_fill;
- HTML2COLOR(0x404040), // color_dn_txt;
-};
-static const GRadioColors GRadioDefaultColorsDisabled = {
- HTML2COLOR(0x808080), // color_dis_edge;
- HTML2COLOR(0xE0E0E0), // color_dis_fill;
- HTML2COLOR(0xC0C0C0), // color_dis_txt;
-};
-
// Send the button event
-static void SendButtonEvent(GWidgetObject *gw) {
+static void SendRadioEvent(GWidgetObject *gw) {
GSourceListener * psl;
GEvent * pe;
#define pbe ((GEventGWinRadio *)pe)
@@ -66,7 +49,7 @@ static void SendButtonEvent(GWidgetObject *gw) {
static void MouseDown(GWidgetObject *gw, coord_t x, coord_t y) {
(void) x; (void) y;
- gwinPressRadio((GHandle)gw);
+ gwinRadioPress((GHandle)gw);
}
#endif
@@ -75,7 +58,7 @@ static void SendButtonEvent(GWidgetObject *gw) {
static void ToggleOn(GWidgetObject *gw, uint16_t role) {
(void) role;
- gwinPressRadio((GHandle)gw);
+ gwinRadioPress((GHandle)gw);
}
static void ToggleAssign(GWidgetObject *gw, uint16_t role, uint16_t instance) {
@@ -125,7 +108,7 @@ static const gwidgetVMT radioVMT = {
#endif
};
-GHandle gwinCreateRadio(GRadioObject *gw, const GWidgetInit *pInit, uint16_t group) {
+GHandle gwinRadioCreate(GRadioObject *gw, const GWidgetInit *pInit, uint16_t group) {
if (!(gw = (GRadioObject *)_gwidgetCreate(&gw->w, pInit, &radioVMT)))
return 0;
@@ -133,53 +116,33 @@ GHandle gwinCreateRadio(GRadioObject *gw, const GWidgetInit *pInit, uint16_t gro
gw->toggle = GWIDGET_NO_INSTANCE;
#endif
gw->group = group;
- gw->c_up = GRadioDefaultColorsUp;
- gw->c_dn = GRadioDefaultColorsDown;
- gw->c_dis = GRadioDefaultColorsDisabled;
gwinSetVisible((GHandle)gw, pInit->g.show);
return (GHandle)gw;
}
-void gwinSetRadioColors(GHandle gh, const GRadioColors *pUp, const GRadioColors *pDown, const GRadioColors *pDisabled) {
- if (gh->vmt != (gwinVMT *)&radioVMT)
- return;
-
- if (pUp) ((GRadioObject *)gh)->c_up = *pUp;
- if (pDown) ((GRadioObject *)gh)->c_dn = *pDown;
- if (pDisabled) ((GRadioObject *)gh)->c_dis = *pDisabled;
-}
-
-void gwinPressRadio(GHandle gh) {
+void gwinRadioPress(GHandle gh) {
GHandle gx;
if (gh->vmt != (gwinVMT *)&radioVMT || (gh->flags & GRADIO_FLG_PRESSED))
return;
- if ((gx = gwinActiveRadio(((GRadioObject *)gh)->group))) {
+ if ((gx = gwinRadioGetActive(((GRadioObject *)gh)->group))) {
gx->flags &= ~GRADIO_FLG_PRESSED;
_gwidgetRedraw(gx);
}
gh->flags |= GRADIO_FLG_PRESSED;
_gwidgetRedraw(gh);
- SendButtonEvent((GWidgetObject *)gh);
+ SendRadioEvent((GWidgetObject *)gh);
}
-bool_t gwinIsRadioPressed(GHandle gh) {
+bool_t gwinRadioIsPressed(GHandle gh) {
if (gh->vmt != (gwinVMT *)&radioVMT)
return FALSE;
return (gh->flags & GRADIO_FLG_PRESSED) ? TRUE : FALSE;
}
-/**
- * @brief Find the currently pressed radio button in the specified group
- * @return The handle of the pressed radio button or NULL if none are pressed
- *
- * @param[in] gh The window handle (must be a radio widget)
- *
- * @api
- */
-GHandle gwinActiveRadio(uint16_t group) {
+GHandle gwinRadioGetActive(uint16_t group) {
const gfxQueueASyncItem * qi;
GHandle gh;
@@ -195,17 +158,17 @@ GHandle gwinActiveRadio(uint16_t group) {
* Custom Draw Routines
*----------------------------------------------------------*/
-static GRadioColors *getDrawColors(GWidgetObject *gw) {
- if (!(gw->g.flags & GWIN_FLG_ENABLED)) return &((GRadioObject *)gw)->c_dis;
- if ((gw->g.flags & GRADIO_FLG_PRESSED)) return &((GRadioObject *)gw)->c_dn;
- return &((GRadioObject *)gw)->c_up;
+static const GColorSet *getDrawColors(GWidgetObject *gw) {
+ if (!(gw->g.flags & GWIN_FLG_ENABLED)) return &gw->pstyle->disabled;
+ if ((gw->g.flags & GRADIO_FLG_PRESSED)) return &gw->pstyle->pressed;
+ return &gw->pstyle->enabled;
}
void gwinRadioDraw_Radio(GWidgetObject *gw, void *param) {
- #define gcw ((GRadioObject *)gw)
- coord_t ld, df;
- GRadioColors * pcol;
- (void) param;
+ #define gcw ((GRadioObject *)gw)
+ coord_t ld, df;
+ const GColorSet * pcol;
+ (void) param;
if (gw->g.vmt != (gwinVMT *)&radioVMT) return;
pcol = getDrawColors(gw);
@@ -213,46 +176,52 @@ void gwinRadioDraw_Radio(GWidgetObject *gw, void *param) {
ld = gw->g.width < gw->g.height ? gw->g.width : gw->g.height;
#if GDISP_NEED_CIRCLE
- df = ld/2;
- gdispFillArea(gw->g.x, gw->g.y, ld, ld, gw->g.bgcolor);
- gdispDrawCircle(gw->g.x+df, gw->g.y+df, df, pcol->color_edge);
+ df = (ld-1)/2;
+ gdispFillArea(gw->g.x, gw->g.y, ld, ld, gw->pstyle->background);
+ gdispDrawCircle(gw->g.x+df, gw->g.y+df, df, pcol->edge);
if (gw->g.flags & GRADIO_FLG_PRESSED)
- gdispFillCircle(gw->g.x+df, gw->g.y+df, df <= 2 ? 1 : (df-2), pcol->color_fill);
+ gdispFillCircle(gw->g.x+df, gw->g.y+df, df <= 2 ? 1 : (df-2), pcol->fill);
#else
- gdispFillArea(gw->g.x+1, gw->g.y+1, ld, ld-2, gw->g.bgcolor);
- gdispDrawBox(gw->g.x, gw->g.y, ld, ld, pcol->color_edge);
+ gdispFillArea(gw->g.x+1, gw->g.y+1, ld, ld-2, gw->pstyle->background);
+ gdispDrawBox(gw->g.x, gw->g.y, ld, ld, pcol->edge);
df = ld < 4 ? 1 : 2;
if (gw->g.flags & GRADIO_FLG_PRESSED)
- gdispFillArea(gw->g.x+df, gw->g.y+df, ld-2*df, ld-2*df, pcol->color_fill);
+ gdispFillArea(gw->g.x+df, gw->g.y+df, ld-2*df, ld-2*df, pcol->fill);
#endif
- gdispFillStringBox(gw->g.x+ld+1, gw->g.y, gw->g.width-ld-1, gw->g.height, gw->txt, gw->g.font, pcol->color_txt, gw->g.bgcolor, justifyLeft);
+ gdispFillStringBox(gw->g.x+ld+1, gw->g.y, gw->g.width-ld-1, gw->g.height, gw->text, gw->g.font, pcol->text, gw->pstyle->background, justifyLeft);
#undef gcw
}
void gwinRadioDraw_Button(GWidgetObject *gw, void *param) {
- (void) param;
- GRadioColors * pcol;
+ const GColorSet * pcol;
+ (void) param;
if (gw->g.vmt != (gwinVMT *)&radioVMT) return;
pcol = getDrawColors(gw);
- gdispFillStringBox(gw->g.x, gw->g.y, gw->g.width-1, gw->g.height-1, gw->txt, gw->g.font, pcol->color_txt, pcol->color_fill, justifyCenter);
- gdispDrawLine(gw->g.x+gw->g.width-1, gw->g.y, gw->g.x+gw->g.width-1, gw->g.y+gw->g.height-1, pcol->color_edge);
- gdispDrawLine(gw->g.x, gw->g.y+gw->g.height-1, gw->g.x+gw->g.width-2, gw->g.y+gw->g.height-1, pcol->color_edge);
+ gdispFillStringBox(gw->g.x, gw->g.y, gw->g.width-1, gw->g.height-1, gw->text, gw->g.font, pcol->text, pcol->fill, justifyCenter);
+ gdispDrawLine(gw->g.x+gw->g.width-1, gw->g.y, gw->g.x+gw->g.width-1, gw->g.y+gw->g.height-1, pcol->edge);
+ gdispDrawLine(gw->g.x, gw->g.y+gw->g.height-1, gw->g.x+gw->g.width-2, gw->g.y+gw->g.height-1, pcol->edge);
}
void gwinRadioDraw_Tab(GWidgetObject *gw, void *param) {
- (void) param;
- GRadioColors * pcol;
+ const GColorSet * pcol;
+ (void) param;
if (gw->g.vmt != (gwinVMT *)&radioVMT) return;
pcol = getDrawColors(gw);
- gdispFillStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, pcol->color_txt, pcol->color_fill, justifyCenter);
- gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->color_edge);
+ if ((gw->g.flags & GRADIO_FLG_PRESSED)) {
+ gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge);
+ gdispFillStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-1, gw->text, gw->g.font, pcol->text, pcol->fill, justifyCenter);
+ } else {
+ gdispFillStringBox(gw->g.x, gw->g.y, gw->g.width-1, gw->g.height-1, gw->text, gw->g.font, pcol->text, pcol->fill, justifyCenter);
+ gdispDrawLine(gw->g.x+gw->g.width-1, gw->g.y, gw->g.x+gw->g.width-1, gw->g.y+gw->g.height-1, pcol->edge);
+ gdispDrawLine(gw->g.x, gw->g.y+gw->g.height-1, gw->g.x+gw->g.width-2, gw->g.y+gw->g.height-1, pcol->edge);
+ }
}
#endif /* GFX_USE_GWIN && GWIN_NEED_BUTTON */
diff --git a/src/gwin/slider.c b/src/gwin/slider.c
index 5aa320f8..4d9c3510 100644
--- a/src/gwin/slider.c
+++ b/src/gwin/slider.c
@@ -29,14 +29,6 @@
#define GWIN_SLIDER_TOGGLE_INC 20 // How many toggles to go from minimum to maximum
#endif
-static const GSliderColors GSliderDefaultColors = {
- HTML2COLOR(0x404040), // color_edge
- HTML2COLOR(0x000000), // color_thumb
- HTML2COLOR(0x00E000), // color_active
- HTML2COLOR(0xE0E0E0), // color_inactive
- HTML2COLOR(0xFFFFFF), // color_txt
-};
-
// Send the slider event
static void SendSliderEvent(GWidgetObject *gw) {
GSourceListener * psl;
@@ -146,10 +138,10 @@ static void ResetDisplayPos(GSliderObject *gsw) {
#define gsw ((GSliderObject *)gw)
if (role) {
- gwinSetSliderPosition((GHandle)gw, gsw->pos+(gsw->max-gsw->min)/GWIN_SLIDER_TOGGLE_INC);
+ gwinSliderSetPosition((GHandle)gw, gsw->pos+(gsw->max-gsw->min)/GWIN_SLIDER_TOGGLE_INC);
SendSliderEvent(gw);
} else {
- gwinSetSliderPosition((GHandle)gw, gsw->pos-(gsw->max-gsw->min)/GWIN_SLIDER_TOGGLE_INC);
+ gwinSliderSetPosition((GHandle)gw, gsw->pos-(gsw->max-gsw->min)/GWIN_SLIDER_TOGGLE_INC);
SendSliderEvent(gw);
}
#undef gsw
@@ -231,7 +223,7 @@ static const gwidgetVMT sliderVMT = {
#endif
};
-GHandle gwinCreateSlider(GSliderObject *gs, const GWidgetInit *pInit) {
+GHandle gwinSliderCreate(GSliderObject *gs, const GWidgetInit *pInit) {
if (!(gs = (GSliderObject *)_gwidgetCreate(&gs->w, pInit, &sliderVMT)))
return 0;
#if GINPUT_NEED_TOGGLE
@@ -241,7 +233,6 @@ GHandle gwinCreateSlider(GSliderObject *gs, const GWidgetInit *pInit) {
#if GINPUT_NEED_DIAL
gs->dial = GWIDGET_NO_INSTANCE;
#endif
- gs->c = GSliderDefaultColors;
gs->min = 0;
gs->max = 100;
gs->pos = 0;
@@ -250,7 +241,7 @@ GHandle gwinCreateSlider(GSliderObject *gs, const GWidgetInit *pInit) {
return (GHandle)gs;
}
-void gwinSetSliderRange(GHandle gh, int min, int max) {
+void gwinSliderSetRange(GHandle gh, int min, int max) {
#define gsw ((GSliderObject *)gh)
if (gh->vmt != (gwinVMT *)&sliderVMT)
@@ -265,7 +256,7 @@ void gwinSetSliderRange(GHandle gh, int min, int max) {
#undef gsw
}
-void gwinSetSliderPosition(GHandle gh, int pos) {
+void gwinSliderSetPosition(GHandle gh, int pos) {
#define gsw ((GSliderObject *)gh)
if (gh->vmt != (gwinVMT *)&sliderVMT)
@@ -284,61 +275,70 @@ void gwinSetSliderPosition(GHandle gh, int pos) {
#undef gsw
}
-void gwinSetSliderColors(GHandle gh, const GSliderColors *pColors) {
- if (gh->vmt != (gwinVMT *)&sliderVMT)
- return;
-
- ((GSliderObject *)gh)->c = *pColors;
-}
+/*----------------------------------------------------------
+ * Custom Draw Routines
+ *----------------------------------------------------------*/
void gwinSliderDraw_Std(GWidgetObject *gw, void *param) {
- #define gsw ((GSliderObject *)gw)
- (void) param;
+ #define gsw ((GSliderObject *)gw)
+ const GColorSet * pcol;
+ (void) param;
if (gw->g.vmt != (gwinVMT *)&sliderVMT)
return;
+ if ((gw->g.flags & GWIN_FLG_ENABLED))
+ pcol = &gw->pstyle->pressed;
+ else
+ pcol = &gw->pstyle->disabled;
+
if (gw->g.width < gw->g.height) { // Vertical slider
if (gsw->dpos != gw->g.height-1)
- gdispFillArea(gw->g.x, gw->g.y+gsw->dpos, gw->g.width, gw->g.height - gsw->dpos, gsw->c.color_active);
+ gdispFillArea(gw->g.x, gw->g.y+gsw->dpos, gw->g.width, gw->g.height - gsw->dpos, pcol->progress); // Active Area
if (gsw->dpos != 0)
- gdispFillArea(gw->g.x, gw->g.y, gw->g.width, gsw->dpos, gsw->c.color_inactive);
- gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, gsw->c.color_edge);
- gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos, gsw->c.color_thumb);
+ gdispFillArea(gw->g.x, gw->g.y, gw->g.width, gsw->dpos, gw->pstyle->enabled.progress); // Inactive area
+ gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge); // Edge
+ gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos, pcol->edge); // Thumb
if (gsw->dpos >= 2)
- gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos-2, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos-2, gsw->c.color_thumb);
+ gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos-2, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos-2, pcol->edge); // Thumb
if (gsw->dpos <= gw->g.height-2)
- gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos+2, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos+2, gsw->c.color_thumb);
+ gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos+2, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos+2, pcol->edge); // Thumb
// Horizontal slider
} else {
if (gsw->dpos != gw->g.width-1)
- gdispFillArea(gw->g.x+gsw->dpos, gw->g.y, gw->g.width-gsw->dpos, gw->g.height, gsw->c.color_inactive);
+ gdispFillArea(gw->g.x+gsw->dpos, gw->g.y, gw->g.width-gsw->dpos, gw->g.height, gw->pstyle->enabled.progress); // Inactive area
if (gsw->dpos != 0)
- gdispFillArea(gw->g.x, gw->g.y, gsw->dpos, gw->g.height, gsw->c.color_active);
- gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, gsw->c.color_edge);
- gdispDrawLine(gw->g.x+gsw->dpos, gw->g.y, gw->g.x+gsw->dpos, gw->g.y+gw->g.height-1, gsw->c.color_thumb);
+ gdispFillArea(gw->g.x, gw->g.y, gsw->dpos, gw->g.height, pcol->progress); // Active Area
+ gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge); // Edge
+ gdispDrawLine(gw->g.x+gsw->dpos, gw->g.y, gw->g.x+gsw->dpos, gw->g.y+gw->g.height-1, pcol->edge); // Thumb
if (gsw->dpos >= 2)
- gdispDrawLine(gw->g.x+gsw->dpos-2, gw->g.y, gw->g.x+gsw->dpos-2, gw->g.y+gw->g.height-1, gsw->c.color_thumb);
+ gdispDrawLine(gw->g.x+gsw->dpos-2, gw->g.y, gw->g.x+gsw->dpos-2, gw->g.y+gw->g.height-1, pcol->edge); // Thumb
if (gsw->dpos <= gw->g.width-2)
- gdispDrawLine(gw->g.x+gsw->dpos+2, gw->g.y, gw->g.x+gsw->dpos+2, gw->g.y+gw->g.height-1, gsw->c.color_thumb);
+ gdispDrawLine(gw->g.x+gsw->dpos+2, gw->g.y, gw->g.x+gsw->dpos+2, gw->g.y+gw->g.height-1, pcol->edge); // Thumb
}
- gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, gsw->c.color_txt, justifyCenter);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);
#undef gsw
}
void gwinSliderDraw_Image(GWidgetObject *gw, void *param) {
- #define gsw ((GSliderObject *)gw)
- #define gi ((gdispImage *)param)
- coord_t z, v;
+ #define gsw ((GSliderObject *)gw)
+ #define gi ((gdispImage *)param)
+ const GColorSet * pcol;
+ coord_t z, v;
if (gw->g.vmt != (gwinVMT *)&sliderVMT)
return;
+ if ((gw->g.flags & GWIN_FLG_ENABLED))
+ pcol = &gw->pstyle->pressed;
+ else
+ pcol = &gw->pstyle->disabled;
+
if (gw->g.width < gw->g.height) { // Vertical slider
if (gsw->dpos != 0) // The unfilled area
- gdispFillArea(gw->g.x, gw->g.y, gw->g.width, gsw->dpos, gsw->c.color_inactive);
+ gdispFillArea(gw->g.x, gw->g.y, gw->g.width, gsw->dpos, gw->pstyle->enabled.progress); // Inactive area
if (gsw->dpos != gw->g.height-1) { // The filled area
for(z=gw->g.height, v=gi->height; z > gsw->dpos;) {
z -= v;
@@ -349,13 +349,13 @@ void gwinSliderDraw_Image(GWidgetObject *gw, void *param) {
gdispImageDraw(gi, gw->g.x, gw->g.y+z, gw->g.width, v, 0, gi->height-v);
}
}
- gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, gsw->c.color_edge);
- gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos, gsw->c.color_thumb);
+ gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge); // Edge
+ gdispDrawLine(gw->g.x, gw->g.y+gsw->dpos, gw->g.x+gw->g.width-1, gw->g.y+gsw->dpos, pcol->edge); // Thumb
// Horizontal slider
} else {
if (gsw->dpos != gw->g.width-1) // The unfilled area
- gdispFillArea(gw->g.x+gsw->dpos, gw->g.y, gw->g.width-gsw->dpos, gw->g.height, gsw->c.color_inactive);
+ gdispFillArea(gw->g.x+gsw->dpos, gw->g.y, gw->g.width-gsw->dpos, gw->g.height, gw->pstyle->enabled.progress); // Inactive area
if (gsw->dpos != 0) { // The filled area
for(z=0, v=gi->width; z < gsw->dpos; z += v) {
if (z+v > gsw->dpos)
@@ -363,10 +363,10 @@ void gwinSliderDraw_Image(GWidgetObject *gw, void *param) {
gdispImageDraw(gi, gw->g.x+z, gw->g.y, v, gw->g.height, 0, 0);
}
}
- gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, gsw->c.color_edge);
- gdispDrawLine(gw->g.x+gsw->dpos, gw->g.y, gw->g.x+gsw->dpos, gw->g.y+gw->g.height-1, gsw->c.color_thumb);
+ gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge); // Edge
+ gdispDrawLine(gw->g.x+gsw->dpos, gw->g.y, gw->g.x+gsw->dpos, gw->g.y+gw->g.height-1, pcol->edge); // Thumb
}
- gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->txt, gw->g.font, gsw->c.color_txt, justifyCenter);
+ gdispDrawStringBox(gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);
#undef gsw
}