[Libreoffice-commits] core.git: Branch 'libreoffice-6-2' - fpicker/source include/vcl vcl/source

Mike Kaganski (via logerrit) logerrit at kemper.freedesktop.org
Tue Apr 9 07:59:25 UTC 2019


 fpicker/source/win32/asyncrequests.cxx |    5 +++++
 include/vcl/winscheduler.hxx           |    5 +++++
 vcl/source/app/winscheduler.cxx        |   12 +++++++++---
 3 files changed, 19 insertions(+), 3 deletions(-)

New commits:
commit 7420a6175358fdc1cda133c0ed2eab693cc72e54
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Sat Apr 6 17:04:06 2019 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Tue Apr 9 09:59:03 2019 +0200

    tdf#124579: ensure to provide an event to wake up main loop when notifying
    
    Without that, Request::waitProcessMessages might wait indefinitely for
    Application::Yield() to return; while the latter would wait for a message
    in GetMessage. If there's no visible LO window, the message might never
    arrive by itself.
    
    Co-authored-by: Jan-Marek Glogowski <glogow at fbihome.de>
    
    Change-Id: Ie2622053a8d4467eb1cbd579d8496cb5ddef08aa
    Reviewed-on: https://gerrit.libreoffice.org/70346
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
    Tested-by: Mike Kaganski <mike.kaganski at collabora.com>
    (cherry picked from commit e3d737119fc7bdce224a173896486f376f95a417)
    Reviewed-on: https://gerrit.libreoffice.org/70349
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/fpicker/source/win32/asyncrequests.cxx b/fpicker/source/win32/asyncrequests.cxx
index 5a5b1decf180..fcd7eadc3010 100644
--- a/fpicker/source/win32/asyncrequests.cxx
+++ b/fpicker/source/win32/asyncrequests.cxx
@@ -19,6 +19,7 @@
 
 #include "asyncrequests.hxx"
 #include <vcl/svapp.hxx>
+#include <vcl/winscheduler.hxx>
 #include <osl/mutex.hxx>
 
 namespace fpicker{
@@ -56,6 +57,10 @@ void Request::waitProcessMessages()
 void Request::notify()
 {
     m_aJoiner.set();
+    // Make sure that main loop receives at least this message to return from GetMessage and recheck
+    // the condition, even in case when there's no visible application windows present, and thus no
+    // other messages might arrive to the main loop.
+    WinScheduler::PostDummyMessage();
 }
 
 AsyncRequests::AsyncRequests(const RequestHandlerRef& rHandler)
diff --git a/include/vcl/winscheduler.hxx b/include/vcl/winscheduler.hxx
index 02d86116bb38..6f77f3a7b082 100644
--- a/include/vcl/winscheduler.hxx
+++ b/include/vcl/winscheduler.hxx
@@ -31,6 +31,11 @@ struct VCL_DLLPUBLIC WinScheduler final
     /// Hack for Windows native dialogs, which run the main loop, so we can't
     /// use the direct processing shortcut.
     static void SetForceRealTimer();
+
+    // Posting a dummy messages might be needed to ensure that main loop eventually returns from
+    // GetMessage ("wakes up") in modes without a visible window. This, e.g., might be needed to
+    // let main thread recheck a condition set from another thread.
+    static void PostDummyMessage();
 };
 
 #endif // _WIN32
diff --git a/vcl/source/app/winscheduler.cxx b/vcl/source/app/winscheduler.cxx
index f8a90f3f638d..8ec11211cfe0 100644
--- a/vcl/source/app/winscheduler.cxx
+++ b/vcl/source/app/winscheduler.cxx
@@ -25,12 +25,18 @@
 #include <win/saldata.hxx>
 #include <win/salinst.h>
 
-void WinScheduler::SetForceRealTimer()
+namespace
 {
-    BOOL const ret
-        = PostMessageW(GetSalData()->mpInstance->mhComWnd, SAL_MSG_FORCE_REAL_TIMER, 0, 0);
+void PostMessageToComWnd(UINT nMsg)
+{
+    BOOL const ret = PostMessageW(GetSalData()->mpInstance->mhComWnd, nMsg, 0, 0);
     SAL_WARN_IF(0 == ret, "vcl.schedule", "ERROR: PostMessage() failed!");
 }
+}
+
+void WinScheduler::SetForceRealTimer() { PostMessageToComWnd(SAL_MSG_FORCE_REAL_TIMER); }
+
+void WinScheduler::PostDummyMessage() { PostMessageToComWnd(SAL_MSG_DUMMY); }
 
 #endif // _WIN32
 


More information about the Libreoffice-commits mailing list