| 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;
|
| }
|
|
|