macOS: Allow setting some fullscreen style options

When using the native fullscreen API by enabling EnableFullScrenView()
allow using hiding (or showing) menu and/or toolbar. An additional style
parameter has been added to EnableFullScrenView() to allow customizing
which style is applied when the user presses the fullscreen button
instead of a call to ShowFullScreen().

Closes #22180.
This commit is contained in:
Tobias Taschner 2022-03-11 13:29:03 +01:00 committed by Vadim Zeitlin
parent 9b2f55833e
commit 0a8bba971c
9 changed files with 44 additions and 11 deletions

View File

@ -314,7 +314,7 @@ public :
virtual bool IsFullScreen() const wxOVERRIDE;
bool EnableFullScreenView(bool enable) wxOVERRIDE;
bool EnableFullScreenView(bool enable, long style) wxOVERRIDE;
virtual bool ShowFullScreen(bool show, long style) wxOVERRIDE;
@ -341,6 +341,7 @@ public :
void RestoreWindowLevel() wxOVERRIDE;
bool m_macIgnoreNextFullscreenChange = false;
long m_macFullscreenStyle = wxFULLSCREEN_ALL;
static WX_NSResponder GetNextFirstResponder() ;
static WX_NSResponder GetFormerFirstResponder() ;

View File

@ -962,7 +962,7 @@ public :
virtual void ShowWithoutActivating() { Show(true); }
virtual bool EnableFullScreenView(bool enable) = 0;
virtual bool EnableFullScreenView(bool enable, long style) = 0;
virtual bool ShowFullScreen(bool show, long style)= 0;

View File

@ -180,7 +180,7 @@ public :
virtual bool IsFullScreen() const;
virtual bool EnableFullScreenView(bool enable);
virtual bool EnableFullScreenView(bool enable, long style);
virtual bool ShowFullScreen(bool show, long style);

View File

@ -64,7 +64,7 @@ public:
virtual bool IsActive() wxOVERRIDE;
virtual void ShowWithoutActivating() wxOVERRIDE;
bool EnableFullScreenView(bool enable = true) wxOVERRIDE;
bool EnableFullScreenView(bool enable = true, long style = wxFULLSCREEN_ALL) wxOVERRIDE;
virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL) wxOVERRIDE;
virtual bool IsFullScreen() const wxOVERRIDE;

View File

@ -171,7 +171,8 @@ public:
// set the frame icons
virtual void SetIcons(const wxIconBundle& icons) { m_icons = icons; }
virtual bool EnableFullScreenView(bool WXUNUSED(enable) = true)
virtual bool EnableFullScreenView(bool WXUNUSED(enable) = true,
long WXUNUSED(style) = wxFULLSCREEN_ALL)
{
return false;
}

View File

@ -649,6 +649,10 @@ public:
@param enable
If @true (default) make the zoom button toggle full screen;
if @false the button does only toggle zoom.
@param style
This parameter sets which elements will be hidden when the
user presses the full screen button. See ShowFullScreen()
for possible values. It is available since wxWidgets 3.1.6.
@return @true if the button behaviour has been changed, @false if running
under another OS.
@ -658,6 +662,8 @@ public:
and entering and exiting the mode is animated.
If the button is not present the old way of switching to full screen
is used.
Only @c ::wxFULLSCREEN_NOTOOLBAR and @c ::wxFULLSCREEN_NOMENUBAR will be
used when using the fullscreen API (other values are ignored).
@onlyfor{wxosx}
@ -665,7 +671,7 @@ public:
@since 3.1.0
*/
virtual bool EnableFullScreenView(bool enable = true);
virtual bool EnableFullScreenView(bool enable = true, long style = wxFULLSCREEN_ALL);
/**
Depending on the value of @a show parameter the window is either shown

View File

@ -322,6 +322,8 @@ static void *EffectiveAppearanceContext = &EffectiveAppearanceContext;
- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame;
- (void)windowWillEnterFullScreen:(NSNotification *)notification;
- (void)windowDidChangeBackingProperties:(NSNotification *)notification;
- (NSApplicationPresentationOptions)window:(NSWindow *)window
willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions;
@end
@ -335,6 +337,27 @@ extern int wxOSXGetIdFromSelector(SEL action );
return self;
}
- (NSApplicationPresentationOptions)window:(NSWindow *)window
willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions
{
NSApplicationPresentationOptions options =
NSApplicationPresentationFullScreen | NSApplicationPresentationHideDock;
wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation];
if ( windowimpl )
{
if (windowimpl->m_macFullscreenStyle & wxFULLSCREEN_NOMENUBAR)
options |= NSApplicationPresentationAutoHideMenuBar;
// Auto hide toolbar requires auto hide menu
if (windowimpl->m_macFullscreenStyle & wxFULLSCREEN_NOTOOLBAR)
options |= NSApplicationPresentationAutoHideToolbar |
NSApplicationPresentationAutoHideMenuBar;
}
return options;
}
- (BOOL) triggerMenu:(SEL) action sender:(id)sender
{
// feed back into menu item, if it is ours
@ -1188,8 +1211,9 @@ bool wxNonOwnedWindowCocoaImpl::IsFullScreen() const
return m_macFullScreenData != NULL ;
}
bool wxNonOwnedWindowCocoaImpl::EnableFullScreenView(bool enable)
bool wxNonOwnedWindowCocoaImpl::EnableFullScreenView(bool enable, long style)
{
m_macFullscreenStyle = style;
NSUInteger collectionBehavior = [m_macWindow collectionBehavior];
if (enable)
{
@ -1212,12 +1236,13 @@ bool wxNonOwnedWindowCocoaImpl::EnableFullScreenView(bool enable)
return true;
}
bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long WXUNUSED(style))
bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long style)
{
if ( IsUsingFullScreenApi(m_macWindow) )
{
if ( show != IsFullScreen() )
{
m_macFullscreenStyle = style;
m_macIgnoreNextFullscreenChange = true;
[m_macWindow toggleFullScreen: nil];
}

View File

@ -284,7 +284,7 @@ bool wxNonOwnedWindowIPhoneImpl::IsFullScreen() const
return m_macFullScreenData != NULL ;
}
bool wxNonOwnedWindowIPhoneImpl::EnableFullScreenView(bool WXUNUSED(enable))
bool wxNonOwnedWindowIPhoneImpl::EnableFullScreenView(bool WXUNUSED(enable), long WXUNUSED(style))
{
return true;
}

View File

@ -181,9 +181,9 @@ void wxTopLevelWindowMac::ShowWithoutActivating()
SendSizeEvent();
}
bool wxTopLevelWindowMac::EnableFullScreenView(bool enable)
bool wxTopLevelWindowMac::EnableFullScreenView(bool enable, long style)
{
return m_nowpeer->EnableFullScreenView(enable);
return m_nowpeer->EnableFullScreenView(enable, style);
}
bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style)