Skip to content

feat: full-screen session menu with window switcher (Steam Shift+Tab style) - #120

Merged
lippdev merged 6 commits into
mainfrom
feat/session-menu-redesign
Sep 30, 2026
Merged

lippdev merged 6 commits into
mainfrom
feat/session-menu-redesign

Conversation

@lippdev

@lippdev lippdev commented Sep 30, 2026

Copy link
Copy Markdown
Owner

Stacked on #117. Redesigned session menu: full-screen, Steam Shift+Tab style, in-menu Alt+Tab window grid, previewable outside a session, no window frame, Windows glass when transparency effects are on, selection ring and controller-flow fixes.

Build left to CI (Windows only); unit tests pass locally. Manual checks are in docs/TESTING.md.

🤖 Generated with Claude Code

lippdev and others added 4 commits September 30, 2026 16:07
…iew)

The Select + Y menu is the core of the app, so it gets the same language as
the console interface.

Look and motion
- Acrylic glass (DesktopAcrylicBackdrop) with rounded corners (DWM), icon
  tiles like the console quick settings, a volume gauge, a filled main exit.
- The panel slides up and fades in; the tiles come in 45 ms apart; closing
  fades and sinks it, then closes (by timer, so a stalled composition can
  never leave the window up). The sub-picker fades and rises in. All of it is
  skipped when Windows animations are off.
- The focused tile outlines in white and grows, on the composition visual:
  once a tile's visual is used for the entrance, WinUI refuses
  UIElement.Scale / CenterPoint on it (that threw in the first build).
- Move / confirm / back sounds; the arrows go through GamepadNavigator (aligned
  card, then the nearest), and the picker confines the focus to itself.

Preview (this alpha)
- The menu opens without a session (shortcut, tray, consolemode://menu) on the
  game screen if it is on, else the primary one, with a "Preview" badge. FPS
  (needs a restore afterwards) is hidden, "Back to the PC" becomes "Close
  menu" and Exit only exits the app: nothing tries to restore a session that
  does not exist.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
A new "Windows" tile in the session menu opens a strip with one card per open
window, front to back, each with the program's icon, its name and the title.
The D-pad picks, A brings the window to the front, X (Square on PlayStation)
or Delete asks it to close, B goes back. It opens on the second card like
Alt + Tab, since the first is the window that was in front.

- AltTabRules (pure, tested) holds the listing rules Windows applies to its
  own Alt + Tab: visible, not cloaked, titled, not a tool window or an owned
  dialog unless it says it is an app window, not the shell, not our own menu.
- WindowSwitcher lists, activates (restoring a minimized window, without
  leaving it topmost) and closes (WM_CLOSE, so a window that asks to save
  keeps its card). Icons load after the cards show, through the shell
  thumbnail; protected app folders keep the generic icon.
- Switching does not end a session: the engine decides that by whether Big
  Picture / Playnite is still visible, not by focus.
- The veils of the picker and the switcher are nearly opaque so the tiles do
  not ghost through the lists.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…erlay

The session menu was a fixed-size panel in the middle of the game screen, so
on a big display it looked small. It now covers the whole screen, like Steam's
overlay: the game dims and blurs behind it, the options sit in a glass side
panel and the open windows fill the middle.

- WindowPlacement.FillScreen puts the borderless, topmost window over the
  whole monitor (the game screen in a session, the primary one in the preview).
- Side panel (left): back to the game, volume with a gauge, resolution, audio,
  FPS, HDR, the coming-soon recording row, then the two ways out, the main one
  filled. Rows grow 2.5% when focused; the window cards 6%.
- The open windows are always on screen (the "Windows" tile and the separate
  strip are gone): the in-menu Alt + Tab is a grid with one card per window.
  The D-pad moves between the panel and the grid, A brings a window to the
  front, X / Delete closes it, B goes back to the game.
- GamepadNavigator.NearestOnSides lets left/right jump to the nearest control
  when nothing shares the row: the panel and the grid are side by side and
  never do.
- Entrance: the header drops in, the panel slides in from the left with its
  rows one after another, then the windows and the hints; closing fades and
  sinks it. All skipped when Windows animations are off.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…, controller flow

Reviewed with the ui-ux-pro-max (WinUI 3 stack) and hallmark (audit) design
skills, kept out of the repo (installed under .claude/skills, git-excluded).

Look
- The light 3 px frame around the full-screen menu was the classic window
  frame: WinUI's SetBorderAndTitleBar(false, false) leaves WS_DLGFRAME and
  WS_EX_WINDOWEDGE on, which also shrank the client area (1914x1074 in
  1920x1080). WindowChrome.Strip removes them; the toast uses it too.
- Glass (DesktopAcrylicBackdrop) only when Windows' transparency effects are
  on, re-applied live on UISettings.ColorValuesChanged; otherwise a solid dark
  panel with the same contrast.
- One selection marker: a 2 px ring on the edge of the row or card (it sat 5
  px out with a gap of background before), no hairline on the rows or the panel
  (a bordered container holding bordered cards), rows stay still, cards grow 4%.
- Colours are named tokens with a high-contrast variant instead of ~30 inline
  hex values; labels 14 -> 16 px and hints 15 -> 17 px for a couch.

Controller
- Left from the grid returns to the panel row you came from; up/down stay inside
  the panel or the grid, so the end of a list is an end (no jump to the other
  side or to the card beside it: GamepadNavigator.ReadingOrderFallback).
- The picker gives the focus back to the row that opened it; closing a window
  card moves the focus to the next card.

Robustness
- A menu that fails to build is logged and dropped instead of crashing the app
  (a bad resource lookup had taken the process down with a stowed exception).

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The preview can leak HDR restore bookkeeping into the next session, and a failed window activation still dismisses the switcher.

Reviewed changes This review covers the full-screen session menu, preview/session behavior, window switcher, and controller navigation.

  • Session menu redesign Replaces the compact overlay with a full-screen, themed and animated menu, including selection and picker focus handling.
  • Window switcher Adds native window enumeration, activation and close actions with an always-visible card grid.
  • Preview and input behavior Opens the menu outside a session and updates menu actions, display/audio/HDR handling, and directional navigation.
  • Localization and verification Adds all three translation catalogs, manual test steps, and pure window-filtering tests.

Note: 1 inline comment(s) dropped because they did not anchor to lines inside the PR diff:

  • src/ConsoleMode/ViewModels/MainViewModel.SessionMenu.cs:296 (RIGHT) — line 296 (RIGHT) is not inside a diff hunk

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using GPT Luna | 𝕏

Comment thread src/ConsoleMode/ViewModels/MainViewModel.Switcher.cs Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes This incremental review covers the window-activation failure fix and its documentation.

  • Kept the menu available after activation failure Changed the switcher to close only when Windows reports successful activation, preserving the retry path.
  • Added failure-case coverage guidance Documented manual checks for stale windows and Windows foreground-activation denial, and recorded the fix in both changelogs.

Pullfrog  | View workflow run | Using GPT Luna | 𝕏

@lippdev
lippdev changed the base branch from feat/console-ui-tabs-background-sounds to main September 30, 2026 21:51
@lippdev
lippdev merged commit 2b28067 into main Sep 30, 2026
2 checks passed
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