Skip to content

Commit 91c0bbb

Browse files
authored
feat(eui-neo): add 0.6.3 (#804)
1 parent cddedde commit 91c0bbb

12 files changed

Lines changed: 266 additions & 9 deletions

File tree

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# Design doc: bump `compat.eui-neo` to 0.6.3
2+
3+
Date: 2026-11-15
4+
5+
Follow-up to `.agents/docs/2026-10-30-bump-eui-neo-0.6.2-plan.md` and commit `1809c8b` (0.6.2).
6+
Upstream released 0.6.3; this bumps the index from 0.6.2 to 0.6.3.
7+
8+
## Source and version
9+
10+
| | |
11+
|---|---|
12+
| Upstream | `https://github.com/sudoevolve/EUI-NEO` |
13+
| Version | `0.6.3` (latest release, 2026-11-12) |
14+
| Tarball | `archive/refs/tags/v0.6.3.tar.gz` |
15+
| sha256 | `08074e2fb72662c8a4c2f7d75dec558aed2c751545797e0ccccbdbe8f439b669` (computed twice from two fresh downloads, stable) |
16+
| Wrap dir | `EUI-NEO-0.6.3/` — absorbed by the existing `install()` hook (`normalise_layout`) |
17+
| CN mirror | **pending** — no `mcpp-res` write access on this machine; plain-string url fallback per SOP |
18+
| License | Apache-2.0 (unchanged) |
19+
| Auto-update | not covered by `.github/xpkgindex-update.yml` (the descriptor has `generated_files` + an `install()` hook); bumped manually |
20+
21+
## What changed upstream (0.6.2 → 0.6.3)
22+
23+
Release notes: `docs/releases/v0.6.3.md` (keyboard navigation + focus, a
24+
backend-agnostic widget semantics snapshot, virtualized `dataTable`, system
25+
save/directory dialogs, input undo byte budgets, line-chart sampling,
26+
async/serial lifecycle fixes, docs reorganisation).
27+
28+
- **`CORE_SOURCES` and `VULKAN_SOURCES` are byte-identical to 0.6.2**
29+
(extracted and diffed from both `CMakeLists.txt`). Every changed core file
30+
is already in the source list (`async.cpp`, `platform.cpp`, `primitive.cpp`,
31+
runtime headers, `window_backend.cpp`); the only new headers are
32+
`core/accessibility.h` and `include/eui/accessibility.h`, both header-only
33+
and re-exported by `include/eui_neo.h`.
34+
- **The one link-line change**: upstream's Windows block grew
35+
`ole32 comdlg32 uuid` (`target_link_libraries(eui_neo PUBLIC …)`), for
36+
`platform.cpp`'s new directory picker (`CoCreateInstance(CLSID_FileOpenDialog,
37+
… IID_PPV_ARGS)`, `SHCreateItemFromParsingName`). This descriptor already
38+
named ole32/comdlg32 from the 0.6.1 CI work; `-luuid` is the new name (the
39+
`IID_*`/`CLSID_*` GUID symbols). The linux implementation shells out to
40+
zenity/kdialog and the macOS one to osascript, so neither leg gains a
41+
link-time dependency.
42+
- **New optional module with a TU**: `modules/serial/` ships
43+
`serial.cpp`/`serial.h` and CMake builds it as `eui::module_serial`, a
44+
separate target linking `eui::neo` — it is NOT part of `CORE_SOURCES`, and
45+
the only in-tree consumer is the `serial_tool` example and the `serial_port`
46+
unit test (which compiles the TU per-test). Exposed here as the `serial`
47+
feature (see below). `modules/keyboard/` is a single header with no TU, so
48+
it needs no feature entry — the `*` include root already serves it.
49+
- The SDL2 branch of `window_backend.cpp` keeps 0.6.2's hoisted
50+
`sendX11MoveResizeForWindow` definition (`#endif` position unchanged across
51+
0.6.2 → 0.6.3, diffed), so the 0.6.1-era package-private template stub in
52+
`mcpp_eui_backends.h` stays inert on non-linux and the linux
53+
`SDL_VIDEO_DRIVER_X11` define stays a practical no-op. **No shim change.**
54+
- No build-config macro changed: the `EUI_*` macro set extracted from
55+
`core/`, `include/` and `components/` is identical between 0.6.1 and 0.6.3.
56+
57+
## Descriptor changes (`pkgs/e/compat.eui-neo.lua`)
58+
59+
- `xpm.<linux|macosx|windows>["0.6.3"]`: plain-string GLOBAL url (no CN
60+
mirror yet), sha256 above.
61+
- Windows `ldflags`: `-luuid` added, with the rationale next to it.
62+
- New `serial` feature: `sources = { "*/modules/serial/serial.cpp" }` —
63+
source-gated exactly like `app-main`; a consumer that names it includes
64+
`<modules/serial/serial.h>` through the existing `*` include root.
65+
- File-top version note for 0.6.3; the `CORE_SOURCES` recipe reference moved
66+
to `v0.6.3`.
67+
68+
## Test members
69+
70+
- All seven `tests/examples/eui-neo*` members: pin `0.6.2` → `0.6.3`.
71+
- **New member `tests/examples/eui-neo-serial`** (registered in the root
72+
`mcpp.toml` workspace): asserts the feature at link time (SerialPort ctor/
73+
dtor/open/isOpen come from `serial.cpp`) and at runtime opens a device path
74+
that cannot exist, so `!open().ok`, `!isOpen()`, and move-ownership leaving
75+
the moved-from object closed — no hardware, no privileges.
76+
77+
## Verification
78+
79+
Local Linux x86_64, mcpp **2026.11.15.1** (the CI `MCPP_VERSION`, downloaded
80+
as the release tarball), `MCPP_INDEX_MIRROR=GLOBAL`, every member cold
81+
(`target/` and `.mcpp/` removed) before its run:
82+
83+
| Member | Result |
84+
|---|---|
85+
| `eui-neo` | `test result ok` — `compat.eui-neo smoke test: ok (parsed eui-neo v3, markdown gated off)` |
86+
| `eui-neo-window` | `test result ok` — own-main loop linked, window run opt-in |
87+
| `eui-neo-app-main` | `test result ok` — package-supplied `main()` linked |
88+
| `eui-neo-markdown` | `test result ok` — `markdown: ok (2 blocks, h1 = 'Heading')` |
89+
| `eui-neo-tray` | `test result ok` — `linux tray backend verified over a private session bus` |
90+
| `eui-neo-vulkan` | `test result ok` — `backend=vulkan, loader api 1.4.357` |
91+
| `eui-neo-sdl2` | `test result ok` — `SDL driver=dummy, curl 8.21.0-DEV ssl=OpenSSL/3.5.1` |
92+
| `eui-neo-serial` | `test result ok` — feature on: link + runtime assertions pass |
93+
94+
Negative verification for `serial`: with the feature removed from the
95+
member's dependency declaration, the cold build fails at link with
96+
`undefined reference to 'core::serial::SerialPort::SerialPort()'` (and
97+
`isOpen`, `open`, the move ctor, `close`, the dtor) — the gating is real, not
98+
a default. Restoring the feature returns the member to `test result ok`.
99+
100+
Index lint: `check_mirror_urls`, `check_package_name`,
101+
`check_reserved_namespace`, `check_cross_package_refs`,
102+
`check_platform_version_parity`, `check_duplicate_versions` — all clean;
103+
`mcpp xpkg parse` reports `features 7`, `parse OK`.
104+
105+
Known local noise (pre-existing, not caused by this bump): the sdl2 member's
106+
link prints mcpp's "one library, two providers" note for zlib
107+
(`compat.zlib` vs glib's runtime `libz.so.1`, mcpp#519). The descriptor
108+
already documents why libz is not staged.
109+
110+
## CI status
111+
112+
PR #804 (run `43730038159`), all legs green: `lint`, `select`, `build`, `scan`,
113+
`mirror-cn-reachable`, `graphics install: no side effects on unrelated
114+
members`, workspace linux default + llvm 0–3/4, macOS, Windows, and the
115+
`candidate (compat:eui-neo 0.6.3)` install/build legs on linux
116+
default/llvm, macosx and windows. The Windows candidate + workspace legs are
117+
what validate `-luuid` and `serial.cpp`'s `windows.h` branch; the macOS leg
118+
validates the termios branch and the framework links.
119+
120+
## Notes
121+
122+
- macOS and Windows legs are unverified locally; the CI `workspace` legs are
123+
authoritative for `-luuid` and for `serial.cpp`'s `windows.h`/termios
124+
branches.
125+
- The `serial` feature is new surface, so the 0.6.3 bump is two things at
126+
once: three version entries and the first descriptor-level exposure of
127+
upstream's module system. If CI finds a platform-specific break in
128+
`serial.cpp`, the version entries stand on their own and the feature can be
129+
reverted without touching them.

‎mcpp.toml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ members = [
100100
"tests/examples/eui-neo-app-main",
101101
"tests/examples/eui-neo-markdown",
102102
"tests/examples/eui-neo-sdl2",
103+
"tests/examples/eui-neo-serial",
103104
"tests/examples/eui-neo-tray",
104105
"tests/examples/eui-neo-vulkan",
105106
"tests/examples/eui-neo-window",

‎pkgs/e/compat.eui-neo.lua‎

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,30 @@
4040
-- fails with "malformed mcpp segment", measured), so one header must serve
4141
-- every published version, and the template is what makes that possible.
4242
--
43-
-- The build recipe below tracks upstream `CMakeLists.txt` (v0.6.2): CORE_SOURCES
43+
-- 0.6.3: CORE_SOURCES and VULKAN_SOURCES are byte-identical to 0.6.2, so the
44+
-- lib's source list, deps, features and flags carry over unchanged. The
45+
-- release is keyboard navigation + accessibility semantics snapshots, data-
46+
-- table virtualization, the system save/directory dialogs, input undo budgets
47+
-- and the line-chart sampling path. What it DOES move, and what a bump has to
48+
-- follow:
49+
-- * `platform.cpp` grows the Windows directory picker (IFileOpenDialog,
50+
-- SHCreateItemFromParsingName, CLSID_FileOpenDialog), so upstream's link
51+
-- line now names ole32/comdlg32/uuid. This descriptor already carried
52+
-- ole32 + comdlg32 from the 0.6.1 CI work; `-luuid` is the new one (the
53+
-- IID_/CLSID_ symbols). The linux/macOS implementations shell out to
54+
-- zenity/kdialog/osascript, so they add no link-time dependency.
55+
-- * `modules/serial/` is upstream's first optional module with a TU of its
56+
-- own (`serial.cpp`, built as `eui::module_serial` in CMake, NOT part of
57+
-- CORE_SOURCES). It is exposed as the `serial` feature; `modules/keyboard`
58+
-- is header-only and already reachable through the `*` include root.
59+
-- * `core/accessibility.h` + `include/eui/accessibility.h` are header-only:
60+
-- `include/eui_neo.h` re-exports the snapshot types, nothing gains a TU.
61+
-- * the SDL2 branch of `window_backend.cpp` keeps 0.6.2's hoisted
62+
-- sendX11MoveResizeForWindow definition (diffed, `#endif` position
63+
-- unchanged), so the template stub below stays inert on non-linux and the
64+
-- linux `SDL_VIDEO_DRIVER_X11` define stays a no-op in practice.
65+
--
66+
-- The build recipe below tracks upstream `CMakeLists.txt` (v0.6.3): CORE_SOURCES
4467
-- plus the OpenGL backend and, for the glfw window backend, `ime_bridge.c`.
4568
-- 0.5.5 grew a Shadertoy subsystem: render_backend.h and include/eui/types.h now
4669
-- include core/render/shadertoy.h unconditionally, and opengl_backend.cpp calls
@@ -281,6 +304,14 @@ package = {
281304
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.2.tar.gz",
282305
sha256 = "189d97aadb044de653237e12ac97d6fa92f1a65952854e3db6211d360f4d4124",
283306
},
307+
-- 0.6.3: CORE_SOURCES/VULKAN_SOURCES byte-identical to 0.6.2; the
308+
-- windows leg gains -luuid and the descriptor gains the `serial`
309+
-- feature (see the file-top note). No CN mirror yet — plain-string
310+
-- GLOBAL url, same as 0.6.2.
311+
["0.6.3"] = {
312+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.3.tar.gz",
313+
sha256 = "08074e2fb72662c8a4c2f7d75dec558aed2c751545797e0ccccbdbe8f439b669",
314+
},
284315
},
285316
macosx = {
286317
["0.5.3"] = {
@@ -338,6 +369,11 @@ package = {
338369
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.2.tar.gz",
339370
sha256 = "189d97aadb044de653237e12ac97d6fa92f1a65952854e3db6211d360f4d4124",
340371
},
372+
-- 0.6.3: see the linux block — plain-string GLOBAL, no CN mirror.
373+
["0.6.3"] = {
374+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.3.tar.gz",
375+
sha256 = "08074e2fb72662c8a4c2f7d75dec558aed2c751545797e0ccccbdbe8f439b669",
376+
},
341377
},
342378
windows = {
343379
["0.5.3"] = {
@@ -395,6 +431,11 @@ package = {
395431
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.2.tar.gz",
396432
sha256 = "189d97aadb044de653237e12ac97d6fa92f1a65952854e3db6211d360f4d4124",
397433
},
434+
-- 0.6.3: see the linux block — plain-string GLOBAL, no CN mirror.
435+
["0.6.3"] = {
436+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.3.tar.gz",
437+
sha256 = "08074e2fb72662c8a4c2f7d75dec558aed2c751545797e0ccccbdbe8f439b669",
438+
},
398439
},
399440
},
400441

@@ -727,6 +768,18 @@ inline bool sendX11MoveResizeForWindow(W* window, int direction) {
727768
defines = { "EUI_HAS_MD4C=1" },
728769
deps = { ["compat.md4c"] = "0.5.3" },
729770
},
771+
-- 0.6.3: `modules/serial/` is upstream's first optional module that
772+
-- is NOT header-only — CMake builds `serial.cpp` into a separate
773+
-- `eui::module_serial` target that links `eui::neo`. An xpkg
774+
-- descriptor models one lib target, so the module's TU rides here
775+
-- as an extra `sources` entry: a consumer that names `serial` gets
776+
-- core::serial::SerialPort in the same archive and includes it as
777+
-- `<modules/serial/serial.h>` (the `*` include root already
778+
-- exposes the whole tree). Off by default, like every other
779+
-- feature: a consumer that does not open a port does not pay for
780+
-- the termios/Win32 code. `modules/keyboard` needs no entry — it
781+
-- is a single header with no TU behind it.
782+
["serial"] = { sources = { "*/modules/serial/serial.cpp" } },
730783
},
731784

