Skip to content

Add support for GNOME Shell 50#416

Closed
gurnben wants to merge 1 commit intohardpixel:masterfrom
gurnben:gnome-50-support
Closed

Add support for GNOME Shell 50#416
gurnben wants to merge 1 commit intohardpixel:masterfrom
gurnben:gnome-50-support

Conversation

@gurnben
Copy link
Copy Markdown

@gurnben gurnben commented Apr 6, 2026

Summary

This change adds support for GNOME Shell 50 while maintaining backward compatibility with GNOME Shell 45–49.

GNOME 50 (released March 2026) ships with mutter 50, which completely removes the X11 backend (mutter MR !4505). The GNOME Shell side was adapted in gnome-shell MR !3768. This required two code-level fixes in window.js to avoid runtime errors, detailed below.

For the full list of GNOME Shell 50 extension changes, see the official porting guide.

Changes

metadata.json

  • Added "50" to shell-version
  • Bumped extension version to 85

window.jsMeta.is_wayland_compositor() removed in mutter 50

Meta.is_wayland_compositor() was removed from mutter 50 in commit b434895 with the rationale: "As we will always be running as one." Since the compositor is now always Wayland, calling this function on GNOME 50 throws an error. The fix guards the call with an existence check, falling back to true when the function doesn't exist:

// Before
const skipTbar = Meta.is_wayland_compositor() && this.win.skip_taskbar

// After
const isWayland = Meta.is_wayland_compositor ? Meta.is_wayland_compositor() : true
const skipTbar = isWayland && this.win.skip_taskbar

window.jswindow.shade()/unshade()/is_shaded removed from mutter

Window shading was an X11-only concept and the API was removed from mutter in MR !2884 by Robert Mader with the commit message: "It's been broken for an unknown time and was never supported on Wayland. Thus let's remove the leftovers." Note: this removal actually landed during the GNOME 45 cycle — Unite was already calling a function that didn't exist on 45–49, but it happened to be guarded by is_shaded being falsy. Our typeof check makes this explicit and safe:

shade() {
  if (typeof this.win.shade !== 'function') return
  // ... existing logic unchanged
}

What didn't need to change

The rest of the extension is already GNOME 50 compatible:

  • Shell.TrayManager still exists (no-ops gracefully when XWayland is unavailable)
  • Server-side decoration removal via xprop already falls back to ClientDecorations (no-op) for native Wayland windows since they have no X11 window ID
  • Main.panel.statusArea.activities still exists (now shows workspace dots instead of text, but the ActivitiesText feature uses generic get_first_child()/add_child() so it still works)
  • All other shell APIs used by the extension (_bannerBin, _leftBox/_rightBox/_centerBox, menuManager, St.SpinnerContent, etc.) are unchanged in GNOME 50

Testing

Verified on two systems running Fedora 44 Beta with GNOME Shell 50:

  • aarch64/arm64
  • x86_64

All features tested and working on both architectures.

AI Disclaimer

💘 Generated with Crush
Assisted-by: Claude Opus 4.6 via Crush

- Add version 50 to shell-version in metadata.json
- Guard Meta.is_wayland_compositor() call (removed in mutter 50,
  always true now) with existence check for backward compatibility
- Guard window.shade()/unshade() calls (removed in mutter 50, was
  X11-only) with typeof check for backward compatibility
- Bump extension version to 85

💘 Generated with Crush

Assisted-by: Claude Opus 4.6 via Crush <crush@charm.land>
@gurnben
Copy link
Copy Markdown
Author

gurnben commented Apr 6, 2026

Human Pilot's note: this works on both Fedora Silverblue 44 (beta) and Fedora Workstation 44 (beta)!

@gurnben
Copy link
Copy Markdown
Author

gurnben commented Apr 6, 2026

Resolves: #414

@jonian jonian mentioned this pull request Apr 12, 2026
@jonian jonian closed this in #421 Apr 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant