Add wxFullScreenEvent for macOS
Send a wxFullScreenEvent when the user enters or exits full screen on macOS. EnableFullScreenView() has to be used to enable the native full screen API. Closes https://github.com/wxWidgets/wxWidgets/pull/2284
This commit is contained in:
committed by
Vadim Zeitlin
parent
a495b1fd23
commit
0ff1bdec09
@@ -681,6 +681,7 @@ class WXDLLIMPEXP_FWD_CORE wxWindowDestroyEvent;
|
||||
class WXDLLIMPEXP_FWD_CORE wxShowEvent;
|
||||
class WXDLLIMPEXP_FWD_CORE wxIconizeEvent;
|
||||
class WXDLLIMPEXP_FWD_CORE wxMaximizeEvent;
|
||||
class WXDLLIMPEXP_FWD_CORE wxFullScreenEvent;
|
||||
class WXDLLIMPEXP_FWD_CORE wxMouseCaptureChangedEvent;
|
||||
class WXDLLIMPEXP_FWD_CORE wxMouseCaptureLostEvent;
|
||||
class WXDLLIMPEXP_FWD_CORE wxPaintEvent;
|
||||
@@ -832,6 +833,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_DESTROY, wxWindowDestroyEvent);
|
||||
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SHOW, wxShowEvent);
|
||||
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_ICONIZE, wxIconizeEvent);
|
||||
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MAXIMIZE, wxMaximizeEvent);
|
||||
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_FULLSCREEN, wxFullScreenEvent);
|
||||
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOUSE_CAPTURE_CHANGED, wxMouseCaptureChangedEvent);
|
||||
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEvent);
|
||||
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_PAINT, wxPaintEvent);
|
||||
@@ -2725,6 +2727,30 @@ private:
|
||||
wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMaximizeEvent);
|
||||
};
|
||||
|
||||
/*
|
||||
wxEVT_FULLSCREEN
|
||||
*/
|
||||
class WXDLLIMPEXP_CORE wxFullScreenEvent : public wxEvent
|
||||
{
|
||||
public:
|
||||
wxFullScreenEvent(int winid = 0, bool fullscreen = true)
|
||||
: wxEvent(winid, wxEVT_FULLSCREEN)
|
||||
{ m_fullscreen = fullscreen; }
|
||||
wxFullScreenEvent(const wxFullScreenEvent& event)
|
||||
: wxEvent(event)
|
||||
{ m_fullscreen = event.m_fullscreen; }
|
||||
|
||||
bool IsFullScreen() const { return m_fullscreen; }
|
||||
|
||||
virtual wxEvent *Clone() const wxOVERRIDE { return new wxFullScreenEvent(*this); }
|
||||
|
||||
protected:
|
||||
bool m_fullscreen;
|
||||
|
||||
private:
|
||||
wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFullScreenEvent);
|
||||
};
|
||||
|
||||
// Joystick event class
|
||||
/*
|
||||
wxEVT_JOY_BUTTON_DOWN,
|
||||
|
@@ -341,6 +341,8 @@ public :
|
||||
CGWindowLevel GetWindowLevel() const wxOVERRIDE { return m_macWindowLevel; }
|
||||
void RestoreWindowLevel() wxOVERRIDE;
|
||||
|
||||
bool m_macIgnoreNextFullscreenChange = false;
|
||||
|
||||
static WX_NSResponder GetNextFirstResponder() ;
|
||||
static WX_NSResponder GetFormerFirstResponder() ;
|
||||
protected :
|
||||
|
@@ -2262,6 +2262,46 @@ public:
|
||||
wxMaximizeEvent(int id = 0);
|
||||
};
|
||||
|
||||
/**
|
||||
@class wxFullScreenEvent
|
||||
|
||||
An event being sent when the user enters or exits full screen mode.
|
||||
|
||||
Currently this event is only generated in the wxOSX/Cocoa port when
|
||||
wxTopLevelWindow::EnableFullScreenView() is enabled and the user
|
||||
the user enters or exits full screen. Note that this event is @e not
|
||||
generated when wxTopLevelWindow::ShowFullScreen().
|
||||
|
||||
@beginEventTable{wxFullScreenEvent}
|
||||
@event{EVT_FULLSCREEN(func)}
|
||||
Process a @c wxEVT_FULLSCREEN event.
|
||||
@endEventTable
|
||||
|
||||
@library{wxcore}
|
||||
@category{events}
|
||||
|
||||
@since 3.1.5
|
||||
|
||||
@see @ref overview_events, wxTopLevelWindow::EnableFullScreenView,
|
||||
wxTopLevelWindow::IsFullScreen
|
||||
*/
|
||||
class wxFullScreenEvent : public wxEvent
|
||||
{
|
||||
public:
|
||||
/**
|
||||
Constructor.
|
||||
*/
|
||||
wxFullScreenEvent(int id = 0, bool fullscreen = true);
|
||||
|
||||
/**
|
||||
Returns @true if the frame entered full screen, @false if exited
|
||||
full screen.
|
||||
*/
|
||||
bool IsFullScreen() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
The possibles modes to pass to wxUpdateUIEvent::SetMode().
|
||||
*/
|
||||
@@ -5151,4 +5191,3 @@ wxEventType wxEVT_WINDOW_MODAL_DIALOG_CLOSED;
|
||||
#endif // wxUSE_GUI
|
||||
|
||||
//@}
|
||||
|
||||
|
@@ -68,6 +68,8 @@ enum
|
||||
See wxMoveEvent.
|
||||
@event{EVT_SHOW(func)}
|
||||
Process a @c wxEVT_SHOW event. See wxShowEvent.
|
||||
@event{EVT_FULLSCREEN(id, func)}
|
||||
Process a @c wxEVT_FULLSCREEN event. See wxFullScreenEvent.
|
||||
@endEventTable
|
||||
|
||||
@library{wxcore}
|
||||
@@ -632,17 +634,16 @@ public:
|
||||
virtual void ShowWithoutActivating();
|
||||
|
||||
/**
|
||||
Enables the maximize button to toggle full screen mode. Prior to
|
||||
macOS 10.10 a full screen button is added to the right upper corner
|
||||
of a window's title bar.
|
||||
Enables the zoom button to toggle full screen mode.
|
||||
|
||||
Currently only available for wxOSX/Cocoa.
|
||||
A wxFullScreenEvent is generated when the users enters or exits
|
||||
full screen via the enter/exit full screen button.
|
||||
|
||||
@param enable
|
||||
If @true (default) adds the full screen button in the title bar;
|
||||
if @false the button is removed.
|
||||
If @true (default) make the zoom button toggle full screen;
|
||||
if @false the button does only toggle zoom.
|
||||
|
||||
@return @true if the button was added or removed, @false if running
|
||||
@return @true if the button behaviour has been changed, @false if running
|
||||
under another OS.
|
||||
|
||||
@note Having the button is also required to let ShowFullScreen()
|
||||
@@ -653,7 +654,7 @@ public:
|
||||
|
||||
@onlyfor{wxosx}
|
||||
|
||||
@see ShowFullScreen()
|
||||
@see ShowFullScreen(), wxFullScreenEvent
|
||||
|
||||
@since 3.1.0
|
||||
*/
|
||||
@@ -718,4 +719,3 @@ public:
|
||||
*/
|
||||
void UseNativeDecorationsByDefault(bool native = true);
|
||||
};
|
||||
|
||||
|
@@ -80,6 +80,7 @@
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxShowEvent, wxEvent);
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxMaximizeEvent, wxEvent);
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxIconizeEvent, wxEvent);
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxFullScreenEvent, wxEvent);
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxMenuEvent, wxEvent);
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxJoystickEvent, wxEvent);
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxDropFilesEvent, wxEvent);
|
||||
@@ -288,6 +289,7 @@ wxDEFINE_EVENT( wxEVT_DESTROY, wxWindowDestroyEvent );
|
||||
wxDEFINE_EVENT( wxEVT_SHOW, wxShowEvent );
|
||||
wxDEFINE_EVENT( wxEVT_ICONIZE, wxIconizeEvent );
|
||||
wxDEFINE_EVENT( wxEVT_MAXIMIZE, wxMaximizeEvent );
|
||||
wxDEFINE_EVENT( wxEVT_FULLSCREEN, wxFullScreenEvent );
|
||||
wxDEFINE_EVENT( wxEVT_MOUSE_CAPTURE_CHANGED, wxMouseCaptureChangedEvent );
|
||||
wxDEFINE_EVENT( wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEvent );
|
||||
wxDEFINE_EVENT( wxEVT_PAINT, wxPaintEvent );
|
||||
|
@@ -606,6 +606,25 @@ extern int wxOSXGetIdFromSelector(SEL action );
|
||||
return true;
|
||||
}
|
||||
|
||||
static void SendFullScreenWindowEvent(NSNotification* notification, bool fullscreen)
|
||||
{
|
||||
NSWindow* window = (NSWindow*) [notification object];
|
||||
wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation];
|
||||
if ( windowimpl )
|
||||
{
|
||||
if (windowimpl->m_macIgnoreNextFullscreenChange)
|
||||
{
|
||||
windowimpl->m_macIgnoreNextFullscreenChange = false;
|
||||
return;
|
||||
}
|
||||
|
||||
wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer();
|
||||
wxFullScreenEvent event(wxpeer->GetId(), fullscreen);
|
||||
event.SetEventObject(wxpeer);
|
||||
wxpeer->HandleWindowEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
// work around OS X bug, on a secondary monitor an already fully sized window
|
||||
// (eg maximized) will not be correctly put to full screen size and keeps a 22px
|
||||
// title band at the top free, therefore we force the correct content size
|
||||
@@ -624,6 +643,13 @@ extern int wxOSXGetIdFromSelector(SEL action );
|
||||
{
|
||||
[view setFrameSize: expectedframerect.size];
|
||||
}
|
||||
|
||||
SendFullScreenWindowEvent(notification, true);
|
||||
}
|
||||
|
||||
- (void)windowWillExitFullScreen:(NSNotification *)notification
|
||||
{
|
||||
SendFullScreenWindowEvent(notification, false);
|
||||
}
|
||||
|
||||
// from https://developer.apple.com/library/archive/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/CapturingScreenContents/CapturingScreenContents.html
|
||||
@@ -1178,6 +1204,7 @@ bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long WXUNUSED(style))
|
||||
{
|
||||
if ( show != IsFullScreen() )
|
||||
{
|
||||
m_macIgnoreNextFullscreenChange = true;
|
||||
[m_macWindow toggleFullScreen: nil];
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user