diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-05-07 21:25:24 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-05-07 21:25:24 +0000 |
commit | 9bc51533db436502b50aaa0014aa272576968df2 (patch) | |
tree | 69130cca051fdf38817fd4c99502b30f804981e8 /NxWidgets | |
parent | 1d7b4d2140b3d4dec9554a333e0e442103e3708f (diff) | |
download | nuttx-9bc51533db436502b50aaa0014aa272576968df2.tar.gz nuttx-9bc51533db436502b50aaa0014aa272576968df2.tar.bz2 nuttx-9bc51533db436502b50aaa0014aa272576968df2.zip |
Various fixes for running the NxWM unit test on the STM3240G-EVAL
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4711 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'NxWidgets')
-rwxr-xr-x | NxWidgets/ChangeLog.txt | 8 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/include/cgraphicsport.hxx | 15 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx | 8 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/src/cgraphicsport.cxx | 20 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx | 37 |
5 files changed, 73 insertions, 15 deletions
diff --git a/NxWidgets/ChangeLog.txt b/NxWidgets/ChangeLog.txt index cff96bca0..a160399a8 100755 --- a/NxWidgets/ChangeLog.txt +++ b/NxWidgets/ChangeLog.txt @@ -28,4 +28,10 @@ * CNxWidget: Removed support for reference constants and close types. The goal is to ge the base widget class as small as possible. * CNxTkWindow: Fix uninitialized pointer value. - +* CNxToolbar: Need to "fake" the fix position callback to avoid + deadlock waits for the callback that won't happen. +* CNxTkWindow: Fix toolbar background color +* CWidgetControl: Don't declare the the geometry is good until a non-NULL + window size is received. +* CGraphicsPort and CWidgetControl: If the underlying graphics device + is write-only, then we have to render fonts a little differently. diff --git a/NxWidgets/libnxwidgets/include/cgraphicsport.hxx b/NxWidgets/libnxwidgets/include/cgraphicsport.hxx index 404fb1d51..8eea3d689 100644 --- a/NxWidgets/libnxwidgets/include/cgraphicsport.hxx +++ b/NxWidgets/libnxwidgets/include/cgraphicsport.hxx @@ -79,6 +79,7 @@ #include <stdint.h> #include <stdbool.h> +#include "nxconfig.hxx" #include "inxwindow.hxx" /**************************************************************************** @@ -105,16 +106,26 @@ namespace NXWidgets class CGraphicsPort { private: - INxWindow *m_pNxWnd; /**< NX window interface. */ + INxWindow *m_pNxWnd; /**< NX window interface. */ +#ifdef CONFIG_NX_WRITEONLY + nxgl_mxpixel_t m_backColor; /**< The background color to use */ +#endif public: /** * Constructor. * - * @param pNxWnd An instance of the underlying window type. + * @param pNxWnd. An instance of the underlying window type. + * @param backColor. The background color is only needed if we + * cannot read from the graphics device. */ +#ifdef CONFIG_NX_WRITEONLY + CGraphicsPort(INxWindow *pNxWnd, + nxgl_mxpixel_t backColor = CONFIG_NXWIDGETS_DEFAULT_BACKGROUNDCOLOR); +#else CGraphicsPort(INxWindow *pNxWnd); +#endif /** * Destructor. diff --git a/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx b/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx index 72713f2c4..db7cb06b6 100644 --- a/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx +++ b/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx @@ -166,6 +166,8 @@ namespace NXWidgets TNxArray<CNxWidget*> m_widgets; /**< List of controlled widgets. */ bool m_modal; /**< True: in modal loop */ + bool m_haveGeometry; /**< True: indicates that we + have valid geometry data. */ sem_t m_modalSem; /**< Modal loops waits for events on this semaphore */ /** @@ -669,11 +671,7 @@ namespace NXWidgets * CGraphicsPort instance */ - inline bool createGraphicsPort(INxWindow *window) - { - m_port = new CGraphicsPort(window); - return m_port != (CGraphicsPort *)NULL; - } + bool createGraphicsPort(INxWindow *window); /** * Get the CGraphicsPort instance for drawing on this window diff --git a/NxWidgets/libnxwidgets/src/cgraphicsport.cxx b/NxWidgets/libnxwidgets/src/cgraphicsport.cxx index 43076e240..d43f3bdfa 100644 --- a/NxWidgets/libnxwidgets/src/cgraphicsport.cxx +++ b/NxWidgets/libnxwidgets/src/cgraphicsport.cxx @@ -105,13 +105,23 @@ using namespace NXWidgets; /** * Constructor. * - * @param pNxWnd An instance of the underlying window type. + * @param pNxWnd. An instance of the underlying window type. + * @param backColor. The background color is only needed if we + * cannot read from the graphics device. */ +#ifdef CONFIG_NX_WRITEONLY +CGraphicsPort::CGraphicsPort(INxWindow *pNxWnd, nxgl_mxpixel_t backColor) +{ + m_pNxWnd = pNxWnd; + m_backColor = backColor; +} +#else CGraphicsPort::CGraphicsPort(INxWindow *pNxWnd) { m_pNxWnd = pNxWnd; } +#endif /** * Destructor. @@ -673,10 +683,6 @@ void CGraphicsPort::drawText(struct nxgl_point_s *pos, CRect *bound, // Loop setup -#if 0 - nxwidget_pixel_t backcolor = g_defaultWidgetStyle->colors.back; -#endif - struct SBitmap bitmap; bitmap.bpp = CONFIG_NXWIDGETS_BPP; bitmap.fmt = CONFIG_NXWIDGETS_FMT; @@ -736,14 +742,14 @@ void CGraphicsPort::drawText(struct nxgl_point_s *pos, CRect *bound, // Sometimes a solid background works, sometimes not. But reading // from graphics memory always works. -#if 0 +#ifdef CONFIG_NX_WRITEONLY // Set the glyph memory to the background color nxwidget_pixel_t *bmPtr = (nxwidget_pixel_t *)bitmap.data; unsigned int npixels = fontWidth * fontHeight; for (unsigned int j = 0; j < npixels; j++) { - *bmPtr++ = backcolor; + *bmPtr++ = m_backColor; } #else // Read the current contents of the destination into the glyph memory diff --git a/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx b/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx index 9c90a5bfd..afd17e6e2 100644 --- a/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx +++ b/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx @@ -84,6 +84,7 @@ CWidgetControl::CWidgetControl(FAR const CWidgetStyle *style) m_port = (CGraphicsPort *)NULL; m_modal = false; + m_haveGeometry = false; m_clickedWidget = (CNxWidget *)NULL; m_focusedWidget = (CNxWidget *)NULL; @@ -440,14 +441,25 @@ void CWidgetControl::geometryEvent(NXHANDLE hWindow, m_hWindow = hWindow; nxgl_rectcopy(&m_bounds, bounds); + } + + // In the normal start up sequence, the window is created with zero size + // at position 0,0. The safe thing to do is to set the position (still + // with size 0, then then set the size. Assuming that is what is being + // done, we will not report that we have valid geometry until the size + // becomes nonzero. + if (!m_haveGeometry && size->h > 0 && size->w > 0) + { // Wake up any threads waiting for initial position information. // REVISIT: If the window is moved or repositioned, then the // position and size data will be incorrect for a period of time. // That case should be handled here as well. + m_haveGeometry = true; giveGeoSem(); } + sched_unlock(); } @@ -650,6 +662,31 @@ void CWidgetControl::newCursorControlEvent(ECursorControl cursorControl) } /** + * The creation sequence is: + * + * 1) Create a dumb CWigetControl instance + * 2) Pass the dumb CWidgetControl instance to the window constructor + * that inherits from INxWindow. + * 3) The call this method with the static_cast to INxWindow to, + * finally, create the CGraphicsPort for this window. + * 4) After that, the fully smartend CWidgetControl instance can + * be used to generate additional widgets. + * + * @param window The instance of INxWindow needed to construct the + * CGraphicsPort instance + */ + +bool CWidgetControl::createGraphicsPort(INxWindow *window) +{ +#ifdef CONFIG_NX_WRITEONLY + m_port = new CGraphicsPort(window, m_style.colors.background); +#else + m_port = new CGraphicsPort(window); +#endif + return m_port != (CGraphicsPort *)NULL; +} + +/** * Copy a widget style * * @param dest The destination style |