Kaydet (Commit) 3e3c3619 authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski

tdf#117295 WIN no main loop shortcut for OLE dialog

Normally we handle Idle events directly without posting events
to the main event queue, as there seem to be no way to post them
to the end of the queue and this starves system events.

This prevents using this short-cut, as the default Windows event
processing doesn't know of this special handling.
Eventually this hack should be removed by simply always processing
all pending events...

This patch includes the follow-up commit 7b148b0e ("WIN move
native dialog hack into WinScheduler").

Change-Id: If9ae81ca7e847743f9251343e106dbf566371584
Reviewed-on: https://gerrit.libreoffice.org/65040
Reviewed-on: https://gerrit.libreoffice.org/65100
Tested-by: Jenkins
Reviewed-by: 's avatarJan-Marek Glogowski <glogow@fbihome.de>
(cherry picked from commit 5bb798a9)
(cherry picked from commit 7b148b0e)
Reviewed-on: https://gerrit.libreoffice.org/65065
üst 4963b550
......@@ -43,6 +43,7 @@
#ifdef _WIN32
#include <oledlg.h>
#include <vcl/winscheduler.hxx>
class InitializedOleGuard
{
......@@ -174,6 +175,10 @@ embed::InsertedObjectInfo SAL_CALL MSOLEDialogObjectCreator::createInstanceByDia
if( !pInsertFct )
throw uno::RuntimeException();
// Disable any event loop shortcuts by enabling a real timer.
// This way the native windows dialog won't block our own processing.
WinScheduler::SetForceRealTimer();
uTemp=pInsertFct(&io);
if ( OLEUI_OK != uTemp )
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_VCL_WINSCHEDULER_HXX
#define INCLUDED_VCL_WINSCHEDULER_HXX
#ifndef _WIN32
#error This header is just useable on Windows
#else
#include <vcl/dllapi.h>
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();
};
#endif // _WIN32
#endif // INCLUDED_VCL_WINSCHEDULER_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -380,6 +380,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
vcl/source/app/unohelp2 \
vcl/source/app/unohelp \
vcl/source/app/vclevent \
vcl/source/app/winscheduler \
vcl/source/components/dtranscomp \
vcl/source/components/factory \
vcl/source/components/fontident \
......
......@@ -269,6 +269,8 @@ int ImplSalWICompareAscii( const wchar_t* pStr1, const char* pStr2 );
#define SAL_MSG_TIMER_CALLBACK (WM_USER+162)
// Stop the timer from the main thread; wParam = 0, lParam = 0
#define SAL_MSG_STOPTIMER (WM_USER+163)
// Start a real timer while GUI is blocked by native dialog
#define SAL_MSG_FORCE_REAL_TIMER (WM_USER+164)
inline void SetWindowPtr( HWND hWnd, WinSalFrame* pThis )
{
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifdef _WIN32
#include <vcl/winscheduler.hxx>
#include <svsys.h>
#include <win/saldata.hxx>
#include <win/salinst.h>
void WinScheduler::SetForceRealTimer()
{
BOOL const ret
= PostMessageW(GetSalData()->mpInstance->mhComWnd, SAL_MSG_FORCE_REAL_TIMER, 0, 0);
SAL_WARN_IF(0 == ret, "vcl.schedule", "ERROR: PostMessage() failed!");
}
#endif // _WIN32
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -620,6 +620,11 @@ LRESULT CALLBACK SalComWndProc( HWND, UINT nMsg, WPARAM wParam, LPARAM lParam, b
pTimer->ImplHandle_WM_TIMER( wParam );
break;
case SAL_MSG_FORCE_REAL_TIMER:
assert(pTimer != nullptr);
pTimer->SetForceRealTimer(true);
break;
case SAL_MSG_DUMMY:
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment