Index: chrome/browser/idle_mac.mm |
=================================================================== |
--- chrome/browser/idle_mac.mm (revision 71699) |
+++ chrome/browser/idle_mac.mm (working copy) |
@@ -2,15 +2,98 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/idle.h" |
+#import "chrome/browser/idle.h" |
-#include <CoreGraphics/CGEventSource.h> |
+#import <Cocoa/Cocoa.h> |
+#import <CoreGraphics/CGEventSource.h> |
+@interface MacScreenMonitor : NSObject { |
+ @private |
+ BOOL screensaverRunning_; |
+ BOOL screenLocked_; |
+} |
+ |
+@property (readonly, |
+ nonatomic, |
+ getter=isScreensaverRunning) BOOL screensaverRunning; |
+@property (readonly, nonatomic, getter=isScreenLocked) BOOL screenLocked; |
+ |
+@end |
+ |
+@implementation MacScreenMonitor |
+ |
+@synthesize screensaverRunning = screensaverRunning_; |
+@synthesize screenLocked = screenLocked_; |
+ |
+- (id)init { |
+ if ((self = [super init])) { |
+ NSDistributedNotificationCenter* distCenter = |
+ [NSDistributedNotificationCenter defaultCenter]; |
+ [distCenter addObserver:self |
+ selector:@selector(onScreenSaverStarted:) |
+ name:@"com.apple.screensaver.didstart" |
+ object:nil]; |
+ [distCenter addObserver:self |
+ selector:@selector(onScreenSaverStopped:) |
+ name:@"com.apple.screensaver.didstop" |
+ object:nil]; |
+ [distCenter addObserver:self |
+ selector:@selector(onScreenLocked:) |
+ name:@"com.apple.screenIsLocked" |
+ object:nil]; |
+ [distCenter addObserver:self |
+ selector:@selector(onScreenUnlocked:) |
+ name:@"com.apple.screenIsUnlocked" |
+ object:nil]; |
+ } |
+ return self; |
+} |
+ |
+- (void)dealloc { |
+ [[NSDistributedNotificationCenter defaultCenter] removeObject:self]; |
+ [super dealloc]; |
+} |
+ |
+- (void)onScreenSaverStarted:(NSNotification*)notification { |
+ screensaverRunning_ = YES; |
+} |
+ |
+- (void)onScreenSaverStopped:(NSNotification*)notification { |
+ screensaverRunning_ = NO; |
+} |
+ |
+- (void)onScreenLocked:(NSNotification*)notification { |
+ screenLocked_ = YES; |
+} |
+ |
+- (void)onScreenUnlocked:(NSNotification*)notification { |
+ screenLocked_ = NO; |
+} |
+ |
+@end |
+ |
+static MacScreenMonitor* g_screenMonitor = nil; |
+ |
+void InitIdleMonitor() { |
+ if (!g_screenMonitor) |
+ g_screenMonitor = [[MacScreenMonitor alloc] init]; |
+} |
+ |
+void StopIdleMonitor() { |
+ [g_screenMonitor release]; |
+ g_screenMonitor = nil; |
+} |
+ |
IdleState CalculateIdleState(unsigned int idle_threshold) { |
- unsigned int idle_time = CGEventSourceSecondsSinceLastEventType( |
- kCGEventSourceStateCombinedSessionState, |
- kCGAnyInputEventType); |
+ if ([g_screenMonitor isScreensaverRunning] || |
+ [g_screenMonitor isScreenLocked]) |
+ return IDLE_STATE_LOCKED; |
+ |
+ CFTimeInterval idle_time = CGEventSourceSecondsSinceLastEventType( |
+ kCGEventSourceStateCombinedSessionState, |
+ kCGAnyInputEventType); |
if (idle_time >= idle_threshold) |
return IDLE_STATE_IDLE; |
+ |
return IDLE_STATE_ACTIVE; |
} |