vcl/unx/gtk3/gtkinst.cxx |  118 +++++++++++++++++++++++++++++++++++++----------
 1 file changed, 94 insertions(+), 24 deletions(-)

New commits:
commit 988175a5111d214aee6c52be8065b1b79be26497
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Thu Jun 3 14:15:41 2021 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Jun 3 16:40:05 2021 +0200

    gtk4: get mouse motion events
    
    Change-Id: Ief3f34c6e1ad33201324940557020c9748784e22
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116670
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 128b63450be9..566e1d0aa53e 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -2204,7 +2204,6 @@ static MouseEventModifiers 
ImplGetMouseButtonMode(sal_uInt16 nButton, sal_uInt16
     return nMode;
 }
 
-#if !GTK_CHECK_VERSION(4, 0, 0)
 static MouseEventModifiers ImplGetMouseMoveMode(sal_uInt16 nCode)
 {
     MouseEventModifiers nMode = MouseEventModifiers::NONE;
@@ -2216,7 +2215,6 @@ static MouseEventModifiers 
ImplGetMouseMoveMode(sal_uInt16 nCode)
         nMode |= MouseEventModifiers::DRAGCOPY;
     return nMode;
 }
-#endif
 
 namespace
 {
@@ -2737,6 +2735,7 @@ private:
 #if GTK_CHECK_VERSION(4, 0, 0)
     GtkEventController* m_pFocusController;
     GtkEventController* m_pClickController;
+    GtkEventController* m_pMotionController;
 #endif
 
     rtl::Reference<GtkInstDropTarget> m_xDropTarget;
@@ -2924,7 +2923,32 @@ private:
     }
 #endif
 
-#if !GTK_CHECK_VERSION(4, 0, 0)
+    bool simple_signal_motion(double x, double y, guint nState)
+    {
+        if (!m_aMouseMotionHdl.IsSet())
+            return false;
+
+        Point aPos(x, y);
+        if (SwapForRTL())
+            aPos.setX(gtk_widget_get_allocated_width(m_pWidget) - 1 - 
aPos.X());
+        sal_uInt32 nModCode = GtkSalFrame::GetMouseModCode(nState);
+        MouseEvent aMEvt(aPos, 0, ImplGetMouseMoveMode(nModCode), nModCode, 
nModCode);
+
+        m_aMouseMotionHdl.Call(aMEvt);
+        return true;
+    }
+
+#if GTK_CHECK_VERSION(4, 0, 0)
+    static void signalMotion(GtkEventControllerMotion *pController, double x, 
double y, gpointer widget)
+    {
+        GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
+        GdkModifierType eType = 
gtk_event_controller_get_current_event_state(GTK_EVENT_CONTROLLER(pController));
+
+        SolarMutexGuard aGuard;
+        pThis->simple_signal_motion(x, y, eType);
+    }
+
+#else
     static gboolean signalMotion(GtkWidget*, GdkEventMotion* pEvent, gpointer 
widget)
     {
         GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
@@ -2955,41 +2979,50 @@ private:
             return false;
         }
 
+        return simple_signal_motion(pEvent->x, pEvent->y, pEvent->state);
+    }
+#endif
+
+    bool signal_crossing(double x, double y, guint nState, MouseEventModifiers 
eMouseEventModifiers)
+    {
         if (!m_aMouseMotionHdl.IsSet())
             return false;
 
-        Point aPos(pEvent->x, pEvent->y);
+        Point aPos(x, y);
         if (SwapForRTL())
             aPos.setX(gtk_widget_get_allocated_width(m_pWidget) - 1 - 
aPos.X());
-        sal_uInt32 nModCode = GtkSalFrame::GetMouseModCode(pEvent->state);
-        MouseEvent aMEvt(aPos, 0, ImplGetMouseMoveMode(nModCode), nModCode, 
nModCode);
+        sal_uInt32 nModCode = GtkSalFrame::GetMouseModCode(nState);
+        MouseEventModifiers eModifiers = ImplGetMouseMoveMode(nModCode);
+        eModifiers = eModifiers | eMouseEventModifiers;
+        MouseEvent aMEvt(aPos, 0, eModifiers, nModCode, nModCode);
 
         m_aMouseMotionHdl.Call(aMEvt);
         return true;
     }
 
-    static gboolean signalCrossing(GtkWidget*, GdkEventCrossing* pEvent, 
gpointer widget)
+#if GTK_CHECK_VERSION(4, 0, 0)
+    static void signalEnter(GtkEventControllerMotion *pController, double x, 
double y, gpointer widget)
     {
         GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
+        GdkModifierType eType = 
gtk_event_controller_get_current_event_state(GTK_EVENT_CONTROLLER(pController));
         SolarMutexGuard aGuard;
-        return pThis->signal_crossing(pEvent);
+        pThis->signal_crossing(x, y, eType, MouseEventModifiers::ENTERWINDOW);
     }
 
