#16091

4.5.0rc1: startup-cursor leaves a transparent root cursor in XWayland (no pointer over X11 popups)

Openmaksviniopened 1d ago

System details

Intel i9-14900HX, NVIDIA RTX 5070 Mobile (proprietary driver), Omarchy 4.5.0rc1 (upgraded from 4.0.6), hyprland 0.56.2-4, xorg-xwayland 24.1.14-1, monitor scale 1.6, XCURSOR_THEME=default (default-cursors -> Adwaita), XCURSOR_SIZE=24

What's wrong?

After upgrading 4.0.6 -> 4.5.0rc1 the mouse pointer is invisible over X11 (XWayland) popup windows that do not set their own cursor: Unity Editor dropdowns, the GTK file chooser opened from Cryptomator "Add vault" (JavaFX runs under XWayland), etc. The main windows of those apps show the pointer fine, and native Wayland apps are unaffected. Did not happen on 4.0.6.

Cause

default/hypr/startup-cursor.lua sets XCURSOR_THEME=omarchy-startup at cold start. That theme's only cursor (default/hypr/cursors/omarchy-startup/cursors/left_ptr) is a fully transparent 24x24 image.

Hyprland sets the XWayland root-window cursor exactly once, when XWayland reports ready: src/xwayland/Server.cpp calls Pointer::Cursor::mgr()->setXWaylandCursor(). CCursorManager::changeTheme() never calls it again. XWayland starts while the transparent theme is active, so the X11 root window keeps the transparent cursor for the whole session, even after omarchy_startup_cursor_restore runs hyprctl setcursor <theme> <size>.

Any X11 window that relies on the root cursor (override-redirect popups, menus, some dialogs) therefore shows no pointer.

Steps to reproduce

  1. Cold boot into 4.5.0rc1.
  2. Open an X11 app with a popup that doesn't set its own cursor (Unity Editor dropdown, or the GTK folder chooser from Cryptomator's "Add vault").
  3. Pointer disappears over the popup. hyprctl setcursor default 24 does not help.

Confirmation

Installing xorg-xsetroot and running xsetroot -cursor_name left_ptr brings the pointer back immediately in those popups, which confirms the root cursor is the culprit.

Workarounds

  • omarchy_startup_cursor_pending = false in ~/.config/hypr/hyprland.lua before the bootstrap dofile (disables the startup cursor feature).
  • Or xsetroot -cursor_name left_ptr after startup.

Possible fix

Refresh the X11 root cursor after omarchy_startup_cursor_restore(true) (an xsetroot/xcb call with the restored theme), or get Hyprland to call setXWaylandCursor() from changeTheme() upstream.

Activity

2
FoxesRCool123h ago

Confirming on 4.5.0rc1 (upgraded from 4.0.6), AMD Radeon RX 7900 XT (Navi 31), hyprland 0.56.2-4, xorg-xwayland 24.1.14-1, cursor theme Bibata-Modern-Ice. Here it's not only popups: the pointer is invisible over the whole main window of Bambu Studio (wxWidgets/GTK3 AppImage under XWayland), and restarting the app doesn't help. XFixesGetCursorImage reports a 24x24 root cursor with 0 opaque pixels, and hyprctl setcursor leaves it unchanged. Setting the root cursor to left_ptr (what xsetroot -cursor_name left_ptr does) fixes it immediately. xsetroot isn't installed by default, so users can't apply that workaround without installing a package.

geekhostuk19h ago

Confirming on the 4.5.0rc1 package (upgraded from 4.0.5), with a Unity game as another affected client type.

System

  • AMD Ryzen 9 9900X, AMD RX 7900 XTX (Navi 31) + Granite Ridge iGPU, three monitors (DP-1 3840x2160@240 primary)
  • omarchy / omarchy-settings 4.5.0rc1-1, Hyprland 0.56.2, Mesa 26.2.5, kernel 7.2.8-9-omarchy

Affected app: Liftoff (Steam app 410340, native Linux Unity 2022.3 build under XWayland, running in the Steam Linux Runtime container). The pointer is invisible over the whole game. Steam itself is fine.

Measurements (XFixesGetCursorImage, pointer over the Liftoff window)

Cold login:                              24x24 opaque_pixels=0/576   name=(empty)
After `hyprctl setcursor default 24`:    unchanged
After `xsetroot -cursor_name left_ptr`:  24x24 opaque_pixels=272/576 name=left_ptr

Xwayland started 2s after Hyprland, inside the startup-cursor window. The environment is clean: the game process has XCURSOR_THEME=default, not omarchy-startup. That rules out the container's env or icon paths and points to the root-cursor mechanism described above.

Workaround in use: I wrap omarchy_startup_cursor_restore from the user hyprland.lua and run xsetroot -cursor_name left_ptr once it's called with loaded = true. That's the same placement #14580 uses. +1 for merging #14580.