docs: Wayland-only path — no framebuffer workarounds. Add Qt6 instrumentation.

- WAYLAND-IMPLEMENTATION-PLAN.md v2.0: document architecture decision
  that Wayland is the only supported display path. Remove all
  framebuffer fallback workarounds (offscreen QPA, redox QPA shim).
- qwaylanddisplay.cpp: add fprintf instrumentation for crash diagnosis;
  skip xkb_context_new on Redox to eliminate potential xkb crash vector.
- greeter-ui/main.cpp: remove QT_QPA_PLATFORM=redox workaround.
  The greeter must use Wayland. Accept the crash until Qt6 is fixed.
- Ruled out: relibc calloc (zeroes correctly), libwayland proxy_create
  (correct), compositor protocol (compliant). Root cause is in Qt6
  generated Wayland wrappers passing NULL to wl_proxy_add_listener.
This commit is contained in:
2026-05-06 12:21:05 +01:00
parent ff5a132a9d
commit 608b1bffbb
3 changed files with 130 additions and 122 deletions
@@ -342,12 +342,17 @@ void QWaylandDisplay::setupConnection()
qCritical("QWaylandDisplay: wl_display_get_registry() returned NULL");
_exit(1);
}
// Instrumentation: log the registry pointer before init
fprintf(stderr, "QWaylandDisplay: registry=%p mDisplay=%p\n", (void*)registry, (void*)mDisplay);
init(registry);
#if QT_CONFIG(xkbcommon)
// Skip xkb on Redox — xkb_context_new may crash without XKB data files
#ifndef Q_OS_REDOX
mXkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_FLAGS));
if (!mXkbContext)
qCWarning(lcQpaWayland, "failed to create xkb context");
#endif
#endif
if (mWaylandInputContextRequested)
checkTextInputProtocol();
@@ -12,13 +12,6 @@ int main(int argc, char *argv[]) {
qputenv("QT_QUICK_BACKEND", QByteArrayLiteral("software"));
QQuickWindow::setGraphicsApi(QSGRendererInterface::Software);
// Use the Redox-native QPA plugin (libqredox.so) instead of Wayland.
// The Qt6 Wayland plugin crashes at null+8 during wl_registry init on Redox.
// The redox QPA plugin renders directly to the framebuffer via scheme:display.
if (qEnvironmentVariableIsEmpty("QT_QPA_PLATFORM")) {
qputenv("QT_QPA_PLATFORM", "redox");
}
QGuiApplication app(argc, argv);
QQuickStyle::setStyle(QStringLiteral("Basic"));