You are on page 1of 7

1.0 2012-03-22 Gregory Nutt <gnutt@nuttx.

* The initial release of the NxWidgets package
1.1 2012-05-19 Gregory Nutt <>
* Updated and verified the NxWidgets DOxygen documentation. Contributed
by Jose Pablo Carballo.
* IBitmap, CRlePalettBitmap: Extended class to support differnt LUTs
for selected and non-selected images.
* CImage: If selected, uses different LUTs based, different borders.
CImage is now basically a button type.
* CImage: Add logic to hightlight an CImage (using the selected LUT).
* nxwm: The tiny NX window manager (NxWM) is being developed in this directory.
* UnitTests/nxwm: A unit test for the NX window manager.
* CWidgetControl: Add a semaphore to force clients to wait if the
size or position of the window is not yet known (multi-user mode only).
* During integration of NxWM, corrected numerous problems with NxWidgets
running on toolbars and framed windows. That capability was commented
out in the 1.0 release but is verfied functional in 1.1.
* CRlePalettBitmap: Fix an error in the text that determines if we
need to "rewind" to the beginning of the image.
* CRlePalettBitmap: Fixe a positioning problem. It was actually losing
the last row of every image!
* CNxWidget: Removed support for "shelving" widgets. I will be removing
some lesser used feature over time in order to reduce the NxWidgets
* 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.
* CNxWidgets, CWidgetControl, and CRectCache: Big change! Remove all support
for widgets in a "vertical" hierarchy. Now widgets exist in a flat,
two-dimensional space and should not overlap. This should greatly
reduce the memory requirements and, since, NuttX already supports
a hierarchical windowing system, does not result in loss of functionality.
* CNxWidgets and CWidgetControl. Remove specific built-in support for
modal loops. There are too many different control mechanisms that might
be needed. Replace with hooks to control widget events from totally
external logic.
* CWindowEventHandler, CWindowEventHandlerList, CWidgetControl: New
callback classes to receive notifications about window events.
* NxWM::CFullScreenWindow and NxWM::CTaskbar: Add support in NxWM for full
screen window applications.
* All application windows now use CWindowEventHandler and CWindowEventHandlerLis
to get notifications about mouse and keyboard events. These class will
then automatically handle polling (with no need for a modal loop).
* NxWM::CTouchscreen and NxWM::CCalibration: Add touchscreen support (still a lo
way to go).
* NxWM::g_playBitmp: Change the play icon again. These tiny touch icons
must be very simple.
* NxWM::CCalibration: Beef up touch input handling logic. Now changes the
color of the touch circle to yellow when it is touched.
* NxWM::CTouchscreen: Do not read touchscreen data when there is no consumer.
* NxWM::CWindowControl: Add new class to wrap CWidgetControl and provide
some special mouse and keyboard input event handling.
* NxWM::CTaskbar: Correct the calculation of the physical size of the
* NxWM::CCalibration: run method must clear m_stop when returning, or you can
never restart the Calibration window.
* NxWM::CTaskbar: On a failure to start an application, the application icon
CImage was being deleted twice.
* NXWidgets::CImage: Now handles mouse click callbacks. CImage is now really
a button. Probably should separate basic imaging functionality as CImage
and create a new CImageButton.
* NxWM::CStartWindow: Now ignores any close application button presses
(You can't close the start window).
* NxWM::CCalibration: The calibration application now has its own thread.
This was necessary for a proper integration with the taskbar.
* NxWM::CCalibration and NxWM:CTouchscreen: Changed the mechanism use
to report calbration data. It is now reported directly from CCalibration
to CTouchscreen. If external logic needs calibration, it can now get it
from CTouchscreen instead of CCalibration. This change was necessary
to make the termination conditions of CCalibration clean (it used to
have to persist until some external logic got the Calibration data).
* IApplication, IApplicationWindow, and all classes that inherit from
these: Now support method to report if the application is a full-screen
or a normal application. This is necessary to prevent CTaskbar from
displaying a task bar on top of a full-screen window.
* NxWM::CTaskbar: Ooops... minimizing the wrong application!
* NxWM::CNxConsole: Add a on_exit() exit handler that will close the
NxConsole window when the NSH thread exits. A correct build now depends
on having CONFIG_SCHED_ONEXIT defined.
* NXWidgets::CNxWidget: Add a new onPreRelease() method.
* NXWidgets::CButton, CButtonArry, CImage now post action event at pre-release t
* NxWM: ICON touches are now drive by action events instead of click events.
* NXWidgets::CNxTkWindow: Reported size of a framed window must exclude the
height of the tool bar (if present)
* TODO.txt: Add a file to keep track of issues.
* NxWM::CStartWindow and IApplicationFactory: This is a substantial
redesign. IApplication wraps an application. However, if we want to
be able to start multiple copies of an application, then we need to
be able to create multiple IApplication instances from the start window.
Enter IApplicationFactory. Icons in the start window now correspond
to application factories; icons in the task bar no correspond to
application instances.
* NxWM::CStartWindow and CWindowControl: The above change necessitated
another architectural change: When create applications, it is sometimes
necessary to wait for windows events. The above change moved the
application creation to the window event thread, hence, causing deadlocks
wheneven the logic tried to wait for a window event. The solution was
to create a new thread, called the start window thread, that runs
asynchronously and can wait for windoew events.
* doc/NxWM-ThreadingModel.ppt: Documented the now rather complex NxWM
threading model.
1.2 2012-06-15 Gregory Nutt <>
* NXWidgets::CCallback: callback arguement is now type CCallback and not
CWidgetControl; Added a method to redirect keyboard contacts to either
the widgets in the window (via CWidgetControl) or to an NxConsole (via
* NXWidgets::INxWindow, CBgWindow, CNxTkWindow, CNxToolbar, CNxWindow:
Now pass the CCallback intances as the callback argument instead of
the CWidgetControl instance. New method redirectNxConsole() will
support redirection of any window keyboard input to the NxConsole
(via CCallback).
* NxWM:CNxConsole: Configures the NxConsole window to redirection keyboard
input to the NxConsole; redirects standard input to the NxConsole
device driver.
* NxWM:CKeyboard: Add a new class that implements a keyboard listener
thread. This thread reads from /dev/console and injects the keyboard
input into NX. NX will determine which window is at the top of the
heirarchy and re-direct the keyboard input to only that top window.
This solves an important problem with, for example, running multiple
copies of the NxConsole: On the copy of the NxConsole at the top of
the heirarchy should get the keyboard input.
* UnitTests/nxwm/main.cxx: Now starts the keyboard thread if
* NxWM::CTaskbar: After drawing the task bar, need to raise the
application window otherwise the taskbar will be on the top and
keyboard input will not be received by the top application.
* NxWM::CTaskbar: Bugfix... previous window should not be minimized
when a new window is started. It should stay in a maximized state
so that it will re-appear with the window above it is closed or
* NxWM::CHexCalculator: Add a hexadecimal/decimal calculator
* NXWidgets::CNxTkWindow: Back out height adjustment in the getSize()
method. The code was correct as it was before.
* NXWidgets::CButtonArray and NXWidgets::CGraphicsPort: There is
a kludge in there to handle the case where we cannot read the
background data because the LCD does not support read operations.
In that case, we just use the default background color. However,
that doesn't work either for the case where the background color
changes when the widget is selected. Then the background color
in the font is wrong. Fixed in CButtonArrary, but the problem
probably exists in other places as well.
* NxWM: Increase default spacing of icons on the Start Window.
* NxWM::CHexCalculator: Fix some non-standard calculator behavior
after = is pressed. Use upper case hex. Increase font size.
* nxwm/Makefile: Fix error that creapt in during some other
recent check-ins.
1.3 2012-09-29 Gregory Nutt <>
* UnitTests/*/main.cxx: Change entry point name to be consistent
with with entry point naming conventions introduced in NuttX
* Kconfig: Added a mconfig configuration file. Eventually, NxWidgets
needs to get hooked into the NuttX mconf configuration. Still not
exactly sure how to do that.
* libnxwidgets/Makefile and NxWidgets/nxwm/Makefile: Need updates
for consistency with recent changes to NuttX build system (>= 6.22)
* Kconfig: Add option to turn on the memory monitor feature of the
NxWidgets/NxWM unit tests.
1.4 2012-12-20 Gregory Nutt <>
* libnxwidgets/Makefile, NxWidgets/nxwm/Makefile, and
NxWidgets/UnitTests/nxwm/Makefile: Makefile improvements from
submitted by Petteri Aimonen. Other Makefiles in the UnitTests
directory probably also need these changes.
* libnxwidgets/src/ccallback.cxx: Fix misplaced #endif. Provided
by Petteri Aimonen.
* libnxwidgets/src/cnxserver.cxx: Reduce delay to allow NX server
to start. One second was un-necessarily long. Reduced to 50 MS.
Reduction suggested by Petteri Aimonen.
* tools/ This script converts from any image type
supported by Python imaging library to the RLE-encoded format used by
* NxWidgets/nxwm/src/capplicationwindow.cxx: If the "desktop" is empty,
users have no need to minimize any windows. If the buttons are small,
it's easy to hit minimize button accidentally when trying to close an
application. Contributed by Petteri Aimonen.
* NxWidgets/nxwm/src/ctaskbar.cxx: Add an option to eliminate the
background image. Contributed by Petteri Aimonen.
* NxWidgets/nxwm/src/chexcalculator.cxx and NxWidgets/nxwm/src/cstartwindow.cxx:
allow changing the icons used for these applications. However, to declare symb
for these icons user would need to modify NxWidgets header files.
This commit adds a simple forward declaration to the relevant files, based on
configured icon. If the icon does not exist, linker will give an error about i
Contributed by Petteri Aimonen.
* NxWidgets::CTaskBar: Highlight the current window in the task bar.
Contributed by Petteri Aimonen.
* NxWidgets/libnxwidgets/src/glyph_cycle.cxx: Width of glyph_cycle was wrong;
Destructor needs to by public. From Petteri Aimonen.
* NxWidgets::CNumericEdit. This is basically a label with plus and minus button
Contributed by Petteri, Aimonen.
* NxWM::CStartWindow: Fix mq_receive error handling with signal is recieved.
From Petteri Aimonen.
* NxWidgets::CNxTimer: Replace the original (apparently non-functional) signal-
based solution with a work queue-based solution. This raises some isses about
using the internal work queues from user space. I have decided to implemented
user-space work queues (someday) in order to accomplish that functionaliy.
Submitted by Petteri Aimonen.
* NxWidgets:CText and NxWidgets:CNumericEdite: Fix some memory freeing bugs
(from Petteri Aimonen).
* NxWidgets::CScrollingPanel: Usability improvements. It is borderless for now
because there was no easy way to redraw only the required part of the border.
Contributed by Petteri Aimonen.
* NxWidgets::CNxWidgets and NxWM::CStartWindow: Small changes to make sub-
classing easier (from Petteri Aimonen).
1.5 2013-02-01 Gregory Nutt <>
* NxWidgets::CGraphicsPort::move(): Fix typo bug in bounding rectangle
calculation (from Petteri Aimonen).
* NxWM::CScrollingPanel::scrollChildren(): Avoid unnecessary redraws in
CScrollingPanel (contributed by Petteri Aimonen).
* NxWM::CCycleButton: Remove the separator from CCycleButton. It draws in
wrong place, and doesnt look very good in the correct place either.
(from Petteri Aimonen).
* NxWidgets::CGraphicsPort: Many times we only want a constant background.
In that case the old code fills the background, reads it back, renders
the text and then writes it back. When used with LCD's (instead of
framebuffers) this causes unnecessary delay and screen flicker.
This commit adds a variant of drawText that takes background color,
so that the background and text can both be rendered at one go.
The old functions still function as before (Petteri Aimonen).
* NxWidgets::CLabel: The label was drawn as a single rectangular region,
then a text was added to the on top of this. The result is that the
text would flicker when the CLabel was updated. With this change, the
two step update is replaced with a five step update: The background
is updated as four rectangulear regions (leaving the previous text in
place), then the new text is updated. This eliminates the flicker
(Petteri Aimonen).
* Kconfig: Many NxWidgets/NxWM settings do not have meaningful, generic
default values. Colors, for example, depend on pixel depth. Some
geometry settings depending on other geometry settings. Font IDs are
not know-able by the configuration system. etc. In these cases, it
is best if the settings are just not undefined so that the system can
calculate a reasonable default. however, if no default is provided
in the .config file, mconf will complain and generate errors. So work
around this, I added several "enabling" settings to override the
default setting. This is awkward and I preferred the configuration as
it was before, but this avoids the mconf errors and warnings.
* UnitTests: Changed occurrences of lib_rawprintf() and lib_lowprintf()
to match recent changes to NuttX (will be in NuttX-6.25)
* CGraphicsPort::_drawText: Renamed from CGraphicsPort::drawText in order
to eliminate some naming collisions when overloaded in some configurations
(i.e., when both bool and nx_pixel_t are uint8_t). From Petteri Aimonen.
* CNxWidgets::drawContents: Change base drawContents from a do-nothing
function to a function that fills the widget with the background color.
This is useful when using CNxWidgets as a "panel" , i.e. a container
for other widgets. Subclasses will override drawContents and decide
themselves how to draw the background.
* CNxWidgets::CTabPanel: A new widget contributed by Petteri Aimonen.
This widget provides a tab panel, which has a button bar at the top
and panels below it. Pressing a button will select the corresponding
1.6 2013-03-15 Gregory Nutt <>
* Type of argv[] has changed from const char ** to char * const *
* NXWidgets::CNxWidget: Add an inline function to get the current style.
* NxWM::CTaskBar: Make a some methods of CTaskbar virtual to allow
customizations. From Petteri Aimonen.
* NXWidgets::CCycleButton: Make CCycleButton change state in onPreRelease().
This way the new value is already available when a listener gets the
action event. From Petteri Aimonen.
* NxWidgets/tools/ Fix so that
it works with indexed input images.
* NxWidgets::CLabel: Fix backward conditional compilation in the
"flicker free" logic.
* NxWidgets::CNxTimer: Previously repeated timers were re-enabled after
the timer action event. Consequently, if the action event handler tried
to stop the timer, the request would be ignored. Changes the order
so that the timer is re-enabled before the callback. There is still
no risk of re-entrancy, because everything executes on the USRWORK work
queue. From Petteri Aimonen.
* NxWidgets::CMultiLineTestBox: Fix text placement error. From Petteri
* NxWidgets::CWidgetControl: Added another semaphore, boundssem, which
is set as soon as the screen bounds are known. This corrects two
1) Due to the way nxgl_rectsize computes the size, it will never
be 0,0 like CWidgetControl expects. Therefore the size is considered
valid even though it has not been set yet.
2) After the check is fixed to test for > 1, NxWM window creation will
hang. This is due to the fact that it uses the screen bounds for
determining window size. This was being blocked on geosem, which
is only posted after the size has been set.
From Petteri Aimonen.
* NxWidgets::CImage: Two enhancements:
1) Allow changing the bitmap even after the control has been created.
2) Allow giving 'null' to have the control draw no image at all.
From Petteri Aimonen.
* NxWM::CTaskBar: Allow windows with null icon. This makes sense for e.g.
full screen windows. From Petteri Aimonen.
* NxWM::CApplicationWindow: Add config options to override NxWM
stop/minimize icons. From Petteri Aimonen.
* NwWM::CStartWindow, NxWM::CWindowMessenger: Get rid of the start window
thread. Instead, handle all events through the USRWORK work queue.
For me, this was necessary because I would open some files in button
handlers and close them in NxTimer handlers. If these belonged to
different tasks, the close operation would fail. Further benefits:
+ Gets rid of one task and message queue.
+ Reduces the amount of code required
+ Decouples CStartWindow from everything else - now it is just a window
with application icons, not an integral part of the event logic.
+ All events come from the same thread, which reduces the possibility of
multithreading errors in user code.
+ The user code can also send events to USRWORK, so that everything gets
serialized nicely without having to use so many mutexes.
- Currently the work state structure is malloc()ed, causing one allocation
and free per each input event. Could add a memory pool for these later, but
the speed difference doesn't seem noticeable.
- The work queue will add ~50 ms latency to input events. This is however
configurable, and the delay is anyway short enough that it is unnoticeable.
From Petteri Aimonen.
1.7 2013-04-28 Gregory Nutt <>
* NxWidgets Fix bug when image width > 255. From
Petteri Aimonen (2013-4-22).
* NxWM::CScrollbarPanel: Fix spelling error in class name: CScollbarPanel
should be CScrollbarPanel. From Petteri Aimonen (2013-4-22).
* NxWidgets:: CGlyphButton: Generate action event, like CButton does.
From Petteri Aimonen (2013-4-22).
* NxWidgets:: CGlyphButton: Prevent drawing outside of the bitmap size.
From Petteri Aimonen (2013-4-22).
* NxWM::CTaskBar: Add option CONFIG_NXWM_TASKBAR_NO_BORDER to suppress
drawing of the border on the taskbar. From Petteri Aimonen (2013-4-22).
* NxWidgets::CNxTimer: Add function to check if CNxTimer is running.
From Petteri Aimonen (2013-4-22).
* NxWidgets::CNxWidgets: Allow overriding of the checkCollision() method.
From Petteri Aimonen (2013-4-22).
1.8 2013-xx-xx Gregory Nutt <>
* NxWM::CMediaPlayer: shell application for an MP3 Media Player with
Kconfig settings to enable it. I plan to write this app to help
develop and test the MP3 codec chip driver. It really doesn't do
anything yet except display a text box saying "Coming soon", and I
need to minimize the icon size a bit. From Ken Pettit (2013-5-11).
* NxWidgets/nxwm/src/glyph_mediaplayer.cxx: Smaller version of the
media player glyph. From Ken Pettit (2013-5-12).
* NxWidgets/nxwm/include/ccalibration.hxx and src/ccalibration.cxx:
Fix a race condition that would cause the calibration screen
to fail to come up when its icon was touched (From Ken Pettit,
* Kconfig: Default priorities for NxWidget and NxWM threads
should be 100, not 50, to be consistent with other default priorities.
* NxWidgets::CGlyphSliderHorizontal and NxWidgets::CGlyphSliderHorizontalGrip:
New widgets added by Ken Pettit (2013-5-15).
* NxWidgets/UnitTests/CGlyphSliderHorizontal: Addes a unit test for the
NxWidgets::CGlyphSliderHorizontal class. From Ken Pettit (2013-5-17) .
* NxWidgets::CGlyphSliderHorizontal: Fix a drawing error. From Ken
Pettit (2013-5-17).
* UnitTests/*/Makefile and .gitignore: Update the way that NSH
the Unit Tests are registered as built-in NSH applications (2013-5-30).
* NxWidgets::CImage: Allow a NULL pointer for a bitmap. Add protection
to prevent dereferencing the NULL pointer. From Petteri Aimonen
* NxWidgets::CNumericEdit: Delay before auto-incrementing now varies:
A longer delay is required to start auto-incrementing and speed increases
while pressed. From Petteri Aimonen (2013-6-4).
* NxWM::CTaskbar: Add a method to redraw the taskbar and the current
application. This should only be necessary if the display loses
state due to e.g. powerdown or other manual intervention. From
Petteri Aimonen (2013-6-4).