1// Copyright (c) 2012 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#include "chrome/browser/idle.h" 6 7#include <ApplicationServices/ApplicationServices.h> 8#import <Cocoa/Cocoa.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] removeObserver: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 75static MacScreenMonitor* g_screenMonitor = nil; 76 77void InitIdleMonitor() { 78 if (!g_screenMonitor) 79 g_screenMonitor = [[MacScreenMonitor alloc] init]; 80} 81 82void CalculateIdleTime(IdleTimeCallback notify) { 83 CFTimeInterval idle_time = CGEventSourceSecondsSinceLastEventType( 84 kCGEventSourceStateCombinedSessionState, 85 kCGAnyInputEventType); 86 notify.Run(static_cast<int>(idle_time)); 87} 88 89bool CheckIdleStateIsLocked() { 90 return [g_screenMonitor isScreensaverRunning] || 91 [g_screenMonitor isScreenLocked]; 92} 93