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" /> +