Home | History | Annotate | Download | only in browser
      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