{"record":{"id":"68a631ea36de5f37","repo":"zed-industries/zed","slug":"wl-seat-below-required-version","errorCode":null,"errorMessage":"wl_seat below required version: {} < {}","messagePattern":"wl_seat below required version: (.+?) < (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/gpui_linux/src/linux/wayland/client.rs","lineNumber":681,"sourceCode":"            return;\n        }\n        let Some(style) = self.cursor_style else {\n            return;\n        };\n        let serial = self.serial_tracker.get(SerialKind::MouseEnter);\n        if let Some(cursor_shape_device) = &self.cursor_shape_device {\n            cursor_shape_device.set_shape(serial.as_raw(), to_shape(style));\n            return;\n        }\n        let Some(focused_window) = self.mouse_focused_window.clone() else {\n            log::warn!(\n                \"wayland: no focused surface to restore cursor style {:?} after hide; cursor may stay invisible\",\n                style\n            );\n            return;\n        };\n        let Some(wl_pointer) = self.wl_pointer.clone() else {\n            log::warn!(\n                \"wayland: no wl_pointer to restore cursor style {:?} after hide; cursor may stay invisible\",\n                style\n            );\n            return;\n        };\n        let scale = focused_window.primary_output_scale();\n        self.cursor.set_icon(\n            &wl_pointer,\n            serial.as_raw(),\n            cursor_style_to_icon_names(style),\n            scale,\n        );\n    }\n}\n\n#[derive(Clone)]\npub struct WaylandClient(Rc<RefCell<WaylandClientState>>);\n","sourceCodeStart":663,"sourceCodeEnd":699,"githubUrl":"https://github.com/zed-industries/zed/blob/9d272b036335401f339d024ea94968fd51016c40/crates/gpui_linux/src/linux/wayland/client.rs#L663-L699","documentation":"The Wayland client negotiates wl_seat versions and requires at least version 5 because it depends on the wl_pointer.frame event (introduced in wl_seat v5); it clamps the advertised version into [5, 9]. If the compositor binds wl_seat with a lower version, the client panics at startup with the advertised and required versions instead of continuing without frame events.","triggerScenarios":"Starting Zed on a Wayland compositor that advertises wl_seat version < 5 — old compositor builds, minimal/nested Wayland servers, or remote-desktop compositors with stale protocol support.","commonSituations":"Older distro compositors; nested compositors (e.g. for testing); compositors that never bumped wl_seat despite supporting pointer events otherwise.","solutions":["Run Zed under XWayland/X11 instead of native Wayland (log out and pick the X11 session, or force the X11 backend per Zed's platform docs)","Update the compositor to a version that binds wl_seat >= 5","Report the compositor name and version so the minimum can be revisited or the check relaxed"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"# shell: check compositor wl_seat version before launching (wayland-info from wayland-utils)\nwayland-info | grep -A1 wl_seat   # shows advertised version; need >= 5","typeGuard":null,"tryCatchPattern":null,"preventionTips":["On compositors older than wl_seat v5, use the X11/XWayland session for Zed","Keep the compositor updated; wl_seat >= 5 has been standard for years","Include compositor name/version in bug reports so the requirement can be revisited"],"tags":["zed","gpui","linux","wayland","wl-seat","protocol-version","panic"],"backgroundTag":"unsupported-wayland-protocol-version","analyzedSha":"9d272b036335401f339d024ea94968fd51016c40","analyzedAt":"2026-08-20T19:29:52.058Z","contentChangedAt":"2026-08-20T19:29:52.058Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}