diff options
Diffstat (limited to '')
-rw-r--r-- | widget/cocoa/nsTouchBarUpdater.mm | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/widget/cocoa/nsTouchBarUpdater.mm b/widget/cocoa/nsTouchBarUpdater.mm new file mode 100644 index 0000000000..6b4b25f992 --- /dev/null +++ b/widget/cocoa/nsTouchBarUpdater.mm @@ -0,0 +1,116 @@ +/* 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/. */ + +#import <Cocoa/Cocoa.h> + +#include "nsTouchBar.h" +#include "nsTouchBarInput.h" +#include "nsTouchBarUpdater.h" +#include "nsTouchBarNativeAPIDefines.h" + +#include "nsIBaseWindow.h" +#include "nsIWidget.h" + +// defined in nsCocoaWindow.mm. +extern BOOL sTouchBarIsInitialized; + +#if !defined(MAC_OS_X_VERSION_10_12_2) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12_2 +@interface BaseWindow (NSTouchBarProvider) +@property(strong) NSTouchBar* touchBar; +@end +#endif + +NS_IMPL_ISUPPORTS(nsTouchBarUpdater, nsITouchBarUpdater); + +NS_IMETHODIMP +nsTouchBarUpdater::UpdateTouchBarInputs(nsIBaseWindow* aWindow, + const nsTArray<RefPtr<nsITouchBarInput>>& aInputs) { + if (!sTouchBarIsInitialized || !aWindow) { + return NS_OK; + } + + BaseWindow* cocoaWin = nsTouchBarUpdater::GetCocoaWindow(aWindow); + if (!cocoaWin) { + return NS_ERROR_FAILURE; + } + + if ([cocoaWin respondsToSelector:@selector(touchBar)]) { + size_t itemCount = aInputs.Length(); + for (size_t i = 0; i < itemCount; ++i) { + nsCOMPtr<nsITouchBarInput> input(aInputs.ElementAt(i)); + if (!input) { + continue; + } + + NSTouchBarItemIdentifier newIdentifier = [TouchBarInput nativeIdentifierWithXPCOM:input]; + // We don't support updating the Share scrubber since it's a special + // Apple-made component that behaves differently from the other inputs. + if ([newIdentifier isEqualToString:[TouchBarInput nativeIdentifierWithType:@"scrubber" + withKey:@"share"]]) { + continue; + } + + TouchBarInput* convertedInput = [[TouchBarInput alloc] initWithXPCOM:input]; + [(nsTouchBar*)cocoaWin.touchBar updateItem:convertedInput]; + } + } + + return NS_OK; +} + +NS_IMETHODIMP +nsTouchBarUpdater::ShowPopover(nsIBaseWindow* aWindow, nsITouchBarInput* aPopover, bool aShowing) { + if (!sTouchBarIsInitialized || !aPopover || !aWindow) { + return NS_OK; + } + + BaseWindow* cocoaWin = nsTouchBarUpdater::GetCocoaWindow(aWindow); + if (!cocoaWin) { + return NS_ERROR_FAILURE; + } + + if ([cocoaWin respondsToSelector:@selector(touchBar)]) { + // We don't need to completely reinitialize the popover. We only need its + // identifier to look it up in [nsTouchBar mappedLayoutItems]. + NSTouchBarItemIdentifier popoverIdentifier = [TouchBarInput nativeIdentifierWithXPCOM:aPopover]; + + TouchBarInput* popoverItem = + [[(nsTouchBar*)cocoaWin.touchBar mappedLayoutItems] objectForKey:popoverIdentifier]; + + [(nsTouchBar*)cocoaWin.touchBar showPopover:popoverItem showing:aShowing]; + } + return NS_OK; +} + +NS_IMETHODIMP +nsTouchBarUpdater::EnterCustomizeMode() { + [NSApp toggleTouchBarCustomizationPalette:(id)this]; + return NS_OK; +} + +NS_IMETHODIMP +nsTouchBarUpdater::IsTouchBarInitialized(bool* aResult) { + *aResult = sTouchBarIsInitialized; + return NS_OK; +} + +BaseWindow* nsTouchBarUpdater::GetCocoaWindow(nsIBaseWindow* aWindow) { + nsCOMPtr<nsIWidget> widget = nullptr; + aWindow->GetMainWidget(getter_AddRefs(widget)); + if (!widget) { + return nil; + } + BaseWindow* cocoaWin = (BaseWindow*)widget->GetNativeData(NS_NATIVE_WINDOW); + if (!cocoaWin) { + return nil; + } + return cocoaWin; +} + +// NOTE: This method is for internal unit tests only. +NS_IMETHODIMP +nsTouchBarUpdater::SetTouchBarInitialized(bool aIsInitialized) { + sTouchBarIsInitialized = aIsInitialized; + return NS_OK; +} |