This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 05b0b7c9f30557cc5a9ebff37951de357823bff4 Author: raiden00pl <raide...@railab.me> AuthorDate: Tue Oct 24 12:22:19 2023 +0200 Documentaion: migrate graphics/readme --- Documentation/applications/graphics/index.rst | 4 - Documentation/applications/graphics/lvgl/index.rst | 6 +- .../applications/graphics/nxwidgets/index.rst | 368 +++++++++++++++++++ Documentation/applications/graphics/nxwm/index.rst | 85 +++++ .../applications/graphics/pdcurs34/index.rst | 5 + Documentation/applications/graphics/tiff/index.rst | 15 + .../applications/graphics/twm4nx/index.rst | 396 +++++++++++++++++++++ 7 files changed, 872 insertions(+), 7 deletions(-) diff --git a/Documentation/applications/graphics/index.rst b/Documentation/applications/graphics/index.rst index 48494352c5..92779321fc 100644 --- a/Documentation/applications/graphics/index.rst +++ b/Documentation/applications/graphics/index.rst @@ -12,10 +12,6 @@ Graphics Support - ft80x - FTDI/BridgeTek FT80x library - libjpeg - libjpeg JPEG image encoding - libyuv - libyuv -- nxwidgets - NxWidgets -- nxwm - NuttX Tiny Window Manager (NxWM) -- pdcurs34 - pdcurses Text User Interface (TUI) - screenshot - TIFF screenshot utility - slcd - Segment LCD Emulaton -- tiff - TIFF file generation library - twm4nx - Minimal Tom's Window Manager (TWM) for NuttX (Twm4Nx) diff --git a/Documentation/applications/graphics/lvgl/index.rst b/Documentation/applications/graphics/lvgl/index.rst index 0a18e1251c..0b0f1385ff 100644 --- a/Documentation/applications/graphics/lvgl/index.rst +++ b/Documentation/applications/graphics/lvgl/index.rst @@ -1,6 +1,6 @@ -==== -LVGL -==== +============= +``lvgl`` LVGL +============= Usage ----- diff --git a/Documentation/applications/graphics/nxwidgets/index.rst b/Documentation/applications/graphics/nxwidgets/index.rst new file mode 100644 index 0000000000..ef9bd79f20 --- /dev/null +++ b/Documentation/applications/graphics/nxwidgets/index.rst @@ -0,0 +1,368 @@ +======================= +``nxwidgets`` NXWidgets +======================= + +In order to better support NuttX based platforms, a special graphical user +interface has been created called NXWidgets. NXWidgets is written in C++ and +integrates seamlessly with the NuttX NX graphics subsystem in order to provide +graphic objects, or _widgets_, in the NX Graphics Subsystem + +Some of the features of NXWidgets include: + +- Conservative C++ + + NXWidgets is written entirely in C++ but using only selected "embedded + friendly" C++ constructs that are fully supported under NuttX. No additional + C++ support libraries are required. + +- NX Integration + + NXWidgets integrate seamlessly with the NX graphics system. Think of the X + server under Linux – the NX graphics system is like a tiny X server that + provides windowing under NuttX. By adding NXWidgets, you can support graphics + objects like buttons and text boxes in the NX windows and toolbars. + +- Small Footprint + + NXWidgets is tailored for use MCUs in embedded applications. It is ideally + suited for mid- and upper-range of most MCU families. A complete NXWidgets is + possible in as little as 40Kb of FLASH and maybe 4Kb of SRAM. + +- Output Devices + + NXWidgets will work on the high-end frame buffer devices as well as on LCDs + connected via serial or parallel ports to a small MCU. + +- Input Devices + + NXWidgets will accept position and selection inputs from a mouse or a + touchscreen. It will also support character input from a keyboard such as a + USB keyboard. NXWidgets supports on very special widget called ``CKeypad`` that + will provide keyboard input via an on-screen keypad that can be operated via + mouse or touchscreen inputs. + +- Many Graphic Objects + + Some of the graphic objects supported by NXWidgets include labels, buttons, + text boxes, button arrays, check boxes, cycle buttons, images, sliders, + scrollable list boxes, progress bars, and more. + +**Note**: Many of the fundamental classed in NxWidgets derive from the Antony +Dzeryn's _Woopsi_ project: http://woopsi.org/ which also has a BSD style +license. See the ``COPYING`` file for details. + +Directory Structure +------------------- + +- ``Kconfig`` + + This is a ``Kconfig`` file that should be provided at ``apps/NxWidgets/Kconfig``. + When copied to that location, it will be used by the NuttX configuration + systems to configure settings for NxWidgets and NxWM + +- ``nxwidgets`` + + The source code, header files, and build environment for NxWidgets is provided + in this directory. + +- ``UnitTests`` + + Provides a collection of unit-level tests for many of the individual widgets + provided by ``nxwidgets``. + +Doxygen +------- + +Installing the necessary packages in Ubuntu +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Install the following packages:: + + $ sudo aptitude install doxygen doxygen-doc doxygen-gui dot2tex graphviz + +2. (Optional) Install Doxygen from the latest sourcode. + + The Ubuntu package is outdated. The newer the version of Doxygen, the better + the documentation looks. + + Place yourself in some temporary folder where you can download the source, + and run [1]:: + + $ svn co https://doxygen.svn.sourceforge.net/svnroot/doxygen/trunk doxygen-svn + $ cd doxygen-svn + $ ./configure + $ make + $ make install + +Generating documentation +~~~~~~~~~~~~~~~~~~~~~~~~ + +Two ways described here: + +1. Use the provided ``gendoc.sh`` script:: + + trunk/NXWidgets/Doxygen/gendoc.sh + + The script only needs the argument to the absolute path where to place the + generated documentation. I.e.:: + + $ cd /path/to/nuttx/trunk/NXWidgets/Doxygen/ + $ mkdir doc + $ ./gendoc.sh $PWD/doc + +2. Using the ``Doxyfile`` directly: + + The file ``Doxyfile`` contains the configuration of the Doxygen settings for + the run, edit only if necessary. + + To generate the documentation type:: + + $ cd /path/to/nuttx/trunk/NXWidgets/Doxygen/ + $ doxygen Doxyfile + +References +~~~~~~~~~~ + +[1] http://www.stack.nl/~dimitri/doxygen/download.html + + +Unit Tests +---------- + +Installing and Building the Unit Tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Setup NuttX + + 1. Configure NuttX + + Configure NuttX to run one of the target configurations. For example, + let's assume that you are using the ``sim/nsh2`` configuration. The + ``sim/nsh2`` configuration was specially created for use NXWidgets on the + simulation platform. A similar, special configuration ``stm3210e-eval/nsh2`` + is also for the ``STM3210E-EVAL`` available. However, the unit test can be + run on other configurations (see steps d and e below). + + **Note**: There are some other special configurationsrecommended for + unit-leveling testing of NxWM because the configuration is more complex in + that case. These are: + + 1) ``sim/nxwmm``, or the simulated platform (no touchscreen), and + 2) ``stm3240g-evel``, for the ``STM3240G-EVAL`` board (with the STMPE11 + touchscreen) + + We will assume the ``sim/nsh2`` configuration in this discussion. The + ``sim/nsh2`` configuration is installed as follows:: + + cd <nuttx-directory-path> + make distclean + tools/configure.sh sim:nsh2 + + Where: + + ``<nuttx-directory-path>`` is the full, absolute path to the NuttX build + directory + + If you are using the ``sim/nsh2`` or ``stm3210e-eval`` configurations, then + skip to step 2 (Hmmm.. better check 1d) too). + + There may be certain requirements for the configuration that you select... + for example, certain widget tests may require touchscreen support or + special font selections. These test-specific requirements are addressed + below under "Unit Test Directories" + + 2. Enable C++ Support + + If you are not using the ``sim/nsh2`` or ``stm3210e-eval``, you will need to + add the following definitions to the NuttX configuration at + ``nuttx/.config`` to enable C++ support:: + + CONFIG_HAVE_CXX=y + + Check first, some configurations already have C++ support enabled (As of + this writing **ONLY** the ``sim/nsh2`` and ``stm321-e-eval`` configurations + have C++ support pre-enabled). + + 3. Enable Debug Options + + If you are running on a simulated target, then you might also want to + enable debug symbols:: + + CONFIG_DEBUG_SYMBOLS=y + + Then you can run the simulation using GDB or DDD which is a very powerful + debugging environment! + + 4. Special configuration requirements for the nxwm unit test:: + + CONFIG_NXTERM=y + + 5. Other ``.config`` file changes – NSH configurations only. + + If the configuration that you are using supports NSH and NSH built-in + tasks then all is well. If it is an NSH configuration, then you will have + to define the following in your ``nuttx/.config`` file as well (if it is not + already defined):: + + CONFIG_NSH_BUILTIN_APPS=y + + ``sim/nsh2`` and ``stm3210e-eval/nsh2`` already has this setting. You do not + need to change anything further in the ``nuttx/.config`` file if you are + using either of these configurations. + + 6. Other ``.config`` file changes – NON-NSH configurations only. + + Entry Point. You will need to set the entry point in the .config file. For + NSH configurations, the entry point will always be ``nsh_main`` and you will + see that setting like:: + + CONFIG_INIT_ENTRYPOINT="nsh_main" + + If you are not using in NSH, then each unit test has a unique entry point. + That entry point is the name of the unit test directory in all lower case + plus the suffix ``_main``. So, for example, the correct entry for the + ``UnitTests/CButton`` would be:: + + CONFIG_INIT_ENTRYPOINT="cbutton_main" + + And the correct entry point for ``UnitTests/nxwm`` would be:: + + CONFIG_INIT_ENTRYPOINT="nxwm_main" + + etc. + + For non-NSH configurations (such as the ``sim/touchscreen``) you will have + to remove the configuration setting that provided the ``main`` function so + that you use the ``main`` in the unit test code instead. So, for example, + with the ``sim/touchscreen`` configuration you need to remove the following + from the NuttX configuration file (``.config``):: + + CONFIG_EXAMPLES_TOUSCHCREEN=y ## REMOVE (provided "tc_main") + +2. Adjust the Stack Size + + If using an simulation configuration (like ``sim/nsh2``) and your unit test + uses X11 as its display device, then you would have to increase the size of + unit test stack as described below under "Stack Size Issues with the X11 + Simulation". + +3. Build NuttX including the unit test and the NXWidgets library:: + + cd <nuttx-directory-path> + . ./setenv.sh + make + +Work-Arounds +~~~~~~~~~~~~ + +Build Issues +............ + +1. I have seen this error on Cygwin building C++ code:: + + LD: nuttx.rel + ld: skipping incompatible /home/patacongo/projects/nuttx/nuttx/trunk/nuttx/libxx//liblibxx.a when searching for -llibxx + ld: cannot find -llibxx + + The problem seems to be caused because ``gcc`` build code for 32-bit mode and + ``g++`` builds code for 64-bit mode. Add the ``-m32`` option to the ``g++`` command + line seems to fix the problem. In ``Make.defs``:: + + CXXFLAGS = -m32 $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) \ + $(ARCHCXXFLAGS) $(ARCHINCLUDESXX) $(ARCHDEFINES) $(EXTRADEFINES) -pipe + +2. Stack Size Issues with the X11 Simulation + + When you run the NuttX simulation, it uses stacks allocated by NuttX from the + NuttX heap. The memory management model is exactly the same in the simulation + as it is real, target system. This is good because this produces a higher + fidelity simulation. + + However, when the simulation calls into Linux/Cygwin libraries, it will still + use these small simulation stacks. This happens, for example, when you call + into the system to get and put characters to the console window or when you + make x11 calls into the system. The programming model within those libraries + will assume a Linux/Cygwin environment where the stack size grows dynamically + + As a consequence, those system libraries may allocate large data structures + on the stack and overflow the small NuttX stacks. X11, in particular, + requires large stacks. If you are using X11 in the simulation, make sure that + you set aside a "lot" of stack for the X11 system calls (maybe 8 or 16Kb). + The stack size for the thread that begins with user start is controlled by + the configuration setting ``CONFIG_INIT_STACKSIZE``; you may need to + increase this value to larger number to survive the X11 system calls. + + If you are running X11 applications as NSH add-on programs, then the stack + size of the add-on program is controlled in another way. Here are the steps + for increasing the stack size in that case:: + + cd ../apps/namedapps # Go to the namedapps directory + vi namedapps_list.h # Edit this file and increase the stack size of the add-on + rm .built *.o # This will force the namedapps logic to rebuild + +Unit Tests Directories +~~~~~~~~~~~~~~~~~~~~~~ + +The following provide simple unit tests for each of the NXWidgets. In addition, +these unit tests provide examples for the use of each widget type. + +- ``CButton`` + + - Exercises the ``CButton`` widget. + - Depends on ``CLabel``. + +- ``CButtonArray`` + + - Exercises the ``CButtonArray`` widget. + +- ``CCheckBox`` + + - Exercises the ``CCheckBox`` widget. + - Depends on ``CLabel`` and ``CButton``. + +- ``CGlyphButton`` + + - Exercises the ``CGlyphButton`` widget. + - Depends on ``CLabel`` and ``CButton``. + +- ``CImage`` + + - Exercises the ``CImage`` widget. + +- ``CLabel`` + + - Exercises the ``CLabel`` widget. + +- ``CProgressBar`` + + - Exercises the ``CProgressBar`` widget. + +- ``CRadioButton`` + + - Exercises the ``CRadioButton`` and ``CRadioButtonGroup`` widgets. + - Depends on ``CLabel`` and ``CButton``. + +- ``CScrollBarHorizontal`` + + - Exercises the ``ScrollbarHorizontal``. + - Depends on ``CSliderHorizontal`` and ``CGlyphButton``. + +- ``CScrollBarVertical`` + + - Exercises the ``ScrollbarHorizontal``. + - Depends on ``CSliderVertical`` and ``CGlyphButton``. + +- ``CSliderHorizontal`` + + - Exercises the ``CSliderHorizontal``. + - Depends on ``CSliderHorizontalGrip``. + +- ``CSliderVertical`` + + - Exercises the ``CSliderVertical``. + - Depends on ``CSliderVerticalGrip``. + +- ``CTextBox`` + + - Exercises the ``CTextBox`` widget. + - Depends on ``CLabel``. diff --git a/Documentation/applications/graphics/nxwm/index.rst b/Documentation/applications/graphics/nxwm/index.rst new file mode 100644 index 0000000000..910a9ea256 --- /dev/null +++ b/Documentation/applications/graphics/nxwm/index.rst @@ -0,0 +1,85 @@ +========================================= +``nxwm`` NuttX Tiny Window Manager (NxWM) +========================================= + +This directory holds a tiny desktop for small embedded devices with a +touchscreen,. NxWM. NxWM is true multiple window manager but only one window is +displayed at a time. This simplification helps performance on LCD based products +(in the same way that a tiled window manager helps) and also makes the best use +of small displays. It is awkward from a human factors point-of-view trying to +manage multiple windows on a small display. + +The window manager consists of a task bar with icons representing the running +tasks. If you touch the task's icon, it comes to the top. Each window has a +toolbar with (1) a title, (2) a minimize button, and (3) a stop application +button using the standard icons for these things. + +There is always a start window that is available in the task bar. When you touch +the start window icon, it brings up the start window containing icons +representing all of the available applications. If you touch an icon in the +start window, it will be started and added to the task bar. + +There is a base class that defines an add-on application and an interface that +supports incorporation of new application. The only application that is provided +is NxTerm. This is an NSH session running in a window. You should be able to +select the NX icon in the start menu and create as many NSH sessions in windows +as you want. (keybard input still comes through serial). + +Note 1: NwWM requires ``NuttX-7.19`` or above to work with the current +``NxWidgets-1.18`` release. + + +Doxygen +------- + +Installing the necessary packages in Ubuntu +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Install the following packages:: + + $ sudo aptitude install doxygen doxygen-doc doxygen-gui dot2tex graphviz + +2. (Optional) Install Doxygen from the latest sourcode. + + The Ubuntu package is outdated. The newer the version of Doxygen, the better + the documentation looks. + + Place yourself in some temporary folder where you can download the source, + and run [1]:: + + $ svn co https://doxygen.svn.sourceforge.net/svnroot/doxygen/trunk doxygen-svn + $ cd doxygen-svn + $ ./configure + $ make + $ make install + +Generating documentation +~~~~~~~~~~~~~~~~~~~~~~~~ + +Two ways described here: + +1. Use the provided ``gendoc.sh`` script:: + + trunk/NXWidgets/Doxygen/gendoc.sh + + The script only needs the argument to the absolute path where to place the + generated documentation. I.e.:: + + $ cd /path/to/nuttx/trunk/NXWidgets/Doxygen/ + $ mkdir doc + $ ./gendoc.sh $PWD/doc + +2. Using the ``Doxyfile`` directly: + + The file ``Doxyfile`` contains the configuration of the Doxygen settings for + the run, edit only if necessary. + + To generate the documentation type:: + + $ cd /path/to/nuttx/trunk/NXWidgets/Doxygen/ + $ doxygen Doxyfile + +References +~~~~~~~~~~ + +[1] http://www.stack.nl/~dimitri/doxygen/download.html diff --git a/Documentation/applications/graphics/pdcurs34/index.rst b/Documentation/applications/graphics/pdcurs34/index.rst new file mode 100644 index 0000000000..70afef3cf1 --- /dev/null +++ b/Documentation/applications/graphics/pdcurs34/index.rst @@ -0,0 +1,5 @@ +=============================================== +``pdcurs34`` pdcurses Text User Interface (TUI) +=============================================== + +TODO diff --git a/Documentation/applications/graphics/tiff/index.rst b/Documentation/applications/graphics/tiff/index.rst new file mode 100644 index 0000000000..39ed96345a --- /dev/null +++ b/Documentation/applications/graphics/tiff/index.rst @@ -0,0 +1,15 @@ +============================== +``tiff`` TIFF Creation Library +============================== + +This directory contains a library that can be used to create TIFF image files. +This file was created for the purpose of supporting screen dumps from an LCD. +Howeve, the logic is general and could be used for most any purpose. + +The only usage documentation is in the (rather extensive) comments in the file +``apps/include/tiff.h``. + +Unit Test +--------- + +See ``apps/examples/tiff``. diff --git a/Documentation/applications/graphics/twm4nx/index.rst b/Documentation/applications/graphics/twm4nx/index.rst new file mode 100644 index 0000000000..52668b0a35 --- /dev/null +++ b/Documentation/applications/graphics/twm4nx/index.rst @@ -0,0 +1,396 @@ +=================================== +``twm4nx`` Tab Window Manager (TWM) +=================================== + +Twm4Nx is a port of twm, Tab Window Manager (or Tom's Window Manager) version +``1.0.10`` to NuttX NX windows server. No, a port is not the right word. It is a +re-design of TWM from the inside out to work with the NuttX NX server. The name +Twm4Nx reflects this legacy. But Twm4Nx is more a homage to TWM than a port of +TWM. + +The original TWM was based on X11 which provides a rich set of features. TWM +provided titlebars, shaped windows, several forms of icon management, +user-defined macro functions, click-to-type and pointer-driven keyboard focus, +graphic contexts, and user-specified key and pointer button bindings, etc. + +Twm4Nx, on the other hand is based on the NuttX NX server which provides +comparatively minimal support. Additional drawing support comes from the NuttX +NxWidgets library (which necessitated the change to C++). + +Twm4Nx is greatly stripped down and targeted on small embedded systems with +minimal resources. For example, no assumption is made about the availability of +a file system; no ``.twmrc`` file is used. Bitmaps are not used (other than for +fonts). + +The TWM license is, I believe compatible with the BSD license used by NuttX. The +origin TWM license required notice of copyrights within each file and a full +copy of the original license which you can find in the ``COPYING`` file. within +this directory. + +Status +------ + +Progress +~~~~~~~~ + +- ``2019-04-28`` This port was brutal. Much TWM logic was removed because it + depended on X11 features (or just because I could not understand how to use + it). The replacement logic is only mostly in place but more needs to be done + to have a complete system (hence, it is marked ``EXPERIMENTAL``). The kinds of + things that need to done are: + + 1. Right click should bring up a window list (like the icon manager???) + 2. For TWM-like behavior, a window frame and toolbar should be highlighted + when the window has focus. + 3. A right click on the toolbar should bring up a window-specific menu. + +- ``2019-05-02`` Some testing progress. The system comes up, connects to and + initializes the VNC window. For some reason, the VNC client breaks the + connection. The server is no longer connected so Twm4Nx constipates and and + eventually hangs. + +- ``2019-05-08`` I abandoned the VNC interface and found that things are much + better using a direct, hardware framebuffer. The background comes up properly + and the Icon Manager appears properly in the upper right hand corner. The Icon + Manager Window can be iconified or de-iconified. The Icon Manager window can + be grabbed by the toolbar title and moved about on the window (the movement is + not very smooth on the particular hardware that I am working with). + +- ``2019-05-10`` A left click on the background brings up the main menu. At + present there are only two options: _Desktop_ which will iconify all windows + and "Twm4Nx Icon Manager" which will de-iconify and/or raise the Icon Manager + window to the top of the hierarchy. That latter option is only meaningful when + the desktop is very crowded. + +- ``2019-05-13`` Added the NxTerm application. If enabled via + ``CONFIG_TWM4XN_NXTERM``, there will now be a _NuttShell_ entry in the Main + Menu. When pressed, this will bring up an NSH session in a Twm4Nx window. + +- ``2019-05-14`` We can now move an icon on the desktop. Includes logic to avoid + collisions with other icons and with the background image. That later is an + issue. The background image image widget needs to be removed; it can occlude a + desktop icon. We need to paint the image directly on the background without + the use of a widget. + +- ``2019-05-15`` Resizing now seems to work correctly in Twm4Nx. + +- ``2019-05-20`` Calibration screen is now in place. + +- ``2019-05-21`` A ``CONTEMPORARY`` theme was added. Still has a few glitches. + +- ``2019-06-01`` A retro, emulated segment LCD clock is now in place. + +How To +------ + +Icon Manager +~~~~~~~~~~~~ + +- At start up, only the Icon Manager window is shown. The Icon Manager is a TWM + alternative to more common desktop icons. Currently Twm4Nx supports both + desktop icons and the Icon Manager. + + Whenever a new application is started from the Main Menu, its name shows up in + the Icon Manager. Selecting the name will either de-iconify the window, or + just raise it to the top of the display. + +Main Menu +~~~~~~~~~ + +- A touch/click at any open location on the background (except the image at the + center or on another icon) will bring up the Main Menu. Options: + + - Desktop. Iconify all windows and show the desktop + - Twm4Nx Icom Manager. De-iconify and/or raise the Icon Manager to the top of + the display. + - Calibration. Perform touchscreen re-calibration. + - Clock. Start and instance of clock in the window. The uses the the retro, + LCD emulation of ``apps/graphics/slcd``. + - NuttShell. Start and instance of NSH running in an NxTerm. + +- All windows close after the terminal menu option is selected. + +Window Toolbar +~~~~~~~~~~~~~~ + +- Most windows have a toolbar at the top. It is optional but used in most + windows. +- The toolbar contains window title and from zero to 4 buttons: + + - Right side: A menu button may be presented. The menu button is not used by + anything in the current implementation and is always suppressed + - Left side: The far left is (1) the terminate button (if present). If + present, it will close window when selected. Not all windows can be closed. + You can't close the Icon Manager or menu windows, for example. Then (2) a + resize button. If presented and is selected, then the resize sequence + described below it started. This may the be preceded by a minimize button + that iconifies the window. + +Moving a Window +~~~~~~~~~~~~~~~ + +- Grab the title in the toolbar and move the window to the desired position. + +Resizing a Window +~~~~~~~~~~~~~~~~~ + +- A window must have the green resize button with the square or it cannot be + resized. +- Press resize button. A small window should pop-up in the upper left hand + corner showing the current window size. +- Touch anywhere in window (not the toolbar) and slide your finger. The resize + window will show the new size but there will be no other update to the + display. It is thought that continuous size updates would overwhelm lower end + MCUs. Movements support include: + + - Move toward the right increases the width of the window + - Move toward the left decreases the width of the window + - Move toward the bottom increases the height of the window + - Move toward the top decreases the height of the Window + - Other moves will affect both the height and width of the window. + +- **Note**: While resizing, non-critical events from all other windows are + ignored. + +Themes +~~~~~~ + +- There are two themes support by the configuration system: + + - ``CONFIG_TWM4NX_CLASSIC`` – Strong bordered windows with dark primary colors. + Reminiscent of Windows 98. + - ``CONFIG_TWM4NX_CONTEMPORARY`` – Border-less windows in pastel shades for a + more contemporary look. + +Issues +~~~~~~ + +``2019-05-16`` Twm4Nx is in a very complete state but only at perhaps _alpha_ in +its maturity. You should expect to see some undocumented problems. If you see +such problems and can describe a sequence to actions to reproduce the problem, +let me know and I will try to resolve the problems. + +Here are all known issues and features that are missing: + +TWM Compatibilities Issues: + +1. Resizing works a little differently in Twm4Nx. +2. Right click should bring up a window list +3. For TWM-like behavior, a window frame and toolbar should be highlighted when + the window has focus. +4. A right click on the toolbar should bring up a window-specific menu. + +There are no near-term plans to address these compatibility issues. + +Other issues/bugs. All-in-all, I would say that Twm4Nx is maturing well and is +attaining stability. That being said, there are some issues and untested +functionality that should be addressed: + +1. Icon drag movement includes logic to avoid collisions with other icons and + with the background image. That later is an issue. We need to paint the image + directly on the background without the use of a widget. +2. There are a few color artifacts in the toolbar of the ``CONTEMPORARY`` theme. + These look like borders are being drawn around the toolbar widgets (even + though the are configured to be borderless). +3. Most Twm4Nx configuration settings are hard-coded in ``*_config.hxx`` header + files. These all need to be brought out and made accessible via Kconfig files +4. I have seen some odd behavior when many NxTerm windows have been opened + (around 15). Specifically, I see failures to start NSH in the windows so they + come up blank. All other behaviors seem normal. Most likely, some NxTerm + resource allocation is failing silently and leaving things in an unusable + state. The board I am using has 128Mb of SDRAM so I can't believe that memory + is the limiting factor. These are, however, RAM-backed windows and will use + significant amounts of memory. The primary issue is that the number of + windows should probably be managed in some way to assure that the end-user + does not experience odd behaviors when resource usage is high. +5. Menus with sub-menus have not been verified. There is no use of sub- menus in + the current code base so I expect that there are issues when, for example, + and item from a sub-menu item: That menu and all of its antecedent menus + should be closed. +6. There is an optional MENU button that may appear at the far left on the + toolbar. It is not used by any window in the current code base and, hence, is + unverified. I would expect some issues with generating and routing the MENU + button events to applications. There are likely other unverified features. +7. X/Y input may be either via a touchscreen or a mouse. Only touchscreen input + has been verified. There is, however, very little difference. The primary + issue is in cursor support: Cursors are needed with a mouse. Cursor images + also change depending on the state (like grabbing and dragging or resizing). + There is also a possibility of using auto-raise with a mouse as well. All of + this logic is in place, but none has been verified. +8. NxTerm windows really need to be scrollable. They are difficult to use with + only a few lines on a small display. A related usability issue is the font + height: The fonts report a maximum font height that results in a large line + spacing on the display and, hence, fewer lines visible in the small window. + This is latter issues is a problem with the fonts not Twm4Nx, however. +9. There is a trivial rounding error in the calculation of the LCD width in + ``SLcd::CSLcd::getWidth()``. It currently truncates down. It needs to round up. + This sometimes leaves a small, one-pixel- wide sliver on the clock display. + This display always recovers and this only cosmetic. + +Adding Twm4Nx Applications +-------------------------- + +Application Factories and the Main Menu +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The original TWM supported a .twmrc in which you could describe application +programs supported on the desktop. Currently no such start-up file is available +for Twm4Nx. Rather, all applications must be added via run-time interfaces. And +overview of these interfaces is provided in this paragraph. + +Currently, there are only two applications developed for Twm4Nx: (1) An NxTerm +hosting NSH that is analogous to an XTerm hosting the Bash shell in a Unix +environment, and (2) a touchscreen calibration application. Let's focus instead +on the NxTerm application as an example because the touchscreen calibration is a +rather unusual beast. + +These example applications can be found at: ``apps/graphics/twm4nx/apps`` and +``apps/include/graphics/twm4nx/apps`` + +In short, adding an application involves a "Factory Object" that is hooked into +the Main Menu. A Factory Object is an object that is used to create other object +instances. The way in which the Factory Object is represented is purely a +decision of the application developer. One option, however, is to use the pure +virtual base class ``IApplicationFactory`` as defined in +``apps/include/graphics/twm4nx/iapplication.hxx``. This base class provides only a +single method:: + + bool initialize(FAR CTwm4Nx *twm4nx); + +where CTwm4Nx is the Twm4NX session instance that allows the class +implementation to interact with session specific resources. Multiple sessions +would be required, for example, if the platform supported multiple displays. + +In practice, the application factory implementation class inherits from the +following base classes: + +1. ``IApplicationFactory``. Provides the common ``initialize()`` method. +2. ``IApplication``. Provides the information for the application's entry in the + Main Menu +3. ``CTwm4NxEvent``. Hooks the application factory into the Twm4Nx event + notification system. + +Initialization consists of instantiating the application factory instance and +calling its ``IApplicationFactory::initialize()`` method. The application factory +instance is a singleton that must persist for the life of the session. For the +NxTerm application factory, this is done in +``apps/graphics/twm4nx/src/twm4nx_main.c`` like:: + + CNxTermFactory nxtermFactory; + success = nxtermFactory.initialize(twm4nx); + +In addition to general initialization, the ``IApplicationFactory::initialize()`` +method must register a new entry with the main menu. You can see an example of +this in ``apps/graphics/twm4nx/apps/cnxterm.c``:: + + FAR CMainMenu *cmain = twm4nx->getMainMenu(); + return cmain->addApplication(this); + +The argument to the ``CMainMenu::addApplication()`` method is of type +``IApplication *``. Remember, however, that our application implementation ``class`` +inherited from ``IApplication``. + +The IApplication pure virtual base class is also defined in +``apps/include/graphics/twm4nx/iapplication.hxx``. It essentially describes what +the Main Menu logic should do when the menu item is selected. It includes these +methods: + +1. ``getName()``. Provides the name string that will be shown in the Main Menu for + this selection. +2. ``getSubMenu()``. One possibility is that selecting the Main Menu item is that + it may bring up yet another sub-menu of options. +3. ``getEventHandler()``. Returns an instance of ``CTwm4NxEvent`` that is used to + route menu selection events. Remember that our application factory inherits + from ``CTwm4NxEvent`` so this function only needs to return the 'this' + pointer. +4. ``getEvent()``. Provides the event ID that will be used in the event + notification. The returned value must conform to the description in + ``apps/include/graphics/twm4nx/twm4nx_events.hxx``. In particular, the + recipient of the event must be ``EVENT_RECIPIENT_APP``. + +The Twm4Nx application is then started when the application factory's +``CTwm4NxEvent::event()`` method is called with the specified event. + +Application Windows +~~~~~~~~~~~~~~~~~~~ + +How the application factory starts an application instance is purely up to the +application designer. Typically this would include starting a new application +task. General characteristics of an application include: + +1. It probably should inherit from ``CTwm4NxEvent`` so that it can receive events + from the system. +2. To create the window, it must instantiate and initialize an instance of + ``CWindow``. +3. It must configure application events to receive notifications from Twm4Nx. + +To create an application window, the application must call the +``CWindowFactory::createWindow()`` method. For the NxTerm example, this looks +like:: + + NXWidgets::CNxString name("NuttShell"); + + uint8_t wflags = (WFLAGS_NO_MENU_BUTTON | WFLAGS_HIDDEN); + + FAR CWindowFactory *factory = m_twm4nx->getWindowFactory(); + m_nxtermWindow = factory->createWindow(name, &CONFIG_TWM4NX_NXTERM_ICON, + (FAR CIconMgr *)0, wflags); + +The window factory is another factory that creates and manages window instance. +The ``createWindow()`` method requires four parameters: + +1. The name of the window. This is the name that is show in the window toolbar + and may be the same name as was used in the Main Menu entry. +2. A reference to the the Icon image associated with the window. This is the + image that is show on the desktop when the window is iconified. It is of + type ``NXWidgets::SRlePaletteBitmap``. +3. A pointer to the Icon Manager instance that this window belongs with. This + can be NULL to use the default Twm4Nx Icon Manager. +4. A set of flags that describe properties of the windows. + + The flag values are defined byte ``WFLAGS_*`` definitions provided in + ``apps/include/graphics/twm4nx/cwindow.hxx``: + + - ``WFLAGS_NO_MENU_BUTTON`` – Omit the menu button from the toolbar. + - ``WFLAGS_NO_DELETE_BUTTON`` – Omit the delete button from the toolbar. + - ``WFLAGS_NO_RESIZE_BUTTON`` – Omit the resize button from the toolbar. + - ``WFLAGS_NO_MINIMIZE_BUTTON`` – Omit the minimize button from the toolbar. + - ``WFLAGS_NO_TOOLBAR`` – Omit the toolbar altogether. + - ``WFLAGS_ICONMGR`` – This window is an icon manager. + - ``WFLAGS_MENU`` – This window is a menu window. + - ``WFLAGS_HIDDEN`` – Start with the window hidden. + +Once the ``CWindow`` is instantiated, events needed by the application can be +configured as is done in the NxTerm application:: + + struct SAppEvents events; + events.eventObj = (FAR void *)this; + events.redrawEvent = EVENT_NXTERM_REDRAW; + events.resizeEvent = EVENT_NXTERM_RESIZE; + events.mouseEvent = EVENT_NXTERM_XYINPUT; + events.kbdEvent = EVENT_NXTERM_KBDINPUT; + events.closeEvent = EVENT_NXTERM_CLOSE; + events.deleteEvent = EVENT_NXTERM_DELETE; + + bool success = m_nxtermWindow->configureEvents(events); + +Again, recall that the application inherits from ``CTwm4NxEvent``. So passing +``this`` as the event object above assures that the specific events are routed to +the application instance. + +Drawing in the application window can be performed using that facilities of +NXWidgets using the ``NXWidgets::CGraphicsPort`` associated with the window. The +NxTerm application does not perform any drawing, however; that drawing is +performed by the NxTerm driver. + +The ``NXWidgets::CGraphicsPort`` can be obtained from a ``CWindow`` instance, say +``m_window``, like:: + + FAR NXWidgets::CWidgetControl *control = m_window->getWidgetControl(); + NXWidgets::CGraphicsPort *port = control->getGraphicsPort(); + +That ``CGraphicsPort`` is then passed to the widget constructor, binding the +widget to that window and forcing all widget drawing to occur within the window. + +Obviously, a lot more could be written about drawing, much more than can be +addressed in this README file.