Blame SOURCES/0001-Resolves-rhbz-1289398-unable-to-use-scroll-wheel-und.patch

f325b2
From ab20ea1d78697aa88dd84b8be4ac385cf295ea20 Mon Sep 17 00:00:00 2001
f325b2
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
f325b2
Date: Tue, 8 Dec 2015 15:52:47 +0000
f325b2
Subject: [PATCH] Resolves: rhbz#1289398 unable to use scroll wheel under
f325b2
 wayland
f325b2
f325b2
because we only get smooth scroll events, so implement that as
f325b2
best we can.
f325b2
f325b2
(cherry picked from commit c5c1f8f710760d40ca1004c5fdd69f8fa2c87496)
f325b2
f325b2
Change-Id: I7701949cf7c9ffdc9d062f75b23db7c6add3c6a9
f325b2
---
f325b2
 vcl/inc/unx/gtk/gtkframe.hxx       |  1 +
f325b2
 vcl/unx/gtk/window/gtksalframe.cxx | 70 +++++++++++++++++++++++++++-----------
f325b2
 2 files changed, 52 insertions(+), 19 deletions(-)
f325b2
f325b2
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
f325b2
index 3531c41..4594249 100644
f325b2
--- a/vcl/inc/unx/gtk/gtkframe.hxx
f325b2
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
f325b2
@@ -211,6 +211,7 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider
f325b2
     Rectangle                       m_aRestorePosSize;
f325b2
 
f325b2
 #if GTK_CHECK_VERSION(3,0,0)
f325b2
+    guint32                         m_nLastScrollEventTime;
f325b2
     cairo_region_t*                 m_pRegion;
f325b2
 #else
f325b2
     GdkRegion*                      m_pRegion;
f325b2
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
f325b2
index 614974a..616f73f 100644
f325b2
--- a/vcl/unx/gtk/window/gtksalframe.cxx
f325b2
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
f325b2
@@ -1129,6 +1129,9 @@ void GtkSalFrame::InitCommon()
f325b2
     m_bSpanMonitorsWhenFullscreen = false;
f325b2
     m_nState            = GDK_WINDOW_STATE_WITHDRAWN;
f325b2
     m_nVisibility       = GDK_VISIBILITY_FULLY_OBSCURED;
f325b2
+#if GTK_CHECK_VERSION(3,0,0)
f325b2
+    m_nLastScrollEventTime = GDK_CURRENT_TIME;
f325b2
+#endif
f325b2
     m_bSendModChangeOnRelease = false;
f325b2
     m_pIMHandler        = NULL;
f325b2
     m_hBackgroundPixmap = None;
f325b2
@@ -3542,30 +3545,59 @@ gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEvent* pEvent, gpointer frame
f325b2
     GdkEventScroll* pSEvent = reinterpret_cast<GdkEventScroll*>(pEvent);
f325b2
 
f325b2
 #if GTK_CHECK_VERSION(3,0,0)
f325b2
-    //TODO: do something less feeble here
f325b2
-    if (pSEvent->direction == GDK_SCROLL_SMOOTH)
f325b2
+    // gnome#726878 check for duplicate legacy scroll event
f325b2
+    if (pSEvent->direction != GDK_SCROLL_SMOOTH &&
f325b2
+        pThis->m_nLastScrollEventTime == pSEvent->time)
f325b2
+    {
f325b2
         return true;
f325b2
+    }
f325b2
 #endif
f325b2
 
f325b2
-    static sal_uLong        nLines = 0;
f325b2
-    if( ! nLines )
f325b2
+    SalWheelMouseEvent aEvent;
f325b2
+
f325b2
+    aEvent.mnTime = pSEvent->time;
f325b2
+    aEvent.mnX = (sal_uLong)pSEvent->x;
f325b2
+    aEvent.mnY = (sal_uLong)pSEvent->y;
f325b2
+    aEvent.mnCode = GetMouseModCode( pSEvent->state );
f325b2
+    aEvent.mnScrollLines = 3;
f325b2
+
f325b2
+    switch (pSEvent->direction)
f325b2
     {
f325b2
-        char* pEnv = getenv( "SAL_WHEELLINES" );
f325b2
-        nLines = pEnv ? atoi( pEnv ) : 3;
f325b2
-        if( nLines > 10 )
f325b2
-            nLines = SAL_WHEELMOUSE_EVENT_PAGESCROLL;
f325b2
-    }
f325b2
+#if GTK_CHECK_VERSION(3,0,0)
f325b2
+        case GDK_SCROLL_SMOOTH:
f325b2
+        {
f325b2
+            double delta_x, delta_y;
f325b2
+            gdk_event_get_scroll_deltas(pEvent, &delta_x, &delta_y);
f325b2
+            //pick the bigger one I guess
f325b2
+            aEvent.mbHorz = fabs(delta_x) > fabs(delta_y);
f325b2
+            if (aEvent.mbHorz)
f325b2
+                aEvent.mnDelta = -delta_x;
f325b2
+            else
f325b2
+                aEvent.mnDelta = -delta_y;
f325b2
+            aEvent.mnScrollLines = 1;
f325b2
+            pThis->m_nLastScrollEventTime = pSEvent->time;
f325b2
+            break;
f325b2
+        }
f325b2
+#endif
f325b2
+        case GDK_SCROLL_UP:
f325b2
+            aEvent.mnDelta = 120;
f325b2
+            aEvent.mbHorz = false;
f325b2
+            break;
f325b2
+        case GDK_SCROLL_DOWN:
f325b2
+            aEvent.mnDelta = -120;
f325b2
+            aEvent.mbHorz = false;
f325b2
+            break;
f325b2
+        case GDK_SCROLL_LEFT:
f325b2
+            aEvent.mbHorz = true;
f325b2
+            aEvent.mnDelta = 120;
f325b2
+            break;
f325b2
+        case GDK_SCROLL_RIGHT:
f325b2
+            aEvent.mnDelta = -120;
f325b2
+            aEvent.mbHorz = true;
f325b2
+            break;
f325b2
+    };
f325b2
 
f325b2
-    bool bNeg = (pSEvent->direction == GDK_SCROLL_DOWN || pSEvent->direction == GDK_SCROLL_RIGHT );
f325b2
-    SalWheelMouseEvent aEvent;
f325b2
-    aEvent.mnTime           = pSEvent->time;
f325b2
-    aEvent.mnX              = (sal_uLong)pSEvent->x;
f325b2
-    aEvent.mnY              = (sal_uLong)pSEvent->y;
f325b2
-    aEvent.mnDelta          = bNeg ? -120 : 120;
f325b2
-    aEvent.mnNotchDelta     = bNeg ? -1 : 1;
f325b2
-    aEvent.mnScrollLines    = nLines;
f325b2
-    aEvent.mnCode           = GetMouseModCode( pSEvent->state );
f325b2
-    aEvent.mbHorz           = (pSEvent->direction == GDK_SCROLL_LEFT || pSEvent->direction == GDK_SCROLL_RIGHT);
f325b2
+    aEvent.mnNotchDelta     = aEvent.mnDelta < 0 ? -1 : 1;
f325b2
 
f325b2
     // --- RTL --- (mirror mouse pos)
f325b2
     if( AllSettings::GetLayoutRTL() )
f325b2
-- 
f325b2
2.5.0
f325b2