732785
-- ── Platform-specific ──────────────────────────────────────────────
@@ -787,10 +840,16 @@ inline bool sendX11MoveResizeForWindow(W* window, int direction) {
787840
-- the one TU in this package that had never been compiled — naming
788841
-- it costs nothing and the comment above is precisely about mcpp not
789842
-- inheriting CMake's defaults.
843+
--
844+
-- uuid is 0.6.3's addition: platform.cpp's directory picker uses
845+
-- CoCreateInstance(CLSID_FileOpenDialog, … IID_PPV_ARGS) and
846+
-- SHCreateItemFromParsingName, whose IID_/CLSID_ GUIDs live in
847+
-- uuid.lib (upstream's own 0.6.3 link line grew ole32 comdlg32
848+
-- uuid for the same TU). ole32/comdlg32 were already here.
790849
ldflags = {
791850
"-lwinmm", "-lurlmon", "-lshell32",
792851
"-luser32", "-limm32", "-lpdh", "-lole32",
793-
"-lcomdlg32", "-lkernel32",
852+
"-lcomdlg32", "-luuid", "-lkernel32",
794853
},
795854
},
796855

‎tests/examples/eui-neo-app-main/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ name = "eui-neo-app-main-tests"
3030
version = "0.1.0"
3131

3232
[dependencies.compat]
33-
eui-neo = { version = "0.6.2", features = ["app-main"] }
33+
eui-neo = { version = "0.6.3", features = ["app-main"] }

