From db02a89fda45aeea3f50a3aa5d4883e0075c40f9 Mon Sep 17 00:00:00 2001 From: jules Date: Fri, 13 Jun 2014 17:57:27 +0100 Subject: [PATCH] Kiosk mode workarounds for 10.8 --- .../juce_gui_basics/components/juce_Desktop.h | 2 +- .../native/juce_mac_NSViewComponentPeer.mm | 42 +++++++++++-------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/modules/juce_gui_basics/components/juce_Desktop.h b/modules/juce_gui_basics/components/juce_Desktop.h index 05911629e9..3bb3e1a19c 100644 --- a/modules/juce_gui_basics/components/juce_Desktop.h +++ b/modules/juce_gui_basics/components/juce_Desktop.h @@ -441,7 +441,7 @@ private: void removeDesktopComponent (Component*); void componentBroughtToFront (Component*); - void setKioskComponent (Component*, bool enableOrDisable, bool allowMenusAndBars); + void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars); void triggerFocusCallback(); void handleAsyncUpdate() override; diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 32568f5051..aebf2e7d65 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -1686,21 +1686,22 @@ private: }; //============================================================================== -struct JuceNSWindowClass : public ObjCClass +struct JuceNSWindowClass : public ObjCClass { - JuceNSWindowClass() : ObjCClass ("JUCEWindow_") + JuceNSWindowClass() : ObjCClass ("JUCEWindow_") { addIvar ("owner"); - addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow, "c@:"); - addMethod (@selector (becomeKeyWindow), becomeKeyWindow, "v@:"); - addMethod (@selector (windowShouldClose:), windowShouldClose, "c@:@"); - addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect, @encode (NSRect), "@:", @encode (NSRect), "@"); - addMethod (@selector (windowWillResize:toSize:), windowWillResize, @encode (NSSize), "@:@", @encode (NSSize)); - addMethod (@selector (zoom:), zoom, "v@:@"); - addMethod (@selector (windowWillMove:), windowWillMove, "v@:@"); + addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow, "c@:"); + addMethod (@selector (becomeKeyWindow), becomeKeyWindow, "v@:"); + addMethod (@selector (windowShouldClose:), windowShouldClose, "c@:@"); + addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect, @encode (NSRect), "@:", @encode (NSRect), "@"); + addMethod (@selector (windowWillResize:toSize:), windowWillResize, @encode (NSSize), "@:@", @encode (NSSize)); + addMethod (@selector (windowDidExitFullScreen:), windowDidExitFullScreen, "v@:@"); + addMethod (@selector (zoom:), zoom, "v@:@"); + addMethod (@selector (windowWillMove:), windowWillMove, "v@:@"); addMethod (@selector (windowWillStartLiveResize:), windowWillStartLiveResize, "v@:@"); - addMethod (@selector (windowDidEndLiveResize:), windowDidEndLiveResize, "v@:@"); + addMethod (@selector (windowDidEndLiveResize:), windowDidEndLiveResize, "v@:@"); #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 addProtocol (@protocol (NSWindowDelegate)); @@ -1766,6 +1767,11 @@ private: return frameRect.size; } + static void windowDidExitFullScreen (id, SEL, NSNotification*) + { + [NSApp setPresentationOptions: NSApplicationPresentationDefault]; + } + static void zoom (id self, SEL, id sender) { if (NSViewComponentPeer* const owner = getOwner (self)) @@ -1864,7 +1870,7 @@ bool MouseInputSource::SourceList::addSource() } //============================================================================== -void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, bool allowMenusAndBars) +void Desktop::setKioskComponent (Component* kioskComp, bool shouldBeEnabled, bool allowMenusAndBars) { #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 @@ -1875,13 +1881,15 @@ void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, boo if (peer->hasNativeTitleBar() && [peer->window respondsToSelector: @selector (toggleFullScreen:)]) { - [peer->window performSelector: @selector (toggleFullScreen:) - withObject: [NSNumber numberWithBool: (BOOL) enableOrDisable]]; + if (shouldBeEnabled && ! allowMenusAndBars) + [NSApp setPresentationOptions: NSApplicationPresentationHideDock | NSApplicationPresentationHideMenuBar]; + + [peer->window performSelector: @selector (toggleFullScreen:) withObject: nil]; } else #endif { - if (enableOrDisable) + if (shouldBeEnabled) { if (peer->hasNativeTitleBar()) [peer->window setStyleMask: NSBorderlessWindowMask]; @@ -1903,9 +1911,7 @@ void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, boo } } #elif JUCE_SUPPORT_CARBON - (void) kioskComp; (void) enableOrDisable; (void) allowMenusAndBars; - - if (enableOrDisable) + if (shouldBeEnabled) { SetSystemUIMode (kUIModeAllSuppressed, allowMenusAndBars ? kUIOptionAutoShowMenuBar : 0); kioskComp->setBounds (Desktop::getInstance().getDisplays().getMainDisplay().totalArea); @@ -1915,7 +1921,7 @@ void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, boo SetSystemUIMode (kUIModeNormal, 0); } #else - (void) kioskComp; (void) enableOrDisable; (void) allowMenusAndBars; + (void) kioskComp; (void) shouldBeEnabled; (void) allowMenusAndBars; // If you're targeting OSes earlier than 10.6 and want to use this feature, // you'll need to enable JUCE_SUPPORT_CARBON.