| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "chrome/browser/fullscreen.h" |
| |
| #import <Carbon/Carbon.h> |
| #import <Cocoa/Cocoa.h> |
| |
| #import "base/logging.h" |
| |
| @interface FullScreenMonitor : NSObject { |
| @private |
| BOOL fullScreen_; |
| EventHandlerRef eventHandler_; |
| } |
| |
| @property (nonatomic, getter=isFullScreen) BOOL fullScreen; |
| |
| @end |
| |
| static OSStatus handleAppEvent(EventHandlerCallRef myHandler, |
| EventRef event, |
| void* userData) { |
| DCHECK(userData); |
| |
| FullScreenMonitor* fullScreenMonitor = |
| reinterpret_cast<FullScreenMonitor*>(userData); |
| |
| UInt32 mode = 0; |
| OSStatus status = GetEventParameter(event, |
| kEventParamSystemUIMode, |
| typeUInt32, |
| NULL, |
| sizeof(UInt32), |
| NULL, |
| &mode); |
| if (status != noErr) |
| return status; |
| BOOL isFullScreenMode = mode == kUIModeAllHidden; |
| [fullScreenMonitor setFullScreen:isFullScreenMode]; |
| return noErr; |
| } |
| |
| @implementation FullScreenMonitor |
| |
| @synthesize fullScreen = fullScreen_; |
| |
| - (id)init { |
| if ((self = [super init])) { |
| // Check if the user is in presentation mode initially. |
| SystemUIMode currentMode; |
| GetSystemUIMode(¤tMode, NULL); |
| fullScreen_ = currentMode == kUIModeAllHidden; |
| |
| // Register a Carbon event to receive the notification about the login |
| // session's UI mode change. |
| EventTypeSpec events[] = |
| {{ kEventClassApplication, kEventAppSystemUIModeChanged }}; |
| OSStatus status = InstallApplicationEventHandler( |
| NewEventHandlerUPP(handleAppEvent), |
| GetEventTypeCount(events), |
| events, |
| self, |
| &eventHandler_); |
| if (status) { |
| [self release]; |
| self = nil; |
| } |
| } |
| return self; |
| } |
| |
| - (void)dealloc { |
| if (eventHandler_) |
| RemoveEventHandler(eventHandler_); |
| [super dealloc]; |
| } |
| |
| @end |
| |
| static FullScreenMonitor* g_fullScreenMonitor = nil; |
| |
| void InitFullScreenMonitor() { |
| if (!g_fullScreenMonitor) |
| g_fullScreenMonitor = [[FullScreenMonitor alloc] init]; |
| } |
| |
| void StopFullScreenMonitor() { |
| [g_fullScreenMonitor release]; |
| g_fullScreenMonitor = nil; |
| } |
| |
| bool IsFullScreenMode() { |
| // Check if the main display has been captured (game in particular). |
| if (CGDisplayIsCaptured(CGMainDisplayID())) |
| return true; |
| |
| return [g_fullScreenMonitor isFullScreen]; |
| } |