Index: chrome/browser/idle_mac.mm |
=================================================================== |
--- chrome/browser/idle_mac.mm (revision 71699) |
+++ chrome/browser/idle_mac.mm (working copy) |
@@ -2,15 +2,101 @@ |
// 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_; |
+} |
+ |
+- (BOOL)isScreensaverRunning; |
dmac
2011/01/25 05:04:37
You could also do this with properties
@property
jianli
2011/01/25 19:30:16
Done.
|
+- (BOOL)isScreenLocked; |
+ |
+@end |
+ |
+@implementation MacScreenMonitor |
+ |
+- (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; |
+} |
+ |
+- (BOOL)isScreensaverRunning { |
+ return screensaverRunning_; |
+} |
+ |
+- (BOOL)isScreenLocked { |
+ return screenLocked_; |
+} |
+ |
+@end |
+ |
+MacScreenMonitor* g_screenMonitor = nil; |
dmac
2011/01/25 05:04:37
should this be static or in an anonymous namespace
jianli
2011/01/25 19:30:16
Done.
|
+ |
+void InitIdleMonitor() { |
+ if (!g_screenMonitor) |
+ g_screenMonitor = [[MacScreenMonitor alloc] init]; |
+} |
+ |
+void StopIdleMonitor() { |
+ [g_screenMonitor release]; |
+ g_screenMonitor = nil; |
+} |
+ |
IdleState CalculateIdleState(unsigned int idle_threshold) { |
+ if ([g_screenMonitor isScreensaverRunning] || |
+ [g_screenMonitor isScreenLocked]) |
+ return IDLE_STATE_LOCKED; |
+ |
unsigned int idle_time = CGEventSourceSecondsSinceLastEventType( |
dmac
2011/01/25 05:04:37
you are changing a double (CFTimeInterval) into an
jianli
2011/01/25 19:30:16
This is from old code written by other people. Tha
|
kCGEventSourceStateCombinedSessionState, |
kCGAnyInputEventType); |
if (idle_time >= idle_threshold) |
return IDLE_STATE_IDLE; |
+ |
return IDLE_STATE_ACTIVE; |
} |