From 9bc51533db436502b50aaa0014aa272576968df2 Mon Sep 17 00:00:00 2001 From: patacongo Date: Mon, 7 May 2012 21:25:24 +0000 Subject: 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 --- NxWidgets/libnxwidgets/include/cgraphicsport.hxx | 15 +++++++-- NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx | 8 ++--- NxWidgets/libnxwidgets/src/cgraphicsport.cxx | 20 +++++++----- NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx | 37 +++++++++++++++++++++++ 4 files changed, 66 insertions(+), 14 deletions(-) (limited to 'NxWidgets/libnxwidgets') 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 #include +#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 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(); } @@ -649,6 +661,31 @@ void CWidgetControl::newCursorControlEvent(ECursorControl cursorControl) wakeupModalLoop(); } +/** + * 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 * -- cgit v1.2.3