From 3aab9eb13b1f0f0d7c7dc43325e0e22b2a01a0b8 Mon Sep 17 00:00:00 2001
From: joaomacp <95joaopereira@gmail.com>
Date: Sun, 7 Jan 2024 18:32:57 +0000
Subject: [PATCH] Analog stick for scrolling in mouse emulation mode
---
.../binding/input/ControllerHandler.java | 43 +++++++++++++------
.../preferences/PreferenceConfiguration.java | 26 +++++++++++
app/src/main/res/values-de/strings.xml | 5 +++
app/src/main/res/values-es/strings.xml | 5 +++
app/src/main/res/values-fr/strings.xml | 5 +++
app/src/main/res/values-pt-rBR/strings.xml | 5 +++
app/src/main/res/values-pt/strings.xml | 5 +++
app/src/main/res/values/arrays.xml | 11 +++++
app/src/main/res/values/strings.xml | 6 +++
app/src/main/res/xml/preferences.xml | 8 ++++
10 files changed, 107 insertions(+), 12 deletions(-)
diff --git a/app/src/main/java/com/limelight/binding/input/ControllerHandler.java b/app/src/main/java/com/limelight/binding/input/ControllerHandler.java
index 492011c7..7ea824bf 100644
--- a/app/src/main/java/com/limelight/binding/input/ControllerHandler.java
+++ b/app/src/main/java/com/limelight/binding/input/ControllerHandler.java
@@ -1857,21 +1857,30 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
return true;
}
- private short scaleRawStickAxis(float stickValue) {
- return (short)Math.pow(stickValue, 3);
- }
-
- private void sendEmulatedMouseEvent(short x, short y) {
+ private Vector2d convertRawStickAxisToPixelMovement(short stickX, short stickY) {
Vector2d vector = new Vector2d();
- vector.initialize(x, y);
+ vector.initialize(stickX, stickY);
vector.scalarMultiply(1 / 32766.0f);
vector.scalarMultiply(4);
if (vector.getMagnitude() > 0) {
// Move faster as the stick is pressed further from center
vector.scalarMultiply(Math.pow(vector.getMagnitude(), 2));
- if (vector.getMagnitude() >= 1) {
- conn.sendMouseMove((short)vector.getX(), (short)-vector.getY());
- }
+ }
+ return vector;
+ }
+
+ private void sendEmulatedMouseMove(short x, short y) {
+ Vector2d vector = convertRawStickAxisToPixelMovement(x, y);
+ if (vector.getMagnitude() >= 1) {
+ conn.sendMouseMove((short)vector.getX(), (short)-vector.getY());
+ }
+ }
+
+ private void sendEmulatedMouseScroll(short x, short y) {
+ Vector2d vector = convertRawStickAxisToPixelMovement(x, y);
+ if (vector.getMagnitude() >= 1) {
+ conn.sendMouseHighResScroll((short)vector.getY());
+ conn.sendMouseHighResHScroll((short)vector.getX());
}
}
@@ -2906,9 +2915,19 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
return;
}
- // Send mouse movement events from analog sticks
- sendEmulatedMouseEvent(leftStickX, leftStickY);
- sendEmulatedMouseEvent(rightStickX, rightStickY);
+ // Send mouse events from analog sticks
+ if (prefConfig.analogStickForScrolling == PreferenceConfiguration.AnalogStickForScrolling.RIGHT) {
+ sendEmulatedMouseMove(leftStickX, leftStickY);
+ sendEmulatedMouseScroll(rightStickX, rightStickY);
+ }
+ else if (prefConfig.analogStickForScrolling == PreferenceConfiguration.AnalogStickForScrolling.LEFT) {
+ sendEmulatedMouseMove(rightStickX, rightStickY);
+ sendEmulatedMouseScroll(leftStickX, leftStickY);
+ }
+ else {
+ sendEmulatedMouseMove(leftStickX, leftStickY);
+ sendEmulatedMouseMove(rightStickX, rightStickY);
+ }
// Requeue the callback
mainThreadHandler.postDelayed(this, mouseEmulationReportPeriod);
diff --git a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java
index 023bb8f6..f5bbf709 100644
--- a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java
+++ b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java
@@ -17,6 +17,12 @@ public class PreferenceConfiguration {
FORCE_H264,
};
+ public enum AnalogStickForScrolling {
+ NONE,
+ RIGHT,
+ LEFT
+ }
+
private static final String LEGACY_RES_FPS_PREF_STRING = "list_resolution_fps";
private static final String LEGACY_ENABLE_51_SURROUND_PREF_STRING = "checkbox_51_surround";
@@ -44,6 +50,7 @@ public class PreferenceConfiguration {
private static final String ENABLE_PERF_OVERLAY_STRING = "checkbox_enable_perf_overlay";
private static final String BIND_ALL_USB_STRING = "checkbox_usb_bind_all";
private static final String MOUSE_EMULATION_STRING = "checkbox_mouse_emulation";
+ private static final String ANALOG_SCROLLING_PREF_STRING = "analog_scrolling";
private static final String MOUSE_NAV_BUTTONS_STRING = "checkbox_mouse_nav_buttons";
static final String UNLOCK_FPS_STRING = "checkbox_unlock_fps";
private static final String VIBRATE_OSC_PREF_STRING = "checkbox_vibrate_osc";
@@ -80,6 +87,7 @@ public class PreferenceConfiguration {
private static final boolean DEFAULT_ENABLE_PERF_OVERLAY = false;
private static final boolean DEFAULT_BIND_ALL_USB = false;
private static final boolean DEFAULT_MOUSE_EMULATION = true;
+ private static final String DEFAULT_ANALOG_STICK_FOR_SCROLLING = "right";
private static final boolean DEFAULT_MOUSE_NAV_BUTTONS = false;
private static final boolean DEFAULT_UNLOCK_FPS = false;
private static final boolean DEFAULT_VIBRATE_OSC = true;
@@ -126,6 +134,7 @@ public class PreferenceConfiguration {
public boolean enableLatencyToast;
public boolean bindAllUsb;
public boolean mouseEmulation;
+ public AnalogStickForScrolling analogStickForScrolling;
public boolean mouseNavButtons;
public boolean unlockFps;
public boolean vibrateOsc;
@@ -384,6 +393,21 @@ public class PreferenceConfiguration {
}
}
+ private static AnalogStickForScrolling getAnalogStickForScrollingValue(Context context) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+ String str = prefs.getString(ANALOG_SCROLLING_PREF_STRING, DEFAULT_ANALOG_STICK_FOR_SCROLLING);
+ if (str.equals("right")) {
+ return AnalogStickForScrolling.RIGHT;
+ }
+ else if (str.equals("left")) {
+ return AnalogStickForScrolling.LEFT;
+ }
+ else {
+ return AnalogStickForScrolling.NONE;
+ }
+ }
+
public static void resetStreamingSettings(Context context) {
// We consider resolution, FPS, bitrate, HDR, and video format as "streaming settings" here
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
@@ -532,6 +556,8 @@ public class PreferenceConfiguration {
config.videoFormat = getVideoFormatValue(context);
config.framePacing = getFramePacingValue(context);
+ config.analogStickForScrolling = getAnalogStickForScrollingValue(context);
+
config.deadzonePercentage = prefs.getInt(DEADZONE_PREF_STRING, DEFAULT_DEADZONE);
config.oscOpacity = prefs.getInt(OSC_OPACITY_PREF_STRING, DEFAULT_OPACITY);
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index a6cde6e2..03788348 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -270,4 +270,9 @@
Wenn dein Host PC Sunshine verwendet, navigiere zur Sunshine Web UI und gebe dort die PIN ein.
Die Maus immer mit dem Touchpad steuern
Host Verarbeitungslatenz min/max/avg: %1$.1f/%2$.1f/%3$.1f ms
+ Verwenden Sie zum Scrollen einen Analogstick
+ Wählen Sie einen Analogstick aus, der zum scrollen im Mausemulationsmodus verwendet werden soll
+ Keine (beide Sticks bewegen die Maus)
+ Rechter Analogstick
+ Linker Analogstick
\ No newline at end of file
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index aa1d7521..9aa8e7ca 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -278,4 +278,9 @@
Utiliza los sensores de movimiento integrados de tu dispositivo si el gamepad conectado o tu versión de Android no admiten los sensores del gamepad.
\nNota: Activar esta opción puede hacer que tu gamepad aparezca como un mando de PlayStation en el host.
Emular el sensor de movimiento del gamepad
+ Ninguno (ambos joysticks mueven el mouse)
+ Joystick analógico derecho
+ Joystick analógico izquierdo
+ Usa un joystick analógico para hacer scroll
+ Selecciona un joystick analógico para scroll cuando la emulación del mouse está habilitada
\ No newline at end of file
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index f883b3bb..1d4553c9 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -278,4 +278,9 @@
Utilise les capteurs de mouvement de votre appareil si la manette connéctée n\'en a pas, ou qu\'ils ne sont pas pris en charge par votre version d\'Android.
\nRemarque : l\'activation de cette option peut faire apparaître votre manette de jeu comme une manette PlayStation du côté hôte.
Émuler les capteurs de mouvement de la manette
+ Utilisez un stick analogique pour faire défiler
+ Sélectionnez un stick analogique pour faire défiler en mode émulation de la souris
+ Aucun (les deux sticks déplacent la souris)
+ Stick analogique droit
+ Stick analogique gauche
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 4f121390..e129e300 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -249,4 +249,9 @@
\n
\nTente desativar o modo HDR, alterar a resolução de streaming ou alterar a resolução do PC host.
Isso causará perda de detalhes em áreas claras e escuras se o seu dispositivo não exibir corretamente todo o conteúdo de vídeo em cores.
+ Nenhum (ambos os sticks movem o rato)
+ Stick analógico direito
+ Stick analógico esquerdo
+ Usar um stick analógico para fazer scroll
+ Selecciona um stick analógico para fazer scroll quando a emulação de rato está ativada
\ No newline at end of file
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 4853e94a..c707a52c 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -249,4 +249,9 @@
480p
720p
Especifique o equilíbrio entre latência e suavidade do vídeo
+ Nenhum (ambos os sticks movem o rato)
+ Stick analógico direito
+ Stick analógico esquerdo
+ Usar um stick analógico para fazer scroll
+ Selecciona um stick analógico para fazer scroll quando a emulação de rato está ativada
\ No newline at end of file
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 2fb29bfe..9bdeb036 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -120,4 +120,15 @@
- cap-fps
- smoothness
+
+
+ - @string/analogscroll_none
+ - @string/analogscroll_right
+ - @string/analogscroll_left
+
+
+ - none
+ - right
+ - left
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 64e263f6..527ea7df 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -289,4 +289,10 @@
Balanced
Balanced with FPS limit
Prefer smoothest video (may significantly increase latency)
+
+ Use an analog stick to scroll
+ Select an analog stick to scroll when in mouse emulation mode
+ None (both sticks move the mouse)
+ Right analog stick
+ Left analog stick
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 5edc62fa..ff349567 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -85,6 +85,14 @@
android:title="@string/title_checkbox_mouse_emulation"
android:summary="@string/summary_checkbox_mouse_emulation"
android:defaultValue="true" />
+