From ae601e28927efef64364f2cbe908e823bb73afcd Mon Sep 17 00:00:00 2001 From: Acfboy Date: Mon, 27 Jul 2026 08:57:48 +0800 Subject: [PATCH] graphics/microwindows: introduce Microwindows graphics support to NuttX 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 Signed-off-by: Pavel Pisa Signed-off-by: Acfboy --- graphics/microwindows/.gitignore | 2 + graphics/microwindows/Kconfig | 131 ++++++++++++++++++++++++++ graphics/microwindows/Make.defs | 33 +++++++ graphics/microwindows/Makefile | 154 +++++++++++++++++++++++++++++++ 4 files changed, 320 insertions(+) create mode 100644 graphics/microwindows/.gitignore create mode 100644 graphics/microwindows/Kconfig create mode 100644 graphics/microwindows/Make.defs create mode 100644 graphics/microwindows/Makefile diff --git a/graphics/microwindows/.gitignore b/graphics/microwindows/.gitignore new file mode 100644 index 000000000..0cb9c8404 --- /dev/null +++ b/graphics/microwindows/.gitignore @@ -0,0 +1,2 @@ +/microwindows +/*.zip diff --git a/graphics/microwindows/Kconfig b/graphics/microwindows/Kconfig new file mode 100644 index 000000000..8463d791f --- /dev/null +++ b/graphics/microwindows/Kconfig @@ -0,0 +1,131 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +menuconfig GRAPHICS_MICROWINDOWS + bool "Microwindows or the Nano-X Window System" + default n + depends on VIDEO_FB + ---help--- + Enable Microwindows or the Nano-X Window System + +if GRAPHICS_MICROWINDOWS + +config MICROWINDOWS_FB_PATH + string "Framebuffer device path" + default "/dev/fb0" + ---help--- + Path to the NuttX framebuffer device. + +choice + prompt "Keyboard driver" + default MICROWINDOWS_KBD_EVENT + ---help--- + Select the keyboard input driver for Microwindows. + +config MICROWINDOWS_KBD_EVENT + bool "Event-mode keyboard driver" + ---help--- + Reads keyboard_event_s events from a NuttX keyboard device + (e.g., /dev/kbd). Supports key press/release tracking and + modifier keys (Shift, Ctrl, Alt). + +config MICROWINDOWS_KBD_RAW + bool "Raw-mode keyboard driver" + depends on LIBC_KBDCODEC + ---help--- + Reads raw byte stream from a character device (e.g., /dev/kbda) + and decodes escape sequences via the kbd_codec library. Suitable + for USB HID keyboards on QEMU. + +config MICROWINDOWS_KBD_NONE + bool "No keyboard driver" + ---help--- + No keyboard driver is compiled. Microwindows will use a null + keyboard driver that never produces input. Suitable for + display-only applications. + +config MICROWINDOWS_KBD_CUSTOM + bool "Custom keyboard driver" + ---help--- + No built-in keyboard driver is compiled. The application or BSP + must provide its own kbddev symbol and KBDDEVICE implementation, + and add the source file to the build (e.g., via CSRCS in its + Makefile). See the Microwindows documentation for details. + +endchoice + +config MICROWINDOWS_KBD_EVENT_PATH + string "Event keyboard device path" + default "/dev/kbd" + depends on MICROWINDOWS_KBD_EVENT + ---help--- + Device path for the event-mode keyboard driver. + +config MICROWINDOWS_KBD_RAW_PATH + string "Raw keyboard device path" + default "/dev/kbda" + depends on MICROWINDOWS_KBD_RAW + ---help--- + Device path for the raw-mode keyboard driver. + +choice + prompt "Mouse/touchscreen driver" + default MICROWINDOWS_MOUSE_RELATIVE + ---help--- + Select the pointing device driver for Microwindows. + +config MICROWINDOWS_MOUSE_RELATIVE + bool "Relative mouse driver" + ---help--- + Reads mouse_report_s events from a NuttX mouse device + (e.g., /dev/mouse0). Supports three buttons and scroll wheel. + +config MICROWINDOWS_MOUSE_TS + bool "Touchscreen driver" + ---help--- + Reads touch_sample_s events from a NuttX touchscreen device + (e.g., /dev/input0). Supports absolute positioning. + +config MICROWINDOWS_MOUSE_NONE + bool "No mouse/touchscreen driver" + ---help--- + No pointing device driver is compiled. Microwindows will use a + null mouse driver that never produces input and hides the cursor. + Suitable for display-only applications. + +config MICROWINDOWS_MOUSE_CUSTOM + bool "Custom mouse/touchscreen driver" + ---help--- + No built-in pointing device driver is compiled. The application + or BSP must provide its own mousedev symbol and MOUSEDEVICE + implementation, and add the source file to the build (e.g., via + CSRCS in its Makefile). See the Microwindows documentation for + details. + +endchoice + +config MICROWINDOWS_MOUSE_PATH + string "Mouse device path" + default "/dev/mouse0" + depends on MICROWINDOWS_MOUSE_RELATIVE + ---help--- + Device path for the relative mouse driver. + +config MICROWINDOWS_TS_PATH + string "Touchscreen device path" + default "/dev/input0" + depends on MICROWINDOWS_MOUSE_TS + ---help--- + Device path for the touchscreen driver. + +config MICROWINDOWS_MWIN + bool "Win32 API (mwin) support" + default n + ---help--- + Build the Microwindows Win32 (mwin) API library. This provides + a high-level windowing API similar to the Microsoft Windows API + with window management, controls, and standard dialogs. + +endif # GRAPHICS_MICROWINDOWS diff --git a/graphics/microwindows/Make.defs b/graphics/microwindows/Make.defs new file mode 100644 index 000000000..935abf66b --- /dev/null +++ b/graphics/microwindows/Make.defs @@ -0,0 +1,33 @@ +############################################################################ +# apps/graphics/microwindows/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +ifneq ($(CONFIG_GRAPHICS_MICROWINDOWS),) +CONFIGURED_APPS += $(APPDIR)/graphics/microwindows + +# It allows `microwindows/src/include` import. + +CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/microwindows/microwindows/src/include +CXXFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/microwindows/microwindows/src/include + +CFLAGS += -DMWCONFIG_FILE='"mwconfig.nuttx"' + +endif diff --git a/graphics/microwindows/Makefile b/graphics/microwindows/Makefile new file mode 100644 index 000000000..5dae89ac0 --- /dev/null +++ b/graphics/microwindows/Makefile @@ -0,0 +1,154 @@ +############################################################################ +# apps/graphics/microwindows/Makefile +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(APPDIR)/Make.defs + +# Microwindows graphic library + +MICROWINDOWS_DIR = . +MICROWINDOWS_DIR_NAME = microwindows + +# Set up build configuration and environment + +WD := ${shell echo $(CURDIR) | sed -e 's/ /\\ /g'} + +MICROWINDOWS_COMMIT_HASH := 1f269127b991d01dea5784eacee321a23e34d3d5 + +CONFIG_GRAPH_MICROWINDOWS_URL ?= https://codeload.github.com/ghaerr/microwindows/zip/$(MICROWINDOWS_COMMIT_HASH) + +MICROWINDOWS_TARBALL := microwindows-$(MICROWINDOWS_COMMIT_HASH).zip + +MICROWINDOWS_UNPACKNAME = microwindows +UNPACK ?= unzip -o $(if $(V),,-q) +CURL ?= curl -L $(if $(V),,-Ss) + +MICROWINDOWS_UNPACKDIR = $(WD)/$(MICROWINDOWS_UNPACKNAME) + +$(MICROWINDOWS_TARBALL): + $(ECHO_BEGIN)"Downloading: $(MICROWINDOWS_TARBALL)" + $(Q) $(CURL) -o $(MICROWINDOWS_TARBALL) $(CONFIG_GRAPH_MICROWINDOWS_URL) + $(ECHO_END) + +$(MICROWINDOWS_UNPACKNAME): $(MICROWINDOWS_TARBALL) + $(ECHO_BEGIN)"Unpacking: $(MICROWINDOWS_TARBALL) -> $(MICROWINDOWS_UNPACKNAME)" + $(Q) $(UNPACK) $(MICROWINDOWS_TARBALL) + $(Q) mv microwindows-$(MICROWINDOWS_COMMIT_HASH) $(MICROWINDOWS_UNPACKNAME) + $(Q) touch $(MICROWINDOWS_UNPACKNAME) + $(ECHO_END) + +# Download and unpack tarball if no git repo found +ifeq ($(wildcard $(MICROWINDOWS_UNPACKNAME)/.git),) +context:: $(MICROWINDOWS_UNPACKNAME) + +distclean:: + $(call DELDIR, $(MICROWINDOWS_UNPACKNAME)) + $(call DELFILE, $(MICROWINDOWS_TARBALL)) +endif + +CFLAGS += -Wno-undef +CFLAGS += -Wno-shadow + +CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/microwindows/microwindows/src/drivers + +CFLAGS += -DNUTTX_FB_PATH=\"$(CONFIG_MICROWINDOWS_FB_PATH)\" +ifdef CONFIG_MICROWINDOWS_KBD_EVENT_PATH +CFLAGS += -DNUTTX_KBD_EVENT_PATH=\"$(CONFIG_MICROWINDOWS_KBD_EVENT_PATH)\" +endif +ifdef CONFIG_MICROWINDOWS_KBD_RAW_PATH +CFLAGS += -DNUTTX_KBD_RAW_PATH=\"$(CONFIG_MICROWINDOWS_KBD_RAW_PATH)\" +endif +ifdef CONFIG_MICROWINDOWS_MOUSE_PATH +CFLAGS += -DNUTTX_MOUSE_PATH=\"$(CONFIG_MICROWINDOWS_MOUSE_PATH)\" +endif +ifdef CONFIG_MICROWINDOWS_TS_PATH +CFLAGS += -DNUTTX_TOUCHSCREEN_PATH=\"$(CONFIG_MICROWINDOWS_TS_PATH)\" +endif + +MW_DIR_OBJ = $(WD)/$(MICROWINDOWS_DIR_NAME)/src + +# Select NuttX drivers via Microwindows Objects.rules +ARCH = NUTTX + +ifeq ($(CONFIG_MICROWINDOWS_KBD_EVENT),y) +KEYBOARD = NUTTXKBD +else ifeq ($(CONFIG_MICROWINDOWS_KBD_RAW),y) +KEYBOARD = NUTTXRAWKBD +else ifeq ($(CONFIG_MICROWINDOWS_KBD_NONE),y) +KEYBOARD = NOKBD +else ifeq ($(CONFIG_MICROWINDOWS_KBD_CUSTOM),y) +KEYBOARD = CUSTOM +endif + +ifeq ($(CONFIG_MICROWINDOWS_MOUSE_RELATIVE),y) +MOUSE = NUTTXMOUSE +else ifeq ($(CONFIG_MICROWINDOWS_MOUSE_TS),y) +MOUSE = NUTTXTOUCH +else ifeq ($(CONFIG_MICROWINDOWS_MOUSE_NONE),y) +MOUSE = NOMOUSE +else ifeq ($(CONFIG_MICROWINDOWS_MOUSE_CUSTOM),y) +MOUSE = CUSTOM +endif + +-include microwindows/src/engine/Objects.rules +-include microwindows/src/drivers/Objects.rules +-include microwindows/src/fonts/Objects.rules + +CSRCS += $(MW_CORE_OBJS:%.o=%.c) + +ifneq ($(CONFIG_MICROWINDOWS_MWIN),) + +# Win32 API +MWIN_CORE_SRCS = microwindows/src/mwin/winmain.c +MWIN_CORE_SRCS += microwindows/src/mwin/winuser.c +MWIN_CORE_SRCS += microwindows/src/mwin/wingdi.c +MWIN_CORE_SRCS += microwindows/src/mwin/winexpos.c +MWIN_CORE_SRCS += microwindows/src/mwin/winclip.c +MWIN_CORE_SRCS += microwindows/src/mwin/winevent.c +MWIN_CORE_SRCS += microwindows/src/mwin/windefw.c +MWIN_CORE_SRCS += microwindows/src/mwin/winrgn.c +MWIN_CORE_SRCS += microwindows/src/mwin/winfont.c +MWIN_CORE_SRCS += microwindows/src/mwin/winsbar.c +MWIN_CORE_SRCS += microwindows/src/mwin/winres.c + +# mwin winlib +WINLIB_SRCS = microwindows/src/mwin/winlib/draw3d.c +WINLIB_SRCS += microwindows/src/mwin/winlib/fastfill.c +WINLIB_SRCS += microwindows/src/mwin/winlib/windlg.c +WINLIB_SRCS += microwindows/src/mwin/winlib/graph3d.c +WINLIB_SRCS += microwindows/src/mwin/winlib/caret.c +WINLIB_SRCS += microwindows/src/mwin/winlib/static.c +WINLIB_SRCS += microwindows/src/mwin/winlib/button.c +WINLIB_SRCS += microwindows/src/mwin/winlib/newedit.c +WINLIB_SRCS += microwindows/src/mwin/winlib/newlistbox.c +WINLIB_SRCS += microwindows/src/mwin/winlib/combobox.c +WINLIB_SRCS += microwindows/src/mwin/winlib/progbar.c +WINLIB_SRCS += microwindows/src/mwin/winlib/scrlbar.c +WINLIB_SRCS += microwindows/src/mwin/winlib/medit.c +WINLIB_SRCS += microwindows/src/mwin/winlib/ptinsid.c +WINLIB_SRCS += microwindows/src/mwin/winlib/insetr.c + +CSRCS += $(MWIN_CORE_SRCS) $(WINLIB_SRCS) +CFLAGS += -DNOGDI + +endif + +include $(APPDIR)/Application.mk