summaryrefslogtreecommitdiffstats
path: root/widget/cocoa/nsTouchBarUpdater.mm
diff options
context:
space:
mode:
Diffstat (limited to 'widget/cocoa/nsTouchBarUpdater.mm')
-rw-r--r--widget/cocoa/nsTouchBarUpdater.mm116
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;
+}