• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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