summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)