Conversation
… GNOME implementation These four window-manager actions had no universal Linux equivalent and were silently skipped. GNOME's default keybindings cover all four (a bare Super tap toggles the overview, Super+D shows the desktop, Super+A shows the app grid) via plain synthetic key presses through the existing uinput device — no D-Bus needed. Gated on XDG_CURRENT_DESKTOP so other desktops (KDE binds Super to KRunner, for one) keep the existing no-op.
|
10 tasks
AppExpose and MissionControl shared one match arm sending GNOME's bare-Super Activities tap, but Activities shows every window across every app -- AppExpose's contract is the frontmost app's windows only, which no tested desktop (GNOME's Activities, KDE's Present Windows) actually has a stock binding for. AppExpose now always skips with the existing "no Linux equivalent" debug log instead of substituting the wrong scope. Also replaced the env-var-mutating test for is_gnome() with a pure desktop_is_gnome(str) helper: the previous test's SAFETY comment claimed a private per-test mutex serialized access to the process environment, but that mutex only serializes callers that take it -- it does nothing for is_gnome() itself or any other concurrent reader, which is exactly the class of race Rust 2024 made set_var/remove_var unsafe over. The pure helper needs no unsafe and no env mutation at all.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
App Expose(or Mission Control / Show Desktop / Launchpad) does nothing on GNOME —crates/openlogi-inject/src/inject/linux.rs::dispatch_nativegroups all four into a no-op branch that only logsno Linux equivalent — action skipped.Root cause / approach
There genuinely is no universal Linux equivalent (different desktops bind Super differently — KDE opens KRunner, for instance), which is why the existing code punts entirely. But GNOME specifically has stable default keybindings for all four:
org.gnome.mutter.overlay-key) toggles the Activities overview — this covers bothMissionControlandAppExpose.Super+Dis GNOME's default "Show desktop".Super+Ais GNOME's default "Show Applications" (app grid) — coversLaunchpadShow.I initially looked at the D-Bus route the issue mentions (
org.gnome.Shell.Eval), since the reporter said it worked for them, but that method requires GNOME's "unsafe-mode" to be explicitly enabled (disabled by default), so it isn't something that works out of the box for most users. Plain synthetic key presses through the existinguinputdevice need no such opt-in and work exactly like a real keypress.Changes
crates/openlogi-inject/src/inject/linux.rs:MissionControl/AppExpose/ShowDesktop/LaunchpadShownow go through a newgnome_key_or_skiphelper — presses the matching GNOME keybinding under GNOME (detected viaXDG_CURRENT_DESKTOP, case-insensitive substring match, matching the existing detection idiom incrates/openlogi-desktop/src/features/profiles/catalog.rs), and falls back to the original no-op + debug log everywhere else, per the issue's own request to leave other desktops alone until they have a stable implementation.Testing
gnome_detection_matches_on_current_desktop_case_insensitively, covering exact match, a compoundXDG_CURRENT_DESKTOPvalue (ubuntu:GNOME), a GNOME variant (gnome-classic), a non-GNOME desktop, and unset.cargo fmt --all -- --check,cargo clippy -p openlogi-inject -p openlogi-agent-core -p openlogi-agent -p openlogi-hook -p openlogi-desktop -p openlogi-overlay --all-targets -- -D warnings, andcargo testfor that same affected set (openlogi-inject's reverse-dependency closure) — all green.Fixes #1042