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