summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorPovilas Kanapickas <povilas@radix.lt>2022-08-25 00:18:31 +0300
committerCaolán McNamara <caolanm@redhat.com>2022-08-26 22:32:29 +0200
commite6bed4293814dd58f0a7d050e8057e717d03faab (patch)
tree4c679de158bfb0f0e1d77249100a56573028e8d6 /vcl
parentf2bd19f6720239db228cd4388be8e928505c51b6 (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.hxx5
-rw-r--r--vcl/unx/gtk3/gtkframe.cxx43
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)