Skip to content

Commit b20bf79

Browse files
committed
feat(eui-neo): add 0.6.1
CORE_SOURCES and VULKAN_SOURCES are byte-identical to 0.6.0 (extracted and diffed from both CMakeLists.txt), so the lib's source list, deps, features and flags carry over unchanged. The release is window lifecycle, Linux input and component fixes; three of its pieces deserve notes: * core/window/x11_moveresize.h is new but header-only: libX11 is dlopen'd at runtime (no link-time X11 dependency), yet its compile-time <X11/Xlib.h> now reaches the linux window_backend.cpp TU through the transitive compat.glfw -> compat.x11 chain — verified in the emitted compile_commands.json, no direct dep added. * ime_bridge.c's new EUI_GLFW_X11_IME_POSITION arm (X11 IME caret fix) calls glfwSetX11InputMethodCursorPos, a function upstream's scripts/patch_glfw_x11_ime.cmake adds to its BUNDLED glfw. compat.glfw is unpatched upstream 3.4, so the define is never set here and the arm is inert; the linux IME keeps the 0.6.0 stub. * The one real descriptor change, found by testing: in the SDL2 backend, beginWindowMove/beginWindowResize call sendX11MoveResizeForWindow UNGUARDED while its declaration sits inside `#if ... && defined(SDL_VIDEO_DRIVER_X11)` (window_backend.cpp:223). Upstream never sees this because its SDL2 always builds the X11 video driver; compat.sdl2's linux config is dummy+offscreen only, so the eui-neo-sdl2 member fails to compile on 0.6.1 (measured: not declared in this scope at window_backend.cpp:571). The fix is a package-private shim in mcpp_eui_backends.h: define SDL_VIDEO_DRIVER_X11 for this package's own TUs when MCPP_FEATURE_SDL2 is on. It can never fire at runtime — compat.sdl2 has no X11 driver, so no SDL window is ever an X11 window and every delegation returns false, upstream's own "unavailable -> report failure" contract. It must not be an interface define: consumers would inherit the lie on every platform. No CN mirror yet (never published to mcpp-res); plain-string GLOBAL url fallback per cn-mirror.md SOP. sha256 computed twice from the tag tarball. All seven workspace members bumped to 0.6.1 and verified locally with mcpp 2026.10.1.2 (same as CI MCPP_VERSION): index lint clean; eui-neo, eui-neo-window, eui-neo-app-main, eui-neo-markdown, eui-neo-sdl2, eui-neo-vulkan, eui-neo-tray all pass — the first sdl2 run failed without the shim and passes with it, which is the shim's measured evidence.
1 parent 3ee304d commit b20bf79

9 files changed

Lines changed: 196 additions & 9 deletions

