• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
75static MacScreenMonitor* g_screenMonitor = nil;
76
77void InitIdleMonitor() {
78  if (!g_screenMonitor)
79    g_screenMonitor = [[MacScreenMonitor alloc] init];
80}
81
82void StopIdleMonitor() {
83  [g_screenMonitor release];
84  g_screenMonitor = nil;
85}
86
87IdleState 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