include/vcl/window.hxx | 2 + vcl/inc/window.h | 2 + vcl/source/window/window.cxx | 2 + vcl/source/window/window2.cxx | 52 ++++++++++++++++++++++++++++++++---------- vcl/source/window/winproc.cxx | 16 +++++++++++- 5 files changed, 60 insertions(+), 14 deletions(-)
New commits: commit c816eb597ee7f4d6819da28d3bbb961cb2f7f96c Author: Henry Castro <hcas...@collabora.com> AuthorDate: Thu Jun 24 07:30:15 2021 -0400 Commit: Szymon Kłos <szymon.k...@collabora.com> CommitDate: Thu Oct 7 11:41:50 2021 +0200 lok: introduce local mouse tracking Add the term local mouse tracking per frame window (per user) instead of global mouse tracking in the desktop case. Change-Id: I3f8c55fc770b4ac7dea167385586d8639ac4d93b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118856 Tested-by: Szymon Kłos <szymon.k...@collabora.com> Reviewed-by: Szymon Kłos <szymon.k...@collabora.com> diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx index 41b35a24063d..220df94e97f2 100644 --- a/include/vcl/window.hxx +++ b/include/vcl/window.hxx @@ -1162,6 +1162,8 @@ public: void SetComponentInterface( css::uno::Reference< css::awt::XWindowPeer > const & xIFace ); + void SetUseFrameData(bool bUseFrameData); + /// Interface to register for dialog / window tunneling. void SetLOKNotifier(const vcl::ILibreOfficeKitNotifier* pNotifier, bool bParent = false); const vcl::ILibreOfficeKitNotifier* GetLOKNotifier() const; diff --git a/vcl/inc/window.h b/vcl/inc/window.h index aebd513426f9..e6acaa78dbbf 100644 --- a/vcl/inc/window.h +++ b/vcl/inc/window.h @@ -139,6 +139,7 @@ struct ImplFrameData VclPtr<vcl::Window> mpFocusWin; //< focus window (is also set, when frame doesn't have the focus) VclPtr<vcl::Window> mpMouseMoveWin; //< last window, where MouseMove() called VclPtr<vcl::Window> mpMouseDownWin; //< last window, where MouseButtonDown() called + VclPtr<vcl::Window> mpTrackWin; //< window, that is in tracking mode std::vector<VclPtr<vcl::Window> > maOwnerDrawList; //< List of system windows with owner draw decoration std::shared_ptr<PhysicalFontCollection> mxFontCollection; //< Font-List for this frame std::shared_ptr<ImplFontCache> mxFontCache; //< Font-Cache for this frame @@ -399,6 +400,7 @@ public: const vcl::ILibreOfficeKitNotifier* mpLOKNotifier; ///< To emit the LOK callbacks eg. for dialog tunneling. vcl::LOKWindowId mnLOKWindowId; ///< ID of this specific window. bool mbLOKParentNotifier; + bool mbUseFrameData; }; namespace vcl diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 3b0e390721e3..e2efee60dce8 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -740,6 +740,7 @@ WindowImpl::WindowImpl( WindowType nType ) mpLOKNotifier = nullptr; mnLOKWindowId = 0; mbLOKParentNotifier = false; + mbUseFrameData = false; } WindowImpl::~WindowImpl() @@ -774,6 +775,7 @@ ImplFrameData::ImplFrameData( vcl::Window *pWindow ) mpFocusWin = nullptr; mpMouseMoveWin = nullptr; mpMouseDownWin = nullptr; + mpTrackWin = nullptr; mxFontCollection = pSVData->maGDIData.mxScreenFontList; mxFontCache = pSVData->maGDIData.mxScreenFontCache; mnFocusId = nullptr; diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx index b8307db328b1..8b2e145d0aae 100644 --- a/vcl/source/window/window2.cxx +++ b/vcl/source/window/window2.cxx @@ -241,17 +241,30 @@ IMPL_LINK( Window, ImplTrackTimerHdl, Timer*, pTimer, void ) Tracking( aTEvt ); } +void Window::SetUseFrameData(bool bUseFrameData) +{ + if (mpWindowImpl) + mpWindowImpl->mbUseFrameData = bUseFrameData; +} + void Window::StartTracking( StartTrackingFlags nFlags ) { + if (!mpWindowImpl) + return; + ImplSVData* pSVData = ImplGetSVData(); + VclPtr<vcl::Window> pTrackWin = mpWindowImpl->mbUseFrameData ? + mpWindowImpl->mpFrameData->mpTrackWin : + pSVData->mpWinData->mpTrackWin; - if ( pSVData->mpWinData->mpTrackWin.get() != this ) + if ( pTrackWin.get() != this ) { - if ( pSVData->mpWinData->mpTrackWin ) - pSVData->mpWinData->mpTrackWin->EndTracking( TrackingEventFlags::Cancel ); + if ( pTrackWin ) + pTrackWin->EndTracking( TrackingEventFlags::Cancel ); } - if ( nFlags & (StartTrackingFlags::ScrollRepeat | StartTrackingFlags::ButtonRepeat) ) + if ( !mpWindowImpl->mbUseFrameData && + (nFlags & (StartTrackingFlags::ScrollRepeat | StartTrackingFlags::ButtonRepeat)) ) { pSVData->mpWinData->mpTrackTimer = new AutoTimer; @@ -264,30 +277,43 @@ void Window::StartTracking( StartTrackingFlags nFlags ) pSVData->mpWinData->mpTrackTimer->Start(); } - pSVData->mpWinData->mpTrackWin = this; - pSVData->mpWinData->mnTrackFlags = nFlags; - CaptureMouse(); + if (mpWindowImpl->mbUseFrameData) + { + mpWindowImpl->mpFrameData->mpTrackWin = this; + } + else + { + pSVData->mpWinData->mpTrackWin = this; + pSVData->mpWinData->mnTrackFlags = nFlags; + CaptureMouse(); + } } void Window::EndTracking( TrackingEventFlags nFlags ) { + if (!mpWindowImpl) + return; + ImplSVData* pSVData = ImplGetSVData(); + VclPtr<vcl::Window> pTrackWin = mpWindowImpl->mbUseFrameData ? + mpWindowImpl->mpFrameData->mpTrackWin : + pSVData->mpWinData->mpTrackWin; - if ( pSVData->mpWinData->mpTrackWin.get() != this ) + if ( pTrackWin.get() != this ) return; - if ( pSVData->mpWinData->mpTrackTimer ) + if ( !mpWindowImpl->mbUseFrameData && pSVData->mpWinData->mpTrackTimer ) { delete pSVData->mpWinData->mpTrackTimer; pSVData->mpWinData->mpTrackTimer = nullptr; } - pSVData->mpWinData->mpTrackWin = nullptr; + mpWindowImpl->mpFrameData->mpTrackWin = pSVData->mpWinData->mpTrackWin = nullptr; pSVData->mpWinData->mnTrackFlags = StartTrackingFlags::NONE; ReleaseMouse(); // call EndTracking if required - if (mpWindowImpl && mpWindowImpl->mpFrameData) + if (mpWindowImpl->mpFrameData) { Point aMousePos( mpWindowImpl->mpFrameData->mnLastMouseX, mpWindowImpl->mpFrameData->mnLastMouseY ); if( ImplIsAntiparallel() ) @@ -312,7 +338,9 @@ void Window::EndTracking( TrackingEventFlags nFlags ) bool Window::IsTracking() const { - return (ImplGetSVData()->mpWinData->mpTrackWin == this); + return (mpWindowImpl->mbUseFrameData ? + mpWindowImpl->mpFrameData->mpTrackWin == this : + ImplGetSVData()->mpWinData->mpTrackWin == this); } void Window::StartAutoScroll( StartAutoScrollFlags nFlags ) diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx index fcbf268290a0..36f040ce3a72 100644 --- a/vcl/source/window/winproc.cxx +++ b/vcl/source/window/winproc.cxx @@ -883,9 +883,16 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& xWindow, MouseNotifyEven MouseEvent aMouseEvent(aWinPos, nClicks, nMode, nCode, nCode); if (nEvent == MouseNotifyEvent::MOUSEMOVE) { - xWindow->MouseMove(aMouseEvent); + if (pFrameData->mpTrackWin) + { + TrackingEvent aTrackingEvent(aMouseEvent); + pFrameData->mpTrackWin->Tracking(aTrackingEvent); + } + else + xWindow->MouseMove(aMouseEvent); } - else if (nEvent == MouseNotifyEvent::MOUSEBUTTONDOWN) + else if (nEvent == MouseNotifyEvent::MOUSEBUTTONDOWN && + !pFrameData->mpTrackWin) { pFrameData->mpMouseDownWin = xWindow; pFrameData->mnFirstMouseX = aMousePos.X(); @@ -895,6 +902,11 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& xWindow, MouseNotifyEven } else { + if (pFrameData->mpTrackWin) + { + pFrameData->mpTrackWin->EndTracking(); + } + pFrameData->mpMouseDownWin = nullptr; pFrameData->mpMouseMoveWin = nullptr; pFrameData->mbStartDragCalled = false;