-    bool signal_crossing(const GdkEventCrossing* pEvent)
+    static void signalLeave(GtkEventControllerMotion *pController, gpointer 
widget)
     {
-        if (!m_aMouseMotionHdl.IsSet())
-            return false;
-
-        Point aPos(pEvent->x, pEvent->y);
-        if (SwapForRTL())
-            aPos.setX(gtk_widget_get_allocated_width(m_pWidget) - 1 - 
aPos.X());
-        sal_uInt32 nModCode = GtkSalFrame::GetMouseModCode(pEvent->state);
-        MouseEventModifiers eModifiers = ImplGetMouseMoveMode(nModCode);
-        eModifiers = eModifiers | (pEvent->type == GDK_ENTER_NOTIFY ? 
MouseEventModifiers::ENTERWINDOW : MouseEventModifiers::LEAVEWINDOW);
-        MouseEvent aMEvt(aPos, 0, eModifiers, nModCode, nModCode);
-
-        m_aMouseMotionHdl.Call(aMEvt);
-        return true;
+        GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
+        GdkModifierType eType = 
gtk_event_controller_get_current_event_state(GTK_EVENT_CONTROLLER(pController));
+        SolarMutexGuard aGuard;
+        pThis->signal_crossing(-1, -1, eType, 
MouseEventModifiers::LEAVEWINDOW);
+    }
+#else
+    static gboolean signalCrossing(GtkWidget*, GdkEventCrossing* pEvent, 
gpointer widget)
+    {
+        GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget);
+        MouseEventModifiers eMouseEventModifiers = pEvent->type == 
GDK_ENTER_NOTIFY ? MouseEventModifiers::ENTERWINDOW : 
MouseEventModifiers::LEAVEWINDOW;
+        SolarMutexGuard aGuard;
+        return pThis->signal_crossing(pEvent->x, pEvent->y, pEvent->state, 
eMouseEventModifiers);
     }
 #endif
 
@@ -3205,6 +3238,7 @@ public:
 #if GTK_CHECK_VERSION(4, 0, 0)
         , m_pFocusController(nullptr)
         , m_pClickController(nullptr)
+        , m_pMotionController(nullptr)
 #endif
     {
         if (!bTakeOwnership)
@@ -3239,8 +3273,16 @@ public:
 
     virtual void connect_mouse_move(const Link<const MouseEvent&, bool>& 
rLink) override
     {
+#if GTK_CHECK_VERSION(4, 0, 0)
+        GtkEventController* pMotionController = get_motion_controller();
+        if (!m_nMotionSignalId)
+            m_nMotionSignalId = g_signal_connect(pMotionController, "motion", 
G_CALLBACK(signalMotion), this);
+        if (!m_nLeaveSignalId)
+            m_nLeaveSignalId = g_signal_connect(pMotionController, "leave", 
G_CALLBACK(signalEnter), this);
+        if (!m_nEnterSignalId)
+            m_nEnterSignalId = g_signal_connect(pMotionController, "enter", 
G_CALLBACK(signalLeave), this);
+#else
         ensureMouseEventWidget();
-#if !GTK_CHECK_VERSION(4, 0, 0)
         if (!m_nMotionSignalId)
             m_nMotionSignalId = g_signal_connect(m_pMouseEventBox, 
"motion-notify-event", G_CALLBACK(signalMotion), this);
         if (!m_nLeaveSignalId)
@@ -3706,6 +3748,16 @@ public:
         }
         return m_pClickController;
     }
+
+    GtkEventController* get_motion_controller()
+    {
+        if (!m_pMotionController)
+        {
+            m_pMotionController = gtk_event_controller_motion_new();
+            gtk_widget_add_controller(m_pWidget, m_pMotionController);
+        }
+        return m_pMotionController;
+    }
 #endif
 
 
@@ -3939,12 +3991,29 @@ public:
 #endif
         }
         if (m_nMotionSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_motion_controller(), 
m_nMotionSignalId);
+#else
             g_signal_handler_disconnect(m_pMouseEventBox, m_nMotionSignalId);
+#endif
+        }
         if (m_nLeaveSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_motion_controller(), 
m_nLeaveSignalId);
+#else
             g_signal_handler_disconnect(m_pMouseEventBox, m_nLeaveSignalId);
+#endif
+        }
         if (m_nEnterSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_motion_controller(), 
m_nEnterSignalId);
+#else
             g_signal_handler_disconnect(m_pMouseEventBox, m_nEnterSignalId);
-
+#endif
+        }
         if (m_nButtonReleaseSignalId)
         {
 #if GTK_CHECK_VERSION(4, 0, 0)
@@ -22634,6 +22703,7 @@ weld::Builder* GtkInstance::CreateBuilder(weld::Widget* 
pParent, const OUString&
         rUIFile != "cui/ui/acorreplacepage.ui" &&
         rUIFile != "cui/ui/applyautofmtpage.ui" &&
         rUIFile != "cui/ui/applylocalizedpage.ui" &&
+        rUIFile != "cui/ui/colorpickerdialog.ui" &&
         rUIFile != "cui/ui/eventassigndialog.ui" &&
         rUIFile != "cui/ui/eventassignpage.ui" &&
         rUIFile != "cui/ui/autocorrectdialog.ui" &&
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to