Skip to content

Match Windows ZoomIt behavior: bug fixes and UI polish - #34

Merged
markrussinovich merged 20 commits into
mainfrom
bugfixes
Jul 20, 2026
Merged

Match Windows ZoomIt behavior: bug fixes and UI polish#34
markrussinovich merged 20 commits into
mainfrom
bugfixes

Conversation

@markrussinovich

Copy link
Copy Markdown
Contributor

Summary

A batch of bug fixes and UI polish to bring ZoomIt for Mac closer to the Windows ZoomIt behavior. Each change is committed individually and covered by the ZoomItMacSelfTest self-test suite (all passing).

Behavior fixes (Windows parity)

  • Static zoom stays active at 1x instead of exiting when you zoom all the way out (only Esc/right-click exits). Live zoom still exits at the floor.
  • Break timer custom background image no longer rendered upside down (flip-aware drawing in the flipped view).
  • Panorama region rectangle rendered in a distinct color, and Escape now cancels/exits panorama during the scrolling capture.
  • Screen saver / display sleep is blocked while the break timer is on (IOKit power assertion).
  • Menu-bar menu reordered to match Windows (Options first, then modes, then Check Permissions/Quit); added a Draw item.
  • Clip editor: changing the transition (e.g. Fade to Black → Fade to White) now updates existing joins and the preview.
  • Webcam overlay can be click-dragged to reposition (recorded composite follows).
  • Trim: editing an existing video no longer deletes the original file (copy vs. move).
  • Settings window floats on top so it can't get lost behind other windows (which left hotkeys suspended and the app seemingly unresponsive).

Options dialog (match Windows)

  • Split Live Zoom into its own tab so the Zoom tab holds static-zoom settings only.
  • Draw tab: removed "default pen width"; blank-screen is now Ctrl+W / Ctrl+K with matching help text.
  • Type tab: the "Sample" preview now renders in the selected font.

UI polish

  • Padded the menu-bar (tray) icon so it matches system icon size/alignment.
  • Moved the Break Timer menu item below Panorama Capture.
  • Permissions dialog uses a standard rounded-square icon, aligned with the heading text.
  • Default typing font is the Mac system font at 20pt, regular (non-bold) weight.
  • Aligned the Break tab controls (timer, colors, position, opacity, backdrop) in a grid.
  • Panorama region rectangle set to blue to stay distinct from the orange screen-recording border.

Not included

  • The Draw-tab blur tool (a larger feature spanning the live/record/export pipeline) is deferred and not part of this PR.

Testing

  • swift build succeeds.
  • swift run ZoomItMacSelfTest passes (new tests added for each behavioral change).

Mark Russinovich added 20 commits July 17, 2026 21:50
Copilot AI review requested due to automatic review settings July 20, 2026 01:59

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR batches a set of behavior fixes and UI polish changes to bring ZoomIt for Mac closer to Windows ZoomIt parity, including options-dialog structure, input behavior, capture/overlay behavior, and visual alignment tweaks.

Changes:

  • Refactors/updates the Settings (Options) UI: separate Live Zoom tab, grid-aligned Break tab, always-on-top settings window, corrected Draw/Type tab behaviors.
  • Improves parity and UX across modes: static zoom no longer exits at 1x, panorama selection border is distinct (blue) and Escape cancels capture, break-timer background drawing respects flipped coordinates, break timer prevents idle display sleep.
  • Adds/updates self-tests covering the newly introduced behaviors and regressions.

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
Sources/ZoomItMacCore/Settings/SettingsWindowController.swift Splits Live Zoom into its own tab, adds always-on-top behavior, refactors Break tab layout into a grid, updates Draw/Type tab behavior.
Sources/ZoomItMacCore/Settings/SettingsStore.swift Adjusts default typing font size to 20pt for Windows parity/UI polish.
Sources/ZoomItMacCore/SelfTest/SelfTestRunner.swift Adds self-tests validating the new parity behaviors and UI rendering expectations.
Sources/ZoomItMacCore/Overlay/ZoomCanvasView.swift Updates W/K drawing shortcuts to use Ctrl for blank-screen and adds helper decision function.
Sources/ZoomItMacCore/Overlay/BreakTimerController.swift Fixes break-timer background rendering in flipped views; acquires/releases idle-sleep assertion during break timer.
Sources/ZoomItMacCore/Core/ModeCoordinator.swift Changes zoom-out floor behavior so static zoom stays active at 1x while live zoom still exits.
Sources/ZoomItMacCore/Capture/WebcamOverlayController.swift Makes the webcam overlay draggable and keeps the recorded composite frame in sync.
Sources/ZoomItMacCore/Capture/VideoClipEditorController.swift Ensures changing the transition updates existing append joins and refreshes preview/timeline.
Sources/ZoomItMacCore/Capture/SnipController.swift Adds border-color customization and a render-for-testing helper for selection UI.
Sources/ZoomItMacCore/Capture/RecordingController.swift Preserves original file when trimming by choosing copy vs move based on edit output.
Sources/ZoomItMacCore/Capture/PanoramaController.swift Adds Escape-to-cancel capture behavior and uses blue selection border for panorama region selection.
Sources/ZoomItMacCore/App/IdleSleepAssertion.swift Introduces an injectable IOKit assertion wrapper to prevent idle display sleep during break timer.
Sources/ZoomItMacCore/App/AppIcon.swift Adds a standardized rounded-square icon renderer for dialogs/pickers.
Sources/ZoomItMacCore/App/AppDelegate.swift Reorders status menu via a declarative entry list; adds Draw item; pads menu-bar icon rendering.
Sources/ZoomItMacCore/App/AppController.swift Adds Draw activation hook and switches permissions dialog icon to the standard rounded-square icon.
Sources/ZoomItMacCore/Annotations/AnnotationController.swift Updates default typing font size and changes fallback system font weight to regular.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +606 to +611
escapeLocalMonitor = NSEvent.addLocalMonitorForEvents(matching: [.keyDown]) { [weak self] event in
guard event.keyCode == 53 else { return event }
Task { @MainActor in self?.cancelCapture() }
return nil
}
}
@markrussinovich
markrussinovich merged commit 6a398f9 into main Jul 20, 2026
4 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.

3 participants