Chromium Code Reviews| Index: chrome/browser/idle_mac.mm |
| =================================================================== |
| --- chrome/browser/idle_mac.mm (revision 71699) |
| +++ chrome/browser/idle_mac.mm (working copy) |
| @@ -2,15 +2,100 @@ |
| // 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 isScreensaverRunning_; |
| + BOOL isScreenLocked_; |
| +} |
| + |
| +- (BOOL)isScreensaverRunning; |
| +- (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 { |
| + isScreensaverRunning_ = YES; |
|
dmac
2011/01/21 19:34:44
cocoa conventions would not have the "is" in front
jianli
2011/01/21 20:21:00
Done.
|
| +} |
| + |
| +- (void)onScreenSaverStopped:(NSNotification*)notification { |
| + isScreensaverRunning_ = NO; |
| +} |
| + |
| +- (void)onScreenLocked:(NSNotification*)notification { |
| + isScreenLocked_ = YES; |
| +} |
| + |
| +- (void)onScreenUnlocked:(NSNotification*)notification { |
| + isScreenLocked_ = NO; |
| +} |
| + |
| +- (BOOL)isScreensaverRunning { |
| + return isScreensaverRunning_; |
| +} |
| + |
| +- (BOOL)isScreenLocked { |
| + return isScreenLocked_; |
| +} |
| + |
| +@end |
| + |
| +MacScreenMonitor* g_screenMonitor = nil; |
| + |
| +void InitIdleMonitor() { |
| + if (!g_screenMonitor) |
| + g_screenMonitor = [[MacScreenMonitor alloc] init]; |
| +} |
| + |
| +void StopIdleMonitor() { |
| + 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( |
| kCGEventSourceStateCombinedSessionState, |
| kCGAnyInputEventType); |
| if (idle_time >= idle_threshold) |
| return IDLE_STATE_IDLE; |
| + |
| return IDLE_STATE_ACTIVE; |
| } |