examples: Implement drivers for microwindows - #3624
Conversation
|
Thanks to @Acfboy for the work and this draft request for discussion and @ghaerr for consultations and support on Microwidows side. I am leaving for four days now, but there are some my thoughts, the NuttX Microwidows screen, mouse and keyboard drivers should be submitted with appropriate build enable options to the mainline Microwindows https://github.com/ghaerr/microwindows before the final nuttx-apps pull request. |
|
@Acfboy please fix the issues on mwdemo: |
|
Hi @Acfboy , could you also add support for building with CMake? |
Thank you for the reminder. I will add CMake support later. |
|
@Acfboy could you spend some time fixing and improving this PR? It still as Draft. It is important to get it merged and let more people to test and review it. Also please remember to include a proper nuttx/Documentation about nanox/microwindows support on NuttX |
|
Hi @acassis , thank for the reminder. I agree I should submit the previous work as a proper PR for the community to review. However, for it to be a proper PR, I think I need to merge the existing NuttX drivers into the Microwindows mainline first. I apologize for postponing this part of the work earlier. I will submit a PR for upstream MW review soon. |
|
Yes, this what I have proposed and expect as well. You should set something like Same for the As for the keyboard, there can be space to think how to map it the best way. The NnuttX provides its You provide translation in You should try even if Nano-X server and clients can be run on NuttX. I do not see X11 graphics option as the main priority, but it would prove that even complex setup can be build and check if it is stable on NuttX. |
Hi, @ppisa . I have a question about this statement. It seems to me that the ranges of the
Two drivers makes the code cleaner. But specify the device path/name via Kconfig risks inconsistency with the real device. Alternatively, if Microwindows auto-selects the device based on NuttX config, then we have to keep both sides in sync — which adds maintenance overhead.
Okay, I'll try server and client of NanoX. |
Yes, you are right, I expected that for where So this seems to be call for priority issue. @acassis @gregory-nutt Please, do you have some some insight what is right? The simple fix is to push
Yes but NuttX is based on configuration and it is better to fail then to do lot of testing of different device names and even deciding if it is raw driver or event based. But in general it seems that there is pace for some discussion and making KBD simple on the NuttX side.
Thanks. |
Hi @ppisa I don't know the right approach to keyboard input keys symbols. Actually @linguini1 faced similar issue when porting Doom to NuttX. Unfortunately NuttX doesn't have a standard keyboard symbols |
|
One option suggested by @cederom was to adopt the EVDEV codec: https://en.wikipedia.org/wiki/Evdev |
@linguini1 and @acassis, I propose simple fix include/nuttx/input/kbd_codec.h - KEYCODE_FWDDEL,
+ KEYCODE_FWDDEL = 128, Or even larger shift to something like 0xF800 as used on Microwindows. This would solve problem with overlap of letters and other ASCII codes with special keys. I can open issue for this. The question is if there is something, some other keyboard driver or application, which breaks by this shift of I think that that this is reasonable solution for NuttX and current model. |
|
I agree, and this was a solution I considered but ultimately did not have enough time to verify if it would break other things in the kernel. I think that is at least a good interim solution which is less invasive. |
Looking ahead at Unicode, Microwindows moved its key code base to F800 because that belongs to the Unicode BMP Private Use Area. This won't overlap other Unicode values if/when NuttX applications move to Unicode.
Possibly good idea, but pushes off actively looking through source for problems now, and not having to change them again perhaps later. FWIW, myself knowing very little about NuttX, if a small shift is thought better for now, choosing a base of 256 at least allows space for using the upper half of various 256-byte multilingual code pages for non-US (e.g. European) accented characters, etc. OTOH, if keycodes are stored in byte arrays, then 128/129 would likely be mandated. |
|
Hi @xiaoxiang781216 @acassis thanks for the thorough review! I've addressed all your feedback and fixed the non-standard commit messages flagged by checkpatch. |
please merge your temp change. |
|
@Acfboy please, squash, merge commits as @xiaoxiang781216 suggests into single commit or some small logical set of incremental commits, there is no use for keeping the new component development history, you ca keep it on some branch of your repository as work progress documentation. So for logical commits series, I can imagine one commit which introduces Microwindows with basic Kconfig then another one which adds some demos, Kconfig options, etc. But the code has to be clean, adhere NutttX style and requirements and build after each incremental commit. As for the decision, which defines should go into |
|
Thanks for pointing this out, @ppisa @xiaoxiang781216 . I've reorganized the changes into two commits. |
|
Thanks @xiaoxiang781216 for the very thorough review, and @ppisa for the clarification and discussion. I have updated the code under your guidance. Regarding whether all include paths in Make.defs should be moved to the Makefile, I agree with @ppisa that this would require more changes to the build system, so I haven't made that change for now. |
@Acfboy please always address the comment in the origin patch instead creating new one. |
On the Microwindows side, for various reasons the idiom of It seems this may be a problem because of the use of -Wundef in NuttX?
The ECOS port is quite old, and probably doesn't follow some of the more recent ideas of keeping platform build-specific options in a separate configuration file. This could be fixed, but I hesitate to change code that I or others can't easily test in the main repo. |
OK, I have tried to add checks for defines presence in Microwindows code. I agree that there is some added complexity. I have repeated some defines sequences because with checks for define presence the conditions testing multiple target OS alternatives are hard to write such that warning is prevented |
This commit integrates the Microwindows core into the NuttX apps build system: - Downloads a pinned upstream commit during build and compiles the engine, drivers and precompiled bitmap fonts via Microwindows' Objects.rules files. - Adds Kconfig options for framebuffer path, keyboard driver selection (event-mode, raw byte-stream, none, custom), and mouse/touchscreen driver selection (relative, touchscreen, none, custom). - Uses the MWCONFIG_FILE mechanism to inject NuttX-specific configuration (mwconfig.nuttx) without modifying upstream headers. - The NuttX screen, keyboard, mouse and touchscreen drivers are pulled from upstream Microwindows. Driver selection is controlled via ARCH=NUTTX and Kconfig-driven KEYBOARD/MOUSE variables in the Makefile. - Depends on VIDEO_FB for the framebuffer device. - Builds the mwin library (Win32 API layer) when MICROWINDOWS_MWIN is enabled. Co-authored-by: Pavel Pisa <ppisa@pikron.com> Signed-off-by: Pavel Pisa <ppisa@pikron.com> Signed-off-by: Acfboy <AcfboyU@outlook.com>
This ports mwdemo.c from Microwindows as a standalone NuttX example application. mwdemo is the primary Win32 API demo in the Microwindows project, featuring 3D graphics, window controls, timer-driven animation, and bitmap image rendering. The demo runs on both qemu-intel64:mw and sim:mw configurations. Signed-off-by: Acfboy <AcfboyU@outlook.com> examples/microwindows: address review, clean up mwdemo. - Replace minimal copyright notice with full Apache 2.0 license header - Use angle brackets for system and microwindows includes - Remove OS-specific dead code (DOS_TURBOC, RTEMS, EMSCRIPTEN/MULTIAPP) - Drop unused demo-mode macros and their corresponding dead code paths (IMAGE, CLIENT3D, CLIPDEMO, ARCDEMO). Keep a fixed GRAPH3D+CONTROLS configuration as the single NuttX demo. - Add g_ prefix to global variable (image -> g_image) - Move demoWndData typedef from mid-file to Private Types section - Merge WinMain body into main() and remove the WinMain indirection - Removed unused images. Signed-off-by: Acfboy <AcfboyU@outlook.com>
|
Thank you for your careful review, detailed discussion, and guidance. I have made the revisions. |
|
It seems that I am late to this party/iteration as the work is merged. @Acfboy has done sound work and as the Microwidows are fully optional component and the main work on NuttX drivers API related code is already integrated into mainline Microwidows, then merge can be base for next @Acfboy work and good opportunity for others to see the integration as preview. On the other hand I do not consider this as production ready/final version. @Acfboy has even prepared documentation and configs with examples configurations qemu-intel64:mw and sim:mw on related NuttX fork https://github.com/Acfboy/nuttx/commits/add-microwindows/ It would worth to be integrated through pull-request as well. But I would like to discuss some more options for example configurations. I would suggest to start the Microwidows demo through NSH to allow console access into running system for debugging, etc. But these are details which will be sorted out. As for the maim Microwindows integration, there worth to be done mone polishment to find reasonable way how to resolve warnings, solve apache/nuttx#19527 (hope to find time to propose patch today). Then the test of more complex demos and applications based for example on X11 API should be tested. We will se where we find problems or some NuttX specific variants would be required... But as both Microwindows and NuttX use POSIX as main runtime model, it should be non-intrusive on both sides. I would be happy if components headers export for NuttX |
Thanks for the detailed summary and future plan. Do you have Nano X11 progress @ppisa ? |
This is more to @Acfboy , I try to help where I have knowledge and as I find a time. I expect that it can be relatively straightforward. But who know. We need UNIX sockets or other local connection. But it should be available on NuttX. |
|
Yes, I'm working on porting the nano-X X11 API and will likely submit a new PR soon. After that, I'll do more thorough testing, including on real hardware, and address all warnings to make it production-ready. |

