sfx2/source/dialog/basedlgs.cxx | 22 ++++++++++++-------- vcl/source/window/window.cxx | 44 +++++++++++++++++++++++++++++----------- 2 files changed, 46 insertions(+), 20 deletions(-)
New commits: commit 76de866e162502518acbc0ab020c257b80946c2d Author: Pranav Kant <pran...@collabora.co.uk> Date: Thu Dec 14 13:11:00 2017 +0530 lokdialog: Send close callback when dialog dissappears too Change-Id: I88bea3dc1ae938d31462e85ca1a8f48dd13e8e89 diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx index f44ed4c15446..a11ddad63f02 100644 --- a/sfx2/source/dialog/basedlgs.cxx +++ b/sfx2/source/dialog/basedlgs.cxx @@ -161,10 +161,9 @@ void SfxModalDialog::dispose() SetDialogData_Impl(); delete pOutputSet; - SfxViewShell* pViewShell = SfxViewShell::Current(); - if (comphelper::LibreOfficeKit::isActive() && pViewShell) + if (comphelper::LibreOfficeKit::isActive() && GetLOKNotifier()) { - pViewShell->notifyWindow(GetLOKWindowId(), "close"); + SfxViewShell::Current()->notifyWindow(GetLOKWindowId(), "close"); ReleaseLOKNotifier(); } @@ -208,13 +207,13 @@ void SfxModalDialog::CreateOutputItemSet( const SfxItemSet& rSet ) void SfxModalDialog::StateChanged( StateChangedType nType ) { - if (comphelper::LibreOfficeKit::isActive() && nType == StateChangedType::InitShow) + if (comphelper::LibreOfficeKit::isActive()) { - // There are some dialogs, like Hyperlink dialog, which inherit from - // SfxModalDialog even though they are modeless, i.e., their Execute method - // isn't called. - if (!GetLOKNotifier()) + if (nType == StateChangedType::InitShow && !GetLOKNotifier()) { + // There are some dialogs, like Hyperlink dialog, which inherit from + // SfxModalDialog even though they are modeless, i.e., their Execute method + // isn't called. SetLOKNotifier(SfxViewShell::Current()); const Size aSize = GetOptimalSize(); std::vector<vcl::LOKPayloadItem> aItems; @@ -222,6 +221,13 @@ void SfxModalDialog::StateChanged( StateChangedType nType ) aItems.emplace_back(std::make_pair("size", aSize.toString())); SfxViewShell::Current()->notifyWindow(GetLOKWindowId(), "created", aItems); } + else if (nType == StateChangedType::Visible && + !IsVisible() && + GetLOKNotifier()) + { + SfxViewShell::Current()->notifyWindow(GetLOKWindowId(), "close"); + ReleaseLOKNotifier(); + } } ModalDialog::StateChanged(nType); commit 53f8f28c53391ef1cadefaf16c3a9e81e04ac7f5 Author: Pranav Kant <pran...@collabora.co.uk> Date: Thu Dec 14 12:53:35 2017 +0530 lokdialog: Unblock custom window mouse key events In some cases, the mouse event blocks. Eg: when the mouse event is responsible for launching a new dialog (cf. Spell dialog -> Options). We don't want any kind of blocking behavior whatsoever in LOK. Post all custom window mouse events back the main-loop thread and keep the current LOK thread free. Change-Id: I018870fadcb62dbb7b33a7d93f8af3a0000442b5 diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 1e76d47890a2..8075a6368784 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -3231,15 +3231,33 @@ VclPtr<vcl::Window> Window::GetParentWithLOKNotifier() return pWindow; } +struct LOKAsyncEvent +{ + VclPtr<vcl::Window> mpWindow; + SalEvent mnEvent; + MouseEvent maMouseEvent; +}; + +static void LOKAsyncEventLink( void* pEvent, void* ) +{ + LOKAsyncEvent* pLOKEv = static_cast<LOKAsyncEvent*>(pEvent); + if (!pLOKEv->mpWindow->IsDisposed()) + { + ImplWindowFrameProc(pLOKEv->mpWindow, pLOKEv->mnEvent, &pLOKEv->maMouseEvent); + } +} + void Window::LogicMouseButtonDown(const MouseEvent& rMouseEvent) { // When we're not doing tiled rendering, then positions must be passed as pixels. assert(comphelper::LibreOfficeKit::isActive()); - if (ImplIsFloatingWindow()) - ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseButtonDown, &rMouseEvent); - else - ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonDown, &rMouseEvent); + LOKAsyncEvent* pEv = new LOKAsyncEvent; + pEv->mpWindow = ImplIsFloatingWindow() ? ImplGetBorderWindow() : this; + pEv->mnEvent = SalEvent::ExternalMouseButtonDown; + pEv->maMouseEvent = rMouseEvent; + Application::PostUserEvent( Link<void*, void>(pEv, LOKAsyncEventLink) ); + } void Window::LogicMouseButtonUp(const MouseEvent& rMouseEvent) @@ -3247,10 +3265,11 @@ void Window::LogicMouseButtonUp(const MouseEvent& rMouseEvent) // When we're not doing tiled rendering, then positions must be passed as pixels. assert(comphelper::LibreOfficeKit::isActive()); - if (ImplIsFloatingWindow()) - ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseButtonUp, &rMouseEvent); - else - ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonUp, &rMouseEvent); + LOKAsyncEvent* pEv = new LOKAsyncEvent; + pEv->mpWindow = ImplIsFloatingWindow() ? ImplGetBorderWindow() : this; + pEv->mnEvent = SalEvent::ExternalMouseButtonUp; + pEv->maMouseEvent = rMouseEvent; + Application::PostUserEvent( Link<void*, void>(pEv, LOKAsyncEventLink) ); } void Window::LogicMouseMove(const MouseEvent& rMouseEvent) @@ -3258,10 +3277,11 @@ void Window::LogicMouseMove(const MouseEvent& rMouseEvent) // When we're not doing tiled rendering, then positions must be passed as pixels. assert(comphelper::LibreOfficeKit::isActive()); - if (ImplIsFloatingWindow()) - ImplWindowFrameProc(ImplGetBorderWindow(), SalEvent::ExternalMouseMove, &rMouseEvent); - else - ImplWindowFrameProc(this, SalEvent::ExternalMouseMove, &rMouseEvent); + LOKAsyncEvent* pEv = new LOKAsyncEvent; + pEv->mpWindow = ImplIsFloatingWindow() ? ImplGetBorderWindow() : this; + pEv->mnEvent = SalEvent::ExternalMouseMove; + pEv->maMouseEvent = rMouseEvent; + Application::PostUserEvent( Link<void*, void>(pEv, LOKAsyncEventLink) ); } void Window::LOKKeyInput(const KeyEvent& rKeyEvent) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits