Skip to content

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

Open
arsarsars1 wants to merge 16 commits into
MonitorControl:mainfrom
arsarsars1:feat/tahoe-compatibility
Open

Fix UI display issues and improve macOS Tahoe/Sequoia support#1827
arsarsars1 wants to merge 16 commits into
MonitorControl: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
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.

@waydabber
Copy link
Copy Markdown
Member

Thank you for the update. It seems to me like the situation did not change much though. I now see the OSD is more rounded, however the offending corners are still there. Also, the percentage value looks a bit unfinished (white on white, big bold numbers, somewhat outside of an appropriate padding).

Screenshot 2026-04-19 at 8 04 24

The app menu/sliders look the same as before but with colored icons. I feel it does not fit the app's old aesthetics nor the current established Tahoe UI design language in an organic way.

Screenshot 2026-04-19 at 8 04 43

I think the ideal approach would be to leave the app menu look as before and maybe provide a minimal OSD that just fits nicely in Tahoe (note: maybe use glass).


Anyway, I really appreciate the effort, it's just that maybe the vision we have about how the app UI should look like diverges a bit. I recommend keeping and improving your fork of MonitorControl, gather some more feedback from users and do a PR when you feel the solution is more mature.

@waydabber waydabber added the feedback needed from reporter Waiting for issue reporter to provide feedback (see comments) label Apr 19, 2026
@waydabber
Copy link
Copy Markdown
Member

(note: some of the issues - like the funny looking sliders - are because UIDesignRequiresCompatibility was not enabled for the project).

- Make Custom HUD background transparent to avoid square opaque corners
- Update custom HUD icon and slider colors for better macOS integration
- Adjust Menu Slider icon padding and layout constraints
@arsarsars1
Copy link
Copy Markdown
Author

I’ve pushed a few UI/UX refinements to address the aesthetic issues and bring the project closer to native macOS styling:

  1. Refined Slider Aesthetics: Updated the menu sliders (MCSliderCell) to use semi-transparent whites (0.85-0.9 alpha). This removes the previous "funny" solid look and provides a much more premium, modern feel that blends well with the system.
  2. Re-enabled Dynamic Icons: The speaker icons in the volume sliders now dynamically update as you slide (swapping between the slash and wave variants), providing better visual feedback.
  3. HUD Polish: Adjusted the Custom HUD progress bar transparency to match the new slider aesthetic for better consistency across the app.
  4. Compatibility: Verified that UIDesignRequiresCompatibility is correctly enabled, ensuring these custom UI elements render as intended on the latest SDKs/Tahoe.

Attached are two screenshots showing the improved look. @waydabber

Screenshot 2026-04-20 at 6 14 16 PM Screenshot 2026-04-20 at 6 13 51 PM

@waydabber
Copy link
Copy Markdown
Member

The white on light-gray OSD still does not feel professional I think (first screenshot).

As for the second screenshot, I think the menu should look like as before, there is no need to change that (or if there is a change, then it should be updated to a full Tahoe style):

Screenshot 2026-04-20 at 17 39 12

Just a general question (no judgement + no offense intended, I just want to understand): are you AI vibe-coding this or are you an experienced Swift/macOS programmer? Honestly, if it's (mostly) AI, then I am not sure this method of instructing the AI through You is super efficient - I should then probably just do whatever changes I feel fit to simplify the process. Let me know if you agree with this. Of course if your work is fully hand-made, then the appropriate course of action is to honor the work involved and keep giving feedbacks/reviews and nudge this in the right direction step by step. Thank you!

@arsarsars1
Copy link
Copy Markdown
Author

Thanks for the honest feedback! It's really helped nudge the design in the right direction.

Regarding your review:

OSD Professionalism: I've completely reworked the Custom OSD. It now uses a transparent root view wrapper which definitely fixes the "offending corners" artifact. It also uses a vibrant dark material (.popover with .vibrantDark) and a subtle 1px edge highlight for a much more polished, native look.
Menu Style: I've kept the menu layout consistent but refined the colors and re-enabled the volume-dependent icon switching for better interactivity. I've also verified everything looks correct even with UIDesignRequiresCompatibility active.
To be completely transparent—yes, I am using an AI coding assistant to help me with these contributions! I'm not a professional Swift developer, but I use MonitorControl every day, so I’m using AI in my free time to help contribute and improve the apps we all use.

I appreciate your patience and detailed reviews as I work through these steps with the assistant. I think the latest version hits the "pro" vibe we were looking for!

I've also rebuilt and launched the latest version for you to test locally. Everything should be looking great now!

Screenshot 2026-04-21 at 1 14 40 AM Screenshot 2026-04-21 at 1 14 31 AM

@The-BigBoss
Copy link
Copy Markdown

The-BigBoss commented Apr 21, 2026

Hi @arsarsars1 我认为 @waydabber 的意思是让第三方显示器在使用Monitor Control调节亮度和音量的时候,看上去更像是在调节Apple公司出品的XDR Display 或 Studio Display一样,当按下 亮度+/- 或 音量+/-、静音 时,屏幕上可以显示(或模仿)类似macOS Tahoe原生UI的那种效果。

121

因为目前版本(4.3.3)的Monitor Control调节第三方显示器时,可以在Sequoia或以前版本的macOS调用原生UI,但是无法在Tahoe上正常调用系统UI,目前的思路是,既然无法调用系统UI,就制作一个复刻的Tahoe的UI。


Hi @arsarsars1, I think what @waydabber means is that when using Monitor Control to adjust brightness and volume on third-party displays, it should look more like adjusting an Apple XDR Display or Studio Display — i.e., when pressing brightness +/- or volume +/- / mute, the on-screen display should show (or mimic) an effect similar to the native macOS Tahoe UI.
121
The current version (4.3.3) of Monitor Control can invoke the native UI on Sequoia or earlier macOS versions when adjusting third-party displays, but it cannot properly invoke the system UI on Tahoe. The current idea is: since the system UI cannot be invoked, we should create a replica of the Tahoe UI.

@waydabber waydabber added fork recommendation Unplanned PR (typically AI) with improvements which may be of interest to the community and removed in progress Issue currently being worked on feedback needed from reporter Waiting for issue reporter to provide feedback (see comments) labels May 9, 2026
@waydabber
Copy link
Copy Markdown
Member

Note: As AI generated PRs are getting more numerous now, I made decision that I won't review AI generated PRs/forks due to lack of time and resources. Of course other maintainers can help with this. I will not close such PRs however, but add a fork recommendation label so these forks are visible here for anybody who might be interested in this specific addition. If this is an original (non-AI) work with major effort involved, please let me know - I want to better honor such PRs and provide a more appropriate feedback as soon as I have the time. Thank you for your understanding!

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

Labels

fork recommendation Unplanned PR (typically AI) with improvements which may be of interest to the community

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants