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
This commit is contained in:
patacongo 2012-05-07 21:25:24 +00:00
parent fb682a72fb
commit b866254cde
5 changed files with 73 additions and 15 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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
*