diff --git a/src/control/settings/Settings.cpp b/src/control/settings/Settings.cpp index 6aa6b1e0..d7ca41fa 100644 --- a/src/control/settings/Settings.cpp +++ b/src/control/settings/Settings.cpp @@ -114,6 +114,7 @@ void Settings::loadDefault() { this->snapGridSize = DEFAULT_GRID_SIZE; this->touchDrawing = false; + this->gtkTouchInertialScrolling = true; this->defaultSaveName = _("%F-Note-%H-%M"); @@ -465,6 +466,8 @@ void Settings::parseItem(xmlDocPtr doc, xmlNodePtr cur) { this->snapGridTolerance = tempg_ascii_strtod(reinterpret_cast(value), nullptr); } else if (xmlStrcmp(name, reinterpret_cast("touchDrawing")) == 0) { this->touchDrawing = xmlStrcmp(value, reinterpret_cast("true")) == 0; + } else if (xmlStrcmp(name, reinterpret_cast("gtkTouchInertialScrolling")) == 0) { + this->gtkTouchInertialScrolling = xmlStrcmp(value, reinterpret_cast("true")) == 0; } else if (xmlStrcmp(name, reinterpret_cast("pressureGuessing")) == 0) { this->pressureGuessing = xmlStrcmp(value, reinterpret_cast("true")) == 0; } else if (xmlStrcmp(name, reinterpret_cast("scrollbarHideType")) == 0) { @@ -891,6 +894,7 @@ void Settings::save() { SAVE_DOUBLE_PROP(snapGridSize); SAVE_BOOL_PROP(touchDrawing); + SAVE_BOOL_PROP(gtkTouchInertialScrolling); SAVE_BOOL_PROP(pressureGuessing); SAVE_UINT_PROP(selectionBorderColor); @@ -1271,6 +1275,17 @@ void Settings::setTouchDrawingEnabled(bool b) { save(); } +auto Settings::getGtkTouchInertialScrollingEnabled() const -> bool { return this->gtkTouchInertialScrolling; }; + +void Settings::setGtkTouchInertialScrollingEnabled(bool b) { + if (this->gtkTouchInertialScrolling == b) { + return; + } + + this->gtkTouchInertialScrolling = b; + save(); +} + auto Settings::isPressureGuessingEnabled() const -> bool { return this->pressureGuessing; } void Settings::setPressureGuessingEnabled(bool b) { if (this->pressureGuessing == b) { diff --git a/src/control/settings/Settings.h b/src/control/settings/Settings.h index 478d164d..672f0537 100644 --- a/src/control/settings/Settings.h +++ b/src/control/settings/Settings.h @@ -270,6 +270,9 @@ public: bool getTouchDrawingEnabled() const; void setTouchDrawingEnabled(bool b); + bool getGtkTouchInertialScrollingEnabled() const; + void setGtkTouchInertialScrollingEnabled(bool b); + bool isPressureGuessingEnabled() const; void setPressureGuessingEnabled(bool b); @@ -892,14 +895,16 @@ private: */ double snapRotationTolerance{}; - /// Grid size for Snapping double snapGridSize{}; - - // Touchscreens act like multi-touch-aware pens. + /// Touchscreens act like multi-touch-aware pens. bool touchDrawing{}; + /// True iff we use GTK's built-in kinetic/inertial scrolling + /// for touchscreen devices. If false, we use our own. + bool gtkTouchInertialScrolling{}; + /** * Infer pressure from speed when device pressure * is unavailable (e.g. drawing with a mouse). diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index c03eebbb..a712771b 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -275,6 +275,10 @@ void MainWindow::setGtkTouchscreenScrollingForDeviceMapping() { } void MainWindow::setGtkTouchscreenScrollingEnabled(bool enabled) { + if (!control->getSettings()->getGtkTouchInertialScrollingEnabled()) { + enabled = false; + } + if (enabled == gtkTouchscreenScrollingEnabled.load() || winXournal == nullptr) { return; } @@ -283,8 +287,9 @@ void MainWindow::setGtkTouchscreenScrollingEnabled(bool enabled) { Util::execInUiThread( [=]() { - gtk_scrolled_window_set_kinetic_scrolling(GTK_SCROLLED_WINDOW(winXournal), - gtkTouchscreenScrollingEnabled.load()); + const bool touchScrollEnabled = gtkTouchscreenScrollingEnabled.load(); + + gtk_scrolled_window_set_kinetic_scrolling(GTK_SCROLLED_WINDOW(winXournal), touchScrollEnabled); }, G_PRIORITY_HIGH); } diff --git a/src/gui/dialog/SettingsDialog.cpp b/src/gui/dialog/SettingsDialog.cpp index 038c0f85..d0a02a8c 100644 --- a/src/gui/dialog/SettingsDialog.cpp +++ b/src/gui/dialog/SettingsDialog.cpp @@ -357,6 +357,7 @@ void SettingsDialog::load() { loadCheckbox("cbDisableScrollbarFadeout", settings->isScrollbarFadeoutDisabled()); loadCheckbox("cbEnablePressureInference", settings->isPressureGuessingEnabled()); loadCheckbox("cbTouchDrawing", settings->getTouchDrawingEnabled()); + loadCheckbox("cbDisableGtkInertialScroll", !settings->getGtkTouchInertialScrollingEnabled()); const bool ignoreStylusEventsEnabled = settings->getIgnoredStylusEvents() != 0; // 0 means disabled, >0 enabled loadCheckbox("cbIgnoreFirstStylusEvents", ignoreStylusEventsEnabled); loadCheckbox("cbInputSystemTPCButton", settings->getInputSystemTPCButtonEnabled()); @@ -682,6 +683,7 @@ void SettingsDialog::save() { settings->setAreStockIconsUsed(getCheckbox("cbStockIcons")); settings->setPressureGuessingEnabled(getCheckbox("cbEnablePressureInference")); settings->setTouchDrawingEnabled(getCheckbox("cbTouchDrawing")); + settings->setGtkTouchInertialScrollingEnabled(!getCheckbox("cbDisableGtkInertialScroll")); settings->setInputSystemTPCButtonEnabled(getCheckbox("cbInputSystemTPCButton")); settings->setInputSystemDrawOutsideWindowEnabled(getCheckbox("cbInputSystemDrawOutsideWindow")); settings->setScrollbarFadeoutDisabled(getCheckbox("cbDisableScrollbarFadeout")); diff --git a/ui/settings.glade b/ui/settings.glade index dba5c862..a80e600a 100644 --- a/ui/settings.glade +++ b/ui/settings.glade @@ -2582,6 +2582,74 @@ This setting can make it easier to draw with touch. + + False + True + 3 + + + + + True + False + 0.01 + + + True + False + 8 + 12 + 12 + + + True + False + vertical + + + True + False + <i>Disabling GTK's built-in touchscreen scrolling can work around scrolling bugs on some platforms. Consider changing this setting if you experience jumps/sudden changes in scroll position when attempting to scroll with a touchscreen.</i> + True + True + 85 + 0 + + + False + True + 0 + + + + + Disable GTK's built-in inertial scroll functionality (requires restart). + cbTouchDrawing + True + True + False + Use two fingers to pan/zoom and one finger to use the selected tool. + 0 + True + + + False + True + 1 + + + + + + + + + True + False + Touch Scrolling + + + False True