* feat(tray): add IPC action to open tray menus
* tray: open IPC-requested menus on the focused screen only
---------
Co-authored-by: bbedward <bbedward@gmail.com>
closeHoverSurfaces() called TrayMenuManager.closeAllMenus(), tearing down
every registered tray menu including ones opened by right-click. With
hoverPopouts enabled, moving the pointer after a right-click re-ran the
hit test and closed the menu before it could be reached.
Tag each menu with how it was opened and add closeHoverMenus(), which
only closes hover-opened menus. The hover controller now uses that.
Click-driven callers pass no argument, so byHover stays undefined and
`byHover === true` evaluates to false.
Fixes#2978
Claude-Session: https://claude.ai/code/session_01DYF9vdsaToU4Usu7kxPCNB
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(bar): separate workspace appearance for unfocused displays
Add a toggle in the Workspace Appearance card to style workspace
indicators independently on displays that aren't currently focused.
The card is split into Focused Display and Unfocused Display(s) tabs.
When the new master toggle is off (default), unfocused displays inherit
the focused settings, preserving existing behavior. When on, unfocused
displays use their own colors (focused/occupied/unfocused/urgent) and
focused border (enable, color, thickness).
WorkspaceSwitcher resolves the focused monitor per compositor and routes
color/border resolution through isFocusedMonitor/useUnfocusedAppearance.
* refactor(bar): address review feedback for unfocused workspace appearance
- Consolidate focused-monitor lookup into BarWidgetService.getFocusedScreenName(),
adding Mango support, and drop the duplicate compositor switches in
WorkspaceSwitcher (effectiveScreenName + isFocusedMonitor now use the helper).
- Extract the shared color and border options into reusable
WorkspaceAppearanceColorOptions and WorkspaceAppearanceBorderFields components
so the focused and unfocused tabs no longer duplicate the layout.
- Gate the unfocused-display options on BarWidgetService.focusedScreenDetectionSupported
and show an explanatory note on compositors without focus detection (e.g. labwc),
instead of silently no-opping.