/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef MOZMenuOpeningCoordinator_h #define MOZMenuOpeningCoordinator_h #import #include "mozilla/RefPtr.h" namespace mozilla { class Runnable; } /* * MOZMenuOpeningCoordinator is a workaround for the fact that opening an NSMenu * creates a nested event loop. This event loop is only exited after the menu is * closed. The caller of NativeMenuMac::ShowAsContextMenu does not expect * ShowAsContextMenu to create a nested event loop, so we need to make sure to * open the NSMenu asynchronously. */ @interface MOZMenuOpeningCoordinator : NSObject + (instancetype)sharedInstance; // Queue aMenu for opening. // The menu will open from a new event loop tick so that its nested event loop // does not block the caller. If another menu's nested event loop is currently // on the stack, we wait for that nested event loop to unwind before opening // aMenu. Returns a handle that can be passed to cancelAsynchronousOpening:. Can // only be called on the main thread. - (NSInteger)asynchronouslyOpenMenu:(NSMenu*)aMenu atScreenPosition:(NSPoint)aPosition forView:(NSView*)aView withAppearance:(NSAppearance*)aAppearance asContextMenu:(BOOL)aIsContextMenu; // If the menu opening request for aHandle hasn't been processed yet, cancel it. // Can only be called on the main thread. - (void)cancelAsynchronousOpening:(NSInteger)aHandle; // This field is a terrible workaround for a gnarly problem. // It should be set to YES by the caller of -[NSMenu // cancelTracking(WithoutAnimation)]. This field gets checked by the native // event loop code in nsAppShell.mm to avoid calling // -[NSApplication nextEventMatchingMask:...] between the call to cancelTracking // and the point at which the menu has finished closing and unwound from its // tracking event loop, because such calls can interfere with menu closing and // get us stuck in the menu event loop forever. @property(class) BOOL needToUnwindForMenuClosing; @end #endif // MOZMenuOpeningCoordinator_h