Hello the community! Here is the work I have done for the first half of GSoC, now complete and ready for review.
Work Completed
The GDI-level Microwindows core, drivers, and
mwdemoare functional on QEMU x86-64 and the simulator.Build System Integration
MWCONFIG_FILE="mwconfig.nuttx"to inject NuttX-specific configuration into Microwindows without touching upstream headers.mwdemo.care compiled into binary using theconvbmptool during the build.NuttX Hardware Drivers
Framebuffer driver (
scr_nuttx.c), keyboard drivers (kbd_nuttx_event.cfor event-mode andkbd_nuttx_raw.cfor raw byte-stream), mouse driver (mou_nuttx_mouse.c), and touchscreen driver (mou_nuttx_ts.c) have been implemented and submitted to upstream Microwindows mainline ghaerr/microwindows#193. Thegraphics/microwindows/Makefileselects the appropriate drivers viaARCH=NUTTXand Kconfig-drivenKEYBOARD/MOUSEvariables.Kconfig Options
Flexible Kconfig for keyboard driver: event-mode (
/dev/kbd), raw byte-stream via kbd_codec (/dev/kbda), none, or custom. For mouse/touchscreen: relative mouse (/dev/mouse0), touchscreen (/dev/input0), none, or custom. Custom options allow BSP/app-level overrides without modifying the Microwindows build logic.Demo Application
Ported
mwdemo.c(a complex Windows-like demo) into a standalone NuttX example application. The demo runs successfully on bothqemu-intel64:mwand the NuttX simulator (sim:mw).I have also tested the demo with
#define CONTROL 1enabled inmwdemo.c, which represents a more complex use case.Upstream Bug Fixes
Several issues were discovered, analysed, and most of them already fixed:
MwSelect()blocked forever when a timer had already expired, because the code assumed no timer existed whenGdGetNextTimeoutreturned false.timeout == 0and return immediately.#if defined(ELKS)inmwtypes.hforcedMWPIXELVALHWtounsigned chareven whenELKS=0(intended to disable it). This truncated 32-bit pixel values read from the framebuffer.#if ELKSMwSelectswitches to polling (select(…, timeout=0)). The USB input thread had a lower priority (50) than the application (100), so it never got CPU time to generate events.TOUCH_POS_VALIDflag was not being checked in the touchscreen driver, causing uninitialized coordinate values to be used.mou_nuttx.cby checkingTOUCH_POS_VALIDbefore using touch coordinates.KEYCODE_xxxmacros (e.g.,KEYCODE_PAUSE = 0x20) overlap with ASCII characters, making it impossible to distinguish special keys from normal input in the event-mode keyboard driver.How to Reproduce (QEMU / Simulator)
qemu-intel64:mw
Then create a bootable disk following the documentation and run:
sim:mw
Notice
#define CONTROL 1manually inmwdemo.cto test more complex case.nxstyleproblems in mwdemo.c are fixed, except the names of Win32 API.