[Libreoffice-commits] core.git: vcl/inc vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Mon May 10 15:18:19 UTC 2021


 vcl/inc/unx/gtk/gtkframe.hxx |    4 ++-
 vcl/unx/gtk3/gtkframe.cxx    |   54 +++++++++++++++++++++++++++++--------------
 2 files changed, 40 insertions(+), 18 deletions(-)

New commits:
commit 6c6b2fcdf34d9463aeb6d9b94474b5334f5fc20a
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Mon May 10 15:00:28 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon May 10 17:17:36 2021 +0200

    gtk4: get motion events
    
    Change-Id: I44f28891015cadf3714dbecd48bad73296d78b53
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115335
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 87ab676c624a..49aaafc3ae81 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -287,18 +287,20 @@ class GtkSalFrame final : public SalFrame
     void WindowMap();
     void WindowUnmap();
     bool WindowCloseRequest();
+    void DrawingAreaMotion(int nEventX, int nEventY, guint32 nTime, guint nState);
 #if GTK_CHECK_VERSION(4, 0, 0)
     static void         signalMap( GtkWidget*, gpointer );
     static void         signalUnmap( GtkWidget*, gpointer );
     static gboolean     signalDelete( GtkWidget*, gpointer );
+    static void         signalMotion(GtkEventControllerMotion *controller, double x, double y, gpointer);
 #else
     static gboolean     signalMap( GtkWidget*, GdkEvent*, gpointer );
     static gboolean     signalUnmap( GtkWidget*, GdkEvent*, gpointer );
     static gboolean     signalDelete( GtkWidget*, GdkEvent*, gpointer );
+    static gboolean     signalMotion( GtkWidget*, GdkEventMotion*, gpointer );
 #endif
 #if !GTK_CHECK_VERSION(4, 0, 0)
     static gboolean     signalConfigure( GtkWidget*, GdkEventConfigure*, gpointer );
-    static gboolean     signalMotion( GtkWidget*, GdkEventMotion*, gpointer );
     static gboolean     signalKey( GtkWidget*, GdkEventKey*, gpointer );
     static gboolean     signalWindowState( GtkWidget*, GdkEvent*, gpointer );
     static gboolean     signalScroll( GtkWidget*, GdkEvent*, gpointer );
diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx
index 8a918fe99c67..c51558d6b7e0 100644
--- a/vcl/unx/gtk3/gtkframe.cxx
+++ b/vcl/unx/gtk3/gtkframe.cxx
@@ -936,18 +936,21 @@ void GtkSalFrame::InitCommon()
 #if !GTK_CHECK_VERSION(4,0,0)
     m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "button-press-event", G_CALLBACK(signalButton), this ));
     m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "button-release-event", G_CALLBACK(signalButton), this ));
+
+    m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "motion-notify-event", G_CALLBACK(signalMotion), this ));
+    m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "leave-notify-event", G_CALLBACK(signalCrossing), this ));
+    m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "enter-notify-event", G_CALLBACK(signalCrossing), this ));
 #else
     GtkGesture *pClick = gtk_gesture_click_new();
     gtk_widget_add_controller(pEventWidget, GTK_EVENT_CONTROLLER(pClick));
     g_signal_connect(pClick, "pressed", G_CALLBACK(gesturePressed), this);
     g_signal_connect(pClick, "released", G_CALLBACK(gestureReleased), this);
+
+    GtkEventController* pMotionController = gtk_event_controller_motion_new();
+    g_signal_connect(pMotionController, "motion", G_CALLBACK(signalMotion), this);
+    gtk_widget_add_controller(pEventWidget, pMotionController);
 #endif
 #if !GTK_CHECK_VERSION(4,0,0)
-    m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "motion-notify-event", G_CALLBACK(signalMotion), this ));
-    m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "leave-notify-event", G_CALLBACK(signalCrossing), this ));
-    m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "enter-notify-event", G_CALLBACK(signalCrossing), this ));
-
-
     //Drop Target Stuff
     gtk_drag_dest_set(GTK_WIDGET(pEventWidget), GtkDestDefaults(0), nullptr, 0, GdkDragAction(0));
     gtk_drag_dest_set_track_motion(GTK_WIDGET(pEventWidget), true);
@@ -3165,7 +3168,30 @@ void GtkSalFrame::gestureLongPress(GtkGestureLongPress* gesture, gdouble x, gdou
     }
 }
 
-#if !GTK_CHECK_VERSION(4, 0, 0)
+void GtkSalFrame::DrawingAreaMotion(int nEventX, int nEventY, guint32 nTime, guint nState)
+{
+    SalMouseEvent aEvent;
+    aEvent.mnTime = nTime;
+    aEvent.mnX = nEventX;
+    aEvent.mnY = nEventY;
+    aEvent.mnCode = GetMouseModCode(nState);
+    aEvent.mnButton = 0;
+
+    if( AllSettings::GetLayoutRTL() )
+        aEvent.mnX = maGeometry.nWidth-1-aEvent.mnX;
+
+    CallCallbackExc(SalEvent::MouseMove, &aEvent);
+}
+
+#if GTK_CHECK_VERSION(4, 0, 0)
+void GtkSalFrame::signalMotion(GtkEventControllerMotion *pController, double x, double y, gpointer frame)
+{
+    GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
+    GdkEvent* pEvent = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(pController));
+    GdkModifierType eType = gtk_event_controller_get_current_event_state(GTK_EVENT_CONTROLLER(pController));
+    pThis->DrawingAreaMotion(x, y, gdk_event_get_time(pEvent), eType);
+}
+#else
 gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer frame )
 {
     UpdateLastInputEventTime(pEvent->time);
@@ -3204,17 +3230,9 @@ gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer
 
     if (!aDel.isDeleted())
     {
-        SalMouseEvent aEvent;
-        aEvent.mnTime   = pEvent->time;
-        aEvent.mnX      = static_cast<tools::Long>(pEvent->x_root) - pThis->maGeometry.nX;
-        aEvent.mnY      = static_cast<tools::Long>(pEvent->y_root) - pThis->maGeometry.nY;
-        aEvent.mnCode   = GetMouseModCode( pEvent->state );
-        aEvent.mnButton = 0;
-
-        if( AllSettings::GetLayoutRTL() )
-            aEvent.mnX = pThis->maGeometry.nWidth-1-aEvent.mnX;
-
-        pThis->CallCallbackExc( SalEvent::MouseMove, &aEvent );
+        pThis->DrawingAreaMotion(pEvent->x_root - pThis->maGeometry.nX,
+                                 pEvent->y_root - pThis->maGeometry.nY,
+                                 pEvent->time, pEvent->state);
     }
 
     if (!aDel.isDeleted())
@@ -3227,7 +3245,9 @@ gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer
 
     return true;
 }
+#endif
 
+#if !GTK_CHECK_VERSION(4, 0, 0)
 gboolean GtkSalFrame::signalCrossing( GtkWidget*, GdkEventCrossing* pEvent, gpointer frame )
 {
     UpdateLastInputEventTime(pEvent->time);


More information about the Libreoffice-commits mailing list