diff --git a/Doxygenfile b/Doxygenfile
index d5efd353..bd7abe0e 100644
--- a/Doxygenfile
+++ b/Doxygenfile
@@ -2015,7 +2015,7 @@ ALLEXTERNALS = NO
# listed.
# The default value is: YES.
-EXTERNAL_GROUPS = YES
+EXTERNAL_GROUPS = NO
# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
# the related pages index. If set to NO, only the current project's pages will
diff --git a/src/gwin/gwin_button.h b/src/gwin/gwin_button.h
index 90a7d106..9ab4d475 100644
--- a/src/gwin/gwin_button.h
+++ b/src/gwin/gwin_button.h
@@ -86,7 +86,7 @@ GHandle gwinGButtonCreate(GDisplay *g, GButtonObject *gb, const GWidgetInit *pIn
bool_t gwinButtonIsPressed(GHandle gh);
/**
- * @defgroup Renderings_Button Button rendering functions
+ * @defgroup Renderings_Button Renderings
*
* @brief Built-in rendering functions for the button widget.
*
diff --git a/src/gwin/gwin_checkbox.h b/src/gwin/gwin_checkbox.h
index d2d2c42c..cd66428a 100644
--- a/src/gwin/gwin_checkbox.h
+++ b/src/gwin/gwin_checkbox.h
@@ -99,7 +99,7 @@ void gwinCheckboxCheck(GHandle gh, bool_t isChecked);
bool_t gwinCheckboxIsChecked(GHandle gh);
/**
- * @defgroup Renderings_Checkbox Checkbox rendering functions
+ * @defgroup Renderings_Checkbox Renderings
*
* @brief Built-in rendering functions for the checkbox widget.
*
diff --git a/src/gwin/gwin_container.h b/src/gwin/gwin_container.h
index 5ae23cea..ff97a51e 100644
--- a/src/gwin/gwin_container.h
+++ b/src/gwin/gwin_container.h
@@ -120,7 +120,7 @@ GHandle gwinGContainerCreate(GDisplay *g, GContainerObject *gw, const GWidgetIni
/**
- * @defgroup Renderings_Container Container rendering functions
+ * @defgroup Renderings_Container Renderings
*
* @brief Built-in rendering functions for the container widget.
*
@@ -158,21 +158,26 @@ void gwinContainerDraw_Std(GWidgetObject *gw, void *param);
*/
void gwinContainerDraw_Transparent(GWidgetObject *gw, void *param);
-/**
- * @brief Renders the container and uses the specified image for the client area.
- *
- * @details The image will be tiled throghout the client area. Therefore, to archive the best looking result the
- * supplied image needs to be of the same size as the client area size of the container widget (inner size).
- *
- * @param[in] gw The widget object (must be a container object).
- * @param[in] param A parameter passed in from the user. Must be an image handle. See note below.
- *
- * @note The image must be already opened before calling @p gwinSetCustomDraw(). The handle is passed as the parameter
- * to this function.
- *
- * @api
- */
-void gwinContainerDraw_Image(GWidgetObject *gw, void *param);
+#if GDISP_NEED_IMAGE || defined(__DOXYGEN__)
+ /**
+ * @brief Renders the container and uses the specified image for the client area.
+ *
+ * @details The image will be tiled throghout the client area. Therefore, to archive the best looking result the
+ * supplied image needs to be of the same size as the client area size of the container widget (inner size).
+ *
+ * @param[in] gw The widget object (must be a container object).
+ * @param[in] param A parameter passed in from the user. Must be an image handle. See note below.
+ *
+ * @note The image must be already opened before calling @p gwinSetCustomDraw(). The handle is passed as the parameter
+ * to this function.
+ *
+ * @pre GDISP_NEED_IMAGE must be set to TRUE
+ *
+ * @api
+ */
+ void gwinContainerDraw_Image(GWidgetObject *gw, void *param);
+#endif /* GDISP_NEED_IMAGE */
+
/** @} */
#ifdef __cplusplus
diff --git a/src/gwin/gwin_frame.h b/src/gwin/gwin_frame.h
index 2e0cc1b2..0824787b 100644
--- a/src/gwin/gwin_frame.h
+++ b/src/gwin/gwin_frame.h
@@ -62,7 +62,7 @@ GHandle gwinGFrameCreate(GDisplay *g, GFrameObject *fo, GWidgetInit *pInit, uint
#define gwinFrameCreate(fo, pInit, flags) gwinGFrameCreate(GDISP, fo, pInit, flags);
/**
- * @defgroup Renderings_Frame Frame rendering functions
+ * @defgroup Renderings_Frame Renderings
*
* @brief Built-in rendering functions for the frame widget.
*
@@ -103,21 +103,25 @@ void gwinFrameDraw_Std(GWidgetObject *gw, void *param);
*/
void gwinFrameDraw_Transparent(GWidgetObject *gw, void *param);
-/**
- * @brief Renders the frame widget and uses the specified image for the client area.
- *
- * @details The image will be tiled throghout the client area. Therefore, to archive the best looking result the
- * supplied image needs to be of the same size as the client area size of the frame widget (inner size).
- *
- * @param[in] gw The widget object (must be a frame object).
- * @param[in] param A parameter passed in from the user. Must be an image handle. See note below.
- *
- * @note The image must be already opened before calling @p gwinSetCustomDraw(). The handle is passed as the parameter
- * to this function.
- *
- * @api
- */
-void gwinFrameDraw_Image(GWidgetObject *gw, void *param);
+#if GDISP_NEED_IMAGE || defined(__DOXYGEN__)
+ /**
+ * @brief Renders the frame widget and uses the specified image for the client area.
+ *
+ * @details The image will be tiled throghout the client area. Therefore, to archive the best looking result the
+ * supplied image needs to be of the same size as the client area size of the frame widget (inner size).
+ *
+ * @param[in] gw The widget object (must be a frame object).
+ * @param[in] param A parameter passed in from the user. Must be an image handle. See note below.
+ *
+ * @note The image must be already opened before calling @p gwinSetCustomDraw(). The handle is passed as the parameter
+ * to this function.
+ *
+ * @pre GDISP_NEED_IMAGE must be set to TRUE
+ *
+ * @api
+ */
+ void gwinFrameDraw_Image(GWidgetObject *gw, void *param);
+#endif /* GDISP_NEED_IMAGE */
/** @} */
#ifdef __cplusplus
diff --git a/src/gwin/gwin_keyboard.h b/src/gwin/gwin_keyboard.h
index 39f09c88..c10567e1 100644
--- a/src/gwin/gwin_keyboard.h
+++ b/src/gwin/gwin_keyboard.h
@@ -9,7 +9,7 @@
* @file src/gwin/gwin_keyboard.h
* @brief GWIN Graphic window subsystem header file.
*
- * @defgroup Keyboard Keyboard
+ * @defgroup VirtualKeyboard VirtualKeyboard
* @ingroup Widgets
*
* @details GWIN allows it to easily create buttons with different styles
@@ -102,7 +102,7 @@ GSourceHandle gwinKeyboardGetEventSource(GHandle gh);
void gwinKeyboardSetLayout(GHandle gh, struct GVKeyTable *layout);
/**
- * @defgroup Renderings_Keyboard Keyboard rendering functions
+ * @defgroup Renderings_Keyboard Renderings
*
* @brief Built-in rendering functions for the keyboard widget.
*
diff --git a/src/gwin/gwin_label.h b/src/gwin/gwin_label.h
index 0123842b..2b784b3a 100644
--- a/src/gwin/gwin_label.h
+++ b/src/gwin/gwin_label.h
@@ -101,7 +101,7 @@ void gwinLabelSetBorder(GHandle gh, bool_t border);
#endif
/**
- * @defgroup Renderings_Label Label rendering functions
+ * @defgroup Renderings_Label Renderings
*
* @brief Built-in rendering functions for the label widget.
*
diff --git a/src/gwin/gwin_list.h b/src/gwin/gwin_list.h
index 8e69aa5d..43c7d2e2 100644
--- a/src/gwin/gwin_list.h
+++ b/src/gwin/gwin_list.h
@@ -327,7 +327,7 @@ void gwinListViewItem(GHandle gh, int item);
#endif
/**
- * @defgroup Renderings_List List rendering functions
+ * @defgroup Renderings_List Renderings
*
* @brief Built-in rendering functions for the list widget.
*
diff --git a/src/gwin/gwin_progressbar.h b/src/gwin/gwin_progressbar.h
index 7c28523c..166cabca 100644
--- a/src/gwin/gwin_progressbar.h
+++ b/src/gwin/gwin_progressbar.h
@@ -176,7 +176,7 @@ void gwinProgressbarDecrement(GHandle gh);
#endif /* GWIN_PROGRESSBAR_AUTO */
/**
- * @defgroup Renderings_Progressbar Progressbar rendering functions
+ * @defgroup Renderings_Progressbar Renderings
*
* @brief Built-in rendering functions for the progressbar widget.
*
diff --git a/src/gwin/gwin_radio.h b/src/gwin/gwin_radio.h
index 41a565f0..051e0739 100644
--- a/src/gwin/gwin_radio.h
+++ b/src/gwin/gwin_radio.h
@@ -116,7 +116,7 @@ bool_t gwinRadioIsPressed(GHandle gh);
GHandle gwinRadioGetActive(uint16_t group);
/**
- * @defgroup Renderings_Radiobutton RadioButton rendering functions
+ * @defgroup Renderings_Radiobutton Renderings
*
* @brief Built-in rendering functions for the radiobutton widget.
*
diff --git a/src/gwin/gwin_slider.h b/src/gwin/gwin_slider.h
index 969990b7..6f988410 100644
--- a/src/gwin/gwin_slider.h
+++ b/src/gwin/gwin_slider.h
@@ -143,7 +143,7 @@ void gwinSliderSetPosition(GHandle gh, int pos);
void gwinSliderSendExtendedEvents(GHandle gh, bool_t enabled);
/**
- * @defgroup Renderings_Slider Slider rendering functions
+ * @defgroup Renderings_Slider Renderings
*
* @brief Built-in rendering functions for the slider widget.
*
diff --git a/src/gwin/gwin_tabset.h b/src/gwin/gwin_tabset.h
index f1d98adb..7d970c5d 100644
--- a/src/gwin/gwin_tabset.h
+++ b/src/gwin/gwin_tabset.h
@@ -62,140 +62,173 @@ typedef struct GTabsetObject {
extern "C" {
#endif
- /**
- * @brief Create a tabset widget
- *
- * @details This widget provides a set of tabs.
- *
- * @param[in] g The GDisplay to display this window on
- * @param[in] fo The GTabsetObject structure to initialize. If this is NULL the structure is dynamically allocated.
- * @param[in] pInit The initialization parameters
- * @param[in] flags Some flags, see notes.
- *
- * @note Possible flags are: GWIN_TABSET_BORDER
- *
- * @return NULL if there is no resulting widget. A valid GHandle otherwise.
- *
- * @api
- */
- GHandle gwinGTabsetCreate(GDisplay *g, GTabsetObject *fo, GWidgetInit *pInit, uint32_t flags);
- #define gwinTabsetCreate(fo, pInit, flags) gwinGTabsetCreate(GDISP, fo, pInit, flags);
+/**
+ * @brief Create a tabset widget
+ *
+ * @details This widget provides a set of tabs.
+ *
+ * @param[in] g The GDisplay to display this window on
+ * @param[in] fo The GTabsetObject structure to initialize. If this is NULL the structure is dynamically allocated.
+ * @param[in] pInit The initialization parameters
+ * @param[in] flags Some flags, see notes.
+ *
+ * @note Possible flags are: GWIN_TABSET_BORDER
+ *
+ * @return NULL if there is no resulting widget. A valid GHandle otherwise.
+ *
+ * @api
+ */
+GHandle gwinGTabsetCreate(GDisplay *g, GTabsetObject *fo, GWidgetInit *pInit, uint32_t flags);
+#define gwinTabsetCreate(fo, pInit, flags) gwinGTabsetCreate(GDISP, fo, pInit, flags);
- /**
- * @brief Add a tab-page to the tabset
- * @returns The GHandle of the tab-page container.
- *
- * @param[in] gh The tabset handle
- * @param[in] title 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.
- *
- * @api
- */
- GHandle gwinTabsetAddTab(GHandle gh, const char *title, bool_t useAlloc);
+/**
+ * @brief Add a tab-page to the tabset
+ * @returns The GHandle of the tab-page container.
+ *
+ * @param[in] gh The tabset handle
+ * @param[in] title 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.
+ *
+ * @api
+ */
+GHandle gwinTabsetAddTab(GHandle gh, const char *title, bool_t useAlloc);
- /**
- * @brief Delete a tab-page.
- * @details Any widgets on the page will also be destroyed
- *
- * @param[in] gh The tab-page handle
- *
- * @note The index position of all tabs after this tab in the tabset are automatically renumbered.
- *
- * @api
- */
- #define gwinTabsetDeleteTab(gh) gwinDestroy(gh)
+/**
+ * @brief Delete a tab-page.
+ * @details Any widgets on the page will also be destroyed
+ *
+ * @param[in] gh The tab-page handle
+ *
+ * @note The index position of all tabs after this tab in the tabset are automatically renumbered.
+ *
+ * @api
+ */
+#define gwinTabsetDeleteTab(gh) gwinDestroy(gh)
- /**
- * @brief Count the number of tabs in the tabset
- * @returns The number of tabs or zero if none exist.
- *
- * @param[in] gh The tabset handle
- *
- * @api
- */
- int gwinTabsetCountTabs(GHandle gh);
+/**
+ * @brief Count the number of tabs in the tabset
+ * @returns The number of tabs or zero if none exist.
+ *
+ * @param[in] gh The tabset handle
+ *
+ * @api
+ */
+int gwinTabsetCountTabs(GHandle gh);
- /**
- * @brief Get the GHandle of a tab based on its position
- * @returns The GHandle of the tab-page container or NULL if that tab-page doesn't exist.
- *
- * @param[in] gh The tabset handle
- * @param[in] index The tab-page handle to return (0 to number of pages - 1)
- *
- * @api
- */
- GHandle gwinTabsetGetTabByIndex(GHandle gh, int index);
+/**
+ * @brief Get the GHandle of a tab based on its position
+ * @returns The GHandle of the tab-page container or NULL if that tab-page doesn't exist.
+ *
+ * @param[in] gh The tabset handle
+ * @param[in] index The tab-page handle to return (0 to number of pages - 1)
+ *
+ * @api
+ */
+GHandle gwinTabsetGetTabByIndex(GHandle gh, int index);
- /**
- * @brief Get the GHandle of a tab based on its title
- * @returns The GHandle of the tab-page container or NULL if that tab-page doesn't exist.
- *
- * @param[in] gh The tabset handle
- * @param[in] title The title to search for
- *
- * @api
- */
- GHandle gwinTabsetGetTabByTitle(GHandle gh, const char *title);
+/**
+ * @brief Get the GHandle of a tab based on its title
+ * @returns The GHandle of the tab-page container or NULL if that tab-page doesn't exist.
+ *
+ * @param[in] gh The tabset handle
+ * @param[in] title The title to search for
+ *
+ * @api
+ */
+GHandle gwinTabsetGetTabByTitle(GHandle gh, const char *title);
- /**
- * @brief Set the title of a tab-page.
- *
- * @param[in] gh The tab-page handle (NB: Use the page handle NOT the tabset handle)
- * @param[in] title 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 This function should be used to change the text associated with a tab-page
- * rather than @p gwinSetText().
- *
- * @api
- */
- void gwinTabsetSetTitle(GHandle gh, const char *title, bool_t useAlloc);
+/**
+ * @brief Set the title of a tab-page.
+ *
+ * @param[in] gh The tab-page handle (NB: Use the page handle NOT the tabset handle)
+ * @param[in] title 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 This function should be used to change the text associated with a tab-page
+ * rather than @p gwinSetText().
+ *
+ * @api
+ */
+void gwinTabsetSetTitle(GHandle gh, const char *title, bool_t useAlloc);
- /**
- * @brief Get the title of a tab-page.
- * @return The title of the tab.
- *
- * @param[in] gh The tab-page handle (NB: Use the page handle NOT the tabset handle)
- *
- * @api
- */
- #define gwinTabsetGetTitle(gh) gwinGetText(gh)
+/**
+ * @brief Get the title of a tab-page.
+ * @return The title of the tab.
+ *
+ * @param[in] gh The tab-page handle (NB: Use the page handle NOT the tabset handle)
+ *
+ * @api
+ */
+#define gwinTabsetGetTitle(gh) gwinGetText(gh)
- /**
- * @brief Set the active tab in a tabset.
- *
- * @param[in] gh The tab-page handle (NB: Use the page handle NOT the tabset handle)
- *
- * @api
- */
- void gwinTabsetSetTab(GHandle gh);
+/**
+ * @brief Set the active tab in a tabset.
+ *
+ * @param[in] gh The tab-page handle (NB: Use the page handle NOT the tabset handle)
+ *
+ * @api
+ */
+void gwinTabsetSetTab(GHandle gh);
+/**
+ * @defgroup Renderings_Tabset Renderings
+ *
+ * @brief Built-in rendering functions for the tabset widget.
+ *
+ * @details These function may be passed to @p gwinSetCustomDraw() to get different tabset drawing styles.
+ *
+ * @note In your custom tabset drawing function you may optionally call these
+ * standard functions and then draw your extra details on top.
+ * @note These custom drawing routines don't have to worry about setting clipping as the framework
+ * sets clipping to the object window prior to calling these routines.
+ *
+ * @{
+ */
+
+/**
+ * @brief The default rendering function for the tabset widget.
+ *
+ * @details Fills the client area with the background color.
+ *
+ * @param[in] gw The widget object (must be a container object).
+ * @param[in] param A parameter passed in from the user. Ignored by this function.
+ *
+ * @api
+ */
+void gwinTabsetDraw_Std(GWidgetObject *gw, void *param);
+
+/**
+ * @brief Renders the tabset but leaves the client area transparent.
+ *
+ * @details Will not fill the client area at all.
+ *
+ * @param[in] gw The widget object (must be a container object).
+ * @param[in] param A parameter passed in from the user. Ignored by this function.
+ *
+ * @api
+ */
+void gwinTabsetDraw_Transparent(GWidgetObject *gw, void *param);
+
+#if GDISP_NEED_IMAGE || defined(__DOXYGEN__)
/**
- * @brief The custom draw routines for a frame window
- * @details These function may be passed to @p gwinSetCustomDraw() to get different frame drawing styles
+ * @brief Renders the tabset and uses the specified image for the client area.
*
- * @param[in] gw The widget object (in this case a frame)
- * @param[in] param A parameter passed in from the user
+ * @details The image will be tiled throghout the client area. Therefore, to archive the best looking result the
+ * supplied image needs to be of the same size as the client area size of the tabset widget (inner size).
*
- * @note In your own custom drawing function you may optionally call these
- * standard functions and then draw your extra details on top.
+ * @param[in] gw The widget object (must be a tabset object).
+ * @param[in] param A parameter passed in from the user. Must be an image handle. See note below.
*
- * @note gwinTabsetDraw_Std() will fill the client area with the background color.
- * gwinTabsetDraw_Transparent() will not fill the client area at all.
- * gwinTabsetDraw_Image() will tile the image throughout the client area.
- * All these drawing functions draw the frame itself the same way.
+ * @note The image must be already opened before calling @p gwinSetCustomDraw(). The handle is passed as the parameter
+ * to this function.
*
- * @note The standard functions below ignore the param parameter except for @p gwinTabsetDraw_Image().
- * @note The image custom draw function @p gwinTabsetDraw_Image() uses param to pass in the gdispImage pointer.
- * The image must be already opened before calling @p gwinSetCustomDraw().
+ * @pre GDISP_NEED_IMAGE must be set to TRUE
*
* @api
- * @{
*/
- void gwinTabsetDraw_Std(GWidgetObject *gw, void *param);
- void gwinTabsetDraw_Transparent(GWidgetObject *gw, void *param);
void gwinTabsetDraw_Image(GWidgetObject *gw, void *param);
- /** @} */
+#endif /* GDISP_NEED_IMAGE */
+/** @} */
#ifdef __cplusplus
}
diff --git a/src/gwin/gwin_textedit.h b/src/gwin/gwin_textedit.h
index 8b3336e2..cffe8fb7 100644
--- a/src/gwin/gwin_textedit.h
+++ b/src/gwin/gwin_textedit.h
@@ -61,7 +61,7 @@ GHandle gwinGTexteditCreate(GDisplay* g, GTexteditObject* wt, GWidgetInit* pInit
#define gwinTexteditCreate(wt, pInit, maxSize) gwinGTexteditCreate(GDISP, wt, pInit, maxSize)
/**
- * @defgroup Renderings_Textedit Textedit rendering functions
+ * @defgroup Renderings_Textedit Renderings
*
* @brief Built-in rendering functions for the textedit widget.
*