vcl/inc/unx/gtk/gtkframe.hxx |    5 +++++
 vcl/unx/gtk3/gtkframe.cxx    |   43 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)

New commits:
commit e6bed4293814dd58f0a7d050e8057e717d03faab
Author:     Povilas Kanapickas <povi...@radix.lt>
AuthorDate: Thu Aug 25 00:18:31 2022 +0300
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Fri Aug 26 22:32:29 2022 +0200

    vcl: implement touchpad rotate gesture support on gtk backend
    
    This change is enough to support both touchpad and touchscreen gestures,
    but currently GDK_TOUCH_MASK is not enabled, so only touchpad gestures
    are supported.
    
    Change-Id: Ia36b64cd891321d3a5420ea81dca236c936d9af3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138790
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 52f256082832..29e1899df9de 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -353,6 +353,10 @@ class GtkSalFrame final : public SalFrame
     static bool         signalZoomUpdate(GtkGesture*, GdkEventSequence*, 
gpointer);
     static bool         signalZoomEnd(GtkGesture*, GdkEventSequence*, 
gpointer);
 
+    static bool         signalRotateBegin(GtkGesture*, GdkEventSequence*, 
gpointer);
+    static bool         signalRotateUpdate(GtkGesture*, GdkEventSequence*, 
gpointer);
+    static bool         signalRotateEnd(GtkGesture*, GdkEventSequence*, 
gpointer);
+
 #if !GTK_CHECK_VERSION(4, 0, 0)
     static gboolean     signalConfigure( GtkWidget*, GdkEventConfigure*, 
gpointer );
 #endif
@@ -440,6 +444,7 @@ public:
     std::vector<gulong>             m_aMouseSignalIds;
 
     GtkGesture                     *m_pZoomGesture;
+    GtkGesture                     *m_pRotateGesture;
 
     void grabPointer(bool bGrab, bool bKeyboardAlso, bool bOwnerEvents);
 
diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx
index a387f9979d47..65f113ab1c33 100644
--- a/vcl/unx/gtk3/gtkframe.cxx
+++ b/vcl/unx/gtk3/gtkframe.cxx
@@ -714,6 +714,7 @@ GtkSalFrame::~GtkSalFrame()
         g_signal_handler_disconnect(G_OBJECT(pEventWidget), handler_id);
 
     g_clear_object(&m_pZoomGesture);
+    g_clear_object(&m_pRotateGesture);
 
 #if !GTK_CHECK_VERSION(4, 0, 0)
     if( m_pFixedContainer )
@@ -1030,6 +1031,13 @@ void GtkSalFrame::InitCommon()
     g_signal_connect_after(m_pZoomGesture, "update", 
G_CALLBACK(signalZoomUpdate), this);
     g_signal_connect_after(m_pZoomGesture, "end", G_CALLBACK(signalZoomEnd), 
this);
 
+    m_pRotateGesture = gtk_gesture_rotate_new(GTK_WIDGET(pEventWidget));
+    
gtk_event_controller_set_propagation_phase(GTK_EVENT_CONTROLLER(m_pRotateGesture),
+                                               GTK_PHASE_TARGET);
+    g_signal_connect(m_pRotateGesture, "begin", G_CALLBACK(signalRotateBegin), 
this);
+    g_signal_connect(m_pRotateGesture, "update", 
G_CALLBACK(signalRotateUpdate), this);
+    g_signal_connect(m_pRotateGesture, "end", G_CALLBACK(signalRotateEnd), 
this);
+
     //Drop Target Stuff
 #if GTK_CHECK_VERSION(4,0,0)
     GtkDropTargetAsync* pDropTarget = gtk_drop_target_async_new(nullptr, 
GdkDragAction(GDK_ACTION_ALL));
@@ -4545,6 +4553,23 @@ namespace
         pThis->CallCallbackExc(SalEvent::GestureZoom, &aEvent);
         return true;
     }
+
+    bool handleSignalRotate(GtkGesture* gesture, GdkEventSequence* sequence, 
gpointer frame,
+                            GestureEventRotateType eEventType)
+    {
+        gdouble x = 0;
+        gdouble y = 0;
+        gtk_gesture_get_point(gesture, sequence, &x, &y);
+
+        SalGestureRotateEvent aEvent;
+        aEvent.meEventType = eEventType;
+        aEvent.mnX = x;
+        aEvent.mnY = y;
+        aEvent.mfAngleDelta = 
gtk_gesture_rotate_get_angle_delta(GTK_GESTURE_ROTATE(gesture));
+        GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
+        pThis->CallCallbackExc(SalEvent::GestureRotate, &aEvent);
+        return true;
+    }
 }
 
 bool GtkSalFrame::signalZoomBegin(GtkGesture* gesture, GdkEventSequence* 
sequence, gpointer frame)
@@ -4562,6 +4587,24 @@ bool GtkSalFrame::signalZoomEnd(GtkGesture* gesture, 
GdkEventSequence* sequence,
     return handleSignalZoom(gesture, sequence, frame, 
GestureEventZoomType::End);
 }
 
+bool GtkSalFrame::signalRotateBegin(GtkGesture* gesture, GdkEventSequence* 
sequence,
+                                    gpointer frame)
+{
+    return handleSignalRotate(gesture, sequence, frame, 
GestureEventRotateType::Begin);
+}
+
+bool GtkSalFrame::signalRotateUpdate(GtkGesture* gesture, GdkEventSequence* 
sequence,
+                                     gpointer frame)
+{
+    return handleSignalRotate(gesture, sequence, frame, 
GestureEventRotateType::Update);
+}
+
+bool GtkSalFrame::signalRotateEnd(GtkGesture* gesture, GdkEventSequence* 
sequence,
+                                  gpointer frame)
+{
+    return handleSignalRotate(gesture, sequence, frame, 
GestureEventRotateType::End);
+}
+
 namespace
 {
     GdkDragAction VclToGdk(sal_Int8 dragOperation)

Reply via email to