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