Skip to content

Fix UI display issues and improve macOS Tahoe/Sequoia support#1827

Open
arsarsars1 wants to merge 7 commits intoMonitorControl:mainfrom
arsarsars1:feat/tahoe-compatibility
Open

Fix UI display issues and improve macOS Tahoe/Sequoia support#1827
arsarsars1 wants to merge 7 commits intoMonitorControl:mainfrom
arsarsars1:feat/tahoe-compatibility

Conversation

@arsarsars1
Copy link
Copy Markdown

@arsarsars1 arsarsars1 commented Dec 27, 2025

Overview

This PR addresses UI display issues and improves macOS Tahoe (15.x) / Sequoia compatibility, with follow-up fixes for OSD behavior, keyboard volume capture, and HUD lifecycle.

Changes Made

UI Fixes

  1. Menu Bar Slider

    • Redesigned layout: icon above slider (column style), left-aligned with the slider
    • Increased view height for spacing; fixed icon/slider overlap
    • Menu SF Symbols use palette configuration on macOS 12+ to avoid white “matting” around filled glyphs (e.g. brightness sun icon)
  2. Preferences — Displays Tab

    • Fixed truncated display friendly name field (taller field, better alignment with larger fonts)
  3. Preferences — About Tab

    • Fixed truncated application name label
  4. Preferences — Keyboard Tab

    • Accessibility troubleshooting UI (Help, Reset Accessibility via tccutil where applicable)
    • Volume control: new option Standard keys (force capture) — always captures volume/mute media keys even when the default output device supports native macOS volume (same intent as community PR Add "Standard keys (force capture)" option to volume control dropdown #1846; included here to ship with Tahoe work)
    • Volume control popup widened slightly to fit the new menu title

macOS Tahoe / Sequoia / 26 Support

  1. Custom HUD for broken native OSD

    • On macOS 26+, OSDUtils uses a custom HUD (CustomHUD.swift) instead of private OSDManager where native OSD no longer shows reliable percentage/updates (per project README note on Tahoe)
    • Fade-out uses RunLoop common mode so the timer still fires during nested run-loop activity
    • Removed unused SwiftUI import from CustomHUD.swift
  2. HUD lifecycle

    • DisplayManager.clearDisplays() calls CustomHUDManager.cleanupDisplay per display so HUD windows/timers are not left behind after display reconnect or reconfigure
  3. Slider

    • Fixed percentage label updates (removed tautological percentageBox guard)

Files Touched (high level)

  • MonitorControl/Support/CustomHUD.swift — custom OSD UI
  • MonitorControl/Support/OSDUtils.swift — route to custom HUD on macOS 26+
  • MonitorControl/Support/SliderHandler.swift — menu slider layout & symbol rendering; percentage label fix
  • MonitorControl/Support/DisplayManager.swift — HUD cleanup when clearing displays
  • MonitorControl/Support/MediaKeyTapManager.swiftKeyboardVolume.mediaForce handling
  • MonitorControl/Enums/PrefKey.swiftmediaForce case
  • MonitorControl/Support/AppDelegate.swift, OnboardingViewController.swift — accessibility prompts include force-capture volume mode
  • MonitorControl/UI/Base.lproj/Main.storyboard, MonitorControl/UI/en.lproj/Main.strings — new volume menu item + layout
  • MonitorControl.xcodeproj/project.pbxproj, Info.plist files — project / version as needed

Testing

  • Tested on macOS Tahoe 15.x (UI, sliders, prefs, accessibility flow)
  • Verify custom HUD on macOS 26+ when adjusting brightness/volume/contrast
  • Verify Standard keys (force capture) keeps volume keys on MonitorControl when system would otherwise own them
  • Unplug/replug or reconfigure displays and confirm no stray HUD windows

Related

- **Menu Bar Slider**:
  - Redesigned layout to column style (icon above slider).
  - Aligned icon to left-start.
  - Increased vertical spacing and view height for better touch target and aesthetics.
  - Fixed icon vs slider overlap issues.

- **Preferences UI**:
  - **Displays**: Fixed truncated friendly name text field, increased height, and improved vertical alignment.
  - **About**: Fixed truncated app name text.
  - **Keyboard**: Improved layout of accessibility troubleshooting buttons (Help/Reset), added container/label for better grid alignment.

- **macOS Tahoe Support**:
  - Added accessibility permission reset functionality.
  - Implemented Custom HUD fallback for cases where native OSD is broken.
@waydabber
Copy link
Copy Markdown
Member

Hi @arsarsars1,

thank you for the pull request, I really appreciate it.

I am not sure I am entirely comfortable with the new menu layout, having the icons above the slider looks kind-of Strange (if we'd like to follow Tahoe style, maybe a min/max icon at both end of the slider might be better. Also, the super-small knob feels a bit strange:

Screenshot 2026-02-09 at 9 58 49

Regarding the OSD, it might need some things to iron out. There seem to be white corners (beyond the rounding) and the yellow brightness icon does not seem to fully follow the macOS vibe.

Screenshot 2026-02-09 at 10 00 25

Because of this, I am not yet ready to accept this PR just yet, but I leave it hanging here. But again, I appreciate your work, I just recommend iterating a bit on this.

@waydabber waydabber added feedback needed from reporter Waiting for issue reporter to provide feedback (see comments) in progress Issue currently being worked on and removed feedback needed from reporter Waiting for issue reporter to provide feedback (see comments) labels Feb 9, 2026
@sidevesh
Copy link
Copy Markdown

sidevesh commented Apr 5, 2026

@arsarsars1 are you planning on addressing the above issues ?

@arsarsars1
Copy link
Copy Markdown
Author

Hi @sidevesh, I will resolve the issues in the PR today. Thank you

Made-with: Cursor

# Conflicts:
#	MonitorControl/UI/cs.lproj/Localizable.strings
- Updated CFBundleVersion in Info.plist files for both MonitorControl and MonitorControlHelper.
- Adjusted HUD dimensions and layout in CustomHUD.swift for improved aesthetics.
- Enhanced SliderHandler to support accent fill for better visual distinction in menu symbols.
- Add KeyboardVolume.mediaForce and UI for always capturing volume/mute keys
- Clean up CustomHUD windows when displays are cleared
- Fix SliderHandler percentage label update (remove tautology check)
- CustomHUD: RunLoop.common timer, drop unused SwiftUI import
- Widen volume control popup for new menu item; en Main.strings

Made-with: Cursor
@arsarsars1
Copy link
Copy Markdown
Author

Hi @waydabber, the pr is updated. Thank you

- Draw the original soft ring + inner edge on BlockBorderOverlayView so the
  pre–visual-effect border look returns without relying on layer draw.
- Use NSVisualEffectView material .menu and blending .withinWindow so the
  card matches standard NSMenu rows (replacing .popover / .behindWindow).
- Light appearance uses a separator stroke instead of a white fill over the
  blurred material.
- Bump CFBundleVersion to 7182 in app and helper Info.plist.

Made-with: Cursor
@arsarsars1
Copy link
Copy Markdown
Author

Latest push (f403b30): Display block menu chrome

  • Restored the original multi-ring + inner-edge border via BlockBorderOverlayView (layer-backed NSVisualEffectView does not draw borders the old way).
  • Switched block material from .popover / .behindWindow to .menu / .withinWindow so the card matches the standard menu background next to the display name row.
  • Light mode: separator stroke instead of white fill over the blur.
  • CFBundleVersion7182 (app + helper).

@sidevesh
Copy link
Copy Markdown

@waydabber can we get this pr in now that @arsarsars1 has fixed the issues ?

@arsarsars1
Copy link
Copy Markdown
Author

@sidevesh yeah, the issue was fixed. It's ready for review. Thank you

@waydabber
Copy link
Copy Markdown
Member

Hi all, sorry for being slow will this, I'll review soon and let you know if there is anything else.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

in progress Issue currently being worked on

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants