Zoom Flatpak on Native Wayland (Sway, wlroots)

April 24, 2026
LinuxWaylandFlatpakSwayZoom

Problem. Zoom flatpak (us.zoom.Zoom) ignores QT_QPA_PLATFORM=wayland. Always runs under Xwayland.

Why. ZoomLauncher calls setenv("QT_QPA_PLATFORM", "xcb", 1) unconditionally. Overrides every env you pass.

Fix. Rename the env var the launcher writes to. Patch one byte: QT_QPA_PLATFORM → QT_QPAYPLATFORM. Launcher now writes to a junk var; Qt reads the real one from your override.

flatpak install --user flathub us.zoom.Zoom
flatpak override --user --env=QT_QPA_PLATFORM=wayland us.zoom.Zoom

LAUNCHER=~/.local/share/flatpak/app/us.zoom.Zoom/current/active/files/extra/zoom/ZoomLauncher
cp -p "$LAUNCHER" "$LAUNCHER.tmp" && mv "$LAUNCHER.tmp" "$LAUNCHER"  # break ostree hardlink
python3 -c "
p='$LAUNCHER'
d=open(p,'rb').read()
open(p,'wb').write(d.replace(b'QT_QPA_PLATFORM\x00', b'QT_QPAYPLATFORM\x00'))
"

Verify.

swaymsg -t get_tree | jq '.. | objects | select(.name=="Zoom Workplace") | {app_id, shell}'
# { "app_id": "Zoom", "shell": "xdg_shell" }

Notes. Re-run after every Zoom update (overwrites the patch). System install is read-only ostree — must use --user. Screen share may regress vs Xwayland; Zoom’s Wayland targets KDE/GNOME protocols.

Script. zoom-wayland-patch — idempotent, re-runnable.