vcl/inc/unx/gtk/gtkframe.hxx | 4 ++- vcl/unx/gtk3/gtkframe.cxx | 54 +++++++++++++++++++++++++++++-------------- 2 files changed, 40 insertions(+), 18 deletions(-)
New commits: commit 6c6b2fcdf34d9463aeb6d9b94474b5334f5fc20a Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon May 10 15:00:28 2021 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon May 10 17:17:36 2021 +0200 gtk4: get motion events Change-Id: I44f28891015cadf3714dbecd48bad73296d78b53 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115335 Tested-by: Caolán McNamara <caol...@redhat.com> 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 87ab676c624a..49aaafc3ae81 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -287,18 +287,20 @@ class GtkSalFrame final : public SalFrame void WindowMap(); void WindowUnmap(); bool WindowCloseRequest(); + void DrawingAreaMotion(int nEventX, int nEventY, guint32 nTime, guint nState); #if GTK_CHECK_VERSION(4, 0, 0) static void signalMap( GtkWidget*, gpointer ); static void signalUnmap( GtkWidget*, gpointer ); static gboolean signalDelete( GtkWidget*, gpointer ); + static void signalMotion(GtkEventControllerMotion *controller, double x, double y, gpointer); #else static gboolean signalMap( GtkWidget*, GdkEvent*, gpointer ); static gboolean signalUnmap( GtkWidget*, GdkEvent*, gpointer ); static gboolean signalDelete( GtkWidget*, GdkEvent*, gpointer ); + static gboolean signalMotion( GtkWidget*, GdkEventMotion*, gpointer ); #endif #if !GTK_CHECK_VERSION(4, 0, 0) static gboolean signalConfigure( GtkWidget*, GdkEventConfigure*, gpointer ); - static gboolean signalMotion( GtkWidget*, GdkEventMotion*, gpointer ); static gboolean signalKey( GtkWidget*, GdkEventKey*, gpointer ); static gboolean signalWindowState( GtkWidget*, GdkEvent*, gpointer ); static gboolean signalScroll( GtkWidget*, GdkEvent*, gpointer ); diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx index 8a918fe99c67..c51558d6b7e0 100644 --- a/vcl/unx/gtk3/gtkframe.cxx +++ b/vcl/unx/gtk3/gtkframe.cxx @@ -936,18 +936,21 @@ void GtkSalFrame::InitCommon() #if !GTK_CHECK_VERSION(4,0,0) m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "button-press-event", G_CALLBACK(signalButton), this )); m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "button-release-event", G_CALLBACK(signalButton), this )); + + m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "motion-notify-event", G_CALLBACK(signalMotion), this )); + m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "leave-notify-event", G_CALLBACK(signalCrossing), this )); + m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "enter-notify-event", G_CALLBACK(signalCrossing), this )); #else GtkGesture *pClick = gtk_gesture_click_new(); gtk_widget_add_controller(pEventWidget, GTK_EVENT_CONTROLLER(pClick)); g_signal_connect(pClick, "pressed", G_CALLBACK(gesturePressed), this); g_signal_connect(pClick, "released", G_CALLBACK(gestureReleased), this); + + GtkEventController* pMotionController = gtk_event_controller_motion_new(); + g_signal_connect(pMotionController, "motion", G_CALLBACK(signalMotion), this); + gtk_widget_add_controller(pEventWidget, pMotionController); #endif #if !GTK_CHECK_VERSION(4,0,0) - m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "motion-notify-event", G_CALLBACK(signalMotion), this )); - m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "leave-notify-event", G_CALLBACK(signalCrossing), this )); - m_aMouseSignalIds.push_back(g_signal_connect( G_OBJECT(pEventWidget), "enter-notify-event", G_CALLBACK(signalCrossing), this )); - - //Drop Target Stuff gtk_drag_dest_set(GTK_WIDGET(pEventWidget), GtkDestDefaults(0), nullptr, 0, GdkDragAction(0)); gtk_drag_dest_set_track_motion(GTK_WIDGET(pEventWidget), true); @@ -3165,7 +3168,30 @@ void GtkSalFrame::gestureLongPress(GtkGestureLongPress* gesture, gdouble x, gdou } } -#if !GTK_CHECK_VERSION(4, 0, 0) +void GtkSalFrame::DrawingAreaMotion(int nEventX, int nEventY, guint32 nTime, guint nState) +{ + SalMouseEvent aEvent; + aEvent.mnTime = nTime; + aEvent.mnX = nEventX; + aEvent.mnY = nEventY; + aEvent.mnCode = GetMouseModCode(nState); + aEvent.mnButton = 0; + + if( AllSettings::GetLayoutRTL() ) + aEvent.mnX = maGeometry.nWidth-1-aEvent.mnX; + + CallCallbackExc(SalEvent::MouseMove, &aEvent); +} + +#if GTK_CHECK_VERSION(4, 0, 0) +void GtkSalFrame::signalMotion(GtkEventControllerMotion *pController, double x, double y, gpointer frame) +{ + GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); + GdkEvent* pEvent = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(pController)); + GdkModifierType eType = gtk_event_controller_get_current_event_state(GTK_EVENT_CONTROLLER(pController)); + pThis->DrawingAreaMotion(x, y, gdk_event_get_time(pEvent), eType); +} +#else gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer frame ) { UpdateLastInputEventTime(pEvent->time); @@ -3204,17 +3230,9 @@ gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer if (!aDel.isDeleted()) { - SalMouseEvent aEvent; - aEvent.mnTime = pEvent->time; - aEvent.mnX = static_cast<tools::Long>(pEvent->x_root) - pThis->maGeometry.nX; - aEvent.mnY = static_cast<tools::Long>(pEvent->y_root) - pThis->maGeometry.nY; - aEvent.mnCode = GetMouseModCode( pEvent->state ); - aEvent.mnButton = 0; - - if( AllSettings::GetLayoutRTL() ) - aEvent.mnX = pThis->maGeometry.nWidth-1-aEvent.mnX; - - pThis->CallCallbackExc( SalEvent::MouseMove, &aEvent ); + pThis->DrawingAreaMotion(pEvent->x_root - pThis->maGeometry.nX, + pEvent->y_root - pThis->maGeometry.nY, + pEvent->time, pEvent->state); } if (!aDel.isDeleted()) @@ -3227,7 +3245,9 @@ gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer return true; } +#endif +#if !GTK_CHECK_VERSION(4, 0, 0) gboolean GtkSalFrame::signalCrossing( GtkWidget*, GdkEventCrossing* pEvent, gpointer frame ) { UpdateLastInputEventTime(pEvent->time); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits