Wed, 31 Dec 2014 06:55:50 +0100
Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef nsCocoaWindow_h_
7 #define nsCocoaWindow_h_
9 #undef DARWIN
11 #import <Cocoa/Cocoa.h>
13 #include "nsBaseWidget.h"
14 #include "nsPIWidgetCocoa.h"
15 #include "nsAutoPtr.h"
16 #include "nsCocoaUtils.h"
18 class nsCocoaWindow;
19 class nsChildView;
20 class nsMenuBarX;
21 @class ChildView;
23 // Value copied from BITMAP_MAX_AREA, used in nsNativeThemeCocoa.mm
24 #define CUIDRAW_MAX_AREA 500000
26 // If we are using an SDK older than 10.7, define bits we need that are missing
27 // from it.
28 #if !defined(MAC_OS_X_VERSION_10_7) || \
29 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
31 enum {
32 NSWindowAnimationBehaviorDefault = 0,
33 NSWindowAnimationBehaviorNone = 2,
34 NSWindowAnimationBehaviorDocumentWindow = 3,
35 NSWindowAnimationBehaviorUtilityWindow = 4,
36 NSWindowAnimationBehaviorAlertPanel = 5,
37 NSWindowCollectionBehaviorFullScreenPrimary = 128, // 1 << 7
38 };
40 typedef NSInteger NSWindowAnimationBehavior;
42 @interface NSWindow (LionWindowFeatures)
43 - (void)setAnimationBehavior:(NSWindowAnimationBehavior)newAnimationBehavior;
44 - (void)toggleFullScreen:(id)sender;
45 @end
47 #endif
49 typedef struct _nsCocoaWindowList {
50 _nsCocoaWindowList() : prev(nullptr), window(nullptr) {}
51 struct _nsCocoaWindowList *prev;
52 nsCocoaWindow *window; // Weak
53 } nsCocoaWindowList;
55 // NSWindow subclass that is the base class for all of our own window classes.
56 // Among other things, this class handles the storage of those settings that
57 // need to be persisted across window destruction and reconstruction, i.e. when
58 // switching to and from fullscreen mode.
59 // We don't save shadow, transparency mode or background color because it's not
60 // worth the hassle - Gecko will reset them anyway as soon as the window is
61 // resized.
62 @interface BaseWindow : NSWindow
63 {
64 // Data Storage
65 NSMutableDictionary* mState;
66 BOOL mDrawsIntoWindowFrame;
67 NSColor* mActiveTitlebarColor;
68 NSColor* mInactiveTitlebarColor;
70 // Shadow
71 BOOL mScheduledShadowInvalidation;
73 // Invalidation disabling
74 BOOL mDisabledNeedsDisplay;
76 // DPI cache. Getting the physical screen size (CGDisplayScreenSize)
77 // is ridiculously slow, so we cache it in the toplevel window for all
78 // descendants to use.
79 float mDPI;
81 NSTrackingArea* mTrackingArea;
83 BOOL mBeingShown;
84 BOOL mDrawTitle;
85 }
87 - (void)importState:(NSDictionary*)aState;
88 - (NSMutableDictionary*)exportState;
89 - (void)setDrawsContentsIntoWindowFrame:(BOOL)aState;
90 - (BOOL)drawsContentsIntoWindowFrame;
91 - (void)setTitlebarColor:(NSColor*)aColor forActiveWindow:(BOOL)aActive;
92 - (NSColor*)titlebarColorForActiveWindow:(BOOL)aActive;
94 - (void)deferredInvalidateShadow;
95 - (void)invalidateShadow;
96 - (float)getDPI;
98 - (void)mouseEntered:(NSEvent*)aEvent;
99 - (void)mouseExited:(NSEvent*)aEvent;
100 - (void)mouseMoved:(NSEvent*)aEvent;
101 - (void)updateTrackingArea;
102 - (NSView*)trackingAreaView;
104 - (void)setBeingShown:(BOOL)aValue;
105 - (BOOL)isBeingShown;
106 - (BOOL)isVisibleOrBeingShown;
108 - (ChildView*)mainChildView;
110 - (NSArray*)titlebarControls;
112 - (void)setWantsTitleDrawn:(BOOL)aDrawTitle;
113 - (BOOL)wantsTitleDrawn;
115 - (void)disableSetNeedsDisplay;
116 - (void)enableSetNeedsDisplay;
118 @end
120 @interface NSWindow (Undocumented)
122 // If a window has been explicitly removed from the "window cache" (to
123 // deactivate it), it's sometimes necessary to "reset" it to reactivate it
124 // (and put it back in the "window cache"). One way to do this, which Apple
125 // often uses, is to set the "window number" to '-1' and then back to its
126 // original value.
127 - (void)_setWindowNumber:(NSInteger)aNumber;
129 // If we set the window's stylemask to be textured, the corners on the bottom of
130 // the window are rounded by default. We use this private method to make
131 // the corners square again, a la Safari. Starting with 10.7, all windows have
132 // rounded bottom corners, so this call doesn't have any effect there.
133 - (void)setBottomCornerRounded:(BOOL)rounded;
134 - (BOOL)bottomCornerRounded;
136 // Present in the same form on OS X since at least OS X 10.5.
137 - (NSRect)contentRectForFrameRect:(NSRect)windowFrame styleMask:(NSUInteger)windowStyle;
138 - (NSRect)frameRectForContentRect:(NSRect)windowContentRect styleMask:(NSUInteger)windowStyle;
140 // Present since at least OS X 10.5. The OS calls this method on NSWindow
141 // (and its subclasses) to find out which NSFrameView subclass to instantiate
142 // to create its "frame view".
143 + (Class)frameViewClassForStyleMask:(NSUInteger)styleMask;
145 @end
147 @interface PopupWindow : BaseWindow
148 {
149 @private
150 BOOL mIsContextMenu;
151 }
153 - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask
154 backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation;
155 - (BOOL)isContextMenu;
156 - (void)setIsContextMenu:(BOOL)flag;
157 - (BOOL)canBecomeMainWindow;
159 @end
161 @interface BorderlessWindow : BaseWindow
162 {
163 }
165 - (BOOL)canBecomeKeyWindow;
166 - (BOOL)canBecomeMainWindow;
168 @end
170 #if defined( MAC_OS_X_VERSION_10_6 ) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 )
171 @interface WindowDelegate : NSObject <NSWindowDelegate>
172 #else
173 @interface WindowDelegate : NSObject
174 #endif
175 {
176 nsCocoaWindow* mGeckoWindow; // [WEAK] (we are owned by the window)
177 // Used to avoid duplication when we send NS_ACTIVATE and
178 // NS_DEACTIVATE to Gecko for toplevel widgets. Starts out
179 // false.
180 bool mToplevelActiveState;
181 BOOL mHasEverBeenZoomed;
182 }
183 + (void)paintMenubarForWindow:(NSWindow*)aWindow;
184 - (id)initWithGeckoWindow:(nsCocoaWindow*)geckoWind;
185 - (void)windowDidResize:(NSNotification*)aNotification;
186 - (nsCocoaWindow*)geckoWidget;
187 - (bool)toplevelActiveState;
188 - (void)sendToplevelActivateEvents;
189 - (void)sendToplevelDeactivateEvents;
190 @end
192 @class ToolbarWindow;
194 // NSColor subclass that allows us to draw separate colors both in the titlebar
195 // and for background of the window.
196 @interface TitlebarAndBackgroundColor : NSColor
197 {
198 ToolbarWindow *mWindow; // [WEAK] (we are owned by the window)
199 }
201 - (id)initWithWindow:(ToolbarWindow*)aWindow;
203 @end
205 // NSWindow subclass for handling windows with toolbars.
206 @interface ToolbarWindow : BaseWindow
207 {
208 TitlebarAndBackgroundColor *mColor;
209 CGFloat mUnifiedToolbarHeight;
210 NSColor *mBackgroundColor;
211 NSView *mTitlebarView; // strong
212 NSRect mWindowButtonsRect;
213 NSRect mFullScreenButtonRect;
214 }
215 // Pass nil here to get the default appearance.
216 - (void)setTitlebarColor:(NSColor*)aColor forActiveWindow:(BOOL)aActive;
217 - (void)setUnifiedToolbarHeight:(CGFloat)aHeight;
218 - (CGFloat)unifiedToolbarHeight;
219 - (CGFloat)titlebarHeight;
220 - (NSRect)titlebarRect;
221 - (void)setTitlebarNeedsDisplayInRect:(NSRect)aRect sync:(BOOL)aSync;
222 - (void)setTitlebarNeedsDisplayInRect:(NSRect)aRect;
223 - (void)setDrawsContentsIntoWindowFrame:(BOOL)aState;
224 - (void)placeWindowButtons:(NSRect)aRect;
225 - (void)placeFullScreenButton:(NSRect)aRect;
226 - (NSPoint)windowButtonsPositionWithDefaultPosition:(NSPoint)aDefaultPosition;
227 - (NSPoint)fullScreenButtonPositionWithDefaultPosition:(NSPoint)aDefaultPosition;
228 @end
230 class nsCocoaWindow : public nsBaseWidget, public nsPIWidgetCocoa
231 {
232 private:
234 typedef nsBaseWidget Inherited;
236 public:
238 nsCocoaWindow();
239 virtual ~nsCocoaWindow();
241 NS_DECL_ISUPPORTS_INHERITED
242 NS_DECL_NSPIWIDGETCOCOA
244 NS_IMETHOD Create(nsIWidget* aParent,
245 nsNativeWidget aNativeParent,
246 const nsIntRect &aRect,
247 nsDeviceContext *aContext,
248 nsWidgetInitData *aInitData = nullptr);
250 NS_IMETHOD Destroy();
252 NS_IMETHOD Show(bool aState);
253 virtual nsIWidget* GetSheetWindowParent(void);
254 NS_IMETHOD Enable(bool aState);
255 virtual bool IsEnabled() const;
256 NS_IMETHOD SetModal(bool aState);
257 virtual bool IsVisible() const;
258 NS_IMETHOD SetFocus(bool aState=false);
259 virtual nsIntPoint WidgetToScreenOffset();
260 virtual nsIntPoint GetClientOffset();
261 virtual nsIntSize ClientToWindowSize(const nsIntSize& aClientSize);
263 virtual void* GetNativeData(uint32_t aDataType) ;
265 NS_IMETHOD ConstrainPosition(bool aAllowSlop,
266 int32_t *aX, int32_t *aY);
267 virtual void SetSizeConstraints(const SizeConstraints& aConstraints);
268 NS_IMETHOD Move(double aX, double aY);
269 NS_IMETHOD PlaceBehind(nsTopLevelWidgetZPlacement aPlacement,
270 nsIWidget *aWidget, bool aActivate);
271 NS_IMETHOD SetSizeMode(int32_t aMode);
272 NS_IMETHOD HideWindowChrome(bool aShouldHide);
273 void EnteredFullScreen(bool aFullScreen);
274 NS_IMETHOD MakeFullScreen(bool aFullScreen);
275 NS_IMETHOD Resize(double aWidth, double aHeight, bool aRepaint);
276 NS_IMETHOD Resize(double aX, double aY, double aWidth, double aHeight, bool aRepaint);
277 NS_IMETHOD GetClientBounds(nsIntRect &aRect);
278 NS_IMETHOD GetScreenBounds(nsIntRect &aRect);
279 void ReportMoveEvent();
280 void ReportSizeEvent();
281 NS_IMETHOD SetCursor(nsCursor aCursor);
282 NS_IMETHOD SetCursor(imgIContainer* aCursor, uint32_t aHotspotX, uint32_t aHotspotY);
284 CGFloat BackingScaleFactor();
285 void BackingScaleFactorChanged();
286 virtual double GetDefaultScaleInternal();
287 virtual int32_t RoundsWidgetCoordinatesTo() MOZ_OVERRIDE;
289 NS_IMETHOD SetTitle(const nsAString& aTitle);
291 NS_IMETHOD Invalidate(const nsIntRect &aRect);
292 virtual nsresult ConfigureChildren(const nsTArray<Configuration>& aConfigurations);
293 virtual LayerManager* GetLayerManager(PLayerTransactionChild* aShadowManager = nullptr,
294 LayersBackend aBackendHint = mozilla::layers::LayersBackend::LAYERS_NONE,
295 LayerManagerPersistence aPersistence = LAYER_MANAGER_CURRENT,
296 bool* aAllowRetaining = nullptr);
297 NS_IMETHOD DispatchEvent(mozilla::WidgetGUIEvent* aEvent,
298 nsEventStatus& aStatus);
299 NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, bool aDoCapture);
300 NS_IMETHOD GetAttention(int32_t aCycleCount);
301 virtual bool HasPendingInputEvent();
302 virtual nsTransparencyMode GetTransparencyMode();
303 virtual void SetTransparencyMode(nsTransparencyMode aMode);
304 NS_IMETHOD SetWindowShadowStyle(int32_t aStyle);
305 virtual void SetShowsToolbarButton(bool aShow);
306 virtual void SetShowsFullScreenButton(bool aShow);
307 virtual void SetWindowAnimationType(WindowAnimationType aType);
308 virtual void SetDrawsTitle(bool aDrawTitle);
309 NS_IMETHOD SetNonClientMargins(nsIntMargin &margins);
310 NS_IMETHOD SetWindowTitlebarColor(nscolor aColor, bool aActive);
311 virtual void SetDrawsInTitlebar(bool aState);
312 virtual nsresult SynthesizeNativeMouseEvent(nsIntPoint aPoint,
313 uint32_t aNativeMessage,
314 uint32_t aModifierFlags);
316 void DispatchSizeModeEvent();
318 virtual gfxASurface* GetThebesSurface();
320 // be notified that a some form of drag event needs to go into Gecko
321 virtual bool DragEvent(unsigned int aMessage, Point aMouseGlobal, UInt16 aKeyModifiers);
323 bool HasModalDescendents() { return mNumModalDescendents > 0; }
324 NSWindow *GetCocoaWindow() { return mWindow; }
326 void SetMenuBar(nsMenuBarX* aMenuBar);
327 nsMenuBarX *GetMenuBar();
329 NS_IMETHOD NotifyIME(const IMENotification& aIMENotification) MOZ_OVERRIDE;
330 NS_IMETHOD_(void) SetInputContext(
331 const InputContext& aContext,
332 const InputContextAction& aAction) MOZ_OVERRIDE;
333 NS_IMETHOD_(InputContext) GetInputContext()
334 {
335 NSView* view = mWindow ? [mWindow contentView] : nil;
336 if (view) {
337 mInputContext.mNativeIMEContext = [view inputContext];
338 }
339 // If inputContext isn't available on this window, returns this window's
340 // pointer since nullptr means the platform has only one context per
341 // process.
342 if (!mInputContext.mNativeIMEContext) {
343 mInputContext.mNativeIMEContext = this;
344 }
345 return mInputContext;
346 }
347 NS_IMETHOD_(bool) ExecuteNativeKeyBinding(
348 NativeKeyBindingsType aType,
349 const mozilla::WidgetKeyboardEvent& aEvent,
350 DoCommandCallback aCallback,
351 void* aCallbackData) MOZ_OVERRIDE;
353 void SetPopupWindowLevel();
355 NS_IMETHOD ReparentNativeWidget(nsIWidget* aNewParent);
356 protected:
358 nsresult CreateNativeWindow(const NSRect &aRect,
359 nsBorderStyle aBorderStyle,
360 bool aRectIsFrameRect);
361 nsresult CreatePopupContentView(const nsIntRect &aRect,
362 nsDeviceContext *aContext);
363 void DestroyNativeWindow();
364 void AdjustWindowShadow();
365 void SetWindowBackgroundBlur();
366 void UpdateBounds();
368 nsresult DoResize(double aX, double aY, double aWidth, double aHeight,
369 bool aRepaint, bool aConstrainToCurrentScreen);
371 virtual already_AddRefed<nsIWidget>
372 AllocateChildPopupWidget()
373 {
374 static NS_DEFINE_IID(kCPopUpCID, NS_POPUP_CID);
375 nsCOMPtr<nsIWidget> widget = do_CreateInstance(kCPopUpCID);
376 return widget.forget();
377 }
379 nsIWidget* mParent; // if we're a popup, this is our parent [WEAK]
380 BaseWindow* mWindow; // our cocoa window [STRONG]
381 WindowDelegate* mDelegate; // our delegate for processing window msgs [STRONG]
382 nsRefPtr<nsMenuBarX> mMenuBar;
383 NSWindow* mSheetWindowParent; // if this is a sheet, this is the NSWindow it's attached to
384 nsChildView* mPopupContentView; // if this is a popup, this is its content widget
385 int32_t mShadowStyle;
387 CGFloat mBackingScaleFactor;
389 WindowAnimationType mAnimationType;
391 bool mWindowMadeHere; // true if we created the window, false for embedding
392 bool mSheetNeedsShow; // if this is a sheet, are we waiting to be shown?
393 // this is used for sibling sheet contention only
394 bool mFullScreen;
395 bool mInFullScreenTransition; // true from the request to enter/exit fullscreen
396 // (MakeFullScreen() call) to EnteredFullScreen()
397 bool mModal;
399 bool mUsesNativeFullScreen; // only true on Lion if SetShowsFullScreenButton(true);
401 bool mIsAnimationSuppressed;
403 bool mInReportMoveEvent; // true if in a call to ReportMoveEvent().
404 bool mInResize; // true if in a call to DoResize().
406 int32_t mNumModalDescendents;
407 InputContext mInputContext;
408 };
410 #endif // nsCocoaWindow_h_