1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #import "chrome/browser/idle.h" 6 7 #import <Cocoa/Cocoa.h> 8 #import <CoreGraphics/CGEventSource.h> 9 10 @interface MacScreenMonitor : NSObject { 11 @private 12 BOOL screensaverRunning_; 13 BOOL screenLocked_; 14 } 15 16 @property (readonly, 17 nonatomic, 18 getter=isScreensaverRunning) BOOL screensaverRunning; 19 @property (readonly, nonatomic, getter=isScreenLocked) BOOL screenLocked; 20 21 @end 22 23 @implementation MacScreenMonitor 24 25 @synthesize screensaverRunning = screensaverRunning_; 26 @synthesize screenLocked = screenLocked_; 27 28 - (id)init { 29 if ((self = [super init])) { 30 NSDistributedNotificationCenter* distCenter = 31 [NSDistributedNotificationCenter defaultCenter]; 32 [distCenter addObserver:self 33 selector:@selector(onScreenSaverStarted:) 34 name:@"com.apple.screensaver.didstart" 35 object:nil]; 36 [distCenter addObserver:self 37 selector:@selector(onScreenSaverStopped:) 38 name:@"com.apple.screensaver.didstop" 39 object:nil]; 40 [distCenter addObserver:self 41 selector:@selector(onScreenLocked:) 42 name:@"com.apple.screenIsLocked" 43 object:nil]; 44 [distCenter addObserver:self 45 selector:@selector(onScreenUnlocked:) 46 name:@"com.apple.screenIsUnlocked" 47 object:nil]; 48 } 49 return self; 50 } 51 52 - (void)dealloc { 53 [[NSDistributedNotificationCenter defaultCenter] removeObject:self]; 54 [super dealloc]; 55 } 56 57 - (void)onScreenSaverStarted:(NSNotification*)notification { 58 screensaverRunning_ = YES; 59 } 60 61 - (void)onScreenSaverStopped:(NSNotification*)notification { 62 screensaverRunning_ = NO; 63 } 64 65 - (void)onScreenLocked:(NSNotification*)notification { 66 screenLocked_ = YES; 67 } 68 69 - (void)onScreenUnlocked:(NSNotification*)notification { 70 screenLocked_ = NO; 71 } 72 73 @end 74 75 static MacScreenMonitor* g_screenMonitor = nil; 76 77 void InitIdleMonitor() { 78 if (!g_screenMonitor) 79 g_screenMonitor = [[MacScreenMonitor alloc] init]; 80 } 81 82 void StopIdleMonitor() { 83 [g_screenMonitor release]; 84 g_screenMonitor = nil; 85 } 86 87 IdleState CalculateIdleState(unsigned int idle_threshold) { 88 if ([g_screenMonitor isScreensaverRunning] || 89 [g_screenMonitor isScreenLocked]) 90 return IDLE_STATE_LOCKED; 91 92 CFTimeInterval idle_time = CGEventSourceSecondsSinceLastEventType( 93 kCGEventSourceStateCombinedSessionState, 94 kCGAnyInputEventType); 95 if (idle_time >= idle_threshold) 96 return IDLE_STATE_IDLE; 97 98 return IDLE_STATE_ACTIVE; 99 } 100