blob: 1825c83816e2bbc13f693871c4e4f35d06128901 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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 {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000053 [[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
Torne (Richard Coles)58218062012-11-14 11:43:16 +000054 [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
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000082void CalculateIdleTime(IdleTimeCallback notify) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000083 CFTimeInterval idle_time = CGEventSourceSecondsSinceLastEventType(
84 kCGEventSourceStateCombinedSessionState,
85 kCGAnyInputEventType);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000086 notify.Run(static_cast<int>(idle_time));
Torne (Richard Coles)58218062012-11-14 11:43:16 +000087}
88
89bool CheckIdleStateIsLocked() {
90 return [g_screenMonitor isScreensaverRunning] ||
91 [g_screenMonitor isScreenLocked];
92}