File tree

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# Design doc: bump `compat.eui-neo` to 0.6.1
2+
3+
Date: 2026-10-14
4+
5+
Follow-up to `.agents/docs/2026-09-26-bump-eui-neo-0.6.0-plan.md` and commit `2863bb1` (0.6.0).
6+
Upstream released 0.6.1; this bumps the index from 0.6.0 to 0.6.1.
7+
8+
## Source and version
9+
10+
| | |
11+
|---|---|
12+
| Upstream | `https://github.com/sudoevolve/EUI-NEO` |
13+
| Version | `0.6.1` (latest release) |
14+
| Tarball | `archive/refs/tags/v0.6.1.tar.gz` |
15+
| sha256 | `cd0bd6bd437177db097da146fc20f4b8b01c70d0db561a6f8e26baa26dbbbf5f` (computed twice, stable) |
16+
| Wrap dir | `EUI-NEO-0.6.1/` — 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+
20+
## What changed upstream (0.6.0 → 0.6.1)
21+
22+
Release notes: `docs/releases/v0.6.1.md` (window lifecycle + self-drawn windows, Linux input,
23+
component interaction, cross-backend build stability).
24+
25+
- **`CORE_SOURCES` and `VULKAN_SOURCES` are byte-identical to 0.6.0** (extracted and diffed from
26+
both `CMakeLists.txt`). The lib's source list, deps, features and flags carry over unchanged.
27+
- `core/window/x11_moveresize.h` is **new but header-only**: EWMH `_NET_WM_MOVERESIZE`
28+
move/resize delegation. libX11 is dlopen'd at runtime — the header states verbatim that "no
29+
build configuration gains a link-time X11 dependency", and `-ldl` is already on the linux
30+
ldflags (glad). It DOES add a compile-time `<X11/Xlib.h>` on linux:
31+
`window_backend.cpp` includes the header **unconditionally** (line 3) and the header guards
32+
its X11 block only on `__linux__ && !__ANDROID__`. Resolution path: the transitive
33+
`compat.glfw → compat.x11` dep chain (dep `include_dirs` propagate to consumers — the same
34+
propagation the glib `private_include_dirs` pairing exists to suppress). Verified by the
35+
build, not assumed — see below.
36+
- `ime_bridge.c` grows a third arm, `#elif defined(__linux__) &&
37+
defined(EUI_GLFW_X11_IME_POSITION)`, the X11 IME candidate-follows-caret fix. The arm calls
38+
`glfwSetX11InputMethodCursorPos`, a function upstream's `scripts/patch_glfw_x11_ime.cmake`
39+
**adds to its bundled glfw** (`3rd/dependencies.cmake` now rewrites the bundled target's
40+
sources at configure time). The index builds `compat.glfw`, unpatched upstream 3.4 — the
41+
define is never set here, the arm is inert, and our linux IME keeps the 0.6.0 `#else` stub.
42+
Enabling the fix would mean patching `compat.glfw`, out of scope for a version bump.
43+
- `3rd/dependencies.cmake` also tightens `find_package(glfw3 3.4)` — applies to upstream's
44+
bundled-vs-system glfw choice only; we pin `compat.glfw` 3.4.
45+
- The rest is header/app-level — with ONE exception, found by testing rather
46+
than reading: in the SDL2 backend, `beginWindowMove` / `beginWindowResize`
47+
call `sendX11MoveResizeForWindow` **unguarded**, but its declaration sits
48+
inside `#if … && defined(SDL_VIDEO_DRIVER_X11)` (window_backend.cpp:223-298).
49+
Upstream never sees this because its SDL2 always builds with the X11 video
50+
driver; `compat.sdl2`'s linux config is dummy+offscreen only, so the
51+
eui-neo-sdl2 member fails to compile on 0.6.1 (measured:
52+
`'sendX11MoveResizeForWindow' was not declared in this scope` at
53+
window_backend.cpp:571). The other SDL2 X11 helper, `x11ContentScale`, is
54+
safe — its call site is inside the same triple guard as its body.
55+
- `apps/vcd_viewer` removed, new upstream tests/docs — none reach the lib or this index.
56+
57+
## Descriptor changes (`pkgs/e/compat.eui-neo.lua`)
58+
59+
- `xpm.<linux|macosx|windows>["0.6.1"]`: plain-string GLOBAL url (no CN mirror), sha256 above.
60+
- **One functional change**, in `generated_files["mcpp_generated/mcpp_eui_backends.h"]`:
61+
when `MCPP_FEATURE_SDL2` is set on linux, `#define SDL_VIDEO_DRIVER_X11 1` for this
62+
package's OWN TUs (the header is already force-included into every one of them). That
63+
compiles the X11-gated declaration in, and can never fire at runtime — compat.sdl2 has
64+
no X11 driver, so no SDL window is ever an X11 window, `SDL_GetWindowWMInfo` reports a
65+
non-X11 subsystem, and every delegation returns false with callers keeping their
66+
programmatic fallback (upstream's own "unavailable → report failure" contract; the
67+
dlopen'd-libX11 paths are inert for the same reason). The `<X11/Xresource.h>` /
68+
`<SDL_syswm.h>` includes the macro wakes up resolve through the same transitive
69+
`compat.glfw → compat.x11` chain the GLFW leg already uses. It must NOT move to the
70+
sdl2 feature's `defines` — those are interface defines and would push the lie into
71+
every consumer TU on every platform (on macOS, SDL_syswm.h would then demand X11
72+
headers consumers don't have).
73+
- No source list, dep, feature-shape or flag changes otherwise.
74+
75+
## Test members
76+
77+
All seven `tests/examples/eui-neo*` members bumped to `0.6.1` (from 0.6.0). No test source
78+
changes: the 0.6.1 surface this workspace exercises (backends, app-mains, tray, markdown,
79+
network, window) is unchanged in shape; the new API (transparent framebuffer, delegated
80+
move/resize, onStart/appId) is window-lifecycle surface that needs a compositor and is not
81+
assertable headless.
82+
83+
## Verification
84+
85+
Locally, mcpp 2026.10.1.2 (same as CI `MCPP_VERSION`), Linux x86_64, `MCPP_INDEX_MIRROR=GLOBAL`:
86+
87+
- Index lint: `check_mirror_urls`, `check_package_name`, `check_reserved_namespace`,
88+
`check_cross_package_refs`, `check_platform_version_parity`, `check_duplicate_versions` —
89+
all clean; `mcpp xpkg parse` accepts the descriptor.
90+
- First pass: six of seven members green, **eui-neo-sdl2 failed to compile** —
91+
`'sendX11MoveResizeForWindow' was not declared in this scope`
92+
(window_backend.cpp:571), the upstream guard asymmetry described above. That is what
93+
produced the `SDL_VIDEO_DRIVER_X11` shim; it is measured, not hypothetical.
94+
- Second pass, with the shim: all seven members `mcpp test` green: eui-neo (headless),
95+
eui-neo-window, eui-neo-app-main, eui-neo-markdown, eui-neo-sdl2 (sdl2+network),
96+
eui-neo-vulkan, eui-neo-tray.
97+
- `compile_commands.json` (fresh, from the passing builds): the 0.6.1
98+
`window_backend.cpp` TU carries `compat-x-x11/1.8.13/include` via the transitive
99+
`compat.glfw → compat.x11` chain — `<X11/Xlib.h>` resolves with no direct dep added.
100+
The shim reaches the sdl2 TU through the same force-include
101+
(`-include mcpp_eui_backends.h`) every eui-neo TU already carries — the macro lives in
102+
the header, so it never appears as a `-D` on the compile line; the evidence it is in
103+
effect is the failed-then-passing eui-neo-sdl2 compile across the two runs.
104+
105+
Windows/macOS legs rest on CI: the descriptor changes there are version-entry-only, and
106+
upstream's own CMake pins the same link model (nothing new on either leg — `x11_moveresize.h`
107+
is `__linux__`-guarded, the IME arm is doubly inert off-linux).

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

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
-- them as `"3rd/stb_image.h"` — except miniaudio, which audio.cpp includes
1818
-- BARE; see the 0.6.0 note below.
1919
--
20-
-- The build recipe below tracks upstream `CMakeLists.txt` (v0.6.0): CORE_SOURCES
20+
-- The build recipe below tracks upstream `CMakeLists.txt` (v0.6.1): CORE_SOURCES
2121
-- plus the OpenGL backend and, for the glfw window backend, `ime_bridge.c`.
2222
-- 0.5.5 grew a Shadertoy subsystem: render_backend.h and include/eui/types.h now
2323
-- include core/render/shadertoy.h unconditionally, and opengl_backend.cpp calls
@@ -80,8 +80,54 @@
8080
-- of tray_bridge.c (diff vs 0.5.9: comments + EOF newline only). `3rd/`,
8181
-- deps and the backend/app-main source lists are unchanged.
8282
--
83+
-- 0.6.1: CORE_SOURCES and VULKAN_SOURCES are byte-identical to 0.6.0, so
84+
-- the lib's source list, deps, features and flags carry over unchanged.
85+
-- The release is window lifecycle + component fixes, and two of its pieces
86+
-- deserve notes because they LOOK like descriptor work and are not:
87+
-- * `core/window/x11_moveresize.h` is NEW but header-only: EWMH
88+
-- _NET_WM_MOVERESIZE move/resize delegation, with libX11 dlopen'd at
89+
-- RUNTIME (no link-time X11 dependency — upstream says so verbatim in
90+
-- the header, and -ldl is already on the linux ldflags for glad).
91+
-- It DOES add a compile-time `<X11/Xlib.h>` on linux, because
92+
-- window_backend.cpp includes it UNCONDITIONALLY and the header guards
93+
-- its X11 block only on `__linux__ && !__ANDROID__`. That include
94+
-- resolves through the transitive compat.glfw → compat.x11 dep chain
95+
-- (verified by the 0.6.1 build of the eui-neo member — do not add a
96+
-- direct compat.x11 dep without measuring a failure first).
97+
-- * ime_bridge.c grows a third arm,
98+
-- `#elif defined(__linux__) && defined(EUI_GLFW_X11_IME_POSITION)`,
99+
-- implementing the X11 IME candidate-window-follows-caret fix. The arm
100+
-- calls glfwSetX11InputMethodCursorPos, a function upstream's
101+
-- `scripts/patch_glfw_x11_ime.cmake` ADDS TO ITS BUNDLED glfw — the
102+
-- index builds compat.glfw, which is unpatched upstream 3.4, so the
103+
-- define is never set here and the arm is inert; our linux IME keeps
104+
-- the `#else` stub exactly as 0.6.0 did. Enabling the fix would
105+
-- require patching compat.glfw, which is out of scope for a bump.
106+
-- * ⚠️ THE ONE REAL DESCRIPTOR CHANGE. In the SDL2 backend,
107+
-- window_backend.cpp calls sendX11MoveResizeForWindow from
108+
-- beginWindowMove/beginWindowResize UNGUARDED, but the function's
109+
-- declaration sits inside `#if … && defined(SDL_VIDEO_DRIVER_X11)` —
110+
-- an upstream bug that only shows with an SDL built without its X11
111+
-- video driver. compat.sdl2's linux config is exactly that
112+
-- (dummy+offscreen only), so the eui-neo-sdl2 member fails to compile
113+
-- on 0.6.1 (measured: 'sendX11MoveResizeForWindow' was not declared).
114+
-- The fix is a package-private shim in mcpp_eui_backends.h: define
115+
-- SDL_VIDEO_DRIVER_X11 for this package's own TUs when MCPP_FEATURE_SDL2
116+
-- is on, waking the X11-gated block up. It can never fire at runtime
117+
-- (compat.sdl2 has no X11 driver to produce an X11 window), so every
118+
-- delegation returns false and callers keep their programmatic
119+
-- fallback — upstream's "unavailable → report failure" contract. It
120+
-- must NOT be an interface define: consumers would inherit the lie on
121+
-- every platform.
122+
-- The rest is header/app-level: transparent framebuffer
123+
-- (DslAppConfig::transparent / framebufferTransparent), beginWindowMove /
124+
-- beginWindowResize (the consumers of x11_moveresize.h), DslAppConfig
125+
-- onStart()/appId(), GLFW 3.3/3.4 macro guards (we pin 3.4), platform.cpp
126+
-- dialog-diagnostics capture (mkstemp, POSIX-guarded), dropdown/slider
127+
-- z-order and OpenGL pixel-unpack fixes. No `3rd/` pin moves.
128+
--
83129
-- All `mcpp` paths are GLOBS relative to the verdir; the leading `*/` absorbs
84-
-- the GitHub tarball's `EUI-NEO-0.6.0/` wrap layer.
130+
-- the GitHub tarball's `EUI-NEO-0.6.1/` wrap layer.
85131
package = {
86132
spec = "1",
87133
namespace = "compat",
@@ -187,6 +233,11 @@ package = {
187233
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.0.tar.gz",
188234
sha256 = "11d0725bcc6f16abbbea6052b58c6949008cf78ceaa1645002ba1b3abf9772a1",
189235
},
236+
-- 0.6.1: see the linux block — plain-string GLOBAL, no CN mirror.
237+
["0.6.1"] = {
238+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.1.tar.gz",
239+
sha256 = "cd0bd6bd437177db097da146fc20f4b8b01c70d0db561a6f8e26baa26dbbbf5f",
240+
},
190241
},
191242
macosx = {
192243
["0.5.3"] = {
@@ -234,6 +285,11 @@ package = {
234285
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.0.tar.gz",
235286
sha256 = "11d0725bcc6f16abbbea6052b58c6949008cf78ceaa1645002ba1b3abf9772a1",
236287
},
288+
-- 0.6.1: see the linux block — plain-string GLOBAL, no CN mirror.
289+
["0.6.1"] = {
290+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.1.tar.gz",
291+
sha256 = "cd0bd6bd437177db097da146fc20f4b8b01c70d0db561a6f8e26baa26dbbbf5f",
292+
},
237293
},
238294
windows = {
239295
["0.5.3"] = {
@@ -281,6 +337,11 @@ package = {
281337
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.0.tar.gz",
282338
sha256 = "11d0725bcc6f16abbbea6052b58c6949008cf78ceaa1645002ba1b3abf9772a1",
283339
},
340+
-- 0.6.1: see the linux block — plain-string GLOBAL, no CN mirror.
341+
["0.6.1"] = {
342+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.1.tar.gz",
343+
sha256 = "cd0bd6bd437177db097da146fc20f4b8b01c70d0db561a6f8e26baa26dbbbf5f",
344+
},
284345
},
285346
},
286347

@@ -340,6 +401,25 @@ package = {
340401
* the SDL2 define, which is how upstream spells it too). */
341402
#if defined(MCPP_FEATURE_SDL2)
342403
# define EUI_WINDOW_BACKEND_SDL2 1
404+
/* 0.6.1, SDL2 backend only: upstream guards
405+
* core/window/window_backend.cpp's sendX11MoveResizeForWindow DECLARATION
406+
* (and the X11ResourceApi helpers) on SDL_VIDEO_DRIVER_X11, but calls it from
407+
* beginWindowMove/beginWindowResize UNGUARDED — so the SDL2 TU fails to
408+
* compile ('sendX11MoveResizeForWindow' was not declared in this scope) when
409+
* SDL's headers do not advertise the X11 video driver. compat.sdl2's linux
410+
* config builds the dummy+offscreen drivers only, so the macro is absent
411+
* here (measured on the eui-neo-sdl2 member, 0.6.1). Defining it for THIS
412+
* PACKAGE'S OWN TUs compiles the X11-gated block in: it only wakes up when a
413+
* window genuinely is an X11 SDL window, which compat.sdl2's runtime can
414+
* never produce, so every delegation returns false and callers keep their
415+
* programmatic fallback — upstream's own "unavailable → report failure"
416+
* contract. It must NOT go in the sdl2 feature's `defines` (interface):
417+
* that would push the lie into every consumer TU on every platform. The
418+
* header needs resolve through the same transitive compat.glfw →
419+
* compat.x11 chain the 0.6.1 x11_moveresize.h include already relies on. */
420+
# if defined(__linux__) && !defined(__ANDROID__)
421+
# define SDL_VIDEO_DRIVER_X11 1
422+
# endif
343423
#endif
344424
]==],
345425
["mcpp_generated/eui_neo_platform_tu.cpp"] = [==[

‎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.0", features = ["app-main"] }
33+
eui-neo = { version = "0.6.1", 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.0", features = ["markdown"] }
10+
eui-neo = { version = "0.6.1", 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.0", features = ["sdl2", "network"] }
10+
eui-neo = { version = "0.6.1", features = ["sdl2", "network"] }

‎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.0"
28+
eui-neo = "0.6.1"

‎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.0", features = ["vulkan"] }
9+
eui-neo = { version = "0.6.1", features = ["vulkan"] }
1010

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

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ name = "eui-neo-window-tests"
3434
version = "0.1.0"
3535

3636
[dependencies.compat]
37-
eui-neo = "0.6.0"
37+
eui-neo = "0.6.1"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ name = "eui-neo-tests"
33
version = "0.1.0"
44

55
[dependencies.compat]
6-
eui-neo = "0.6.0"
6+
eui-neo = "0.6.1"

0 commit comments

Comments
 (0)