vcl/inc/unx/gtk/gtkframe.hxx | 1 vcl/unx/gtk3/gtk3gtkframe.cxx | 103 ++++++++++++++++++++++++++++++------------ 2 files changed, 75 insertions(+), 29 deletions(-)
New commits: commit 7dfd50f947671d79b9119f10259857700d5728d8 Author: Caolán McNamara <caol...@redhat.com> Date: Thu Jun 23 17:32:11 2016 +0100 Resolves: rhbz#1349501 gtk3: smooth scrolling events can be disabled... by the user with GDK_CORE_DEVICE_EVENTS=1, and so manage to disable their wheel scrolling Change-Id: I7df63f738983c90dea75b9f43a36133910446aba diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index ff5c454..e455f9e 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -213,6 +213,7 @@ class GtkSalFrame : public SalFrame #if GTK_CHECK_VERSION(3,0,0) OUString m_aTooltip; Rectangle m_aHelpArea; + guint32 m_nLastScrollEventTime; long m_nWidthRequest; long m_nHeightRequest; cairo_region_t* m_pRegion; diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index 1136e47..aef66c0 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -1051,6 +1051,7 @@ void GtkSalFrame::InitCommon() m_bSpanMonitorsWhenFullscreen = false; m_nState = GDK_WINDOW_STATE_WITHDRAWN; m_nVisibility = GDK_VISIBILITY_FULLY_OBSCURED; + m_nLastScrollEventTime = GDK_CURRENT_TIME; m_bSendModChangeOnRelease = false; m_pIMHandler = nullptr; m_hBackgroundPixmap = None; @@ -2655,11 +2656,15 @@ gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEventScroll* pEvent, gpointer { UpdateLastInputEventTime(pEvent->time); - if (pEvent->direction != GDK_SCROLL_SMOOTH) - return false; - GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); + // gnome#726878 check for duplicate legacy scroll event + if (pEvent->direction != GDK_SCROLL_SMOOTH && + pThis->m_nLastScrollEventTime == pEvent->time) + { + return false; + } + SalWheelMouseEvent aEvent; aEvent.mnTime = pEvent->time; @@ -2670,36 +2675,76 @@ gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEventScroll* pEvent, gpointer aEvent.mnY = (sal_uLong)pEvent->y; aEvent.mnCode = GetMouseModCode( pEvent->state ); - // rhbz#1344042 "Traditionally" in gtk3 we tool a single up/down event as - // equating to 3 scroll lines and a delta of 120. So scale the delta here - // by 120 where a single mouse wheel click is an incoming delta_x of 1 - // and divide that by 40 to get the number of scrollines - if (pEvent->delta_x != 0.0) + switch (pEvent->direction) { - aEvent.mnDelta = -pEvent->delta_x * 120; - aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : +1; - if (aEvent.mnDelta == 0) - aEvent.mnDelta = aEvent.mnNotchDelta; - aEvent.mbHorz = true; - aEvent.mnScrollLines = std::abs(aEvent.mnDelta) / 40; - if (aEvent.mnScrollLines == 0) - aEvent.mnScrollLines = 1; + case GDK_SCROLL_SMOOTH: + pThis->m_nLastScrollEventTime = pEvent->time; - pThis->CallCallback(SalEvent::WheelMouse, &aEvent); - } + // rhbz#1344042 "Traditionally" in gtk3 we tool a single up/down event as + // equating to 3 scroll lines and a delta of 120. So scale the delta here + // by 120 where a single mouse wheel click is an incoming delta_x of 1 + // and divide that by 40 to get the number of scrollines + if (pEvent->delta_x != 0.0) + { + aEvent.mnDelta = -pEvent->delta_x * 120; + aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : +1; + if (aEvent.mnDelta == 0) + aEvent.mnDelta = aEvent.mnNotchDelta; + aEvent.mbHorz = true; + aEvent.mnScrollLines = std::abs(aEvent.mnDelta) / 40; + if (aEvent.mnScrollLines == 0) + aEvent.mnScrollLines = 1; + + pThis->CallCallback(SalEvent::WheelMouse, &aEvent); + } - if (pEvent->delta_y != 0.0) - { - aEvent.mnDelta = -pEvent->delta_y * 120; - aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : +1; - if (aEvent.mnDelta == 0) - aEvent.mnDelta = aEvent.mnNotchDelta; - aEvent.mbHorz = false; - aEvent.mnScrollLines = std::abs(aEvent.mnDelta) / 40; - if (aEvent.mnScrollLines == 0) - aEvent.mnScrollLines = 1; + if (pEvent->delta_y != 0.0) + { + aEvent.mnDelta = -pEvent->delta_y * 120; + aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : +1; + if (aEvent.mnDelta == 0) + aEvent.mnDelta = aEvent.mnNotchDelta; + aEvent.mbHorz = false; + aEvent.mnScrollLines = std::abs(aEvent.mnDelta) / 40; + if (aEvent.mnScrollLines == 0) + aEvent.mnScrollLines = 1; + + pThis->CallCallback(SalEvent::WheelMouse, &aEvent); + } + + break; + + case GDK_SCROLL_UP: + aEvent.mnDelta = 120; + aEvent.mnNotchDelta = 1; + aEvent.mnScrollLines = 3; + aEvent.mbHorz = false; + pThis->CallCallback(SalEvent::WheelMouse, &aEvent); + break; - pThis->CallCallback(SalEvent::WheelMouse, &aEvent); + case GDK_SCROLL_DOWN: + aEvent.mnDelta = -120; + aEvent.mnNotchDelta = -1; + aEvent.mnScrollLines = 3; + aEvent.mbHorz = false; + pThis->CallCallback(SalEvent::WheelMouse, &aEvent); + break; + + case GDK_SCROLL_LEFT: + aEvent.mnDelta = 120; + aEvent.mnNotchDelta = 1; + aEvent.mnScrollLines = 3; + aEvent.mbHorz = true; + pThis->CallCallback(SalEvent::WheelMouse, &aEvent); + break; + + case GDK_SCROLL_RIGHT: + aEvent.mnDelta = -120; + aEvent.mnNotchDelta = -1; + aEvent.mnScrollLines = 3; + aEvent.mbHorz = true; + pThis->CallCallback(SalEvent::WheelMouse, &aEvent); + break; } return true;
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits