From cd68034e0152c020fc3c9fb37e704d0806f4edfb Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 27 Aug 2024 01:34:36 +0200 Subject: [PATCH] Add configuration option to disable `Scroll Deadzone` on Android --- core/config/project_settings.cpp | 1 + doc/classes/ProjectSettings.xml | 3 +++ .../main/java/org/godotengine/editor/BaseGodotEditor.kt | 5 +++++ .../src/main/java/org/godotengine/editor/BaseGodotGame.kt | 2 ++ .../android/java/lib/src/org/godotengine/godot/Godot.kt | 2 ++ .../src/org/godotengine/godot/input/GodotGestureHandler.kt | 6 ++++-- .../src/org/godotengine/godot/input/GodotInputHandler.java | 7 +++++++ 7 files changed, 24 insertions(+), 2 deletions(-) diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index c328332387..8f59edaeba 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -1622,6 +1622,7 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_pan_and_scale_gestures", false); GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "input_devices/pointing/android/rotary_input_scroll_axis", PROPERTY_HINT_ENUM, "Horizontal,Vertical"), 1); GLOBAL_DEF("input_devices/pointing/android/override_volume_buttons", false); + GLOBAL_DEF_BASIC("input_devices/pointing/android/disable_scroll_deadzone", false); // These properties will not show up in the dialog. If you want to exclude whole groups, use add_hidden_prefix(). GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray()); diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index a156c0ad27..be6fa0cb04 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -1514,6 +1514,9 @@ - [code]wintab[/code], uses Wacom "WinTab" driver. - [code]dummy[/code], tablet input is disabled. + + If [code]true[/code], disables the scroll deadzone on Android, allowing even very small scroll movements to be registered. This may increase scroll sensitivity but can also lead to unintended scrolling from slight finger movements. + If [code]true[/code], long press events on an Android touchscreen are transformed into right click events. diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt index bcb59a3ec1..13ce53ebbb 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt @@ -497,6 +497,11 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe protected open fun enableLongPressGestures() = java.lang.Boolean.parseBoolean(GodotLib.getEditorSetting("interface/touchscreen/enable_long_press_as_right_click")) + /** + * Disable scroll deadzone for the Godot Android editor. + */ + protected open fun disableScrollDeadzone() = true + /** * Enable pan and scale gestures for the Godot Android editor. */ diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt index 7290f74627..3c3837bdc1 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt @@ -52,6 +52,8 @@ abstract class BaseGodotGame: GodotEditor() { override fun enablePanAndScaleGestures() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures")) + override fun disableScrollDeadzone() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/disable_scroll_deadzone")) + override fun onGodotSetupCompleted() { super.onGodotSetupCompleted() Log.v(TAG, "OnGodotSetupCompleted") diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.kt b/platform/android/java/lib/src/org/godotengine/godot/Godot.kt index 9ab30e5f5b..63862e9513 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.kt @@ -715,12 +715,14 @@ class Godot(private val context: Context) { val panScaleEnabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures")) val rotaryInputAxisValue = GodotLib.getGlobal("input_devices/pointing/android/rotary_input_scroll_axis") val overrideVolumeButtons = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/override_volume_buttons")) + val scrollDeadzoneDisabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/disable_scroll_deadzone")) runOnUiThread { renderView?.inputHandler?.apply { enableLongPress(longPressEnabled) enablePanningAndScalingGestures(panScaleEnabled) setOverrideVolumeButtons(overrideVolumeButtons) + disableScrollDeadzone(scrollDeadzoneDisabled) try { setRotaryInputAxis(Integer.parseInt(rotaryInputAxisValue)) } catch (e: NumberFormatException) { diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt index 2929a0a0b0..037898cde1 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt @@ -55,6 +55,8 @@ internal class GodotGestureHandler(private val inputHandler: GodotInputHandler) */ var panningAndScalingEnabled = false + var scrollDeadzoneDisabled = false + private var nextDownIsDoubleTap = false private var dragInProgress = false private var scaleInProgress = false @@ -153,7 +155,7 @@ internal class GodotGestureHandler(private val inputHandler: GodotInputHandler) if (contextClickInProgress) { inputHandler.handleMouseEvent(event, event.actionMasked, MotionEvent.BUTTON_SECONDARY, false) return true - } else if (!scaleInProgress) { + } else if (scrollDeadzoneDisabled && !scaleInProgress) { // The 'onScroll' event is triggered with a long delay. // Force the 'InputEventScreenDrag' event earlier here. // We don't toggle 'dragInProgress' here so that the scaling logic can override the drag operation if needed. @@ -191,7 +193,7 @@ internal class GodotGestureHandler(private val inputHandler: GodotInputHandler) distanceY: Float ): Boolean { if (scaleInProgress) { - if (dragInProgress || lastDragX != 0.0f || lastDragY != 0.0f) { + if (dragInProgress || (scrollDeadzoneDisabled && (lastDragX != 0.0f || lastDragY != 0.0f))) { if (originEvent != null) { // Cancel the drag inputHandler.handleMotionEvent(originEvent, MotionEvent.ACTION_CANCEL) diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java index 695d56c24f..0ffa0b094a 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java @@ -114,6 +114,13 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens this.gestureDetector.setIsLongpressEnabled(enable); } + /** + * Disable scroll deadzone. This is false by default. + */ + public void disableScrollDeadzone(boolean disable) { + this.godotGestureHandler.setScrollDeadzoneDisabled(disable); + } + /** * Enable multi-fingers pan & scale gestures. This is false by default. *