I made this change in haste. It breaks the old behavior with
auto-hiding menu bars. Also, the occulsion check doesn't seem
to work as it always returns false. The way to handle menu bar
hiding apps needs to be thought through more carefully. What is
the right expectation when using a hiding app? What is the
right expectation when macOS crowds out menu items?
This reverts commit 82ac22c392.
The block-based addObserverForName: calls in fileNotifications captured
self strongly. The returned observer tokens were never stored, so
removeObserver:self in dealloc couldn't remove them (that API only
removes selector-based observers, not block-based ones).
- Use weak-strong pattern in each block to avoid retaining self.
- Store returned observer tokens in _notificationTokens.
- Remove each token in dealloc for proper cleanup.
MoCalTooltipWindow is borderless and returns NO from canBecomeKeyWindow.
showWindow: internally calls makeKeyAndOrderFront: which triggers:
Warning: -[NSWindow makeKeyWindow] called on <MoCalTooltipWindow>
which returned NO from -[NSWindow canBecomeKeyWindow].
Use orderFront: instead since the tooltip doesn't need key status.
Set project-level build settings to sign-to-run-locally defaults
so the project builds out of the box without a Local.xcconfig. Remove
signing settings from target-level build settings entirely so
Local.xcconfig can override them cleanly. Update Local.xcconfig.example
to reflect all required keys for both options.
Move DEVELOPMENT_TEAM and provisioning settings out of project.pbxproj
into a gitignored Local.xcconfig, so contributor signing configs are
never accidentally committed. Add Local.xcconfig.example as a template,
CONTRIBUTING.md with setup instructions, and a GitHub Actions workflow
that fails any PR modifying signing settings in project.pbxproj.
Itsycal doesn't currently do well in situations when the menubar
icon isn't visible. This can be the case either because there isn't
enough space in the menubar for the icon, or because the user is
using a menubar management app to hide it.
- When there isn't enough space, the icon is invisible but still
positioned to the left of the visible ones: as a result, Itsycal
show its window pointing to one of the frontmost app's main menus.
- When the icon was purposefully hidden (I tested with Ice.app),
the icon's location is far off-screen, and as a result, the
Itsycal window doesn't show at all.
This commit detects both cases of icon invisibility, and falls back
to positioning the window against the right edge of the screen.
macOS 26 controls are generally lower contrast and
thus harder to visually parse. Increase contrast
of toolbar icons and add a border around the
calendar picker in the General pane.
macOS 26 adopts a new .icon format to support the
new Liquid Glass design. Legacy icons in .icns
format are shown in the new OS in 'icon jail':
reduced size against a grey squircle background.
The OS applies styling to these icons to mimic
the glass effect for dark, clear, and tint modes.
Icon jail appears to be an attempt to shame
developers to conform to Apple's strictures.
For now I've chosen to tweak the legacy icon to
look somewhat better in jail. The outline is a
squircle instead of a rounded rect and the contrast
is higher. The new .icon format adds considerable
bloat to the app size which costs me $ every time
the app is downloaded for no discernible benefit.
As the app has no Dock icon, the only time the
icon is seen is in the Finder. Strangely, as of
macOS 26.1, this icon is NOT in jail when shown
at the small size in the Finder's list view.
Tahoe appears to handle memory management of
NSTableView differently from previous versions of
macOS. In the past, a table view would manage a
reuse pool of table view cells in order to minimize
memory allocation and deallocation. Instead of
deallocating unused cells, the table view would
hold them in a reuse pool. When a new cell was
needed, the reuse pool would first be checked. If
a cell was found there, a new allocation was
avoided.
In Tahoe, the table view appears to deallocate
unused cells and allocate every time a new one is
needed.
This new behavior caused a memory leak because old
agenda table view cells could never be deallocated
because they were held by a strong reference from
NSNotificationCenter for the kSizeDidChangeNotification.
To fix, change the way these notifications are
observed so they can easily be deallocated. The
notification is posted to the main thread since
its selector updates the UI.
Since macOS 15 Sequoia, if the current locale's
calendar is ISO 8601, NSDateFormatter won't honor
the EEE format and simply omits showing the day
of the week.
0.15.5 introduced a terminal-only ShowEventPopoverOnHover option
which opens and closes the event agenda popovers on hover in and
out events, but there is a bug causing a part of that behavior to leak
into the default mode when this property is either disabled or not set.
kShowEventPopoverOnHover is an NSCFConstantString instance and
is a truthy value, so this code path is always taken and the popover
closes when it should only react to explicit interactions.