summaryrefslogtreecommitdiff
path: root/NxWidgets
diff options
context:
space:
mode:
Diffstat (limited to 'NxWidgets')
-rwxr-xr-xNxWidgets/ChangeLog.txt8
-rw-r--r--NxWidgets/libnxwidgets/include/cgraphicsport.hxx15
-rw-r--r--NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx8
-rw-r--r--NxWidgets/libnxwidgets/src/cgraphicsport.cxx20
-rw-r--r--NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx37
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