diff options
-rw-r--r-- | doc/ScintillaHistory.html | 7 | ||||
-rw-r--r-- | gtk/ScintillaGTK.cxx | 35 | ||||
-rw-r--r-- | gtk/ScintillaGTK.h | 2 | ||||
-rw-r--r-- | scripts/HeaderOrder.txt | 1 |
4 files changed, 44 insertions, 1 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 4f45fcb95..f36226cd2 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -501,12 +501,13 @@ <td>jedailey</td> <td>oirfeodent</td> <td>A-R-C-A</td> - </tr> </tr><tr> <td>Roberto Rossi</td> <td>Kenny Liu</td> <td>Iain Clarke</td> <td>desto</td> + </tr><tr> + <td>John Flatness</td> </tr> </table> <p> @@ -562,6 +563,10 @@ Fix display of autocompletion lists and calltips on GTK+ 3.22 on Wayland. Newer APIs used on GTK+ 3.22 as older APIs were deprecated. </li> + <li> + Make trackpad scrolling work on Wayland. + <a href="http://sourceforge.net/p/scintilla/bugs/1901/">Bug #1901</a>. + </li> </ul> <h3> <a href="http://www.scintilla.org/scite372.zip">Release 3.7.2</a> diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 753a52c3b..993aa8fbd 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -7,6 +7,7 @@ #include <string.h> #include <stdio.h> #include <time.h> +#include <math.h> #include <assert.h> #include <ctype.h> @@ -22,6 +23,9 @@ #include <gdk/gdk.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> +#if defined(GDK_WINDOWING_WAYLAND) +#include <gdk/gdkwayland.h> +#endif #if defined(__WIN32__) || defined(_MSC_VER) #include <windows.h> @@ -165,6 +169,8 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : im_context(NULL), lastNonCommonScript(PANGO_SCRIPT_INVALID_CODE), lastWheelMouseDirection(0), wheelMouseIntensity(0), + smoothScrollY(0), + smoothScrollX(0), rgnUpdate(0), repaintFullWindow(false), styleIdleID(0), @@ -545,11 +551,21 @@ void ScintillaGTK::Initialise() { parentClass = reinterpret_cast<GtkWidgetClass *>( g_type_class_ref(gtk_container_get_type())); + gint maskSmooth = 0; +#if defined(GDK_WINDOWING_WAYLAND) + GdkDisplay *pdisplay = gdk_display_get_default(); + if (GDK_IS_WAYLAND_DISPLAY(pdisplay)) { + // On Wayland, touch pads only produce smooth scroll events + maskSmooth = GDK_SMOOTH_SCROLL_MASK; + } +#endif + gtk_widget_set_can_focus(PWidget(wMain), TRUE); gtk_widget_set_sensitive(PWidget(wMain), TRUE); gtk_widget_set_events(PWidget(wMain), GDK_EXPOSURE_MASK | GDK_SCROLL_MASK + | maskSmooth | GDK_STRUCTURE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK @@ -1784,6 +1800,25 @@ gint ScintillaGTK::ScrollEvent(GtkWidget *widget, GdkEventScroll *event) { if (widget == NULL || event == NULL) return FALSE; +#if defined(GDK_WINDOWING_WAYLAND) + if (event->direction == GDK_SCROLL_SMOOTH) { + const int smoothScrollFactor = 4; + sciThis->smoothScrollY += event->delta_y * smoothScrollFactor; + sciThis->smoothScrollX += event->delta_x * smoothScrollFactor;; + if (ABS(sciThis->smoothScrollY) >= 1.0) { + const int scrollLines = trunc(sciThis->smoothScrollY); + sciThis->ScrollTo(sciThis->topLine + scrollLines); + sciThis->smoothScrollY -= scrollLines; + } + if (ABS(sciThis->smoothScrollX) >= 1.0) { + const int scrollPixels = trunc(sciThis->smoothScrollX); + sciThis->HorizontalScrollTo(sciThis->xOffset + scrollPixels); + sciThis->smoothScrollX -= scrollPixels; + } + return TRUE; + } +#endif + // Compute amount and direction to scroll (even tho on win32 there is // intensity of scrolling info in the native message, gtk doesn't // support this so we simulate similarly adaptive scrolling) diff --git a/gtk/ScintillaGTK.h b/gtk/ScintillaGTK.h index 35778c520..6f69661f2 100644 --- a/gtk/ScintillaGTK.h +++ b/gtk/ScintillaGTK.h @@ -57,6 +57,8 @@ class ScintillaGTK : public ScintillaBase { GTimeVal lastWheelMouseTime; gint lastWheelMouseDirection; gint wheelMouseIntensity; + gdouble smoothScrollY; + gdouble smoothScrollX; #if GTK_CHECK_VERSION(3,0,0) cairo_rectangle_list_t *rgnUpdate; diff --git a/scripts/HeaderOrder.txt b/scripts/HeaderOrder.txt index 98efd3074..43afd5c43 100644 --- a/scripts/HeaderOrder.txt +++ b/scripts/HeaderOrder.txt @@ -45,6 +45,7 @@ #include <gdk/gdk.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> +#include <gdk/gdkwayland.h> #include <gtk/gtk-a11y.h> // Windows headers |