include/sfx2/lokcomponenthelpers.hxx   |    2 +-
 sfx2/source/view/lokstarmathhelper.cxx |   13 ++++++++++++-
 2 files changed, 13 insertions(+), 2 deletions(-)

New commits:
commit f0a88a6d214ebdcc3617d24beb4bb5148f72c3a4
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Sat Nov 5 15:17:00 2022 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Sat Nov 5 14:06:46 2022 +0100

    lok: properly treat zoom in LokStarMathHelper::postMouseEvent
    
    Previous naive implementation was dropped in commit
    033a342a630dbb6329962156727e621866b77b48 (lok: use twips in Math,
    Wed Nov 02 11:03:08 2022 +0300). Unlike chart, Math expects twips,
    so PPT (pixel per twip) factor must be converted into percentage.
    
    Change-Id: Icd936e004d961c0abc25c241391d4e24c44e8c14
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142319
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/include/sfx2/lokcomponenthelpers.hxx 
b/include/sfx2/lokcomponenthelpers.hxx
index 23bdcd44369e..61a3812a9d2f 100644
--- a/include/sfx2/lokcomponenthelpers.hxx
+++ b/include/sfx2/lokcomponenthelpers.hxx
@@ -78,7 +78,7 @@ public:
     void Dispatch(const OUString& cmd, const 
css::uno::Sequence<css::beans::PropertyValue>& rArguments) const;
 
     bool postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, 
int nModifier,
-                        double fScaleX = 1.0, double fScaleY = 1.0);
+                        double fPPTScaleX, double fPPTScaleY);
 
 private:
     const SfxViewShell* mpViewShell;
diff --git a/sfx2/source/view/lokstarmathhelper.cxx 
b/sfx2/source/view/lokstarmathhelper.cxx
index 8ec65c45a274..a1ee4c2ccacb 100644
--- a/sfx2/source/view/lokstarmathhelper.cxx
+++ b/sfx2/source/view/lokstarmathhelper.cxx
@@ -139,7 +139,7 @@ tools::Rectangle LokStarMathHelper::GetBoundingBox() const
 }
 
 bool LokStarMathHelper::postMouseEvent(int nType, int nX, int nY, int nCount, 
int nButtons,
-                                       int nModifier, double /*fScaleX*/, 
double /*fScaleY*/)
+                                       int nModifier, double fPPTScaleX, 
double fPPTScaleY)
 {
     const tools::Rectangle rBBox = GetBoundingBox();
     if (Point aMousePos(nX, nY); rBBox.Contains(aMousePos))
@@ -147,6 +147,17 @@ bool LokStarMathHelper::postMouseEvent(int nType, int nX, 
int nY, int nCount, in
         if (vcl::Window* pWindow = GetWidgetWindow())
         {
             aMousePos -= rBBox.TopLeft();
+
+            // In lok, Math does not convert coordinates (see 
SmGraphicWidget::SetDrawingArea,
+            // which disables MapMode), and uses twips internally (see 
SmDocShell ctor and
+            // SmMapUnit), but the conversion factor can depend on the client 
zoom.
+            // 1. Remove the twip->pixel factor in the passed scales
+            double fScaleX = o3tl::convert(fPPTScaleX, o3tl::Length::px, 
o3tl::Length::twip);
+            double fScaleY = o3tl::convert(fPPTScaleY, o3tl::Length::px, 
o3tl::Length::twip);
+            // 2. Adjust the position according to the scales
+            aMousePos
+                = Point(std::round(aMousePos.X() * fScaleX), 
std::round(aMousePos.Y() * fScaleY));
+
             LokMouseEventData aMouseEventData(
                 nType, aMousePos, nCount, MouseEventModifiers::SIMPLECLICK, 
nButtons, nModifier);
             SfxLokHelper::postMouseEventAsync(pWindow, aMouseEventData);

Reply via email to