‎tests/examples/eui-neo-markdown/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ version = "0.1.0"
77
# what switches components/markdown.h from its fallback to the real parser.
88

99
[dependencies.compat]
10-
eui-neo = { version = "0.6.2", features = ["markdown"] }
10+
eui-neo = { version = "0.6.3", features = ["markdown"] }

‎tests/examples/eui-neo-sdl2/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ version = "0.1.0"
77
# into a real libcurl-backed implementation. The render backend stays OpenGL,
88
# unnamed — naming a feature no longer costs you the defaults.
99
[dependencies.compat]
10-
eui-neo = { version = "0.6.2", features = ["sdl2", "network"] }
10+
eui-neo = { version = "0.6.3", features = ["sdl2", "network"] }
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "eui-neo-serial-tests"
3+
version = "0.1.0"
4+
5+
# compat.eui-neo's `serial` feature: modules/serial/serial.cpp is upstream's
6+
# first optional module with a TU of its own (CMake builds it as
7+
# eui::module_serial, outside CORE_SOURCES), so the descriptor exposes it as a
8+
# source-gated feature rather than compiling termios/Win32 code into every
9+
# consumer.
10+
#
11+
# The assertion is link-time first: without the feature, SerialPort's
12+
# constructor/destructor/open() are undefined symbols. The runtime half opens a
13+
# device path that cannot exist on any platform, so it needs no hardware and is
14+
# deterministic — open() must report !ok and leave the port closed.
15+
#
16+
# The `compat` index redirect is inherited from the workspace root.
17+
[dependencies.compat]
18+
eui-neo = { version = "0.6.3", features = ["serial"] }
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Verify compat.eui-neo's `serial` feature — upstream's first optional MODULE
2+
// with a translation unit of its own (modules/serial/serial.cpp, built as
3+
// eui::module_serial in CMake and absent from CORE_SOURCES).
4+
//
5+
// The primary assertion is LINK-time: SerialPort's ctor/dtor/open()/isOpen()
6+
// only exist when the feature's `sources` entry compiled that TU into the
7+
// package lib. Without it the program fails with undefined references, which
8+
// is the negative result this member is here to make visible.
9+
//
10+
// The runtime half stays hardware-free on purpose: the device path cannot
11+
// exist on any platform, so open() must fail and leave the port closed. 0.6.3
12+
// is the release that made a failed open release its handle and keep the
13+
// previous connection; there is no previous connection here, so the observable
14+
// contract is simply "still closed". No serial hardware, no privileges.
15+
//
16+
// Windows macros first: modules/serial/serial.h includes <windows.h> for the
17+
// consumer, and this TU is compiled by the CONSUMER, which does not inherit the
18+
// package-private NOMINMAX / WIN32_LEAN_AND_MEAN flags.
19+
#if defined(_WIN32)
20+
#ifndef NOMINMAX
21+
#define NOMINMAX
22+
#endif
23+
#ifndef WIN32_LEAN_AND_MEAN
24+
#define WIN32_LEAN_AND_MEAN
25+
#endif
26+
#endif
27+
28+
#include <modules/serial/serial.h>
29+
30+
#include <utility>
31+
32+
int main() {
33+
bool ok = true;
34+
35+
core::serial::SerialPort port;
36+
ok = ok && !port.isOpen();
37+
38+
const core::serial::OpenResult missing =
39+
port.open("__mcpp_no_such_serial_device__", 115200);
40+
ok = ok && !missing.ok;
41+
ok = ok && missing.error != core::serial::OpenError::None;
42+
ok = ok && !port.isOpen();
43+
44+
// 0.6.3: ownership is movable and the moved-from object ends up closed.
45+
core::serial::SerialPort moved(std::move(port));
46+
ok = ok && !moved.isOpen();
47+
moved.close();
48+
49+
return ok ? 0 : 1;
50+
}

‎tests/examples/eui-neo-tray/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ name = "eui-neo-tray-tests"
2525
version = "0.1.0"
2626

2727
[dependencies.compat]
28-
eui-neo = "0.6.2"
28+
eui-neo = "0.6.3"

‎tests/examples/eui-neo-vulkan/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ version = "0.1.0"
66
# package resolves the exclusive choice in its own preprocessor from the
77
# MCPP_FEATURE_* flags. The window backend stays GLFW, unnamed.
88
[dependencies.compat]
9-
eui-neo = { version = "0.6.2", features = ["vulkan"] }
9+
eui-neo = { version = "0.6.3", features = ["vulkan"] }
1010

1111
[build]
1212
cxxflags = ["-DHAVE_EUI_VULKAN=1"]

0 commit comments

Comments
 (0)