From 76ee2fa0a050dff262863d4b3d20c7b91fbdd39e Mon Sep 17 00:00:00 2001 From: Rob Krakora Date: Sat, 18 Jul 2015 01:15:29 +0200 Subject: [PATCH] Implement sending wxIconizeEvent in wxOSX. Translate windowDid{Miniaturize,Deminiaturize} callbacks to calls to SendIconizeEvent(). Closes #16718. (this is a backport of 31e1387541b8d2431232c25a31524f3e2991978d from master) --- docs/changes.txt | 1 + include/wx/osx/nonownedwnd.h | 4 +++- include/wx/osx/toplevel.h | 3 +++ interface/wx/event.h | 2 -- src/osx/cocoa/nonownedwnd.mm | 24 ++++++++++++++++++++++++ src/osx/nonownedwnd_osx.cpp | 8 ++++++++ src/osx/toplevel_osx.cpp | 9 +++++++++ 7 files changed, 48 insertions(+), 3 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 31c1f2d6a8..29b83430d1 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -639,6 +639,7 @@ wxOSX: - Fix wxSearchCtrl appearance under 10.10 (John Roberts). - Generate correct events for WXK_NUMPAD_ENTER (John Roberts). - Fix handling of WXK_NUMPAD_ENTER in wxTextCtrl (John Roberts). +- Send wxIconizeEvent when a window is iconized/restore (Rob Krakora). - Fix printing all pages non-interactively (John Roberts). - Fix custom paper support (tijsv). - Return false from wxSound::Create()/IsOk() if the file doesn't exist. diff --git a/include/wx/osx/nonownedwnd.h b/include/wx/osx/nonownedwnd.h index edc3f04e62..9b0d3bea4e 100644 --- a/include/wx/osx/nonownedwnd.h +++ b/include/wx/osx/nonownedwnd.h @@ -113,7 +113,9 @@ public: virtual void HandleResized( double timestampsec ); virtual void HandleMoved( double timestampsec ); virtual void HandleResizing( double timestampsec, wxRect* rect ); - + + void OSXHandleMiniaturize(double WXUNUSED(timestampsec), bool miniaturized); + void WindowWasPainted(); virtual bool Destroy(); diff --git a/include/wx/osx/toplevel.h b/include/wx/osx/toplevel.h index 73b218fe75..d162b4121f 100644 --- a/include/wx/osx/toplevel.h +++ b/include/wx/osx/toplevel.h @@ -81,6 +81,9 @@ public: virtual void SetRepresentedFilename(const wxString& filename); + // do *not* call this to iconize the frame, this is a private function! + void OSXSetIconizeState(bool iconic); + protected: // common part of all ctors void Init(); diff --git a/interface/wx/event.h b/interface/wx/event.h index 52bb60970b..37eeae6093 100644 --- a/interface/wx/event.h +++ b/interface/wx/event.h @@ -4210,8 +4210,6 @@ public: An event being sent when the frame is iconized (minimized) or restored. - Currently only wxMSW and wxGTK generate such events. - @onlyfor{wxmsw,wxgtk} @beginEventTable{wxIconizeEvent} diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index 666c63c6a7..465e52be18 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -309,6 +309,8 @@ static NSResponder* s_formerFirstResponder = NULL; - (void)windowDidResignKey:(NSNotification *)notification; - (void)windowDidBecomeKey:(NSNotification *)notification; - (void)windowDidMove:(NSNotification *)notification; +- (void)windowDidMiniaturize:(NSNotification *)notification; +- (void)windowDidDeminiaturize:(NSNotification *)notification; - (BOOL)windowShouldClose:(id)window; - (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame; @@ -397,6 +399,28 @@ extern int wxOSXGetIdFromSelector(SEL action ); [self triggerMenu:_cmd]; } +- (void)windowDidMiniaturize:(NSNotification *)notification +{ + NSWindow* window = (NSWindow*) [notification object]; + wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation]; + if ( windowimpl ) + { + if ( wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer() ) + wxpeer->OSXHandleMiniaturize(0, [window isMiniaturized]); + } +} + +- (void)windowDidDeminiaturize:(NSNotification *)notification +{ + NSWindow* window = (NSWindow*) [notification object]; + wxNonOwnedWindowCocoaImpl* windowimpl = [window WX_implementation]; + if ( windowimpl ) + { + if ( wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer() ) + wxpeer->OSXHandleMiniaturize(0, [window isMiniaturized]); + } +} + - (BOOL)windowShouldClose:(id)nwindow { wxNonOwnedWindowCocoaImpl* windowimpl = [(NSWindow*) nwindow WX_implementation]; diff --git a/src/osx/nonownedwnd_osx.cpp b/src/osx/nonownedwnd_osx.cpp index 0e57c7f9f9..d70ebfe2b9 100644 --- a/src/osx/nonownedwnd_osx.cpp +++ b/src/osx/nonownedwnd_osx.cpp @@ -552,4 +552,12 @@ bool wxNonOwnedWindow::DoSetPathShape(const wxGraphicsPath& path) return DoSetRegionShape(wxRegion(bmp)); } +void +wxNonOwnedWindow::OSXHandleMiniaturize(double WXUNUSED(timestampsec), + bool miniaturized) +{ + if ( wxTopLevelWindowMac* top = (wxTopLevelWindowMac*) MacGetTopLevelWindow() ) + top->OSXSetIconizeState(miniaturized); +} + #endif // wxUSE_GRAPHICS_CONTEXT diff --git a/src/osx/toplevel_osx.cpp b/src/osx/toplevel_osx.cpp index b0dc820904..548c6431a3 100644 --- a/src/osx/toplevel_osx.cpp +++ b/src/osx/toplevel_osx.cpp @@ -224,3 +224,12 @@ void wxTopLevelWindowMac::SetRepresentedFilename(const wxString& filename) { m_nowpeer->SetRepresentedFilename(filename); } + +void wxTopLevelWindowMac::OSXSetIconizeState(bool iconize) +{ + if ( iconize != m_iconized ) + { + m_iconized = iconize; + (void)SendIconizeEvent(iconize); + } +}