From d4a332f62c14341871d2ffd6e3ebd994b9494137 Mon Sep 17 00:00:00 2001 From: Bryan Vargas Date: Wed, 17 Dec 2025 02:54:01 -0600 Subject: [PATCH] feat: Add live updates for remaining time in menu - Add NSTimer to update remaining time every second - Use NSRunLoopCommonModes so timer fires while menu is open - Implement menuWillOpen: and menuDidClose: delegates - Timer starts when menu opens, stops when menu closes The timer must use NSRunLoopCommonModes because the menu tracking uses NSEventTrackingRunLoopMode, not the default mode. --- .../KYAActivationDurationsMenuController.m | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/KeepingYouAwake/KYAActivationDurationsMenuController/KYAActivationDurationsMenuController.m b/KeepingYouAwake/KYAActivationDurationsMenuController/KYAActivationDurationsMenuController.m index d9bddeb2..16befae9 100644 --- a/KeepingYouAwake/KYAActivationDurationsMenuController/KYAActivationDurationsMenuController.m +++ b/KeepingYouAwake/KYAActivationDurationsMenuController/KYAActivationDurationsMenuController.m @@ -16,6 +16,7 @@ @interface KYAActivationDurationsMenuController () @property (nonatomic, readwrite) NSMenu *menu; +@property (nonatomic) NSTimer *updateTimer; @end @implementation KYAActivationDurationsMenuController @@ -111,7 +112,7 @@ - (nullable NSMenuItem *)menuItemForRemainingTime return menuItem; } -// TODO: Use this for live updates of the menu item +// Live updates of the remaining time menu item - (void)updateRemainingTime:(id)sender { Auto delegate = self.delegate; @@ -127,6 +128,26 @@ - (void)updateRemainingTime:(id)sender } } +- (void)startUpdateTimer +{ + if(self.updateTimer != nil) { return; } + + // Create timer manually and add to common modes so it fires while menu is open + // (menu tracking uses NSEventTrackingRunLoopMode, not NSDefaultRunLoopMode) + self.updateTimer = [NSTimer timerWithTimeInterval:1.0 + target:self + selector:@selector(updateRemainingTime:) + userInfo:nil + repeats:YES]; + [[NSRunLoop currentRunLoop] addTimer:self.updateTimer forMode:NSRunLoopCommonModes]; +} + +- (void)stopUpdateTimer +{ + [self.updateTimer invalidate]; + self.updateTimer = nil; +} + #pragma mark - NSMenuDelegate - (void)menuNeedsUpdate:(NSMenu *)menu @@ -178,4 +199,14 @@ - (void)menuNeedsUpdate:(NSMenu *)menu } } +- (void)menuWillOpen:(NSMenu *)menu +{ + [self startUpdateTimer]; +} + +- (void)menuDidClose:(NSMenu *)menu +{ + [self stopUpdateTimer]; +} + @end