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

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