172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 53f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#ifndef BASE_MAC_MAC_UTIL_H_ 63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#define BASE_MAC_MAC_UTIL_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <Carbon/Carbon.h> 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string> 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/logging.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TODO(rohitrao): Clean up sites that include mac_util.h and remove this line. 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/mac/foundation_util.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(__OBJC__) 1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#import <Foundation/Foundation.h> 1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#else // __OBJC__ 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass NSImage; 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif // __OBJC__ 2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass FilePath; 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace base { 263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace mac { 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Full screen modes, in increasing order of priority. More permissive modes 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// take predecence. 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochenum FullScreenMode { 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kFullScreenModeHideAll = 0, 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kFullScreenModeHideDock = 1, 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kFullScreenModeAutoHideAll = 2, 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kNumFullScreenModes = 3, 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // kFullScreenModeNormal is not a valid FullScreenMode, but it is useful to 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // other classes, so we include it here. 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kFullScreenModeNormal = 10, 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string PathFromFSRef(const FSRef& ref); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool FSRefFromPath(const std::string& path, FSRef* ref); 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns an sRGB color space. The return value is a static value; do not 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// release it! 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottCGColorSpaceRef GetSRGBColorSpace(); 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the color space being used by the main display. The return value 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// is a static value; do not release it! 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottCGColorSpaceRef GetSystemColorSpace(); 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Add a full screen request for the given |mode|. Must be paired with a 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ReleaseFullScreen() call for the same |mode|. This does not by itself create 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a fullscreen window; rather, it manages per-application state related to 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// hiding the dock and menubar. Must be called on the main thread. 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RequestFullScreen(FullScreenMode mode); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Release a request for full screen mode. Must be matched with a 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RequestFullScreen() call for the same |mode|. As with RequestFullScreen(), 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this does not affect windows directly, but rather manages per-application 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// state. For example, if there are no other outstanding 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |kFullScreenModeAutoHideAll| requests, this will reshow the menu bar. Must 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// be called on main thread. 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ReleaseFullScreen(FullScreenMode mode); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Convenience method to switch the current fullscreen mode. This has the same 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// net effect as a ReleaseFullScreen(from_mode) call followed immediately by a 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RequestFullScreen(to_mode). Must be called on the main thread. 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SwitchFullScreenModes(FullScreenMode from_mode, FullScreenMode to_mode); 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Set the visibility of the cursor. 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SetCursorVisibility(bool visible); 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Should windows miniaturize on a double-click (on the title bar)? 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ShouldWindowsMiniaturizeOnDoubleClick(); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Activates the process with the given PID. 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ActivateProcess(pid_t pid); 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Set the Time Machine exclusion property for the given file. 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool SetFileBackupExclusion(const FilePath& file_path, bool exclude); 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sets the process name as displayed in Activity Monitor to process_name. 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SetProcessName(CFStringRef process_name); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Converts a NSImage to a CGImageRef. Normally, the system frameworks can do 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// this fine, especially on 10.6. On 10.5, however, CGImage cannot handle 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// converting a PDF-backed NSImage into a CGImageRef. This function will 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// rasterize the PDF into a bitmap CGImage. The caller is responsible for 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// releasing the return value. 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickCGImageRef CopyNSImageToCGImage(NSImage* image); 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Checks if the current application is set as a Login Item, so it will launch 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// on Login. If a non-NULL pointer to is_hidden is passed, the Login Item also 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// is queried for the 'hide on launch' flag. 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool CheckLoginItemStatus(bool* is_hidden); 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Adds current application to the set of Login Items with specified "hide" 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// flag. This has the same effect as adding/removing the application in 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// SystemPreferences->Accounts->LoginItems or marking Application in the Dock 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// as "Options->Open on Login". 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Does nothing if the application is already set up as Login Item with 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// specified hide flag. 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid AddToLoginItems(bool hide_on_startup); 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Removes the current application from the list Of Login Items. 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid RemoveFromLoginItems(); 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Returns true if the current process was automatically launched as a 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 'Login Item' with 'hide on startup' flag. Used to suppress opening windows. 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WasLaunchedAsHiddenLoginItem(); 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace mac 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace base 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if !defined(__OBJC__) 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define OBJC_CPP_CLASS_DECL(x) class x; 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else // __OBJC__ 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define OBJC_CPP_CLASS_DECL(x) 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // __OBJC__ 12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Convert toll-free bridged CFTypes to NSTypes and vice-versa. This does not 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// autorelease |cf_val|. This is useful for the case where there is a CFType in 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// a call that expects an NSType and the compiler is complaining about const 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// casting problems. 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// The calls are used like this: 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// NSString *foo = CFToNSCast(CFSTR("Hello")); 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// CFStringRef foo2 = NSToCFCast(@"Hello"); 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// The macro magic below is to enforce safe casting. It could possibly have 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// been done using template function specialization, but template function 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// specialization doesn't always work intuitively, 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// (http://www.gotw.ca/publications/mill17.htm) so the trusty combination 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// of macros and function overloading is used instead. 13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define CF_TO_NS_CAST_DECL(TypeCF, TypeNS) \ 136dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenOBJC_CPP_CLASS_DECL(TypeNS) \ 137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen\ 138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace base { \ 139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace mac { \ 140dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTypeNS* CFToNSCast(TypeCF##Ref cf_val); \ 141dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTypeCF##Ref NSToCFCast(TypeNS* ns_val); \ 142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} \ 143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} \ 144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define CF_TO_NS_MUTABLE_CAST_DECL(name) \ 146dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CF##name, NS##name) \ 147dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenOBJC_CPP_CLASS_DECL(NSMutable##name) \ 148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen\ 149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace base { \ 150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace mac { \ 151dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenNSMutable##name* CFToNSCast(CFMutable##name##Ref cf_val); \ 152dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCFMutable##name##Ref NSToCFCast(NSMutable##name* ns_val); \ 153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} \ 154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} \ 15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// List of toll-free bridged types taken from: 15721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// http://www.cocoadev.com/index.pl?TollFreeBridged 15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 159dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_MUTABLE_CAST_DECL(Array); 160dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_MUTABLE_CAST_DECL(AttributedString); 161dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFCalendar, NSCalendar); 162dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_MUTABLE_CAST_DECL(CharacterSet); 163dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_MUTABLE_CAST_DECL(Data); 164dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFDate, NSDate); 165dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_MUTABLE_CAST_DECL(Dictionary); 166dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFError, NSError); 167dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFLocale, NSLocale); 168dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFNumber, NSNumber); 169dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFRunLoopTimer, NSTimer); 170dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFTimeZone, NSTimeZone); 171dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_MUTABLE_CAST_DECL(Set); 172dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFReadStream, NSInputStream); 173dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFWriteStream, NSOutputStream); 174dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_MUTABLE_CAST_DECL(String); 175dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCF_TO_NS_CAST_DECL(CFURL, NSURL); 176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Stream operations for CFTypes. They can be used with NSTypes as well 178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// by using the NSToCFCast methods above. 179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// e.g. LOG(INFO) << base::mac::NSToCFCast(@"foo"); 180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Operator << can not be overloaded for ObjectiveC types as the compiler 181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// can not distinguish between overloads for id with overloads for void*. 182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenextern std::ostream& operator<<(std::ostream& o, const CFErrorRef err); 183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenextern std::ostream& operator<<(std::ostream& o, const CFStringRef str); 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#endif // BASE_MAC_MAC_UTIL_H_ 186