vcl/unx/gtk3/gtkinst.cxx |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

New commits:
commit 7d5841b435a6794e30f02b62db15660ffe4ee39e
Author:     Povilas Kanapickas <povi...@radix.lt>
AuthorDate: Wed Dec 7 03:13:31 2022 +0200
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Wed Dec 14 13:50:05 2022 +0000

    vcl: Implement touchpad zoom gesture support in GtkInstanceDrawingArea
    
    Change-Id: I5ad68ee424fbcc45a3e56045f00ac41cf6c80195
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143758
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index f44240e216bc..ca08ce4d37f6 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -18089,6 +18089,7 @@ private:
     gulong m_nPopupMenu;
     gulong m_nScrollEvent;
 #endif
+    GtkGesture *m_pZoomGesture;
 
 #if GTK_CHECK_VERSION(4, 0, 0)
     static void signalDraw(GtkDrawingArea*, cairo_t *cr, int /*width*/, int 
/*height*/, gpointer widget)
@@ -18214,6 +18215,38 @@ private:
     }
 #endif
 
+    bool handleSignalZoom(GtkGesture* gesture, GdkEventSequence* sequence,
+                          GestureEventZoomType eEventType)
+    {
+        gdouble x = 0;
+        gdouble y = 0;
+        gtk_gesture_get_point(gesture, sequence, &x, &y);
+
+        double fScaleDelta = 
gtk_gesture_zoom_get_scale_delta(GTK_GESTURE_ZOOM(gesture));
+
+        CommandGestureZoomData aGestureData(x, y, eEventType, fScaleDelta);
+        CommandEvent aCEvt(Point(x, y), CommandEventId::GestureZoom, true, 
&aGestureData);
+        return m_aCommandHdl.Call(aCEvt);
+    }
+
+    static bool signalZoomBegin(GtkGesture* gesture, GdkEventSequence* 
sequence, gpointer widget)
+    {
+        GtkInstanceDrawingArea* pThis = 
static_cast<GtkInstanceDrawingArea*>(widget);
+        return pThis->handleSignalZoom(gesture, sequence, 
GestureEventZoomType::Begin);
+    }
+
+    static bool signalZoomUpdate(GtkGesture* gesture, GdkEventSequence* 
sequence, gpointer widget)
+    {
+        GtkInstanceDrawingArea* pThis = 
static_cast<GtkInstanceDrawingArea*>(widget);
+        return pThis->handleSignalZoom(gesture, sequence, 
GestureEventZoomType::Update);
+    }
+
+    static bool signalZoomEnd(GtkGesture* gesture, GdkEventSequence* sequence, 
gpointer widget)
+    {
+        GtkInstanceDrawingArea* pThis = 
static_cast<GtkInstanceDrawingArea*>(widget);
+        return pThis->handleSignalZoom(gesture, sequence, 
GestureEventZoomType::End);
+    }
+
 #if GTK_CHECK_VERSION(4, 0, 0)
     static void signalResize(GtkDrawingArea*, int nWidth, int nHeight, 
gpointer widget)
     {
@@ -18244,7 +18277,19 @@ public:
         gtk_drawing_area_set_draw_func(m_pDrawingArea, signalDraw, this, 
nullptr);
 #else
         m_nDrawSignalId = g_signal_connect(m_pDrawingArea, "draw", 
G_CALLBACK(signalDraw), this);
+        gtk_widget_add_events(GTK_WIDGET(pDrawingArea), 
GDK_TOUCHPAD_GESTURE_MASK);
 #endif
+
+        ensureMouseEventWidget();
+        m_pZoomGesture = gtk_gesture_zoom_new(m_pMouseEventBox);
+        
gtk_event_controller_set_propagation_phase(GTK_EVENT_CONTROLLER(m_pZoomGesture),
+                                                   GTK_PHASE_TARGET);
+        // Note that the default zoom gesture signal handler needs to run 
first to setup correct
+        // scale delta. Otherwise the first "begin" event will always contain 
scale delta of infinity.
+        g_signal_connect_after(m_pZoomGesture, "begin", 
G_CALLBACK(signalZoomBegin), this);
+        g_signal_connect_after(m_pZoomGesture, "update", 
G_CALLBACK(signalZoomUpdate), this);
+        g_signal_connect_after(m_pZoomGesture, "end", 
G_CALLBACK(signalZoomEnd), this);
+
         gtk_widget_set_has_tooltip(m_pWidget, true);
         g_object_set_data(G_OBJECT(m_pDrawingArea), 
"g-lo-GtkInstanceDrawingArea", this);
         m_xDevice->EnableRTL(get_direction());
@@ -18433,6 +18478,8 @@ public:
 
     virtual ~GtkInstanceDrawingArea() override
     {
+        g_clear_object(&m_pZoomGesture);
+
         ImplGetDefaultWindow()->RemoveEventListener(LINK(this, 
GtkInstanceDrawingArea, SettingsChangedHdl));
 
         g_object_steal_data(G_OBJECT(m_pDrawingArea), 
"g-lo-GtkInstanceDrawingArea");

Reply via email to