[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - include/vcl sfx2/source vcl/source
Michael Meeks (via logerrit)
logerrit at kemper.freedesktop.org
Fri Oct 11 18:21:39 UTC 2019
include/vcl/window.hxx | 1 +
sfx2/source/view/lokhelper.cxx | 25 +++++++++++++++----------
vcl/source/window/window.cxx | 8 ++++++++
3 files changed, 24 insertions(+), 10 deletions(-)
New commits:
commit 6385067924a5d80bd261ddce2d70f003353dccc2
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Thu Jul 18 20:46:36 2019 +0100
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Fri Oct 11 20:20:21 2019 +0200
lok: ensure that dialog windows are focused before emitting events.
Otherwise, we can emit events on a different view's window, causing
problems, and cross-user interference. Also emit the key-event on
the focused sub-window so event bubbling works.
Change-Id: I9dd16c2a256bae58d754f94c6d94a1f3fcdb800b
Reviewed-on: https://gerrit.libreoffice.org/80661
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 72bf36ec21e3..9f97f915b11c 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -1112,6 +1112,7 @@ public:
bool HasActiveChildFrame();
GetFocusFlags GetGetFocusFlags() const;
void GrabFocusToDocument();
+ VclPtr<vcl::Window> GetFocusedWindow() const;
/**
* Set this when you need to act as if the window has focus even if it
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index c44d4c94d37d..3b05bd1dd696 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -314,24 +314,29 @@ namespace
SfxLokHelper::setView(pLOKEv->mnView);
}
+ if (!pLOKEv->mpWindow->HasChildPathFocus(true))
+ {
+ SAL_INFO("sfx.view", "LOK - focus mismatch, switching focus");
+ pLOKEv->mpWindow->GrabFocus();
+ }
+
+ VclPtr<vcl::Window> pFocusWindow = pLOKEv->mpWindow->GetFocusedWindow();
+ if (!pFocusWindow)
+ pFocusWindow = pLOKEv->mpWindow;
+
switch (pLOKEv->mnEvent)
{
case VclEventId::WindowKeyInput:
{
sal_uInt16 nRepeat = pLOKEv->maKeyEvent.GetRepeat();
- if (nRepeat > 0)
- {
- KeyEvent singlePress(pLOKEv->maKeyEvent.GetCharCode(),
- pLOKEv->maKeyEvent.GetKeyCode());
- for (sal_uInt16 i = 0; i <= nRepeat; ++i)
- pLOKEv->mpWindow->KeyInput(singlePress);
- }
- else
- pLOKEv->mpWindow->KeyInput(pLOKEv->maKeyEvent);
+ KeyEvent singlePress(pLOKEv->maKeyEvent.GetCharCode(),
+ pLOKEv->maKeyEvent.GetKeyCode());
+ for (sal_uInt16 i = 0; i <= nRepeat; ++i)
+ pFocusWindow->KeyInput(singlePress);
break;
}
case VclEventId::WindowKeyUp:
- pLOKEv->mpWindow->KeyUp(pLOKEv->maKeyEvent);
+ pFocusWindow->KeyUp(pLOKEv->maKeyEvent);
break;
case VclEventId::WindowMouseButtonDown:
pLOKEv->mpWindow->LogicMouseButtonDown(pLOKEv->maMouseEvent);
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 24724e6c8ada..a6b7bfc026f8 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -3008,6 +3008,14 @@ void Window::GrabFocusToDocument()
ImplGrabFocusToDocument(GetFocusFlags::NONE);
}
+VclPtr<vcl::Window> Window::GetFocusedWindow() const
+{
+ if (mpWindowImpl && mpWindowImpl->mpFrameData)
+ return mpWindowImpl->mpFrameData->mpFocusWin;
+ else
+ return VclPtr<vcl::Window>();
+}
+
void Window::SetFakeFocus( bool bFocus )
{
ImplGetWindowImpl()->mbFakeFocusSet = bFocus;
More information about the Libreoffice-commits
mailing list