vcl/README.scheduler | 4 ++++ vcl/inc/osx/saltimer.h | 1 + vcl/osx/salframeview.mm | 3 +++ vcl/osx/saltimer.cxx | 8 ++++++++ 4 files changed, 16 insertions(+)
New commits: commit c69c1ee9d1305c284be48a7a973810da16c15541 Author: Jan-Marek Glogowski <glo...@fbihome.de> Date: Sat Oct 14 01:43:07 2017 +0200 tdf#112076 OSX post timeout after shouldCloseWindow It seems that something filters application defined events when closing a window... DoYield expects a timeout event, which never arrives, stopping all redraw and generating a busy loop. Change-Id: Ic83468cceac7b967acaecf18b321178fc7565b94 Reviewed-on: https://gerrit.libreoffice.org/43381 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Jan-Marek Glogowski <glo...@fbihome.de> diff --git a/vcl/README.scheduler b/vcl/README.scheduler index 566a88629301..17648ae3b439 100644 --- a/vcl/README.scheduler +++ b/vcl/README.scheduler @@ -170,6 +170,10 @@ There is also a workaround for a problem for pushing tasks to an empty queue, as [NSApp postEvent: ... atStart: NO] doesn't append the event, if the message queue is empty. +An additional problem is the filtering of events on Window close. This drops +posted timer events, when a Window is closed resulting in a busy DoYield loop, +so we have to re-post the event, after closing a window. + == Windows implementation details == Posted or sent event messages often trigger processing of WndProc in diff --git a/vcl/inc/osx/saltimer.h b/vcl/inc/osx/saltimer.h index 65247b930cfa..c860ad5cbdda 100644 --- a/vcl/inc/osx/saltimer.h +++ b/vcl/inc/osx/saltimer.h @@ -58,6 +58,7 @@ public: void handleStartTimerEvent( NSEvent* pEvent ); void handleDispatchTimerEvent( NSEvent* pEvent ); void handleTimerElapsed(); + void handleWindowShouldClose(); bool IsTimerElapsed() const; }; diff --git a/vcl/osx/salframeview.mm b/vcl/osx/salframeview.mm index 1f0a3690bb70..c0d28fe4bc3f 100644 --- a/vcl/osx/salframeview.mm +++ b/vcl/osx/salframeview.mm @@ -369,6 +369,9 @@ static AquaSalFrame* getMouseContainerFrame() { mpFrame->CallCallback( SalEvent::Close, nullptr ); bRet = NO; // application will close the window or not, AppKit shouldn't + AquaSalTimer *pTimer = static_cast<AquaSalTimer*>( ImplGetSVData()->maSchedCtx.mpSalTimer ); + assert( pTimer ); + pTimer->handleWindowShouldClose(); } } diff --git a/vcl/osx/saltimer.cxx b/vcl/osx/saltimer.cxx index 877fdfae85b5..3226b1d1f9ec 100644 --- a/vcl/osx/saltimer.cxx +++ b/vcl/osx/saltimer.cxx @@ -196,4 +196,12 @@ AquaSalTimer::~AquaSalTimer() Stop(); } +void AquaSalTimer::handleWindowShouldClose() +{ + // for whatever reason events get filtered on close, presumely by + // timestamp so post a new timeout event, if there was one queued... + if ( ExistsValidEvent() && !m_pRunningTimer ) + queueDispatchTimerEvent( NO ); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits