From 3ba3be201cddf3c6a4606f49028fc6640da0b28e Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Thu, 13 Aug 2015 01:13:36 +0200 Subject: [PATCH] Adding gwinSetFocus() and gwinGetFocus() --- docs/releases.txt | 2 ++ src/gwin/gwin.h | 25 +++++++++++++++++++++++++ src/gwin/gwin_wm.c | 23 ++++++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/releases.txt b/docs/releases.txt index 03045d13..9f7c16be 100644 --- a/docs/releases.txt +++ b/docs/releases.txt @@ -9,6 +9,8 @@ FEATURE: Added GFXSINGLEMAKE=yes|no to the ugfx makefile to compile ugfx as a si FEATURE: New board STM32F746G-Discovery FEATURE: New gdisp driver STM32LTDC FEATURE: Better support for Raw32 platforms +FEATURE: Implementing widget focusing. See gwinSetFocus() and gwinGetFocus() + *** Release 2.3 *** FEATURE: Added more events to the slider widget diff --git a/src/gwin/gwin.h b/src/gwin/gwin.h index 4a7d02bf..329be4c4 100644 --- a/src/gwin/gwin.h +++ b/src/gwin/gwin.h @@ -547,6 +547,31 @@ extern "C" { */ GHandle gwinGetNextWindow(GHandle gh); + /** + * @brief Set the focus to a specific widget + * + * @details The widget that is currently in focus is the widget that + * receives mouse and keyboard events. + * Passing NULL will remove the focus from any widget. + * + * @param[in] gh The widget handle. Non-widget handles will be ignored. + * + * @api + */ + void gwinSetFocus(GHandle gh); + + /** + * @brief Get the widget that is currently in focus + * + * @details The widget that is currently in focus is the widget that + * receives mouse and keyboard events. + * + * @return The handle of the widget that is currently in focus. May be NULL. + * + * @api + */ + GHandle gwinGetFocus(void); + /** * @brief Set a window or widget to flash * diff --git a/src/gwin/gwin_wm.c b/src/gwin/gwin_wm.c index 00365c36..52f7a1aa 100644 --- a/src/gwin/gwin_wm.c +++ b/src/gwin/gwin_wm.c @@ -162,7 +162,7 @@ extern const GWindowManager GNullWindowManager; GWindowManager * _GWINwm; bool_t _gwinFlashState; - +static GHandle _widgetInFocus; static gfxSem gwinsem; static gfxQueueASync _GWINList; #if GWIN_NEED_FLASHING @@ -184,6 +184,8 @@ static volatile uint8_t RedrawPending; void _gwmInit(void) { + _widgetInFocus = 0; + gfxSemInit(&gwinsem, 1, 1); gfxQueueASyncInit(&_GWINList); #if GWIN_NEED_FLASHING @@ -571,6 +573,25 @@ GHandle gwinGetNextWindow(GHandle gh) { return gh ? (GHandle)gfxQueueASyncNext(&gh->wmq) : (GHandle)gfxQueueASyncPeek(&_GWINList); } +void gwinSetFocus(GHandle gh) { + // Passing NULL removes the focus from any widget + if (gh == 0) { + _widgetInFocus = 0; + return; + } + + // Only accept widgets + if (!gwinIsWidget(gh)) { + return; + } + + _widgetInFocus = gh; +} + +GHandle gwinGetFocus(void) { + return _widgetInFocus; +} + #if GWIN_NEED_FLASHING static void FlashTimerFn(void *param) { GHandle gh;