Sync the tracked source tree to the wayland-protocols 1.49 release
tarball already pinned in recipe.toml (blake3-verified). Upstream 1.49
drops the pkg-config .pc.in files, switches scanner discovery to a
native wayland-scanner dependency with fallback, and adds the new
stable/staging protocol XMLs (ext-image-*, xdg-toplevel-icon,
cursor-shape, content-type, alpha-modifier, ...).
Comprehensive fix — not a fallback. Each recipe now has explicit
[package] section with name and version. Version inference:
- Git-source recipes without rev/branch: '0.1.0' (Red Bear convention)
- Tar/git recipes with version in URL or dir name: extracted version
- Sysroot-copy recipes: matched to toolchain version
Affected: 250+ recipes across all categories (core, libs, dev, system,
kde, qt, drivers, gpu, drm, kernel, userspace, etc.) Every recipe
in the redbear-mini build chain that was missing [package] now has
explicit version metadata. Cookbook can now always determine a version
at packaging time, eliminating 'cannot guess version' failures.
No cookbook fallback hack — the source of truth is recipe metadata.
Cherry-picked from Qt upstream (commit e488f852fa18c2afc2842a88eff8f66ad4105a45).
Original patch source:
https://download.qt.io/official_releases/qt/6.11/CVE-2026-6210-qtsvg-6.11.diff
Fix: Test types of nodes before downcasting them. A bad cast in
QSvgMarker::drawHelper led to endless recursion resulting in a heap
overflow. While fixing that, another similar case was also fixed.
Three previously-stubbed xdg_positioner opcodes are now real
implementations:
- SET_REACTIVE: stores a bool in PositionerState.reactive. Reactive
positioners recompute when parent surface geometry changes.
Cross-referenced with wlroots xdg-positioner.c.
- SET_PARENT_SIZE: stores the (w, h) parent rectangle in
PositionerState.parent_size. Used when no parent_configure
is set.
- SET_PARENT_CONFIGURE: stores the u32 serial in
PositionerState.parent_configure. This ties the positioner
to a specific parent xdg_surface.configure event.
The PositionerState struct gained three new fields:
reactive: Option<bool>
parent_size: Option<(i32, i32)>
parent_configure: Option<u32>
The old catch-all sed pattern that discarded all three opcodes as
a single empty match arm has been replaced with three explicit
arms. Each arm validates payload length before reading.
Systemic fix: all local recipes (~150 references across 40+ Cargo.toml files)
now resolve libredox, redox_syscall, and redox-scheme through
recipes/core/base/ symlinks instead of local/sources/ paths.
Eliminates lockfile collision between Cargo's resolution of the same
package through different path strings (local/sources/ vs recipes/core/base/).
This is required because the base recipe's workspace Cargo.toml resolves
these deps through recipes/core/base/ (via symlink chain from the
recipe copy location), and Cargo treats different path strings to the
same directory as different packages.
Updated the compositor description to accurately reflect that on Redox,
the DRM/KMS backend provides hardware-accelerated display via
/scheme/drm/card0 with SETCRTC + PAGE_FLIP. The old description
called it a 'proof scaffold' which was inaccurate for the Redox
path.
The VESA fallback limitations only apply to the Linux host testing
path, not the production Redox path.
- Cookbook Cargo.toml: 0.1.0 → 0.2.5
- All 61 in-house crate Cargo.toml versions: 0.2.4 → 0.2.5
- os-release.in: fix URLs from github.com to gitea.redbearos.org
- sync-versions.sh --check passes with zero drift
The OS version is derived from the git branch name at build time.
Building on branch 0.2.5 produces os-release with VERSION_ID=0.2.5.
Bump the lower-delta graphics-stack lane to real upstream latest stable
on 2026-07-02. Per AGENTS.md fork-adaptation policy, the local patches
in local/patches/{libdrm,libwayland,libevdev,libinput}/ must be re-applied
against the new source trees before the next build; rebase is open work.
Versions resolved against authoritative upstream registries (real latest stable):
libwayland 1.24.0 -> 1.25.0 (gitlab.freedesktop.org/wayland/wayland)
wayland-protocols 1.38 -> 1.49 (gitlab.freedesktop.org/wayland/wayland-protocols)
libdrm 2.4.125 -> 2.4.134 (gitlab.freedesktop.org/mesa/libdrm)
libxkbcommon 1.7.0 -> 1.9.2 (github.com/xkbcommon/libxkbcommon mirror)
libevdev 1.13.2 -> 1.13.6 (freedesktop.org/software/libevdev)
libinput 1.30.2 -> 1.31.3 (gitlab.freedesktop.org/libinput/libinput)
seatd-redox 0.9.1 -> 0.9.3 (git.sr.ht/~kennylevinsen/seatd)
expat 2.5.0 -> 2.8.2 (github.com/libexpat/libexpat)
BLAKE3 hashes verified against the actual downloaded upstream tarballs.
Not changed (already at or near upstream latest):
- dbus 1.16.2 (== upstream latest)
- xkeyboard-config (no standalone recipe; consumed via libxkbcommon)
- linux-input-headers (Red Bear original, not upstream)
Patches NOT yet rebased: see local/patches/{libdrm,libwayland,libevdev,
libinput}/. The dependency surfaces they patch (libdrm 2.4.134 has new
DRM modifier code, libwayland 1.25.0 has new server-decoder helpers,
libinput 1.31 has new touchpad gesture tables) will need review before
re-fetch.
TLC (Twilight Commander) was missing from both ISO configs. Added
tlc = {} to [packages] in redbear-mini.toml and redbear-full.toml.
Created missing symlink: recipes/tui/tlc -> ../../local/recipes/tui/tlc.
ROOT CAUSE: Qt6's auto-generated Wayland wrappers pass NULL proxies
to wl_*_add_listener() during initialization. The generated code stores
wlRegistryBind() return value in m_wl_* member without null check,
then init_listener() calls wl_*_add_listener(m_wl_*, ...) which
page-faults at null+8 (write to proxy->object.implementation).
FIX (kded6): wrapper script renames libqwayland.so to .disabled
before launching kded6.real. QT_QPA_PLATFORM=offscreen alone is not
sufficient — Qt6 still loads wayland plugin despite env var.
FIX (libwayland): null guards in redox.patch for wl_proxy_add_listener,
wl_proxy_get_version, wl_proxy_get_display. Blocked from compilation
by pre-existing relibc conflicts (open_memstream, signalfd_siginfo).
FIX (Qt6 wrappers): regex-based null guard insertion proven in concept.
Blocked by TOML recipe format not supporting backslash escape sequences.
Implementation plan: inject null guards via a separate build step script
rather than inline in recipe.toml.
- Restored wayland-libwayland-v1.24.0-patched.tar.gz from sources/
to replace corrupted source with stray + characters from failed patch
- Force-rebuilt kf6-kded6 (deleted pkgar) so #ifdef Q_OS_REDOX guard
is compiled in — kded6 now uses offscreen QPA on Redox
- wl_proxy_add_listener: return -1 on NULL proxy (was page fault at null+8)
- wl_proxy_get_version: return 0 on NULL proxy
- wl_proxy_get_display: return NULL on NULL proxy
- All keep fprintf diagnostics for caller identification
This is the definitive fix for the Qt6 Wayland crash. Instead of
page-faulting at proxy->object.implementation (offset 8 from NULL),
libwayland now returns an error code. Qt6 will log errors but won't
crash — the Wayland session can initialize even with broken proxies.
- libwayland: fprintf+abort if wl_proxy_add_listener called with NULL proxy.
Prints caller address via __builtin_return_address(0) to identify
which Qt6 function passes the null proxy.
- compositor: eprintln each wl_registry_bind to show which globals
Qt6 binds before crashing.
- Next boot will definitively identify the crash source.
- get_data_device: stores wl_data_device in client object map
- get_subsurface: stores wl_subsurface in client object map
- data_device/subsurface requests accepted silently (Qt6 needs
these proxies to exist for initialization even though we don't
implement clipboard or subsurface compositing yet)
Instrumentation confirmed: setupConnection() completes with valid
registry=0x44f230. Crash is in Qt6 global binding path during
forceRoundTrip(), not in compositor protocol handling.
Scheme files on Redox don't support try_clone(). Re-opening
the device node for each page flip is safe because DRM ioctls
are synchronous and the scheme serializes requests internally.
The compositor is single-threaded — Mutex guards exist only for
Rust borrow-safety. Raw pointers from Vec::as_mut_ptr() remain
valid after guard drop because no concurrent mutation is possible.
- Add drm_backend module with full KMS initialization:
DRM_IOCTL_MODE_GETCONNECTOR → CREATE_DUMB → MAP_DUMB →
ADDFB → SETCRTC → PAGE_FLIP
- I/O uses standard write+read on /scheme/drm/card0 (no libredox dep)
- Double-buffered with AtomicUsize-based flip
- DRM output preferred; falls back to VESA framebuffer
- composite_buffer integrated: writes to DRM back buffer, page-flips
- Cross-referenced with Linux drm_mode.h ioctl numbers
- Remove xkb_context_new on Redox (eliminates crash vector)
Consolidate the active desktop path around redbear-full while landing the greeter/session stack and the runtime fixes needed to keep Wayland and KWin bring-up moving forward.
Derivative of Redox OS (https://www.redox-os.org) adding:
- AMD GPU driver (amdgpu) via LinuxKPI compat layer
- ext4 filesystem support (ext4d scheme daemon)
- ACPI fixes for AMD bare metal (x2APIC, DMAR, IVRS, MCFG)
- Custom branding (hostname, os-release, boot identity)
Build system is full upstream Redox with RBOS overlay in local/.
Patches for kernel, base, and relibc are symlinked from local/patches/
and protected from make clean/distclean. Custom recipes live in
local/recipes/ with symlinks into the recipes/ search path.
Build: make all CONFIG_NAME=redbear-full
Sync: ./local/scripts/sync-upstream.sh