diff options
author | Povilas Kanapickas <povilas@radix.lt> | 2022-08-25 00:18:31 +0300 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-08-26 22:32:29 +0200 |
commit | e6bed4293814dd58f0a7d050e8057e717d03faab (patch) | |
tree | 4c679de158bfb0f0e1d77249100a56573028e8d6 /vcl | |
parent | f2bd19f6720239db228cd4388be8e928505c51b6 (diff) |
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 <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/unx/gtk/gtkframe.hxx | 5 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtkframe.cxx | 43 |
2 files changed, 48 insertions, 0 deletions
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) |