1 // Copyright (c) 2011 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 #ifndef BASE_MAC_MAC_UTIL_H_ 6 #define BASE_MAC_MAC_UTIL_H_ 7 #pragma once 8 9 #include <Carbon/Carbon.h> 10 #include <string> 11 12 #include "base/logging.h" 13 14 // TODO(rohitrao): Clean up sites that include mac_util.h and remove this line. 15 #include "base/mac/foundation_util.h" 16 17 #if defined(__OBJC__) 18 #import <Foundation/Foundation.h> 19 #else // __OBJC__ 20 class NSImage; 21 #endif // __OBJC__ 22 23 class FilePath; 24 25 namespace base { 26 namespace mac { 27 28 // Full screen modes, in increasing order of priority. More permissive modes 29 // take predecence. 30 enum FullScreenMode { 31 kFullScreenModeHideAll = 0, 32 kFullScreenModeHideDock = 1, 33 kFullScreenModeAutoHideAll = 2, 34 kNumFullScreenModes = 3, 35 36 // kFullScreenModeNormal is not a valid FullScreenMode, but it is useful to 37 // other classes, so we include it here. 38 kFullScreenModeNormal = 10, 39 }; 40 41 std::string PathFromFSRef(const FSRef& ref); 42 bool FSRefFromPath(const std::string& path, FSRef* ref); 43 44 // Returns an sRGB color space. The return value is a static value; do not 45 // release it! 46 CGColorSpaceRef GetSRGBColorSpace(); 47 48 // Returns the color space being used by the main display. The return value 49 // is a static value; do not release it! 50 CGColorSpaceRef GetSystemColorSpace(); 51 52 // Add a full screen request for the given |mode|. Must be paired with a 53 // ReleaseFullScreen() call for the same |mode|. This does not by itself create 54 // a fullscreen window; rather, it manages per-application state related to 55 // hiding the dock and menubar. Must be called on the main thread. 56 void RequestFullScreen(FullScreenMode mode); 57 58 // Release a request for full screen mode. Must be matched with a 59 // RequestFullScreen() call for the same |mode|. As with RequestFullScreen(), 60 // this does not affect windows directly, but rather manages per-application 61 // state. For example, if there are no other outstanding 62 // |kFullScreenModeAutoHideAll| requests, this will reshow the menu bar. Must 63 // be called on main thread. 64 void ReleaseFullScreen(FullScreenMode mode); 65 66 // Convenience method to switch the current fullscreen mode. This has the same 67 // net effect as a ReleaseFullScreen(from_mode) call followed immediately by a 68 // RequestFullScreen(to_mode). Must be called on the main thread. 69 void SwitchFullScreenModes(FullScreenMode from_mode, FullScreenMode to_mode); 70 71 // Set the visibility of the cursor. 72 void SetCursorVisibility(bool visible); 73 74 // Should windows miniaturize on a double-click (on the title bar)? 75 bool ShouldWindowsMiniaturizeOnDoubleClick(); 76 77 // Activates the process with the given PID. 78 void ActivateProcess(pid_t pid); 79 80 // Set the Time Machine exclusion property for the given file. 81 bool SetFileBackupExclusion(const FilePath& file_path, bool exclude); 82 83 // Sets the process name as displayed in Activity Monitor to process_name. 84 void SetProcessName(CFStringRef process_name); 85 86 // Converts a NSImage to a CGImageRef. Normally, the system frameworks can do 87 // this fine, especially on 10.6. On 10.5, however, CGImage cannot handle 88 // converting a PDF-backed NSImage into a CGImageRef. This function will 89 // rasterize the PDF into a bitmap CGImage. The caller is responsible for 90 // releasing the return value. 91 CGImageRef CopyNSImageToCGImage(NSImage* image); 92 93 // Checks if the current application is set as a Login Item, so it will launch 94 // on Login. If a non-NULL pointer to is_hidden is passed, the Login Item also 95 // is queried for the 'hide on launch' flag. 96 bool CheckLoginItemStatus(bool* is_hidden); 97 98 // Adds current application to the set of Login Items with specified "hide" 99 // flag. This has the same effect as adding/removing the application in 100 // SystemPreferences->Accounts->LoginItems or marking Application in the Dock 101 // as "Options->Open on Login". 102 // Does nothing if the application is already set up as Login Item with 103 // specified hide flag. 104 void AddToLoginItems(bool hide_on_startup); 105 106 // Removes the current application from the list Of Login Items. 107 void RemoveFromLoginItems(); 108 109 // Returns true if the current process was automatically launched as a 110 // 'Login Item' with 'hide on startup' flag. Used to suppress opening windows. 111 bool WasLaunchedAsHiddenLoginItem(); 112 113 } // namespace mac 114 } // namespace base 115 116 #if !defined(__OBJC__) 117 #define OBJC_CPP_CLASS_DECL(x) class x; 118 #else // __OBJC__ 119 #define OBJC_CPP_CLASS_DECL(x) 120 #endif // __OBJC__ 121 122 // Convert toll-free bridged CFTypes to NSTypes and vice-versa. This does not 123 // autorelease |cf_val|. This is useful for the case where there is a CFType in 124 // a call that expects an NSType and the compiler is complaining about const 125 // casting problems. 126 // The calls are used like this: 127 // NSString *foo = CFToNSCast(CFSTR("Hello")); 128 // CFStringRef foo2 = NSToCFCast(@"Hello"); 129 // The macro magic below is to enforce safe casting. It could possibly have 130 // been done using template function specialization, but template function 131 // specialization doesn't always work intuitively, 132 // (http://www.gotw.ca/publications/mill17.htm) so the trusty combination 133 // of macros and function overloading is used instead. 134 135 #define CF_TO_NS_CAST_DECL(TypeCF, TypeNS) \ 136 OBJC_CPP_CLASS_DECL(TypeNS) \ 137 \ 138 namespace base { \ 139 namespace mac { \ 140 TypeNS* CFToNSCast(TypeCF##Ref cf_val); \ 141 TypeCF##Ref NSToCFCast(TypeNS* ns_val); \ 142 } \ 143 } \ 144 145 #define CF_TO_NS_MUTABLE_CAST_DECL(name) \ 146 CF_TO_NS_CAST_DECL(CF##name, NS##name) \ 147 OBJC_CPP_CLASS_DECL(NSMutable##name) \ 148 \ 149 namespace base { \ 150 namespace mac { \ 151 NSMutable##name* CFToNSCast(CFMutable##name##Ref cf_val); \ 152 CFMutable##name##Ref NSToCFCast(NSMutable##name* ns_val); \ 153 } \ 154 } \ 155 156 // List of toll-free bridged types taken from: 157 // http://www.cocoadev.com/index.pl?TollFreeBridged 158 159 CF_TO_NS_MUTABLE_CAST_DECL(Array); 160 CF_TO_NS_MUTABLE_CAST_DECL(AttributedString); 161 CF_TO_NS_CAST_DECL(CFCalendar, NSCalendar); 162 CF_TO_NS_MUTABLE_CAST_DECL(CharacterSet); 163 CF_TO_NS_MUTABLE_CAST_DECL(Data); 164 CF_TO_NS_CAST_DECL(CFDate, NSDate); 165 CF_TO_NS_MUTABLE_CAST_DECL(Dictionary); 166 CF_TO_NS_CAST_DECL(CFError, NSError); 167 CF_TO_NS_CAST_DECL(CFLocale, NSLocale); 168 CF_TO_NS_CAST_DECL(CFNumber, NSNumber); 169 CF_TO_NS_CAST_DECL(CFRunLoopTimer, NSTimer); 170 CF_TO_NS_CAST_DECL(CFTimeZone, NSTimeZone); 171 CF_TO_NS_MUTABLE_CAST_DECL(Set); 172 CF_TO_NS_CAST_DECL(CFReadStream, NSInputStream); 173 CF_TO_NS_CAST_DECL(CFWriteStream, NSOutputStream); 174 CF_TO_NS_MUTABLE_CAST_DECL(String); 175 CF_TO_NS_CAST_DECL(CFURL, NSURL); 176 177 // Stream operations for CFTypes. They can be used with NSTypes as well 178 // by using the NSToCFCast methods above. 179 // e.g. LOG(INFO) << base::mac::NSToCFCast(@"foo"); 180 // Operator << can not be overloaded for ObjectiveC types as the compiler 181 // can not distinguish between overloads for id with overloads for void*. 182 extern std::ostream& operator<<(std::ostream& o, const CFErrorRef err); 183 extern std::ostream& operator<<(std::ostream& o, const CFStringRef str); 184 185 #endif // BASE_MAC_MAC_UTIL_H_ 186