diff --git a/patches/diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch b/patches/diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch
new file mode 100644
index 0000000000..6507df1c73
--- /dev/null
+++ b/patches/diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch
@@ -0,0 +1,15 @@
+diff --git a/res/layout/winemu_sidebar_controls_fragment.xml b/res/layout/winemu_sidebar_controls_fragment.xml
+index 65f220893..203786ab4 100644
+--- a/res/layout/winemu_sidebar_controls_fragment.xml
++++ b/res/layout/winemu_sidebar_controls_fragment.xml
+@@ -13,6 +13,10 @@
+
+
+
++
++
++
++
+
+
+
diff --git a/patches/diffs/res/values/ids.xml.patch b/patches/diffs/res/values/ids.xml.patch
index 652cf0241f..aa0cc463cd 100644
--- a/patches/diffs/res/values/ids.xml.patch
+++ b/patches/diffs/res/values/ids.xml.patch
@@ -1,13 +1,45 @@
+diff --git a/res/values/ids.xml b/res/values/ids.xml
+index ef99687a9..c543aff14 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
-@@ -3338,4 +3338,10 @@
-
-
-
-+
-+
-+
-+
-+
-+
-
+@@ -2309,6 +2309,18 @@
+
+
+
++
++
++
++
++
++
++
++
++
++
++
++
+
+
+
+@@ -2596,6 +2608,7 @@
+
+
+
++
+
+
+
+@@ -3344,4 +3357,13 @@
+
+
+
++
++
++
++
++
++
++
++
++
+
\ No newline at end of file
diff --git a/patches/diffs/res/values/strings.xml.patch b/patches/diffs/res/values/strings.xml.patch
index c8cff0defa..29df0a9e52 100644
--- a/patches/diffs/res/values/strings.xml.patch
+++ b/patches/diffs/res/values/strings.xml.patch
@@ -1,93 +1,32 @@
+diff --git a/res/values/strings.xml b/res/values/strings.xml
+index 5397bfabd..0ba13d3bb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
-@@ -134,7 +134,7 @@
- 超过限定文件大小
- 文件类型不匹配
- androidx.startup
-- GameHub
-+ GameHub Lite
- Downloading new version in the background…
- Click to install
- Close
-@@ -787,7 +787,7 @@
- Fetching info
- Current firmware does not support G-Touch. Update firmware before playing
- Please save your config first
-- Follow system
-+ Default
- Force audio track
- Force Enable
- 120 FPS
-@@ -1280,7 +1280,7 @@
- Import mobile games, easy management
- Connect to your computer
- Import PC games
-- Join GameHub official community! All the latest player info awaits >>>
-+ Read the report on telemetry removed & behind-the-scenes >>>
- Import PC games, play AAA titles on mobile
- Stream PC games to your phone, play anywhere
- PC Link Remote Play
-@@ -1329,8 +1329,8 @@
- Hide game
- Please select an action for the games in the list?
- View game details
-- Discover
-- My
-+ Free Games
-+ Dashboard
- Find games
- Continue Game
- View Details
-@@ -1505,7 +1505,7 @@
- Other Notifications
- Friend Notifications
- Highlight Notifications
-- Personal Information
-+ Credits
- Automatic (Recommended)
- Clear Cache
- By default, a one-minute video is approximately…
-@@ -1517,12 +1517,12 @@
- · Size 75MB, Resolution 1080p, Frame Rate 30FPS
- · Size 50MB, Resolution 720p, Frame Rate 30FPS
- "
-- Active
-+
- Resolution 1080p, Frame Rate 60FPS
- Resolution 1080p, Frame Rate 30FPS
- Resolution 720p, Frame Rate 30FPS
- Reset
-- Reset Mapping Active
-+
- Record Video
- Format
- Bitrate
-@@ -2230,8 +2230,8 @@
- Scan Error
- Select File
- Select Game Folder
-- Steam Network Acceleration
-- Provide mitigation for network-restricted regions
-+
-+
- Launch in Windowed Mode
- Run programs in windowed mode, some programs require this option to work properly
- Game Settings
-@@ -3153,7 +3153,7 @@
- Press the mouse scroll button to switch between [Camera mode] and [Cursor mode]. Drag and place this icon to the dropdown list on the screen. In [Cursor mode],you can scroll down the list by scroll the scroll wheel of mouse.
- Wheel Orientation
- Wheel Sensitivity
-- Account Value (¥)
-+ Account Value ($)
- Add
- Add Configurations
- Add To Game Library
-@@ -3262,7 +3262,7 @@
- Game Library
- Game Management
- Game Count
-- Game Price(¥)
-+ Game Price ($)
- Failed to obtain the configuration scheme
- GPU Driver
- Sync Steam play data, click to log in to your Steam account
+@@ -3448,6 +3448,27 @@ Supports browsers on PC, mobile, and other devices."
+ Touch Control Opacity
+ Input Mapping
+ Mouse Speed
++ RTS Touch Controls
++ RTS Gesture Settings
++ RTS Gesture Settings
++ Close
++ Reset to Defaults
++ Tap
++ Long Press (300ms)
++ Double-Tap
++ Drag Finger
++ Pinch In/Out
++ Two-Finger Drag
++ Left Click
++ Right Click
++ Double Left Click
++ Drag Left Click
++ Mouse Wheel Scroll
++ +/- Keys
++ Page Up/Down
++ Middle Mouse Button
++ WASD Keys
++ Arrow Keys
+ Performance
+ Screen Brightness
+ Switch Touch Control Layout
diff --git a/patches/diffs/res/values/styles.xml.patch b/patches/diffs/res/values/styles.xml.patch
index 8fcfc7b065..bc90a9c5c2 100644
--- a/patches/diffs/res/values/styles.xml.patch
+++ b/patches/diffs/res/values/styles.xml.patch
@@ -1,12 +1,14 @@
+diff --git a/res/values/styles.xml b/res/values/styles.xml
+index 142ace1f1..0fb233366 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
-@@ -3067,9 +3067,6 @@
-
--
-
+
diff --git a/patches/diffs/smali_classes4/com/winemu/core/controller/X11Controller.smali.patch b/patches/diffs/smali_classes4/com/winemu/core/controller/X11Controller.smali.patch
new file mode 100644
index 0000000000..8b491055b6
--- /dev/null
+++ b/patches/diffs/smali_classes4/com/winemu/core/controller/X11Controller.smali.patch
@@ -0,0 +1,21 @@
+diff --git a/smali_classes4/com/winemu/core/controller/X11Controller.smali b/smali_classes4/com/winemu/core/controller/X11Controller.smali
+index d35419214..38a426891 100644
+--- a/smali_classes4/com/winemu/core/controller/X11Controller.smali
++++ b/smali_classes4/com/winemu/core/controller/X11Controller.smali
+@@ -748,3 +748,16 @@
+ :cond_1
+ return-void
+ .end method
++
++.method public final setTrackpadInputMode(I)V
++ .locals 1
++
++ iget-object v0, p0, Lcom/winemu/core/controller/X11Controller;->b:Lcom/winemu/core/input/TouchInputManager;
++
++ if-eqz v0, :cond_end
++
++ invoke-virtual {v0, p1}, Lcom/winemu/core/input/TouchInputManager;->A(I)V
++
++ :cond_end
++ return-void
++.end method
\ No newline at end of file
diff --git a/patches/diffs/smali_classes4/com/winemu/openapi/WinUIBridge.smali.patch b/patches/diffs/smali_classes4/com/winemu/openapi/WinUIBridge.smali.patch
new file mode 100644
index 0000000000..cd2ac476f1
--- /dev/null
+++ b/patches/diffs/smali_classes4/com/winemu/openapi/WinUIBridge.smali.patch
@@ -0,0 +1,35 @@
+diff --git a/smali_classes4/com/winemu/openapi/WinUIBridge.smali b/smali_classes4/com/winemu/openapi/WinUIBridge.smali
+index 8ada83959..85fefcff4 100644
+--- a/smali_classes4/com/winemu/openapi/WinUIBridge.smali
++++ b/smali_classes4/com/winemu/openapi/WinUIBridge.smali
+@@ -2370,11 +2370,8 @@
+
+ if-nez v0, :cond_0
+
+- const-string v0, "x11Controller"
+-
+- invoke-static {v0}, Lkotlin/jvm/internal/Intrinsics;->y(Ljava/lang/String;)V
+-
+- const/4 v0, 0x0
++ # X11Controller is null - just return silently instead of throwing
++ return-void
+
+ :cond_0
+ move-object v1, v0
+@@ -2678,3 +2675,16 @@
+ :goto_2
+ return-void
+ .end method
++
++.method public final setTrackpadInputMode(I)V
++ .locals 1
++
++ iget-object v0, p0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
++
++ if-eqz v0, :cond_end
++
++ invoke-virtual {v0, p1}, Lcom/winemu/core/controller/X11Controller;->setTrackpadInputMode(I)V
++
++ :cond_end
++ return-void
++.end method
\ No newline at end of file
diff --git a/patches/diffs/smali_classes4/com/xj/winemu/WineActivity.smali.patch b/patches/diffs/smali_classes4/com/xj/winemu/WineActivity.smali.patch
index 4a5ae2a5eb..cc4ad0cef2 100644
--- a/patches/diffs/smali_classes4/com/xj/winemu/WineActivity.smali.patch
+++ b/patches/diffs/smali_classes4/com/xj/winemu/WineActivity.smali.patch
@@ -1,15 +1,26 @@
---- a/smali_classes4/com/xj/winemu/WineActivity.smali
-+++ b/smali_classes4/com/xj/winemu/WineActivity.smali
-@@ -605,8 +605,6 @@
- invoke-virtual {v1}, Lcom/winemu/openapi/WinUIBridge;->V()Z
+--- a/smali_classes4/com/xj/winemu/WineActivity.smali 2026-02-18 00:07:33.559459674 -0600
++++ b/smali_classes4/com/xj/winemu/WineActivity.smali 2026-02-18 00:07:28.315526480 -0600
+@@ -80,6 +80,10 @@
+
+ .field public t:Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsView;
+
++.field public t0:Lcom/xj/winemu/view/RtsTouchOverlayView;
++
++.field public static t1:Lcom/xj/winemu/WineActivity;
++
+ .field public u:Lcom/xj/winemu/utils/WineGameUsageTracker;
+
+ .field public final v:F
+@@ -606,8 +610,6 @@
move-result v0
--
-- if-eqz v0, :cond_5
+- if-eqz v0, :cond_5
+-
invoke-virtual {p0}, Lcom/xj/winemu/WineActivity;->q2()V
-@@ -615,7 +613,6 @@
+ goto :goto_1
+@@ -615,7 +617,6 @@
:cond_4
invoke-virtual {p0}, Lcom/xj/winemu/WineActivity;->q2()V
@@ -17,7 +28,186 @@
:goto_1
return-void
.end method
-@@ -4105,10 +4102,70 @@
+@@ -3473,7 +3474,7 @@
+ .end method
+
+ .method public final g2(Z)V
+- .locals 4
++ .locals 6
+
+ if-eqz p1, :cond_4
+
+@@ -3551,10 +3552,84 @@
+ :goto_0
+ iget-object p1, v2, Lcom/xj/winemu/databinding/ActivityWineBinding;->btnLayout:Landroid/widget/FrameLayout;
+
++ # Add InputControlsView (buttons) FIRST
+ iget-object v0, p0, Lcom/xj/winemu/WineActivity;->t:Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsView;
+-
+ invoke-virtual {p1, v0}, Landroid/view/ViewGroup;->addView(Landroid/view/View;)V
+
++ # Create and add RtsTouchOverlayView ON TOP (after buttons)
++ new-instance v1, Lcom/xj/winemu/view/RtsTouchOverlayView;
++
++ invoke-direct {v1, p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->(Landroid/content/Context;)V
++
++ # Set the WinUIBridge on the overlay
++ iget-object v2, p0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
++
++ iput-object v2, v1, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
++
++ # Set the buttons view reference so overlay can forward touches
++ iput-object v0, v1, Lcom/xj/winemu/view/RtsTouchOverlayView;->b:Landroid/view/View;
++
++ # Make the overlay clickable so it receives touch events
++ const/4 v2, 0x1
++ invoke-virtual {v1, v2}, Landroid/view/View;->setClickable(Z)V
++
++ # Store the overlay in the field
++ iput-object v1, p0, Lcom/xj/winemu/WineActivity;->t0:Lcom/xj/winemu/view/RtsTouchOverlayView;
++
++ # Create MATCH_PARENT layout params (-1 = MATCH_PARENT)
++ new-instance v2, Landroid/view/ViewGroup$LayoutParams;
++ const/4 v3, -0x1
++ invoke-direct {v2, v3, v3}, Landroid/view/ViewGroup$LayoutParams;->(II)V
++
++ # Add overlay to btnLayout ON TOP (buttons already added)
++ invoke-virtual {p1, v1, v2}, Landroid/view/ViewGroup;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
++
++ # Check saved setting and set initial visibility (static method)
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsTouchControlsEnabled()Z
++
++ move-result v2
++ move v4, v2
++
++ if-eqz v2, :cond_rts_hide
++
++ # RTS enabled - set visibility VISIBLE (0)
++ const/4 v2, 0x0
++
++ invoke-virtual {v1, v2}, Landroid/view/View;->setVisibility(I)V
++
++ goto :goto_rts_done
++
++ :cond_rts_hide
++ # RTS disabled - set visibility GONE (8)
++ const/16 v2, 0x8
++
++ invoke-virtual {v1, v2}, Landroid/view/View;->setVisibility(I)V
++
++ :goto_rts_done
++ # If RTS is enabled on startup, disable Screen Trackpad input immediately
++ if-eqz v4, :cond_after_init_trackpad
++ iget-object v2, p0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
++ if-eqz v2, :cond_after_init_trackpad
++ const/4 v3, 0x0
++ invoke-virtual {v2, v3}, Lcom/winemu/openapi/WinUIBridge;->k0(Z)V
++ # Persistently turn off Screen Trackpad for current profile when RTS starts enabled
++ iget-object v2, p0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
++ if-eqz v2, :cond_profile_null_init
++ invoke-virtual {v2}, Lcom/xj/winemu/api/bean/WineActivityData;->e()Ljava/lang/String;
++ move-result-object v2
++ if-nez v2, :cond_have_profile_init
++
++ :cond_profile_null_init
++ const/4 v2, 0x0
++
++ :cond_have_profile_init
++ const/4 v5, 0x0
++ invoke-static {v5, v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->h(ZLjava/lang/String;)V
++
++ :cond_after_init_trackpad
++ # Store this activity instance to static field for toggle access
++ sput-object p0, Lcom/xj/winemu/WineActivity;->t1:Lcom/xj/winemu/WineActivity;
++
+ :cond_3
+ invoke-virtual {p0}, Lcom/xj/winemu/WineActivity;->X2()V
+
+@@ -3567,6 +3642,83 @@
+ return-void
+ .end method
+
++.method public static toggleRtsTouchOverlay(Z)V
++ .locals 6
++
++ # Get the static activity instance
++ sget-object v0, Lcom/xj/winemu/WineActivity;->t1:Lcom/xj/winemu/WineActivity;
++
++ if-eqz v0, :cond_end
++
++ # Get the overlay view
++ iget-object v1, v0, Lcom/xj/winemu/WineActivity;->t0:Lcom/xj/winemu/view/RtsTouchOverlayView;
++
++ if-eqz v1, :cond_end
++
++ # Check if enabling or disabling
++ if-eqz p0, :cond_hide
++
++ # Enable - set VISIBLE (0), ENABLED, and CLICKABLE
++ const/4 v4, 0x0
++ invoke-virtual {v1, v4}, Landroid/view/View;->setVisibility(I)V
++ const/4 v4, 0x1
++ invoke-virtual {v1, v4}, Landroid/view/View;->setEnabled(Z)V
++ invoke-virtual {v1, v4}, Landroid/view/View;->setClickable(Z)V
++
++ # Disable Screen Trackpad input while RTS overlay is enabled
++ iget-object v2, v0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
++ if-eqz v2, :cond_after_enable
++ const/4 v3, 0x0
++ invoke-virtual {v2, v3}, Lcom/winemu/openapi/WinUIBridge;->k0(Z)V
++
++ :cond_after_enable
++ # Persistently turn off Screen Trackpad for current profile while RTS is active
++ iget-object v2, v0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
++ if-eqz v2, :cond_profile_null_enable
++ invoke-virtual {v2}, Lcom/xj/winemu/api/bean/WineActivityData;->e()Ljava/lang/String;
++ move-result-object v2
++ if-nez v2, :cond_have_profile_enable
++
++ :cond_profile_null_enable
++ const/4 v2, 0x0
++
++ :cond_have_profile_enable
++ const/4 v5, 0x0
++ invoke-static {v5, v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->h(ZLjava/lang/String;)V
++
++ goto :cond_end
++
++ :cond_hide
++ # Disable - set INVISIBLE (4), DISABLED, and non-CLICKABLE so normal trackpad works
++ const/4 v4, 0x4
++ invoke-virtual {v1, v4}, Landroid/view/View;->setVisibility(I)V
++ const/4 v4, 0x0
++ invoke-virtual {v1, v4}, Landroid/view/View;->setEnabled(Z)V
++ invoke-virtual {v1, v4}, Landroid/view/View;->setClickable(Z)V
++
++ # Restore Screen Trackpad input based on current profile when RTS overlay is disabled
++ iget-object v2, v0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
++ if-eqz v2, :cond_end
++
++ # Get current profile id
++ iget-object v3, v0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
++ if-eqz v3, :cond_profile_null
++ invoke-virtual {v3}, Lcom/xj/winemu/api/bean/WineActivityData;->e()Ljava/lang/String;
++ move-result-object v3
++ if-nez v3, :cond_have_profile
++
++ :cond_profile_null
++ const/4 v3, 0x0
++
++ :cond_have_profile
++ invoke-static {v3}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->B(Ljava/lang/String;)Z
++ move-result v4
++ invoke-virtual {v2, v4}, Lcom/winemu/openapi/WinUIBridge;->k0(Z)V
++
++ :cond_end
++ return-void
++.end method
++
+ .method public final g3(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+ .locals 3
+
+@@ -4105,10 +4257,70 @@
.end method
.method public onCreate(Landroid/os/Bundle;)V
@@ -25,7 +215,7 @@
+ .locals 12
invoke-super {p0, p1}, Lcom/xj/common/view/focus/focus/app/FocusableAppCompatActivity;->onCreate(Landroid/os/Bundle;)V
-+
+
+ sget v2, Landroid/os/Build$VERSION;->SDK_INT:I
+
+ const/16 v3, 0x1e
@@ -50,7 +240,7 @@
+ const/16 v3, 0x1f
+
+ if-lt v2, v3, :cond_1
-
++
+ const-class v2, Landroid/os/PerformanceHintManager;
+
+ invoke-virtual {p0, v2}, Landroid/app/Activity;->getSystemService(Ljava/lang/Class;)Ljava/lang/Object;
@@ -89,7 +279,7 @@
invoke-virtual {p0}, Lcom/xj/winemu/WineActivity;->S2()V
invoke-virtual {p0}, Landroid/app/Activity;->getWindow()Landroid/view/Window;
-@@ -4137,13 +4194,13 @@
+@@ -4137,13 +4349,13 @@
const/4 v1, 0x0
@@ -105,7 +295,7 @@
invoke-virtual {p1}, Lcom/xj/winemu/databinding/ActivityWineBinding;->getRoot()Lcom/xj/common/view/focus/InterceptFocusEventConstraintLayout;
move-result-object p1
-@@ -4152,13 +4209,13 @@
+@@ -4152,13 +4364,13 @@
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->g:Lcom/xj/winemu/databinding/ActivityWineBinding;
@@ -121,7 +311,7 @@
iget-object p1, p1, Lcom/xj/winemu/databinding/ActivityWineBinding;->rootView:Lcom/xj/common/view/focus/InterceptFocusEventConstraintLayout;
const-string v2, "rootView"
-@@ -4193,20 +4250,20 @@
+@@ -4193,20 +4405,20 @@
iget-object v2, p0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
@@ -146,7 +336,7 @@
:goto_0
invoke-direct {p1, v3}, Lcom/xj/winemu/utils/WineInGameSettings;->(Ljava/lang/String;)V
-@@ -4216,13 +4273,13 @@
+@@ -4216,13 +4428,13 @@
const/4 v2, 0x0
@@ -162,7 +352,7 @@
const-class v3, Lcom/xj/winemu/api/bean/IWinEmuService;
-@@ -4234,7 +4291,7 @@
+@@ -4234,7 +4446,7 @@
check-cast v3, Lcom/xj/winemu/api/bean/IWinEmuService;
@@ -171,7 +361,7 @@
invoke-interface {v3, p1}, Lcom/xj/winemu/api/bean/IWinEmuService;->p(Ljava/lang/String;)Landroid/graphics/Bitmap;
-@@ -4242,21 +4299,21 @@
+@@ -4242,21 +4454,21 @@
goto :goto_1
@@ -197,7 +387,7 @@
iget-object p1, p1, Lcom/xj/winemu/databinding/ActivityWineBinding;->ivGameLogo:Lcom/xj/base/view/RoundedImageView;
sget v3, Lcom/xj/winemu/R$drawable;->wine_default_exe_icon:I
-@@ -4265,16 +4322,16 @@
+@@ -4265,16 +4477,16 @@
goto :goto_2
@@ -217,7 +407,7 @@
iget-object v3, v3, Lcom/xj/winemu/databinding/ActivityWineBinding;->ivGameLogo:Lcom/xj/base/view/RoundedImageView;
invoke-virtual {v3, p1}, Landroidx/appcompat/widget/AppCompatImageView;->setImageBitmap(Landroid/graphics/Bitmap;)V
-@@ -4284,16 +4341,16 @@
+@@ -4284,16 +4496,16 @@
goto :goto_3
@@ -237,7 +427,7 @@
iget-object p1, p1, Lcom/xj/winemu/databinding/ActivityWineBinding;->ivGameLogo:Lcom/xj/base/view/RoundedImageView;
sget v3, Lcom/xj/winemu/R$drawable;->wine_default_exe_icon:I
-@@ -4305,31 +4362,31 @@
+@@ -4305,31 +4517,31 @@
:goto_3
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
@@ -274,7 +464,7 @@
move p1, v2
:goto_4
-@@ -4337,7 +4394,7 @@
+@@ -4337,7 +4549,7 @@
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
@@ -283,7 +473,7 @@
invoke-virtual {p1}, Lcom/xj/winemu/api/bean/WineActivityData;->h()Ljava/lang/String;
-@@ -4345,26 +4402,26 @@
+@@ -4345,26 +4557,26 @@
goto :goto_5
@@ -315,7 +505,7 @@
:goto_6
move p1, v3
-@@ -4373,16 +4430,16 @@
+@@ -4373,16 +4585,16 @@
iput-boolean p1, p0, Lcom/xj/winemu/WineActivity;->I:Z
@@ -335,7 +525,7 @@
iget-object p1, p1, Lcom/xj/winemu/databinding/ActivityWineBinding;->drawerWineSlider:Lcom/xj/winemu/sidebar/WineActivityDrawerContent;
iget-object v3, p0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
-@@ -4391,13 +4448,13 @@
+@@ -4391,13 +4603,13 @@
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->g:Lcom/xj/winemu/databinding/ActivityWineBinding;
@@ -351,7 +541,7 @@
iget-object p1, p1, Lcom/xj/winemu/databinding/ActivityWineBinding;->drawerWineSlider:Lcom/xj/winemu/sidebar/WineActivityDrawerContent;
iget v3, p0, Lcom/xj/winemu/WineActivity;->v:F
-@@ -4406,13 +4463,13 @@
+@@ -4406,13 +4618,13 @@
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->g:Lcom/xj/winemu/databinding/ActivityWineBinding;
@@ -367,7 +557,7 @@
iget-object p1, p1, Lcom/xj/winemu/databinding/ActivityWineBinding;->layoutXContainer:Landroid/widget/FrameLayout;
const-string v3, "layoutXContainer"
-@@ -4431,7 +4488,7 @@
+@@ -4431,7 +4643,7 @@
iget-object v4, p0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
@@ -376,7 +566,7 @@
invoke-virtual {v4}, Lcom/xj/winemu/api/bean/WineActivityData;->g()Ljava/lang/String;
-@@ -4439,7 +4496,7 @@
+@@ -4439,7 +4651,7 @@
goto :goto_8
@@ -385,7 +575,7 @@
move-object v4, v1
:goto_8
-@@ -4447,7 +4504,7 @@
+@@ -4447,7 +4659,7 @@
iget-object v6, p0, Lcom/xj/winemu/WineActivity;->r:Lcom/xj/winemu/api/bean/WineActivityData;
@@ -394,7 +584,7 @@
invoke-virtual {v6}, Lcom/xj/winemu/api/bean/WineActivityData;->b()Z
-@@ -4459,7 +4516,7 @@
+@@ -4459,7 +4671,7 @@
goto :goto_9
@@ -403,7 +593,7 @@
move-object v6, v1
:goto_9
-@@ -4503,13 +4560,13 @@
+@@ -4503,13 +4715,13 @@
const-string v4, "winuiBridge"
@@ -419,7 +609,7 @@
new-instance v5, Lcom/xj/winemu/n0;
invoke-direct {v5, p0}, Lcom/xj/winemu/n0;->(Lcom/xj/winemu/WineActivity;)V
-@@ -4518,13 +4575,13 @@
+@@ -4518,13 +4730,13 @@
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
@@ -435,7 +625,7 @@
new-instance v5, Lcom/xj/winemu/o0;
invoke-direct {v5, p0}, Lcom/xj/winemu/o0;->(Lcom/xj/winemu/WineActivity;)V
-@@ -4533,13 +4590,13 @@
+@@ -4533,13 +4745,13 @@
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
@@ -451,7 +641,7 @@
new-instance v5, Lcom/xj/winemu/p0;
invoke-direct {v5, p0}, Lcom/xj/winemu/p0;->(Lcom/xj/winemu/WineActivity;)V
-@@ -4549,7 +4606,7 @@
+@@ -4549,7 +4761,7 @@
:try_start_0
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
@@ -460,7 +650,7 @@
invoke-static {v4}, Lkotlin/jvm/internal/Intrinsics;->y(Ljava/lang/String;)V
-@@ -4562,28 +4619,28 @@
+@@ -4562,28 +4774,28 @@
goto :goto_b
@@ -494,7 +684,7 @@
iget-object v0, v5, Lcom/xj/winemu/databinding/ActivityWineBinding;->layoutXContainer:Landroid/widget/FrameLayout;
invoke-static {v0, v3}, Lkotlin/jvm/internal/Intrinsics;->f(Ljava/lang/Object;Ljava/lang/String;)V
-@@ -4592,24 +4649,24 @@
+@@ -4592,24 +4804,24 @@
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
@@ -523,7 +713,7 @@
invoke-virtual {p0}, Lcom/xj/winemu/WineActivity;->f3()V
invoke-virtual {p0}, Lcom/xj/winemu/WineActivity;->C2()V
-@@ -4651,7 +4708,7 @@
+@@ -4651,7 +4863,7 @@
:try_start_1
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
@@ -532,7 +722,7 @@
invoke-static {v4}, Lkotlin/jvm/internal/Intrinsics;->y(Ljava/lang/String;)V
-@@ -4664,19 +4721,19 @@
+@@ -4664,19 +4876,19 @@
goto/16 :goto_f
@@ -555,7 +745,7 @@
new-instance v0, Lcom/xj/winemu/WineActivity$onCreate$8;
invoke-direct {v0, p0}, Lcom/xj/winemu/WineActivity$onCreate$8;->(Lcom/xj/winemu/WineActivity;)V
-@@ -4685,13 +4742,13 @@
+@@ -4685,13 +4897,13 @@
iget-object p1, p0, Lcom/xj/winemu/WineActivity;->h:Lcom/winemu/openapi/WinUIBridge;
@@ -571,7 +761,7 @@
new-instance v0, Lcom/xj/winemu/WineActivity$onCreate$9;
invoke-direct {v0, p0}, Lcom/xj/winemu/WineActivity$onCreate$9;->(Lcom/xj/winemu/WineActivity;)V
-@@ -4704,14 +4761,14 @@
+@@ -4704,14 +4916,14 @@
const-string v0, "wineInGameSettingsSaver"
@@ -588,7 +778,7 @@
invoke-virtual {p1}, Lcom/xj/winemu/utils/WineInGameSettings;->d()Lcom/xj/winemu/bean/FpsLimit;
move-result-object p1
-@@ -4720,7 +4777,7 @@
+@@ -4720,7 +4932,7 @@
move-result v3
@@ -597,7 +787,7 @@
invoke-virtual {p1}, Lcom/xj/winemu/bean/FpsLimit;->getFpsLimit()I
-@@ -4734,7 +4791,7 @@
+@@ -4734,7 +4946,7 @@
move-result v3
@@ -606,7 +796,7 @@
new-instance v3, Ljava/lang/StringBuilder;
-@@ -4752,58 +4809,58 @@
+@@ -4752,58 +4964,58 @@
invoke-static {v5, v3}, Lcom/xj/common/utils/XjLog;->c(Ljava/lang/String;Ljava/lang/String;)V
diff --git a/patches/diffs/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali.patch b/patches/diffs/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali.patch
new file mode 100644
index 0000000000..f092c71f6a
--- /dev/null
+++ b/patches/diffs/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali.patch
@@ -0,0 +1,61 @@
+diff --git a/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali b/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali
+index b6c70a374..ec65cf1d5 100644
+--- a/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali
++++ b/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali
+@@ -2472,6 +2472,56 @@
+
+ invoke-virtual {p1, v0}, Lcom/xj/winemu/view/SidebarSwitchItemView;->setClickListener(Lkotlin/jvm/functions/Function0;)V
+
++ # RTS Touch Controls switch - use findViewById since not in binding
++ invoke-virtual {p0}, Landroidx/fragment/app/Fragment;->getView()Landroid/view/View;
++ move-result-object v0
++ if-eqz v0, :cond_skip_rts
++
++ # Store root view for later use
++ move-object v2, v0
++
++ const v1, 0x7f0a0e80
++ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
++ move-result-object v0
++ check-cast v0, Lcom/xj/winemu/view/SidebarSwitchItemView;
++ if-eqz v0, :cond_skip_rts
++
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsTouchControlsEnabled()Z
++ move-result v1
++ invoke-virtual {v0, v1}, Lcom/xj/winemu/view/SidebarSwitchItemView;->setSwitch(Z)V
++
++ new-instance v1, Lcom/xj/winemu/sidebar/RtsSwitchClickListener;
++ invoke-direct {v1, p0, v0}, Lcom/xj/winemu/sidebar/RtsSwitchClickListener;->(Lcom/xj/winemu/sidebar/SidebarControlsFragment;Lcom/xj/winemu/view/SidebarSwitchItemView;)V
++ invoke-virtual {v0, v1}, Lcom/xj/winemu/view/SidebarSwitchItemView;->setClickListener(Lkotlin/jvm/functions/Function0;)V
++
++ # Find gear button and set up click listener
++ const v1, 0x7f0a0e82
++ invoke-virtual {v2, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
++ move-result-object v1
++ check-cast v1, Landroid/widget/ImageButton;
++ if-eqz v1, :cond_skip_rts
++
++ # Set gear button click listener
++ new-instance v3, Lcom/xj/winemu/sidebar/RtsGestureSettingsClickListener;
++ invoke-direct {v3, p0}, Lcom/xj/winemu/sidebar/RtsGestureSettingsClickListener;->(Lcom/xj/winemu/sidebar/SidebarControlsFragment;)V
++ invoke-virtual {v1, v3}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
++
++ # Set gear button visibility based on RTS enabled state
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsTouchControlsEnabled()Z
++ move-result v3
++ if-eqz v3, :cond_gear_gone
++
++ # RTS enabled - show gear button
++ const/4 v3, 0x0
++ invoke-virtual {v1, v3}, Landroid/view/View;->setVisibility(I)V
++ goto :cond_skip_rts
++
++ :cond_gear_gone
++ # RTS disabled - hide gear button
++ const/16 v3, 0x8
++ invoke-virtual {v1, v3}, Landroid/view/View;->setVisibility(I)V
++
++ :cond_skip_rts
+ invoke-virtual {p0}, Lcom/xj/base/base/fragment/BaseVmFragment;->T()Landroidx/databinding/ViewDataBinding;
+
+ move-result-object p1
diff --git a/patches/diffs/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali.patch b/patches/diffs/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali.patch
new file mode 100644
index 0000000000..12be90252f
--- /dev/null
+++ b/patches/diffs/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali.patch
@@ -0,0 +1,190 @@
+diff --git a/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali b/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali
+index 59d561a3f..58a38c0e4 100644
+--- a/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali
++++ b/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali
+@@ -76,6 +76,185 @@
+ return-void
+ .end method
+
++.method public static getRtsTouchControlsEnabled()Z
++ .locals 3
++
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->z()Lcom/tencent/mmkv/MMKV;
++
++ move-result-object v0
++
++ const-string v1, "sp_k_enable_rts_touch_controls_global"
++
++ const/4 v2, 0x0
++
++ invoke-virtual {v0, v1, v2}, Lcom/tencent/mmkv/MMKV;->c(Ljava/lang/String;Z)Z
++
++ move-result v0
++
++ return v0
++.end method
++
++.method public static setRtsTouchControlsEnabled(Z)V
++ .locals 2
++
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->z()Lcom/tencent/mmkv/MMKV;
++
++ move-result-object v0
++
++ const-string v1, "sp_k_enable_rts_touch_controls_global"
++
++ invoke-virtual {v0, v1, p0}, Lcom/tencent/mmkv/MMKV;->v(Ljava/lang/String;Z)Z
++
++ return-void
++.end method
++
++# RTS Gesture Configuration Methods
++
++.method public static getRtsGestureEnabled(Ljava/lang/String;)Z
++ .locals 4
++ # p0 = gesture name (TAP, LONG_PRESS, DOUBLE_TAP, DRAG, PINCH, TWO_FINGER_DRAG)
++ # Returns true if gesture is enabled (default: true)
++
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->z()Lcom/tencent/mmkv/MMKV;
++ move-result-object v0
++
++ # Null check - return default (true) if MMKV not available
++ if-nez v0, :cond_mmkv_ok
++ const/4 v0, 0x1
++ return v0
++ :cond_mmkv_ok
++
++ new-instance v1, Ljava/lang/StringBuilder;
++ invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
++ const-string v2, "sp_k_rts_gesture_enabled_"
++ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
++ invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
++ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
++ move-result-object v1
++
++ const/4 v2, 0x1
++ invoke-virtual {v0, v1, v2}, Lcom/tencent/mmkv/MMKV;->c(Ljava/lang/String;Z)Z
++ move-result v0
++
++ return v0
++.end method
++
++.method public static setRtsGestureEnabled(Ljava/lang/String;Z)V
++ .locals 3
++ # p0 = gesture name, p1 = enabled
++
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->z()Lcom/tencent/mmkv/MMKV;
++ move-result-object v0
++
++ # Null check - skip if MMKV not available
++ if-nez v0, :cond_mmkv_ok
++ return-void
++ :cond_mmkv_ok
++
++ new-instance v1, Ljava/lang/StringBuilder;
++ invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
++ const-string v2, "sp_k_rts_gesture_enabled_"
++ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
++ invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
++ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
++ move-result-object v1
++
++ invoke-virtual {v0, v1, p1}, Lcom/tencent/mmkv/MMKV;->v(Ljava/lang/String;Z)Z
++
++ return-void
++.end method
++
++.method public static getRtsGestureAction(Ljava/lang/String;)I
++ .locals 4
++ # p0 = gesture name
++ # Returns action index (0 = default action for that gesture)
++ # For PINCH: 0=SCROLL_WHEEL, 1=PLUS_MINUS, 2=PAGE_UP_DOWN
++ # For TWO_FINGER_DRAG: 0=MIDDLE_MOUSE, 1=WASD, 2=ARROW_KEYS
++
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->z()Lcom/tencent/mmkv/MMKV;
++ move-result-object v0
++
++ # Null check - return default (0) if MMKV not available
++ if-nez v0, :cond_mmkv_ok
++ const/4 v0, 0x0
++ return v0
++ :cond_mmkv_ok
++
++ new-instance v1, Ljava/lang/StringBuilder;
++ invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
++ const-string v2, "sp_k_rts_gesture_action_"
++ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
++ invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
++ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
++ move-result-object v1
++
++ const/4 v2, 0x0
++ invoke-virtual {v0, v1, v2}, Lcom/tencent/mmkv/MMKV;->e(Ljava/lang/String;I)I
++ move-result v0
++
++ return v0
++.end method
++
++.method public static setRtsGestureAction(Ljava/lang/String;I)V
++ .locals 3
++ # p0 = gesture name, p1 = action index
++
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->z()Lcom/tencent/mmkv/MMKV;
++ move-result-object v0
++
++ # Null check - skip if MMKV not available
++ if-nez v0, :cond_mmkv_ok
++ return-void
++ :cond_mmkv_ok
++
++ new-instance v1, Ljava/lang/StringBuilder;
++ invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
++ const-string v2, "sp_k_rts_gesture_action_"
++ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
++ invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
++ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
++ move-result-object v1
++
++ invoke-virtual {v0, v1, p1}, Lcom/tencent/mmkv/MMKV;->q(Ljava/lang/String;I)Z
++
++ return-void
++.end method
++
++.method public static resetRtsGestureSettings()V
++ .locals 3
++ # Reset all gesture settings to defaults
++
++ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->z()Lcom/tencent/mmkv/MMKV;
++ move-result-object v0
++
++ # Null check - skip if MMKV not available
++ if-nez v0, :cond_mmkv_ok
++ return-void
++ :cond_mmkv_ok
++
++ # Remove all gesture enabled keys
++ const-string v1, "sp_k_rts_gesture_enabled_TAP"
++ invoke-virtual {v0, v1}, Lcom/tencent/mmkv/MMKV;->x(Ljava/lang/String;)V
++ const-string v1, "sp_k_rts_gesture_enabled_LONG_PRESS"
++ invoke-virtual {v0, v1}, Lcom/tencent/mmkv/MMKV;->x(Ljava/lang/String;)V
++ const-string v1, "sp_k_rts_gesture_enabled_DOUBLE_TAP"
++ invoke-virtual {v0, v1}, Lcom/tencent/mmkv/MMKV;->x(Ljava/lang/String;)V
++ const-string v1, "sp_k_rts_gesture_enabled_DRAG"
++ invoke-virtual {v0, v1}, Lcom/tencent/mmkv/MMKV;->x(Ljava/lang/String;)V
++ const-string v1, "sp_k_rts_gesture_enabled_PINCH"
++ invoke-virtual {v0, v1}, Lcom/tencent/mmkv/MMKV;->x(Ljava/lang/String;)V
++ const-string v1, "sp_k_rts_gesture_enabled_TWO_FINGER_DRAG"
++ invoke-virtual {v0, v1}, Lcom/tencent/mmkv/MMKV;->x(Ljava/lang/String;)V
++
++ # Remove all gesture action keys
++ const-string v1, "sp_k_rts_gesture_action_PINCH"
++ invoke-virtual {v0, v1}, Lcom/tencent/mmkv/MMKV;->x(Ljava/lang/String;)V
++ const-string v1, "sp_k_rts_gesture_action_TWO_FINGER_DRAG"
++ invoke-virtual {v0, v1}, Lcom/tencent/mmkv/MMKV;->x(Ljava/lang/String;)V
++
++ return-void
++.end method
++
+ .method public static A(Ljava/lang/String;)Z
+ .locals 3
+
diff --git a/patches/files_to_add.txt b/patches/files_to_add.txt
index 3e69adab28..5921847874 100644
--- a/patches/files_to_add.txt
+++ b/patches/files_to_add.txt
@@ -2857,3 +2857,26 @@ smali_classes4/com/xj/winemu/PcEmuSetupDialog$1.smali
smali_classes5/com/xj/cloud/ui/setting/CloudGameSettingDataHelper.smali
smali_classes5/com/xj/landscape/launcher/ui/gamedetail/GameDetailActivity$CopyLocalGameIdClickListener.smali
smali_classes5/com/xj/landscape/launcher/ui/gamedetail/GameVideoActivity$$ExternalSyntheticLambda0.smali
+res/color/rts_checkbox_tint.xml
+res/drawable/rts_checkbox_button.xml
+res/drawable/rts_checkbox_checked.xml
+res/drawable/rts_checkbox_unchecked.xml
+res/drawable/rts_dialog_background.xml
+res/layout/rts_action_picker_dialog.xml
+res/layout/rts_action_picker_item.xml
+res/layout/rts_gesture_config_dialog.xml
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$AppPopupDismissListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$WidgetPopupDismissListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsGestureSettingsClickListener.smali
+smali_classes4/com/xj/winemu/sidebar/RtsSwitchClickListener.smali
+smali_classes4/com/xj/winemu/view/RtsTouchOverlayView.smali
+smali_classes4/com/xj/winemu/view/RtsTouchOverlayView$RightClickReleaseRunnable.smali
diff --git a/patches/files_to_patch.txt b/patches/files_to_patch.txt
index 9236fefae1..e89930c7d3 100644
--- a/patches/files_to_patch.txt
+++ b/patches/files_to_patch.txt
@@ -224,3 +224,8 @@ smali_classes7/org/repackage/com/zui/opendeviceidlibrary/OpenDeviceId.smali
smali_classes7/org/slf4j/helpers/Util.smali
smali_classes7/tv/danmaku/ijk/media/exo2/CacheHelper.smali
smali_classes7/tv/danmaku/ijk/media/exo2/ExoSourceManager.smali
+smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali
+smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali
+res/layout/winemu_sidebar_controls_fragment.xml
+smali_classes4/com/winemu/core/controller/X11Controller.smali
+smali_classes4/com/winemu/openapi/WinUIBridge.smali
\ No newline at end of file
diff --git a/patches/new_files/res/color/rts_checkbox_tint.xml b/patches/new_files/res/color/rts_checkbox_tint.xml
new file mode 100644
index 0000000000..11d57c6496
--- /dev/null
+++ b/patches/new_files/res/color/rts_checkbox_tint.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/patches/new_files/res/drawable/rts_checkbox_button.xml b/patches/new_files/res/drawable/rts_checkbox_button.xml
new file mode 100644
index 0000000000..2ed70edbc2
--- /dev/null
+++ b/patches/new_files/res/drawable/rts_checkbox_button.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/patches/new_files/res/drawable/rts_checkbox_checked.xml b/patches/new_files/res/drawable/rts_checkbox_checked.xml
new file mode 100644
index 0000000000..4ca83531a5
--- /dev/null
+++ b/patches/new_files/res/drawable/rts_checkbox_checked.xml
@@ -0,0 +1,21 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
diff --git a/patches/new_files/res/drawable/rts_checkbox_unchecked.xml b/patches/new_files/res/drawable/rts_checkbox_unchecked.xml
new file mode 100644
index 0000000000..2e4e91090c
--- /dev/null
+++ b/patches/new_files/res/drawable/rts_checkbox_unchecked.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/patches/new_files/res/drawable/rts_dialog_background.xml b/patches/new_files/res/drawable/rts_dialog_background.xml
new file mode 100644
index 0000000000..2bd9c1ccf0
--- /dev/null
+++ b/patches/new_files/res/drawable/rts_dialog_background.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/patches/new_files/res/layout/rts_action_picker_dialog.xml b/patches/new_files/res/layout/rts_action_picker_dialog.xml
new file mode 100644
index 0000000000..190968afd8
--- /dev/null
+++ b/patches/new_files/res/layout/rts_action_picker_dialog.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/patches/new_files/res/layout/rts_action_picker_item.xml b/patches/new_files/res/layout/rts_action_picker_item.xml
new file mode 100644
index 0000000000..73201f4ebf
--- /dev/null
+++ b/patches/new_files/res/layout/rts_action_picker_item.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
diff --git a/patches/new_files/res/layout/rts_gesture_config_dialog.xml b/patches/new_files/res/layout/rts_gesture_config_dialog.xml
new file mode 100644
index 0000000000..fb343fdd71
--- /dev/null
+++ b/patches/new_files/res/layout/rts_gesture_config_dialog.xml
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener.smali
new file mode 100644
index 0000000000..e5afd03e19
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener.smali
@@ -0,0 +1,36 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener;
+.super Ljava/lang/Object;
+.implements Landroid/content/DialogInterface$OnClickListener;
+
+# instance fields
+.field private final owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.field private final key:Ljava/lang/String;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;)V
+ .locals 0
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ iput-object p2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener;->key:Ljava/lang/String;
+ return-void
+.end method
+
+# virtual methods
+.method public onClick(Landroid/content/DialogInterface;I)V
+ .locals 3
+
+ # Persist selection
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener;->key:Ljava/lang/String;
+ invoke-static {v0, p2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->setRtsGestureAction(Ljava/lang/String;I)V
+
+ # Update label text directly without rebuilding dialog
+ iget-object v1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ iget-object v2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener;->key:Ljava/lang/String;
+ invoke-virtual {v1, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->updateActionLabelForKey(Ljava/lang/String;)V
+
+ if-eqz p1, :cond_end
+ invoke-interface {p1}, Landroid/content/DialogInterface;->dismiss()V
+
+ :cond_end
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$AppPopupDismissListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$AppPopupDismissListener.smali
new file mode 100644
index 0000000000..de6bfa6832
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$AppPopupDismissListener.smali
@@ -0,0 +1,22 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$AppPopupDismissListener;
+.super Ljava/lang/Object;
+.implements Landroidx/appcompat/widget/PopupMenu$OnDismissListener;
+
+# instance fields
+.field private final owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ .locals 0
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$AppPopupDismissListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ return-void
+.end method
+
+# virtual methods
+.method public onDismiss(Landroidx/appcompat/widget/PopupMenu;)V
+ .locals 1
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$AppPopupDismissListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ invoke-virtual {v0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->applyPendingSelectionIfAny()V
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener.smali
new file mode 100644
index 0000000000..bbef9ce9f9
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener.smali
@@ -0,0 +1,45 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener;
+.super Ljava/lang/Object;
+.implements Landroid/view/View$OnClickListener;
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingClass;
+ value = Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x1
+ name = "CloseClickListener"
+.end annotation
+
+# instance fields
+.field final synthetic this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener;->this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ return-void
+.end method
+
+# virtual methods
+.method public onClick(Landroid/view/View;)V
+ .locals 1
+
+ :try_start
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener;->this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ if-eqz v0, :cond_end
+
+ iget-object v0, v0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->dialog:Landroid/app/Dialog;
+ if-eqz v0, :cond_end
+
+ invoke-virtual {v0}, Landroid/app/Dialog;->dismiss()V
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err
+
+ :catch_err
+ :cond_end
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener.smali
new file mode 100644
index 0000000000..017546c5db
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener.smali
@@ -0,0 +1,29 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;
+.super Ljava/lang/Object;
+.implements Landroid/content/DialogInterface$OnDismissListener;
+
+# instance fields
+.field private final owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ .locals 0
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ return-void
+.end method
+
+# virtual methods
+.method public onDismiss(Landroid/content/DialogInterface;)V
+ .locals 2
+ :try_start
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ invoke-virtual {v0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->applyPendingSelectionIfAny()V
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err
+ return-void
+
+ :catch_err
+ const/4 v1, 0x0
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener.smali
new file mode 100644
index 0000000000..9b7a8e6a10
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener.smali
@@ -0,0 +1,43 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener;
+.super Ljava/lang/Object;
+.implements Landroid/widget/PopupMenu$OnMenuItemClickListener;
+
+# instance fields
+.field private final owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.field private final key:Ljava/lang/String;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;)V
+ .locals 0
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ iput-object p2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener;->key:Ljava/lang/String;
+ return-void
+.end method
+
+# virtual methods
+.method public onMenuItemClick(Landroid/view/MenuItem;)Z
+ .locals 5
+
+ if-eqz p1, :cond_false
+ :try_start
+ invoke-interface {p1}, Landroid/view/MenuItem;->getItemId()I
+ move-result v0
+
+ iget-object v1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ iget-object v2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener;->key:Ljava/lang/String;
+ invoke-virtual {v1, v2, v0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->setPendingSelection(Ljava/lang/String;I)V
+
+ const/4 v3, 0x1
+ return v3
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err
+
+ :catch_err
+ const/4 v4, 0x0
+ return v4
+
+ :cond_false
+ const/4 v0, 0x0
+ return v0
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener.smali
new file mode 100644
index 0000000000..90dabd4e88
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener.smali
@@ -0,0 +1,53 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener;
+.super Ljava/lang/Object;
+.implements Landroid/content/DialogInterface$OnClickListener;
+
+# instance fields
+.field private final owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.field private final key:Ljava/lang/String;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;)V
+ .locals 0
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ iput-object p2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener;->key:Ljava/lang/String;
+ return-void
+.end method
+
+# virtual methods
+.method public onClick(Landroid/content/DialogInterface;I)V
+ .locals 4
+
+ :try_start
+ if-eqz p1, :try_end
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ if-eqz v0, :try_end
+
+ iget-object v1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener;->key:Ljava/lang/String;
+ if-eqz v1, :try_end
+
+ # Persist immediately to MMKV
+ invoke-static {v1, p2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->setRtsGestureAction(Ljava/lang/String;I)V
+
+ # Update label text immediately so user sees the change
+ invoke-virtual {v0, v1}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->updateActionLabelForKey(Ljava/lang/String;)V
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err
+
+ # Dismiss dialog safely
+ if-eqz p1, :cond_done
+ :try_dismiss
+ invoke-interface {p1}, Landroid/content/DialogInterface;->dismiss()V
+ :try_dismiss_end
+ .catch Ljava/lang/Throwable; {:try_dismiss .. :try_dismiss_end} :dismiss_err
+
+ :dismiss_err
+ :cond_done
+ return-void
+
+ :catch_err
+ const/4 v3, 0x0
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener.smali
new file mode 100644
index 0000000000..01ddbd67c4
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener.smali
@@ -0,0 +1,57 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+.super Ljava/lang/Object;
+.implements Landroid/view/View$OnClickListener;
+
+# instance fields
+.field private final owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.field private final key:Ljava/lang/String;
+.field private final optionIndex:I
+.field private final dialog:Landroid/app/Dialog;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ .locals 0
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ iput-object p2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->key:Ljava/lang/String;
+ iput p3, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->optionIndex:I
+ iput-object p4, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->dialog:Landroid/app/Dialog;
+ return-void
+.end method
+
+# virtual methods
+.method public onClick(Landroid/view/View;)V
+ .locals 4
+
+ :try_start
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ if-eqz v0, :try_end
+
+ iget-object v1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->key:Ljava/lang/String;
+ if-eqz v1, :try_end
+
+ iget v2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->optionIndex:I
+
+ # Persist immediately to MMKV
+ invoke-static {v1, v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->setRtsGestureAction(Ljava/lang/String;I)V
+
+ # Update label text immediately so user sees the change
+ invoke-virtual {v0, v1}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->updateActionLabelForKey(Ljava/lang/String;)V
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err
+
+ # Dismiss dialog safely
+ iget-object v3, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->dialog:Landroid/app/Dialog;
+ if-eqz v3, :cond_done
+ :try_dismiss
+ invoke-virtual {v3}, Landroid/app/Dialog;->dismiss()V
+ :try_dismiss_end
+ .catch Ljava/lang/Throwable; {:try_dismiss .. :try_dismiss_end} :dismiss_err
+
+ :dismiss_err
+ :cond_done
+ return-void
+
+ :catch_err
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener.smali
new file mode 100644
index 0000000000..2f0ec209e5
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener.smali
@@ -0,0 +1,48 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener;
+.super Ljava/lang/Object;
+.source "RtsGestureConfigDialog.java"
+
+# interfaces
+.implements Landroid/content/DialogInterface$OnClickListener;
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingClass;
+ value = Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x1
+ name = "ResetClickListener"
+.end annotation
+
+# instance fields
+.field final synthetic this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener;->this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ return-void
+.end method
+
+# virtual methods
+.method public onClick(Landroid/content/DialogInterface;I)V
+ .locals 0
+
+ # Reset all gesture settings to defaults
+ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->resetRtsGestureSettings()V
+
+ # Refresh the UI to show default values
+ iget-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener;->this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ invoke-virtual {p1}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->refreshUI()V
+
+ # Show the dialog again with refreshed values
+ iget-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener;->this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ invoke-virtual {p1}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->show()V
+
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener.smali
new file mode 100644
index 0000000000..d464d71ce2
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener.smali
@@ -0,0 +1,51 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener;
+.super Ljava/lang/Object;
+.source "RtsGestureConfigDialog.java"
+
+# interfaces
+.implements Landroid/widget/AdapterView$OnItemSelectedListener;
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingClass;
+ value = Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x1
+ name = "SpinnerListener"
+.end annotation
+
+# instance fields
+.field final synthetic this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.field private gestureName:Ljava/lang/String;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener;->this$0:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ iput-object p2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener;->gestureName:Ljava/lang/String;
+
+ return-void
+.end method
+
+# virtual methods
+.method public onItemSelected(Landroid/widget/AdapterView;Landroid/view/View;IJ)V
+ .locals 1
+
+ # Get gesture name
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener;->gestureName:Ljava/lang/String;
+ if-eqz v0, :cond_done
+
+ # Save the action index
+ invoke-static {v0, p3}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->setRtsGestureAction(Ljava/lang/String;I)V
+
+ :cond_done
+ return-void
+.end method
+
+.method public onNothingSelected(Landroid/widget/AdapterView;)V
+ .locals 0
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$WidgetPopupDismissListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$WidgetPopupDismissListener.smali
new file mode 100644
index 0000000000..02816adde3
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$WidgetPopupDismissListener.smali
@@ -0,0 +1,29 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$WidgetPopupDismissListener;
+.super Ljava/lang/Object;
+.implements Landroid/widget/PopupMenu$OnDismissListener;
+
+# instance fields
+.field private final owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ .locals 0
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$WidgetPopupDismissListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ return-void
+.end method
+
+# virtual methods
+.method public onDismiss(Landroid/widget/PopupMenu;)V
+ .locals 2
+ :try_start
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$WidgetPopupDismissListener;->owner:Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ invoke-virtual {v0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->applyPendingSelectionIfAny()V
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err
+ return-void
+
+ :catch_err
+ const/4 v1, 0x0
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog.smali
new file mode 100644
index 0000000000..d5ada576ad
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog.smali
@@ -0,0 +1,1035 @@
+.class public Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+.super Ljava/lang/Object;
+.source "RtsGestureConfigDialog.java"
+
+# interfaces
+.implements Landroid/widget/CompoundButton$OnCheckedChangeListener;
+.implements Landroid/view/View$OnClickListener;
+
+# instance fields
+.field private context:Landroid/content/Context;
+.field public dialog:Landroid/app/Dialog;
+.field private dialogView:Landroid/view/View;
+.field private isInitializing:Z
+.field private pendingKey:Ljava/lang/String;
+.field private pendingIndex:I
+
+# direct methods
+.method public constructor (Landroid/content/Context;)V
+ .locals 1
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->context:Landroid/content/Context;
+
+ const/4 v0, 0x1
+ iput-boolean v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->isInitializing:Z
+
+ return-void
+.end method
+
+.method public show()V
+ .locals 6
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->context:Landroid/content/Context;
+
+ if-nez v0, :cond_context_ok
+ return-void
+ :cond_context_ok
+
+ invoke-static {v0}, Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;
+ move-result-object v1
+
+ if-nez v1, :cond_inflater_ok
+ return-void
+ :cond_inflater_ok
+
+ const v2, 0x7f0d0400
+ const/4 v3, 0x0
+ invoke-virtual {v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
+ move-result-object v1
+ iput-object v1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->dialogView:Landroid/view/View;
+
+ # Use plain Dialog with transparent theme (not AlertDialog which forces layout constraints)
+ new-instance v2, Landroid/app/Dialog;
+ const v3, 0x7f14051c
+ invoke-direct {v2, v0, v3}, Landroid/app/Dialog;->(Landroid/content/Context;I)V
+
+ invoke-virtual {v2, v1}, Landroid/app/Dialog;->setContentView(Landroid/view/View;)V
+
+ iput-object v2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->dialog:Landroid/app/Dialog;
+
+ invoke-direct {p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->setupCheckboxes()V
+
+ invoke-direct {p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->showActionLabels()V
+
+ # Setup close button click listener - try both btnClose and tvClose
+ :try_start_close
+ iget-object v3, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->dialogView:Landroid/view/View;
+ if-eqz v3, :cond_no_close_btn
+
+ # Try btnClose (outer container)
+ const v4, 0x7f0a0e8b
+ invoke-virtual {v3, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ if-eqz v4, :try_tv_close
+ new-instance v5, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener;
+ invoke-direct {v5, p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ invoke-virtual {v4, v5}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ :try_tv_close
+ # Also try tvClose (inner text view)
+ const v4, 0x7f0a0e8c
+ invoke-virtual {v3, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ if-eqz v4, :cond_no_close_btn
+ new-instance v5, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener;
+ invoke-direct {v5, p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ invoke-virtual {v4, v5}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+ :cond_no_close_btn
+ :try_end_close
+ .catch Ljava/lang/Throwable; {:try_start_close .. :try_end_close} :catch_close
+ :catch_close
+
+ const/4 v1, 0x0
+ iput-boolean v1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->isInitializing:Z
+
+ invoke-virtual {v2}, Landroid/app/Dialog;->show()V
+
+ # Configure window for full screen overlay AFTER showing (window is guaranteed)
+ :try_start_window
+ invoke-virtual {v2}, Landroid/app/Dialog;->getWindow()Landroid/view/Window;
+ move-result-object v3
+ if-eqz v3, :cond_end
+
+ # Set transparent background
+ new-instance v4, Landroid/graphics/drawable/ColorDrawable;
+ const/4 v5, 0x0
+ invoke-direct {v4, v5}, Landroid/graphics/drawable/ColorDrawable;->(I)V
+ invoke-virtual {v3, v4}, Landroid/view/Window;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
+
+ # Force full-screen window so FrameLayout can center its child
+ const/4 v4, -0x1
+ const/4 v5, -0x1
+ invoke-virtual {v3, v4, v5}, Landroid/view/Window;->setLayout(II)V
+
+ # Force gravity center
+ const/16 v5, 0x11
+ invoke-virtual {v3, v5}, Landroid/view/Window;->setGravity(I)V
+
+ # Also set LayoutParams (some devices ignore setGravity)
+ invoke-virtual {v3}, Landroid/view/Window;->getAttributes()Landroid/view/WindowManager$LayoutParams;
+ move-result-object v4
+ if-eqz v4, :skip_gravity
+ iput v5, v4, Landroid/view/WindowManager$LayoutParams;->gravity:I
+ const/4 v5, 0x0
+ iput v5, v4, Landroid/view/WindowManager$LayoutParams;->dimAmount:F
+ invoke-virtual {v3, v4}, Landroid/view/Window;->setAttributes(Landroid/view/WindowManager$LayoutParams;)V
+ :skip_gravity
+ :try_end_window
+ .catch Ljava/lang/Throwable; {:try_start_window .. :try_end_window} :catch_window
+ :catch_window
+ :cond_end
+
+ return-void
+.end method
+
+.method private showActionLabels()V
+ .locals 5
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->dialogView:Landroid/view/View;
+ if-nez v0, :cond_start
+ return-void
+ :cond_start
+
+ # Show PINCH action label
+ const v1, 0x7f0a0e88
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ if-eqz v1, :cond_pinch_done
+
+ const/4 v2, 0x0
+ invoke-virtual {v1, v2}, Landroid/view/View;->setVisibility(I)V
+
+ instance-of v2, v1, Landroid/widget/TextView;
+ if-eqz v2, :cond_pinch_done
+
+ check-cast v1, Landroid/widget/TextView;
+ const-string v3, "PINCH"
+ invoke-virtual {v1, v3}, Landroid/view/View;->setTag(Ljava/lang/Object;)V
+ invoke-virtual {v1, p0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+ const-string v2, "PINCH"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v2
+
+ if-nez v2, :cond_p1
+ # Scroll Wheel ▼
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "Scroll Wheel"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_pinch_done
+ :cond_p1
+ const/4 v3, 0x1
+ if-ne v2, v3, :cond_p2
+ # +/- Keys ▼
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "+/- Keys"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_pinch_done
+ :cond_p2
+ # Page Up/Down ▼
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "Page Up/Down"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ :cond_pinch_done
+
+ # Show TWO_FINGER_DRAG action label
+ const v1, 0x7f0a0e8a
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ if-eqz v1, :cond_done
+
+ const/4 v2, 0x0
+ invoke-virtual {v1, v2}, Landroid/view/View;->setVisibility(I)V
+
+ instance-of v2, v1, Landroid/widget/TextView;
+ if-eqz v2, :cond_done
+
+ check-cast v1, Landroid/widget/TextView;
+ const-string v3, "TWO_FINGER_DRAG"
+ invoke-virtual {v1, v3}, Landroid/view/View;->setTag(Ljava/lang/Object;)V
+ invoke-virtual {v1, p0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+ const-string v2, "TWO_FINGER_DRAG"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v2
+
+ if-nez v2, :cond_t1
+ # Middle Mouse Pan ▼
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "Middle Mouse Pan"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_done
+ :cond_t1
+ const/4 v3, 0x1
+ if-ne v2, v3, :cond_t2
+ # WASD Keys ▼
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "WASD Keys"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_done
+ :cond_t2
+ # Arrow Keys ▼
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "Arrow Keys"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ :cond_done
+ return-void
+.end method
+
+.method private setupCheckboxes()V
+ .locals 4
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->dialogView:Landroid/view/View;
+ if-nez v0, :cond_start
+ return-void
+ :cond_start
+
+ const v1, 0x7f0a0e83
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ check-cast v1, Landroid/widget/CheckBox;
+ if-eqz v1, :cond_tap_done
+ const-string v2, "TAP"
+ invoke-virtual {v1, v2}, Landroid/view/View;->setTag(Ljava/lang/Object;)V
+ const-string v2, "TAP"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v2
+ invoke-virtual {v1, v2}, Landroid/widget/CheckBox;->setChecked(Z)V
+ invoke-virtual {v1, p0}, Landroid/widget/CheckBox;->setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V
+ :cond_tap_done
+
+ const v1, 0x7f0a0e84
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ check-cast v1, Landroid/widget/CheckBox;
+ if-eqz v1, :cond_lp_done
+ const-string v2, "LONG_PRESS"
+ invoke-virtual {v1, v2}, Landroid/view/View;->setTag(Ljava/lang/Object;)V
+ const-string v2, "LONG_PRESS"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v2
+ invoke-virtual {v1, v2}, Landroid/widget/CheckBox;->setChecked(Z)V
+ invoke-virtual {v1, p0}, Landroid/widget/CheckBox;->setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V
+ :cond_lp_done
+
+ const v1, 0x7f0a0e85
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ check-cast v1, Landroid/widget/CheckBox;
+ if-eqz v1, :cond_dt_done
+ const-string v2, "DOUBLE_TAP"
+ invoke-virtual {v1, v2}, Landroid/view/View;->setTag(Ljava/lang/Object;)V
+ const-string v2, "DOUBLE_TAP"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v2
+ invoke-virtual {v1, v2}, Landroid/widget/CheckBox;->setChecked(Z)V
+ invoke-virtual {v1, p0}, Landroid/widget/CheckBox;->setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V
+ :cond_dt_done
+
+ const v1, 0x7f0a0e86
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ check-cast v1, Landroid/widget/CheckBox;
+ if-eqz v1, :cond_drag_done
+ const-string v2, "DRAG"
+ invoke-virtual {v1, v2}, Landroid/view/View;->setTag(Ljava/lang/Object;)V
+ const-string v2, "DRAG"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v2
+ invoke-virtual {v1, v2}, Landroid/widget/CheckBox;->setChecked(Z)V
+ invoke-virtual {v1, p0}, Landroid/widget/CheckBox;->setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V
+ :cond_drag_done
+
+ const v1, 0x7f0a0e87
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ check-cast v1, Landroid/widget/CheckBox;
+ if-eqz v1, :cond_pinch_done
+ const-string v2, "PINCH"
+ invoke-virtual {v1, v2}, Landroid/view/View;->setTag(Ljava/lang/Object;)V
+ const-string v2, "PINCH"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v2
+ invoke-virtual {v1, v2}, Landroid/widget/CheckBox;->setChecked(Z)V
+ invoke-virtual {v1, p0}, Landroid/widget/CheckBox;->setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V
+ :cond_pinch_done
+
+ const v1, 0x7f0a0e89
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ check-cast v1, Landroid/widget/CheckBox;
+ if-eqz v1, :cond_twofinger_done
+ const-string v2, "TWO_FINGER_DRAG"
+ invoke-virtual {v1, v2}, Landroid/view/View;->setTag(Ljava/lang/Object;)V
+ const-string v2, "TWO_FINGER_DRAG"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v2
+ invoke-virtual {v1, v2}, Landroid/widget/CheckBox;->setChecked(Z)V
+ invoke-virtual {v1, p0}, Landroid/widget/CheckBox;->setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V
+ :cond_twofinger_done
+
+ return-void
+.end method
+
+.method public onCheckedChanged(Landroid/widget/CompoundButton;Z)V
+ .locals 1
+
+ iget-boolean v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->isInitializing:Z
+ if-eqz v0, :cond_not_init
+ return-void
+ :cond_not_init
+
+ invoke-virtual {p1}, Landroid/view/View;->getTag()Ljava/lang/Object;
+ move-result-object v0
+ if-eqz v0, :cond_done
+ check-cast v0, Ljava/lang/String;
+
+ invoke-static {v0, p2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->setRtsGestureEnabled(Ljava/lang/String;Z)V
+
+ :cond_done
+ return-void
+.end method
+
+.method public onClick(Landroid/view/View;)V
+ .locals 2
+
+ :try_start
+ if-eqz p1, :cond_end
+ invoke-virtual {p1}, Landroid/view/View;->getTag()Ljava/lang/Object;
+ move-result-object v0
+ if-eqz v0, :cond_end
+ check-cast v0, Ljava/lang/String;
+ # Use dialog-only picker for stability
+ invoke-direct {p0, v0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->showActionDialog(Ljava/lang/String;)V
+ :cond_end
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err
+ return-void
+
+ :catch_err
+ const/4 v1, 0x0
+ return-void
+.end method
+
+.method private showPinchPicker()V
+ .locals 10
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->context:Landroid/content/Context;
+ if-eqz v0, :cond_end
+
+ # Get LayoutInflater
+ const-string v1, "layout_inflater"
+ invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
+ move-result-object v1
+ check-cast v1, Landroid/view/LayoutInflater;
+ if-eqz v1, :cond_end
+
+ # Inflate custom picker layout (0x7f0d0401 = rts_action_picker_dialog)
+ const v2, 0x7f0d0401
+ const/4 v3, 0x0
+ invoke-virtual {v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
+ move-result-object v1
+
+ # Create Dialog with transparent theme
+ new-instance v2, Landroid/app/Dialog;
+ const v3, 0x7f14051c
+ invoke-direct {v2, v0, v3}, Landroid/app/Dialog;->(Landroid/content/Context;I)V
+
+ invoke-virtual {v2, v1}, Landroid/app/Dialog;->setContentView(Landroid/view/View;)V
+
+ # Set option texts
+ # Option 0 text (0x7f0a0e91 = rts_action_option_0_text)
+ const v3, 0x7f0a0e91
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ check-cast v3, Landroid/widget/TextView;
+ const-string v4, "Scroll Wheel"
+ invoke-virtual {v3, v4}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Option 1 text (0x7f0a0e94 = rts_action_option_1_text)
+ const v3, 0x7f0a0e94
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ check-cast v3, Landroid/widget/TextView;
+ const-string v4, "+/- Keys"
+ invoke-virtual {v3, v4}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Option 2 text (0x7f0a0e97 = rts_action_option_2_text)
+ const v3, 0x7f0a0e97
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ check-cast v3, Landroid/widget/TextView;
+ const-string v4, "Page Up/Down"
+ invoke-virtual {v3, v4}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Get current selection from MMKV
+ const-string v5, "PINCH"
+ const/4 v6, 0x0
+ invoke-static {v5, v6}, Lcom/xj/winemu/mapping/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;I)I
+ move-result v6
+
+ # Show checkmark for current selection
+ const/4 v7, 0x0
+ # Check option 0 (0x7f0a0e92 = rts_action_option_0_check)
+ const v3, 0x7f0a0e92
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ if-ne v6, v7, :cond_hide_0
+ const/4 v8, 0x0
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_check_1
+ :cond_hide_0
+ const/16 v8, 0x8
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_check_1
+ # Check option 1 (0x7f0a0e95 = rts_action_option_1_check)
+ const v3, 0x7f0a0e95
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ const/4 v7, 0x1
+ if-ne v6, v7, :cond_hide_1
+ const/4 v8, 0x0
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_check_2
+ :cond_hide_1
+ const/16 v8, 0x8
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_check_2
+ # Check option 2 (0x7f0a0e98 = rts_action_option_2_check)
+ const v3, 0x7f0a0e98
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ const/4 v7, 0x2
+ if-ne v6, v7, :cond_hide_2
+ const/4 v8, 0x0
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_setup_clicks
+ :cond_hide_2
+ const/16 v8, 0x8
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_setup_clicks
+ # Set click listeners
+ const-string v9, "PINCH"
+
+ # Option 0 click (0x7f0a0e90 = rts_action_option_0)
+ const v3, 0x7f0a0e90
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ new-instance v4, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x0
+ invoke-direct {v4, p0, v9, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v3, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Option 1 click (0x7f0a0e93 = rts_action_option_1)
+ const v3, 0x7f0a0e93
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ new-instance v4, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x1
+ invoke-direct {v4, p0, v9, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v3, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Option 2 click (0x7f0a0e96 = rts_action_option_2)
+ const v3, 0x7f0a0e96
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ new-instance v4, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x2
+ invoke-direct {v4, p0, v9, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v3, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Set dismiss listener
+ new-instance v5, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;
+ invoke-direct {v5, p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ invoke-virtual {v2, v5}, Landroid/app/Dialog;->setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)V
+
+ # Show dialog
+ invoke-virtual {v2}, Landroid/app/Dialog;->show()V
+
+ :cond_end
+ return-void
+.end method
+
+.method private showTwoFingerPicker()V
+ .locals 10
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->context:Landroid/content/Context;
+ if-eqz v0, :cond_end
+
+ # Get LayoutInflater
+ const-string v1, "layout_inflater"
+ invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
+ move-result-object v1
+ check-cast v1, Landroid/view/LayoutInflater;
+ if-eqz v1, :cond_end
+
+ # Inflate custom picker layout (0x7f0d0401 = rts_action_picker_dialog)
+ const v2, 0x7f0d0401
+ const/4 v3, 0x0
+ invoke-virtual {v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
+ move-result-object v1
+
+ # Create Dialog with transparent theme
+ new-instance v2, Landroid/app/Dialog;
+ const v3, 0x7f14051c
+ invoke-direct {v2, v0, v3}, Landroid/app/Dialog;->(Landroid/content/Context;I)V
+
+ invoke-virtual {v2, v1}, Landroid/app/Dialog;->setContentView(Landroid/view/View;)V
+
+ # Set option texts
+ # Option 0 text (0x7f0a0e91 = rts_action_option_0_text)
+ const v3, 0x7f0a0e91
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ check-cast v3, Landroid/widget/TextView;
+ const-string v4, "Middle Mouse Pan"
+ invoke-virtual {v3, v4}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Option 1 text (0x7f0a0e94 = rts_action_option_1_text)
+ const v3, 0x7f0a0e94
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ check-cast v3, Landroid/widget/TextView;
+ const-string v4, "WASD Keys"
+ invoke-virtual {v3, v4}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Option 2 text (0x7f0a0e97 = rts_action_option_2_text)
+ const v3, 0x7f0a0e97
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ check-cast v3, Landroid/widget/TextView;
+ const-string v4, "Arrow Keys"
+ invoke-virtual {v3, v4}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Get current selection from MMKV
+ const-string v5, "TWO_FINGER_DRAG"
+ const/4 v6, 0x0
+ invoke-static {v5, v6}, Lcom/xj/winemu/mapping/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;I)I
+ move-result v6
+
+ # Show checkmark for current selection
+ const/4 v7, 0x0
+ # Check option 0 (0x7f0a0e92 = rts_action_option_0_check)
+ const v3, 0x7f0a0e92
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ if-ne v6, v7, :cond_hide_0
+ const/4 v8, 0x0
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_check_1
+ :cond_hide_0
+ const/16 v8, 0x8
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_check_1
+ # Check option 1 (0x7f0a0e95 = rts_action_option_1_check)
+ const v3, 0x7f0a0e95
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ const/4 v7, 0x1
+ if-ne v6, v7, :cond_hide_1
+ const/4 v8, 0x0
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_check_2
+ :cond_hide_1
+ const/16 v8, 0x8
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_check_2
+ # Check option 2 (0x7f0a0e98 = rts_action_option_2_check)
+ const v3, 0x7f0a0e98
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ const/4 v7, 0x2
+ if-ne v6, v7, :cond_hide_2
+ const/4 v8, 0x0
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_setup_clicks
+ :cond_hide_2
+ const/16 v8, 0x8
+ invoke-virtual {v3, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_setup_clicks
+ # Set click listeners
+ const-string v9, "TWO_FINGER_DRAG"
+
+ # Option 0 click (0x7f0a0e90 = rts_action_option_0)
+ const v3, 0x7f0a0e90
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ new-instance v4, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x0
+ invoke-direct {v4, p0, v9, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v3, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Option 1 click (0x7f0a0e93 = rts_action_option_1)
+ const v3, 0x7f0a0e93
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ new-instance v4, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x1
+ invoke-direct {v4, p0, v9, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v3, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Option 2 click (0x7f0a0e96 = rts_action_option_2)
+ const v3, 0x7f0a0e96
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v3
+ new-instance v4, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x2
+ invoke-direct {v4, p0, v9, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v3, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Set dismiss listener
+ new-instance v5, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;
+ invoke-direct {v5, p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ invoke-virtual {v2, v5}, Landroid/app/Dialog;->setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)V
+
+ # Show dialog
+ invoke-virtual {v2}, Landroid/app/Dialog;->show()V
+
+ :cond_end
+ return-void
+.end method
+
+.method public updateActionLabelForKey(Ljava/lang/String;)V
+ .locals 6
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->dialogView:Landroid/view/View;
+ if-eqz v0, :cond_end
+
+ const-string v1, "PINCH"
+ invoke-virtual {v1, p1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+ move-result v1
+ if-eqz v1, :cond_check_two
+ const v1, 0x7f0a0e88
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ if-eqz v1, :cond_end
+ instance-of v2, v1, Landroid/widget/TextView;
+ if-eqz v2, :cond_end
+ check-cast v1, Landroid/widget/TextView;
+ const-string v2, "PINCH"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v2
+ if-nez v2, :cond_p1
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "Scroll Wheel"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v5, " \u25BC"
+ invoke-virtual {v3, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_end
+ :cond_p1
+ const/4 v3, 0x1
+ if-ne v2, v3, :cond_p2
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "+/- Keys"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_end
+ :cond_p2
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "Page Up/Down"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_end
+
+ :cond_check_two
+ const-string v1, "TWO_FINGER_DRAG"
+ invoke-virtual {v1, p1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+ move-result v1
+ if-eqz v1, :cond_end
+ const v1, 0x7f0a0e8a
+ invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v1
+ if-eqz v1, :cond_end
+ instance-of v2, v1, Landroid/widget/TextView;
+ if-eqz v2, :cond_end
+ check-cast v1, Landroid/widget/TextView;
+ const-string v2, "TWO_FINGER_DRAG"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v2
+ if-nez v2, :cond_t1
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "Middle Mouse Pan"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_end
+ :cond_t1
+ const/4 v3, 0x1
+ if-ne v2, v3, :cond_t2
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "WASD Keys"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+ goto :cond_end
+ :cond_t2
+ new-instance v3, Ljava/lang/StringBuilder;
+ invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
+ const-string v4, "Arrow Keys"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ const-string v4, " \u25BC"
+ invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+ move-result-object v3
+ invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ :cond_end
+ return-void
+.end method
+
+.method private showActionMenu(Landroid/view/View;Ljava/lang/String;)V
+ .locals 1
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->context:Landroid/content/Context;
+ if-eqz v0, :cond_end
+ if-eqz p2, :cond_end
+
+ # Use the stable dialog picker for all selections to avoid popup crashes/dupes
+ invoke-direct {p0, p2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->showActionDialog(Ljava/lang/String;)V
+
+ :cond_end
+ return-void
+.end method
+
+.method private showActionDialog(Ljava/lang/String;)V
+ .locals 12
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->context:Landroid/content/Context;
+ if-eqz v0, :cond_end
+ if-eqz p1, :cond_end
+
+ :try_start
+ # Get LayoutInflater
+ invoke-static {v0}, Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;
+ move-result-object v1
+ if-eqz v1, :cond_end
+
+ # Inflate custom picker layout (0x7f0d0401 = rts_action_picker_dialog)
+ const v2, 0x7f0d0401
+ const/4 v3, 0x0
+ invoke-virtual {v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
+ move-result-object v1
+ if-eqz v1, :cond_end
+
+ # Create Dialog with transparent theme (0x7f14051c = _XPopup_TransparentDialog)
+ new-instance v2, Landroid/app/Dialog;
+ const v3, 0x7f14051c
+ invoke-direct {v2, v0, v3}, Landroid/app/Dialog;->(Landroid/content/Context;I)V
+
+ invoke-virtual {v2, v1}, Landroid/app/Dialog;->setContentView(Landroid/view/View;)V
+
+ # Check if PINCH or TWO_FINGER_DRAG
+ const-string v3, "PINCH"
+ invoke-virtual {v3, p1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+ move-result v3
+
+ # Set option texts based on gesture type
+ # Option 0 text (0x7f0a0e91 = rts_action_option_0_text)
+ const v4, 0x7f0a0e91
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ check-cast v4, Landroid/widget/TextView;
+ if-eqz v3, :cond_two_text0
+ const-string v5, "Scroll Wheel"
+ goto :cond_set_text0
+ :cond_two_text0
+ const-string v5, "Middle Mouse Pan"
+ :cond_set_text0
+ invoke-virtual {v4, v5}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Option 1 text (0x7f0a0e94 = rts_action_option_1_text)
+ const v4, 0x7f0a0e94
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ check-cast v4, Landroid/widget/TextView;
+ if-eqz v3, :cond_two_text1
+ const-string v5, "+/- Keys"
+ goto :cond_set_text1
+ :cond_two_text1
+ const-string v5, "WASD Keys"
+ :cond_set_text1
+ invoke-virtual {v4, v5}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Option 2 text (0x7f0a0e97 = rts_action_option_2_text)
+ const v4, 0x7f0a0e97
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ check-cast v4, Landroid/widget/TextView;
+ if-eqz v3, :cond_two_text2
+ const-string v5, "Page Up/Down"
+ goto :cond_set_text2
+ :cond_two_text2
+ const-string v5, "Arrow Keys"
+ :cond_set_text2
+ invoke-virtual {v4, v5}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
+
+ # Get current selection from MMKV
+ invoke-static {p1}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v6
+
+ # Show checkmark for current selection
+ # Check option 0 (0x7f0a0e92 = rts_action_option_0_check)
+ const v4, 0x7f0a0e92
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ const/4 v7, 0x0
+ if-ne v6, v7, :cond_hide_0
+ const/4 v8, 0x0
+ invoke-virtual {v4, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_check_1
+ :cond_hide_0
+ const/16 v8, 0x8
+ invoke-virtual {v4, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_check_1
+ # Check option 1 (0x7f0a0e95 = rts_action_option_1_check)
+ const v4, 0x7f0a0e95
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ const/4 v7, 0x1
+ if-ne v6, v7, :cond_hide_1
+ const/4 v8, 0x0
+ invoke-virtual {v4, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_check_2
+ :cond_hide_1
+ const/16 v8, 0x8
+ invoke-virtual {v4, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_check_2
+ # Check option 2 (0x7f0a0e98 = rts_action_option_2_check)
+ const v4, 0x7f0a0e98
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ const/4 v7, 0x2
+ if-ne v6, v7, :cond_hide_2
+ const/4 v8, 0x0
+ invoke-virtual {v4, v8}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_setup_clicks
+ :cond_hide_2
+ const/16 v8, 0x8
+ invoke-virtual {v4, v8}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_setup_clicks
+ # Set click listeners
+ # Option 0 click (0x7f0a0e90 = rts_action_option_0)
+ const v4, 0x7f0a0e90
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ new-instance v5, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x0
+ invoke-direct {v5, p0, p1, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v4, v5}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Option 1 click (0x7f0a0e93 = rts_action_option_1)
+ const v4, 0x7f0a0e93
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ new-instance v5, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x1
+ invoke-direct {v5, p0, p1, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v4, v5}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Option 2 click (0x7f0a0e96 = rts_action_option_2)
+ const v4, 0x7f0a0e96
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v4
+ new-instance v5, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;
+ const/4 v7, 0x2
+ invoke-direct {v5, p0, p1, v7, v2}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;Ljava/lang/String;ILandroid/app/Dialog;)V
+ invoke-virtual {v4, v5}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ # Set dismiss listener
+ new-instance v9, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;
+ invoke-direct {v9, p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener;->(Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;)V
+ invoke-virtual {v2, v9}, Landroid/app/Dialog;->setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)V
+
+ # Show dialog
+ invoke-virtual {v2}, Landroid/app/Dialog;->show()V
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err_dialog
+
+ :catch_err_dialog
+ nop
+
+ :cond_end
+ return-void
+.end method
+
+.method public setPendingSelection(Ljava/lang/String;I)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->pendingKey:Ljava/lang/String;
+ iput p2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->pendingIndex:I
+ return-void
+.end method
+
+.method public applyPendingSelectionIfAny()V
+ .locals 4
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->pendingKey:Ljava/lang/String;
+ if-eqz v0, :cond_end
+
+ :try_start
+ iget v1, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->pendingIndex:I
+ invoke-static {v0, v1}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->setRtsGestureAction(Ljava/lang/String;I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->updateActionLabelForKey(Ljava/lang/String;)V
+ :try_end
+ .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_err
+
+ :catch_err
+ # swallow errors and continue
+ nop
+
+ const/4 v2, 0x0
+ iput-object v2, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->pendingKey:Ljava/lang/String;
+ const/4 v3, 0x0
+ iput v3, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->pendingIndex:I
+
+ :cond_end
+ return-void
+.end method
+
+.method public dismiss()V
+ .locals 1
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->dialog:Landroid/app/Dialog;
+ if-eqz v0, :cond_0
+
+ invoke-virtual {v0}, Landroid/app/Dialog;->dismiss()V
+
+ :cond_0
+ return-void
+.end method
+
+.method public refreshUI()V
+ .locals 1
+
+ const/4 v0, 0x1
+ iput-boolean v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->isInitializing:Z
+
+ invoke-direct {p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->setupCheckboxes()V
+ invoke-direct {p0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->showActionLabels()V
+
+ const/4 v0, 0x0
+ iput-boolean v0, p0, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->isInitializing:Z
+
+ return-void
+.end method
+
+
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureSettingsClickListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureSettingsClickListener.smali
new file mode 100644
index 0000000000..f955eafda2
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureSettingsClickListener.smali
@@ -0,0 +1,40 @@
+.class public final synthetic Lcom/xj/winemu/sidebar/RtsGestureSettingsClickListener;
+.super Ljava/lang/Object;
+.source "RtsGestureSettingsClickListener.java"
+
+# interfaces
+.implements Landroid/view/View$OnClickListener;
+
+# instance fields
+.field public final synthetic fragment:Lcom/xj/winemu/sidebar/SidebarControlsFragment;
+
+# direct methods
+.method public synthetic constructor (Lcom/xj/winemu/sidebar/SidebarControlsFragment;)V
+ .locals 0
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsGestureSettingsClickListener;->fragment:Lcom/xj/winemu/sidebar/SidebarControlsFragment;
+
+ return-void
+.end method
+
+# virtual methods
+.method public onClick(Landroid/view/View;)V
+ .locals 2
+
+ # Get context from fragment
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsGestureSettingsClickListener;->fragment:Lcom/xj/winemu/sidebar/SidebarControlsFragment;
+ invoke-virtual {v0}, Landroidx/fragment/app/Fragment;->getContext()Landroid/content/Context;
+ move-result-object v0
+
+ if-eqz v0, :cond_0
+
+ # Create and show the dialog
+ new-instance v1, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;
+ invoke-direct {v1, v0}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->(Landroid/content/Context;)V
+ invoke-virtual {v1}, Lcom/xj/winemu/sidebar/RtsGestureConfigDialog;->show()V
+
+ :cond_0
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsSwitchClickListener.smali b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsSwitchClickListener.smali
new file mode 100644
index 0000000000..29b4223da8
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsSwitchClickListener.smali
@@ -0,0 +1,87 @@
+.class public final synthetic Lcom/xj/winemu/sidebar/RtsSwitchClickListener;
+.super Ljava/lang/Object;
+.source "SourceFile"
+
+# interfaces
+.implements Lkotlin/jvm/functions/Function0;
+
+
+# annotations
+.annotation system Ldalvik/annotation/Signature;
+ value = {
+ "Ljava/lang/Object;",
+ "Lkotlin/jvm/functions/Function0<",
+ "Lkotlin/Unit;",
+ ">;"
+ }
+.end annotation
+
+
+# instance fields
+.field public final synthetic a:Lcom/xj/winemu/sidebar/SidebarControlsFragment;
+
+.field public final synthetic b:Lcom/xj/winemu/view/SidebarSwitchItemView;
+
+
+# direct methods
+.method public synthetic constructor (Lcom/xj/winemu/sidebar/SidebarControlsFragment;Lcom/xj/winemu/view/SidebarSwitchItemView;)V
+ .locals 0
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ iput-object p1, p0, Lcom/xj/winemu/sidebar/RtsSwitchClickListener;->a:Lcom/xj/winemu/sidebar/SidebarControlsFragment;
+
+ iput-object p2, p0, Lcom/xj/winemu/sidebar/RtsSwitchClickListener;->b:Lcom/xj/winemu/view/SidebarSwitchItemView;
+
+ return-void
+.end method
+
+
+# virtual methods
+.method public final invoke()Ljava/lang/Object;
+ .locals 3
+
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsSwitchClickListener;->b:Lcom/xj/winemu/view/SidebarSwitchItemView;
+
+ # Toggle the switch state
+ invoke-virtual {v0}, Lcom/xj/winemu/view/SidebarSwitchItemView;->getSwitchState()Z
+ move-result v1
+
+ xor-int/lit8 v1, v1, 0x1
+
+ invoke-virtual {v0, v1}, Lcom/xj/winemu/view/SidebarSwitchItemView;->setSwitch(Z)V
+
+ # Save to preferences
+ invoke-static {v1}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->setRtsTouchControlsEnabled(Z)V
+
+ # Immediately toggle overlay state in the running activity
+ invoke-static {v1}, Lcom/xj/winemu/WineActivity;->toggleRtsTouchOverlay(Z)V
+
+ # Update gear button visibility
+ iget-object v0, p0, Lcom/xj/winemu/sidebar/RtsSwitchClickListener;->a:Lcom/xj/winemu/sidebar/SidebarControlsFragment;
+ invoke-virtual {v0}, Landroidx/fragment/app/Fragment;->getView()Landroid/view/View;
+ move-result-object v0
+ if-eqz v0, :cond_skip_gear
+
+ const v2, 0x7f0a0e82
+ invoke-virtual {v0, v2}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+ move-result-object v0
+ if-eqz v0, :cond_skip_gear
+
+ if-eqz v1, :cond_gear_gone
+
+ # RTS enabled - show gear button
+ const/4 v2, 0x0
+ invoke-virtual {v0, v2}, Landroid/view/View;->setVisibility(I)V
+ goto :cond_skip_gear
+
+ :cond_gear_gone
+ # RTS disabled - hide gear button
+ const/16 v2, 0x8
+ invoke-virtual {v0, v2}, Landroid/view/View;->setVisibility(I)V
+
+ :cond_skip_gear
+ sget-object v0, Lkotlin/Unit;->a:Lkotlin/Unit;
+
+ return-object v0
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/view/RtsTouchOverlayView$RightClickReleaseRunnable.smali b/patches/new_files/smali_classes4/com/xj/winemu/view/RtsTouchOverlayView$RightClickReleaseRunnable.smali
new file mode 100644
index 0000000000..21b701670b
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/view/RtsTouchOverlayView$RightClickReleaseRunnable.smali
@@ -0,0 +1,52 @@
+.class Lcom/xj/winemu/view/RtsTouchOverlayView$RightClickReleaseRunnable;
+.super Ljava/lang/Object;
+
+# interfaces
+.implements Ljava/lang/Runnable;
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingClass;
+ value = Lcom/xj/winemu/view/RtsTouchOverlayView;
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x1
+ name = "RightClickReleaseRunnable"
+.end annotation
+
+# instance fields
+.field final synthetic this$0:Lcom/xj/winemu/view/RtsTouchOverlayView;
+
+# direct methods
+.method public constructor (Lcom/xj/winemu/view/RtsTouchOverlayView;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView$RightClickReleaseRunnable;->this$0:Lcom/xj/winemu/view/RtsTouchOverlayView;
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+ return-void
+.end method
+
+# virtual methods
+.method public run()V
+ .locals 6
+
+ # Get parent view's WinUIBridge
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView$RightClickReleaseRunnable;->this$0:Lcom/xj/winemu/view/RtsTouchOverlayView;
+ iget-object v0, v0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ # Check X11Controller is ready
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Release: c0(0, 0, button=3, isDown=false, isRelative=true)
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x3 # button 3 = right click
+ const/4 v4, 0x0 # isDown = false (release)
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ :cond_end
+ return-void
+.end method
diff --git a/patches/new_files/smali_classes4/com/xj/winemu/view/RtsTouchOverlayView.smali b/patches/new_files/smali_classes4/com/xj/winemu/view/RtsTouchOverlayView.smali
new file mode 100644
index 0000000000..bef98eb871
--- /dev/null
+++ b/patches/new_files/smali_classes4/com/xj/winemu/view/RtsTouchOverlayView.smali
@@ -0,0 +1,1796 @@
+.class public Lcom/xj/winemu/view/RtsTouchOverlayView;
+.super Landroid/view/View;
+.source "RtsTouchOverlayView.kt"
+
+
+# instance fields
+.field public a:Lcom/winemu/openapi/WinUIBridge;
+.field public b:Landroid/view/View;
+.field public lastTouchX:F
+.field public lastTouchY:F
+.field public lastGameX:F
+.field public lastGameY:F
+.field public tracking:Z
+.field public dragging:Z
+.field public downTime:J
+.field public startX:F
+.field public startY:F
+# Two-finger pan fields
+.field public twoFingerPanning:Z
+.field public twoFingerStartX:F
+.field public twoFingerStartY:F
+.field public twoFingerLastX:F
+.field public twoFingerLastY:F
+.field public panLeft:Z
+.field public panRight:Z
+.field public panUp:Z
+.field public panDown:Z
+# Pinch-to-zoom fields
+.field public pinching:Z
+.field public initialPinchDistance:F
+.field public lastPinchDistance:F
+.field public accumulatedZoom:F
+# Double-tap detection fields
+.field public lastTapTime:J
+.field public lastTapX:F
+.field public lastTapY:F
+.field public doubleTapCandidate:Z
+.field public doubleTapDelivered:Z
+.field public forwardingButtons:Z
+
+
+.method public constructor (Landroid/content/Context;)V
+ .locals 2
+
+ invoke-direct {p0, p1}, Landroid/view/View;->(Landroid/content/Context;)V
+
+ # Initialize tracking fields
+ const/4 v0, 0x0
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchX:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchY:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastGameX:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastGameY:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->startX:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->startY:F
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->tracking:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->dragging:Z
+ # Initialize two-finger pan fields
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerPanning:Z
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerStartX:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerStartY:F
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerLastX:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerLastY:F
+ # Initialize pinch-to-zoom fields
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->pinching:Z
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->initialPinchDistance:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastPinchDistance:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->accumulatedZoom:F
+ # Initialize double-tap fields
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapX:F
+ iput v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapY:F
+ const-wide/16 v0, 0x0
+ iput-wide v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->downTime:J
+ iput-wide v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapTime:J
+ const/4 v0, 0x0
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapCandidate:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapDelivered:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->forwardingButtons:Z
+
+ return-void
+.end method
+
+
+.method public setWinUIBridge(Lcom/winemu/openapi/WinUIBridge;)V
+ .locals 0
+ iput-object p1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ return-void
+.end method
+
+
+.method public setButtonsView(Landroid/view/View;)V
+ .locals 0
+ iput-object p1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->b:Landroid/view/View;
+ return-void
+.end method
+
+
+.method public dispatchTouchEvent(Landroid/view/MotionEvent;)Z
+ .locals 13
+
+ # Check if RTS controls enabled
+ invoke-static {}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsTouchControlsEnabled()Z
+ move-result v0
+ if-nez v0, :cond_enabled
+
+ # Not enabled - return false to pass event to underlying views
+ const/4 v0, 0x0
+ return v0
+
+ :cond_enabled
+ # Get action and pointer count
+ invoke-virtual {p1}, Landroid/view/MotionEvent;->getActionMasked()I
+ move-result v0
+
+ invoke-virtual {p1}, Landroid/view/MotionEvent;->getPointerCount()I
+ move-result v1
+
+ # If already forwarding to GameHub buttons, keep passing events through and skip RTS handling
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->forwardingButtons:Z
+ if-eqz v2, :cond_check_button_down
+
+ iget-object v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->b:Landroid/view/View;
+ if-eqz v2, :cond_forward_return
+ invoke-virtual {v2, p1}, Landroid/view/View;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
+ :cond_forward_return
+
+ # Reset forwarding when the gesture ends
+ const/4 v2, 0x1
+ if-eq v0, v2, :cond_reset_forwarding
+ const/4 v2, 0x3
+ if-eq v0, v2, :cond_reset_forwarding
+ const/4 v2, 0x6
+ if-ne v0, v2, :cond_forward_return_true
+
+ :cond_reset_forwarding
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->forwardingButtons:Z
+
+ :cond_forward_return_true
+ const/4 v0, 0x1
+ return v0
+
+ :cond_check_button_down
+ # On down events, see if touch hits a GameHub control; if so, forward only to buttons
+ const/4 v2, 0x0
+ if-eq v0, v2, :cond_maybe_forward_buttons
+ const/4 v3, 0x5
+ if-ne v0, v3, :cond_after_button_check
+
+ :cond_maybe_forward_buttons
+ iget-object v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->b:Landroid/view/View;
+ if-eqz v2, :cond_after_button_check
+ instance-of v3, v2, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsView;
+ if-eqz v3, :cond_after_button_check
+
+ invoke-virtual {p1}, Landroid/view/MotionEvent;->getActionIndex()I
+ move-result v3
+ invoke-virtual {p1, v3}, Landroid/view/MotionEvent;->getX(I)F
+ move-result v4
+ invoke-virtual {p1, v3}, Landroid/view/MotionEvent;->getY(I)F
+ move-result v3
+
+ check-cast v2, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsView;
+ invoke-virtual {v2, v4, v3}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsView;->w(FF)Lcom/xj/pcvirtualbtn/inputcontrols/ControlElement;
+ move-result-object v3
+ if-eqz v3, :cond_after_button_check
+
+ const/4 v3, 0x1
+ iput-boolean v3, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->forwardingButtons:Z
+ invoke-virtual {v2, p1}, Landroid/view/View;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
+ const/4 v0, 0x1
+ return v0
+
+ :cond_after_button_check
+
+ # Check for two-finger gestures (pointer count >= 2)
+ const/4 v9, 0x2
+ if-lt v1, v9, :cond_single_finger
+
+ # === TWO FINGER HANDLING ===
+ # Get center point of two fingers
+ const/4 v2, 0x0
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getX(I)F
+ move-result v3
+ const/4 v2, 0x1
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getX(I)F
+ move-result v4
+ add-float v5, v3, v4
+ const/high16 v6, 0x40000000 # 2.0f
+ div-float/2addr v5, v6 # centerX
+
+ const/4 v2, 0x0
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getY(I)F
+ move-result v3
+ const/4 v2, 0x1
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getY(I)F
+ move-result v4
+ add-float v6, v3, v4
+ const/high16 v7, 0x40000000 # 2.0f
+ div-float/2addr v6, v7 # centerY
+
+ # Check if this is start of two-finger gesture (POINTER_DOWN = 5)
+ const/4 v2, 0x5
+ if-ne v0, v2, :cond_not_pointer_down
+
+ # Cancel any single-finger tracking and ensure left is released
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseLeftButton()V
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->tracking:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->dragging:Z
+
+ # Calculate initial distance between two fingers for pinch detection
+ # Get finger positions again (already calculated v3,v4 as X coords above)
+ const/4 v2, 0x0
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getX(I)F
+ move-result v7
+ const/4 v2, 0x1
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getX(I)F
+ move-result v8
+ const/4 v2, 0x0
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getY(I)F
+ move-result v9
+ const/4 v2, 0x1
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getY(I)F
+ move-result v10
+
+ # Calculate distance: sqrt((x2-x1)^2 + (y2-y1)^2)
+ sub-float v11, v8, v7 # deltaX
+ sub-float v0, v10, v9 # deltaY
+ mul-float v11, v11, v11 # deltaX^2
+ mul-float v0, v0, v0 # deltaY^2
+ add-float v11, v11, v0 # deltaX^2 + deltaY^2
+ float-to-double v0, v11
+ invoke-static {v0, v1}, Ljava/lang/Math;->sqrt(D)D
+ move-result-wide v0
+ double-to-float v11, v0 # distance
+
+ # Start two-finger pan (will switch to pinch if distance changes)
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerPanning:Z
+ iput v5, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerStartX:F
+ iput v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerStartY:F
+ iput v5, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerLastX:F
+ iput v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerLastY:F
+
+ # Check TWO_FINGER_DRAG action - only press middle mouse if action is 0
+ const-string v2, "TWO_FINGER_DRAG"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v2
+ if-nez v2, :cond_skip_middle_press
+ # Action 0: Press middle mouse to initiate camera pan
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressMiddleButton()V
+ :cond_skip_middle_press
+
+ # Store initial pinch distance
+ iput v11, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->initialPinchDistance:F
+ iput v11, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastPinchDistance:F
+ # Clear pinch flag and accumulated zoom
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->pinching:Z
+ iput v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->accumulatedZoom:F
+ # Clear pan direction flags
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ goto :cond_return
+
+ :cond_not_pointer_down
+ # Check for two-finger move (ACTION_MOVE = 2) while panning or pinching
+ const/4 v2, 0x2
+ if-ne v0, v2, :cond_not_two_move
+
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerPanning:Z
+ if-nez v2, :cond_check_pan_or_pinch
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->pinching:Z
+ if-eqz v2, :cond_return
+
+ :cond_check_pan_or_pinch
+ # Calculate current distance between fingers
+ const/4 v2, 0x0
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getX(I)F
+ move-result v7
+ const/4 v2, 0x1
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getX(I)F
+ move-result v8
+ const/4 v2, 0x0
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getY(I)F
+ move-result v9
+ const/4 v2, 0x1
+ invoke-virtual {p1, v2}, Landroid/view/MotionEvent;->getY(I)F
+ move-result v10
+
+ # Calculate distance: sqrt((x2-x1)^2 + (y2-y1)^2)
+ sub-float v11, v8, v7 # deltaX
+ sub-float v0, v10, v9 # deltaY
+ mul-float v11, v11, v11 # deltaX^2
+ mul-float v0, v0, v0 # deltaY^2
+ add-float v11, v11, v0 # deltaX^2 + deltaY^2
+ float-to-double v0, v11
+ invoke-static {v0, v1}, Ljava/lang/Math;->sqrt(D)D
+ move-result-wide v0
+ double-to-float v11, v0 # currentDistance
+
+ # Check if we should switch to pinch mode (distance changed by 50+ pixels)
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->pinching:Z
+ if-nez v2, :cond_already_pinching
+
+ # Not pinching yet - check if distance changed enough
+ iget v7, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->initialPinchDistance:F
+ sub-float v8, v11, v7 # distanceChange
+ invoke-static {v8}, Ljava/lang/Math;->abs(F)F
+ move-result v8
+ const/high16 v9, 0x42480000 # 50.0f threshold
+ cmpl-float v8, v8, v9
+ if-lez v8, :cond_do_panning
+
+ # Distance changed by 50+ pixels - switch to pinch mode
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->pinching:Z
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerPanning:Z
+ # End any active panning
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->endTwoFingerPan()V
+ # Release middle button so pinch does not continue to pan
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseMiddleButton()V
+ # Ensure left button is not held during pinch
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseLeftButton()V
+ # Update lastPinchDistance for continuous zooming
+ iput v11, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastPinchDistance:F
+ goto :cond_return
+
+ :cond_already_pinching
+ # Already pinching - handle zoom
+ # First check if PINCH gesture is enabled
+ const-string v0, "PINCH"
+ invoke-static {v0}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v0
+ if-eqz v0, :cond_scroll_done # Skip if disabled
+
+ iget v7, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastPinchDistance:F
+ sub-float v8, v11, v7 # distanceDelta = current - last
+
+ # Add to accumulated zoom
+ iget v9, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->accumulatedZoom:F
+ add-float v9, v9, v8
+ iput v9, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->accumulatedZoom:F
+
+ # Send scroll events for every 5 pixels of accumulated zoom (very aggressive)
+ const/high16 v10, 0x40a00000 # 5.0f (sensitivity - very responsive)
+
+ # Get the configured action for PINCH (0=scroll, 1=plus/minus, 2=page up/down)
+ const-string v0, "PINCH"
+ invoke-static {v0}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v12 # v12 = pinch action
+
+ :loop_scroll_events
+ invoke-static {v9}, Ljava/lang/Math;->abs(F)F
+ move-result v0
+ cmpl-float v0, v0, v10
+ if-ltz v0, :cond_scroll_done
+
+ # Determine scroll direction (zoom in or out)
+ const/4 v0, 0x0
+ cmpl-float v0, v9, v0
+ if-lez v0, :cond_zoom_out
+
+ # Zoom out (pinch outward = fingers spreading)
+ const/4 v0, 0x1 # direction = +1
+
+ # Check action type and call appropriate method
+ if-nez v12, :cond_zoom_out_check_action1
+ # Action 0: Mouse Wheel (default)
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ goto :cond_zoom_out_done
+
+ :cond_zoom_out_check_action1
+ const/4 v1, 0x1
+ if-ne v12, v1, :cond_zoom_out_action2
+ # Action 1: Plus/Minus Keys
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendPlusMinusKey(I)V
+ goto :cond_zoom_out_done
+
+ :cond_zoom_out_action2
+ # Action 2: Page Up/Down
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendPageUpDownKey(I)V
+
+ :cond_zoom_out_done
+ sub-float v9, v9, v10
+ goto :loop_scroll_continue
+
+ :cond_zoom_out
+ # Zoom in (pinch inward = fingers coming together)
+ const/4 v0, -0x1 # direction = -1
+
+ # Check action type and call appropriate method
+ if-nez v12, :cond_zoom_in_check_action1
+ # Action 0: Mouse Wheel (default)
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendScrollWheel(I)V
+ goto :cond_zoom_in_done
+
+ :cond_zoom_in_check_action1
+ const/4 v1, 0x1
+ if-ne v12, v1, :cond_zoom_in_action2
+ # Action 1: Plus/Minus Keys
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendPlusMinusKey(I)V
+ goto :cond_zoom_in_done
+
+ :cond_zoom_in_action2
+ # Action 2: Page Up/Down
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->sendPageUpDownKey(I)V
+
+ :cond_zoom_in_done
+ add-float v9, v9, v10
+
+ :loop_scroll_continue
+ iput v9, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->accumulatedZoom:F
+ goto :loop_scroll_events
+
+ :cond_scroll_done
+ # Update last pinch distance
+ iput v11, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastPinchDistance:F
+ goto :cond_return
+
+ :cond_do_panning
+ # Not pinching - do panning based on configured action
+ # First check if TWO_FINGER_DRAG gesture is enabled
+ const-string v0, "TWO_FINGER_DRAG"
+ invoke-static {v0}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v0
+ if-eqz v0, :cond_pan_update_pos # Skip action if disabled, just update position
+
+ # Get the configured action (0=middle mouse, 1=WASD, 2=arrow keys)
+ const-string v0, "TWO_FINGER_DRAG"
+ invoke-static {v0}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v12 # v12 = pan action
+
+ # Calculate delta from last center position for relative movement
+ iget v7, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerLastX:F
+ sub-float v7, v5, v7 # deltaX = centerX - lastX
+
+ iget v8, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerLastY:F
+ sub-float v8, v6, v8 # deltaY = centerY - lastY
+
+ # Branch based on action
+ if-nez v12, :cond_pan_check_wasd
+
+ # Action 0: Middle mouse drag (default)
+ # Apply sensitivity scaling, inversion, and deadzone
+ const/high16 v0, 0x3e800000 # 0.25f
+ mul-float v7, v7, v0
+ mul-float v8, v8, v0
+ # invert so map moves with fingers
+ const/high16 v1, 0xbf800000 # -1.0f
+ mul-float v7, v7, v1
+ mul-float v8, v8, v1
+ # Send relative mouse movement while middle button is held
+ invoke-virtual {p0, v7, v8}, Lcom/xj/winemu/view/RtsTouchOverlayView;->moveCursorBy(FF)V
+ goto :cond_pan_update_pos
+
+ :cond_pan_check_wasd
+ const/4 v1, 0x1
+ if-ne v12, v1, :cond_pan_arrows
+
+ # Action 1: WASD keys - use direction-based key press/release
+ # Threshold for direction detection (50 pixels from start)
+ iget v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerStartX:F
+ sub-float v7, v5, v0 # deltaX from start
+ iget v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerStartY:F
+ sub-float v8, v6, v0 # deltaY from start
+
+ const/high16 v10, 0x42480000 # 50.0f threshold
+ const/high16 v11, 0xc2480000 # -50.0f
+
+ # Horizontal: left (A) / right (D)
+ cmpg-float v2, v7, v11
+ if-gez v2, :cond_wasd_check_right
+ # deltaX < -50, press A (left)
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ if-nez v2, :cond_wasd_check_vertical
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressWasdKey(I)V
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ if-eqz v2, :cond_wasd_check_vertical
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ const/4 v2, 0x2
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+ goto :cond_wasd_check_vertical
+
+ :cond_wasd_check_right
+ cmpl-float v2, v7, v10
+ if-lez v2, :cond_wasd_center_h
+ # deltaX > 50, press D (right)
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ if-nez v2, :cond_wasd_check_vertical
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ const/4 v2, 0x2
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressWasdKey(I)V
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ if-eqz v2, :cond_wasd_check_vertical
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ const/4 v2, 0x1
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+ goto :cond_wasd_check_vertical
+
+ :cond_wasd_center_h
+ # Release both A and D
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ if-eqz v2, :cond_wasd_release_right
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ const/4 v2, 0x1
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+ :cond_wasd_release_right
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ if-eqz v2, :cond_wasd_check_vertical
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ const/4 v2, 0x2
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+
+ :cond_wasd_check_vertical
+ # Vertical: up (W) / down (S)
+ cmpg-float v2, v8, v11
+ if-gez v2, :cond_wasd_check_down
+ # deltaY < -50, press W (up)
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ if-nez v2, :cond_pan_update_pos
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ const/4 v2, 0x3
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressWasdKey(I)V
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ if-eqz v2, :cond_pan_update_pos
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ const/4 v2, 0x4
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+ goto :cond_pan_update_pos
+
+ :cond_wasd_check_down
+ cmpl-float v2, v8, v10
+ if-lez v2, :cond_wasd_center_v
+ # deltaY > 50, press S (down)
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ if-nez v2, :cond_pan_update_pos
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ const/4 v2, 0x4
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressWasdKey(I)V
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ if-eqz v2, :cond_pan_update_pos
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ const/4 v2, 0x3
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+ goto :cond_pan_update_pos
+
+ :cond_wasd_center_v
+ # Release both W and S
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ if-eqz v2, :cond_wasd_release_down
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ const/4 v2, 0x3
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+ :cond_wasd_release_down
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ if-eqz v2, :cond_pan_update_pos
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ const/4 v2, 0x4
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+ goto :cond_pan_update_pos
+
+ :cond_pan_arrows
+ # Action 2: Arrow keys - use direction-based key press/release
+ # Threshold for direction detection (50 pixels from start)
+ iget v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerStartX:F
+ sub-float v7, v5, v0 # deltaX from start
+ iget v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerStartY:F
+ sub-float v8, v6, v0 # deltaY from start
+
+ const/high16 v10, 0x42480000 # 50.0f
+ const/high16 v11, 0xc2480000 # -50.0f
+
+ # Check horizontal direction (left/right)
+ # If deltaX < -50 and not already pressing left, press left arrow
+ cmpg-float v2, v7, v11
+ if-gez v2, :cond_check_right
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ if-nez v2, :cond_check_vertical
+ # Start pressing left
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressArrowKey(I)V
+ # Release right if pressed
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ if-eqz v2, :cond_check_vertical
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ const/4 v2, 0x2
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+ goto :cond_check_vertical
+
+ :cond_check_right
+ # If deltaX > 50 and not already pressing right, press right arrow
+ cmpl-float v2, v7, v10
+ if-lez v2, :cond_check_center_h
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ if-nez v2, :cond_check_vertical
+ # Start pressing right
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ const/4 v2, 0x2
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressArrowKey(I)V
+ # Release left if pressed
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ if-eqz v2, :cond_check_vertical
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ const/4 v2, 0x1
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+ goto :cond_check_vertical
+
+ :cond_check_center_h
+ # If deltaX is between -50 and 50, release both left and right
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ if-eqz v2, :cond_check_release_right
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ const/4 v2, 0x1
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+ :cond_check_release_right
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ if-eqz v2, :cond_check_vertical
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ const/4 v2, 0x2
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+
+ :cond_check_vertical
+ # Check vertical direction (up/down)
+ # If deltaY < -50 and not already pressing up, press up arrow
+ cmpg-float v2, v8, v11
+ if-gez v2, :cond_check_down
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ if-nez v2, :cond_return
+ # Start pressing up
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ const/4 v2, 0x3
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressArrowKey(I)V
+ # Release down if pressed
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ if-eqz v2, :cond_return
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ const/4 v2, 0x4
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+ goto :cond_return
+
+ :cond_check_down
+ # If deltaY > 50 and not already pressing down, press down arrow
+ cmpl-float v2, v8, v10
+ if-lez v2, :cond_check_center_v
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ if-nez v2, :cond_return
+ # Start pressing down
+ const/4 v2, 0x1
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ const/4 v2, 0x4
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressArrowKey(I)V
+ # Release up if pressed
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ if-eqz v2, :cond_return
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ const/4 v2, 0x3
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+ goto :cond_return
+
+ :cond_check_center_v
+ # If deltaY is between -50 and 50, release both up and down
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ if-eqz v2, :cond_check_release_down
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ const/4 v2, 0x3
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+ :cond_check_release_down
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ if-eqz v2, :cond_pan_update_pos
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ const/4 v2, 0x4
+ invoke-virtual {p0, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+
+ :cond_pan_update_pos
+ # Update last center position for all pan methods
+ iput v5, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerLastX:F
+ iput v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerLastY:F
+ goto :cond_return
+
+ :cond_not_two_move
+ # Check for pointer up (POINTER_UP = 6) - second finger lifted
+ const/4 v2, 0x6
+ if-ne v0, v2, :cond_return
+
+ # End two-finger pan - release keys based on configured action
+ # Get action to know which keys to release
+ const-string v2, "TWO_FINGER_DRAG"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v2
+
+ if-nez v2, :cond_end_check_wasd
+ # Action 0: Release middle mouse
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseMiddleButton()V
+ goto :cond_end_cleanup
+
+ :cond_end_check_wasd
+ const/4 v3, 0x1
+ if-ne v2, v3, :cond_end_arrows
+ # Action 1: Release WASD keys
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->endWasdPan()V
+ goto :cond_end_cleanup
+
+ :cond_end_arrows
+ # Action 2: Release arrow keys
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->endTwoFingerPan()V
+
+ :cond_end_cleanup
+ # Ensure left button is not held after two-finger end
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseLeftButton()V
+ # Clear pinching state
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->pinching:Z
+ iput v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->accumulatedZoom:F
+ # Clear pan direction flags
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerPanning:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ goto :cond_return
+
+ # === SINGLE FINGER HANDLING ===
+ :cond_single_finger
+ # Check if we were two-finger panning/pinching and now only have one finger
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerPanning:Z
+ if-nez v2, :cond_was_two_finger
+ iget-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->pinching:Z
+ if-eqz v2, :cond_normal_single
+
+ :cond_was_two_finger
+ # End two-finger pan - release keys based on configured action
+ const-string v2, "TWO_FINGER_DRAG"
+ invoke-static {v2}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureAction(Ljava/lang/String;)I
+ move-result v2
+
+ if-nez v2, :cond_was_check_wasd
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseMiddleButton()V
+ goto :cond_was_cleanup
+
+ :cond_was_check_wasd
+ const/4 v3, 0x1
+ if-ne v2, v3, :cond_was_arrows
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->endWasdPan()V
+ goto :cond_was_cleanup
+
+ :cond_was_arrows
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->endTwoFingerPan()V
+
+ :cond_was_cleanup
+ # Clear pinching state
+ const/4 v2, 0x0
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->pinching:Z
+ iput v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->accumulatedZoom:F
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerPanning:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ iput-boolean v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ # Don't process this touch as single finger, let user lift completely
+ goto :cond_return
+
+ :cond_normal_single
+ # Get touch coordinates for single finger
+ invoke-virtual {p1}, Landroid/view/MotionEvent;->getX()F
+ move-result v2
+
+ invoke-virtual {p1}, Landroid/view/MotionEvent;->getY()F
+ move-result v3
+
+ # On ACTION_DOWN (0), warp cursor to touch position and start tracking
+ if-nez v0, :cond_not_down
+
+ # Start tracking, not dragging yet
+ const/4 v1, 0x1
+ iput-boolean v1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->tracking:Z
+ const/4 v1, 0x0
+ iput-boolean v1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->dragging:Z
+
+ # Store initial touch position for movement threshold check
+ iput v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchX:F
+ iput v3, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchY:F
+ iput v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->startX:F
+ iput v3, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->startY:F
+
+ # Store down time for long press detection
+ invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
+ move-result-wide v4
+ iput-wide v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->downTime:J
+
+ # Evaluate if this down could be a double-tap based on last tap time and distance
+ iget-wide v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapTime:J
+ const-wide/16 v8, 0x0
+ cmp-long v10, v6, v8
+ if-nez v10, :cond_check_double_window
+ const/4 v6, 0x0
+ iput-boolean v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapCandidate:Z
+ iput-boolean v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapDelivered:Z
+ goto :cond_after_double_check
+
+ :cond_check_double_window
+ sub-long/2addr v4, v6 # reuse v4 as elapsed since last tap
+ const-wide/16 v8, 0xfa # 250ms window
+ cmp-long v10, v4, v8
+ if-gez v10, :cond_no_double_tap
+
+ iget v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapX:F
+ sub-float v6, v2, v6
+ invoke-static {v6}, Ljava/lang/Math;->abs(F)F
+ move-result v6
+ iget v7, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapY:F
+ sub-float v7, v3, v7
+ invoke-static {v7}, Ljava/lang/Math;->abs(F)F
+ move-result v7
+ const/high16 v8, 0x42480000 # 50.0f distance window
+ cmpg-float v9, v6, v8
+ if-gtz v9, :cond_no_double_tap
+ cmpg-float v6, v7, v8
+ if-gtz v6, :cond_no_double_tap
+
+ const/4 v6, 0x1
+ iput-boolean v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapCandidate:Z
+ iput-boolean v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapDelivered:Z
+ goto :cond_after_double_check
+
+ :cond_no_double_tap
+ const/4 v6, 0x0
+ iput-boolean v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapCandidate:Z
+ iput-boolean v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapDelivered:Z
+
+ :cond_after_double_check
+
+ # Warp cursor to touch position
+ invoke-virtual {p0, v2, v3}, Lcom/xj/winemu/view/RtsTouchOverlayView;->warpCursorTo(FF)V
+
+ # If this is the second tap in the window, emit TWO clicks (double-click) immediately
+ iget-boolean v10, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapCandidate:Z
+ if-eqz v10, :cond_no_double_action_down
+ iget-boolean v10, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapDelivered:Z
+ if-eqz v10, :cond_no_double_action_down
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->doClick()V
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->doClick()V
+ goto :cond_return
+
+ :cond_no_double_action_down
+ # Don't press anything on ACTION_DOWN - wait to see what gesture unfolds
+ # This prevents interfering left-clicks when user is doing a long-press for right-click
+
+ goto :cond_return
+
+ :cond_not_down
+ # On ACTION_MOVE (2)
+ const/4 v1, 0x2
+ if-ne v0, v1, :cond_not_move
+
+ # Check if we're tracking
+ iget-boolean v1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->tracking:Z
+ if-eqz v1, :cond_return
+
+ # Check if finger moved significantly from last position (threshold = 5 pixels for flicker fix)
+ iget v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchX:F
+ sub-float v4, v2, v4
+ invoke-static {v4}, Ljava/lang/Math;->abs(F)F
+ move-result v4
+
+ iget v5, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchY:F
+ sub-float v5, v3, v5
+ invoke-static {v5}, Ljava/lang/Math;->abs(F)F
+ move-result v5
+
+ # Only update cursor if moved more than 5 pixels (reduces flicker)
+ const/high16 v6, 0x40a00000 # 5.0f
+ cmpg-float v7, v4, v6
+ if-gtz v7, :cond_do_move
+ cmpg-float v7, v5, v6
+ if-lez v7, :cond_return # Skip if barely moved
+
+ :cond_do_move
+ # Update last touch position
+ iput v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchX:F
+ iput v3, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchY:F
+
+ # Check if this is start of drag (moved > 20 pixels from start)
+ iget-boolean v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->dragging:Z
+ if-nez v4, :cond_already_dragging
+
+ # Check distance from start
+ iget v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->startX:F
+ sub-float v4, v2, v4
+ invoke-static {v4}, Ljava/lang/Math;->abs(F)F
+ move-result v4
+
+ iget v5, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->startY:F
+ sub-float v5, v3, v5
+ invoke-static {v5}, Ljava/lang/Math;->abs(F)F
+ move-result v5
+
+ const/high16 v6, 0x41200000 # 10.0f (drag threshold - reduced for better button clicks)
+ cmpg-float v7, v4, v6
+ if-gtz v7, :cond_start_drag
+ cmpg-float v7, v5, v6
+ if-lez v7, :cond_already_dragging
+
+ :cond_start_drag
+ # Check if DRAG gesture is enabled before starting drag
+ const-string v4, "DRAG"
+ invoke-static {v4}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v4
+ if-eqz v4, :cond_already_dragging # Skip drag initiation if disabled
+
+ # Start dragging - press left button and hold
+ const/4 v4, 0x1
+ iput-boolean v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->dragging:Z
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->pressLeftButton()V
+
+ :cond_already_dragging
+ # Use warp for all movement - cursor stays exactly under finger
+ invoke-virtual {p0, v2, v3}, Lcom/xj/winemu/view/RtsTouchOverlayView;->warpCursorTo(FF)V
+
+ goto :cond_return
+
+ :cond_not_move
+ # On ACTION_UP (1)
+ const/4 v1, 0x1
+ if-ne v0, v1, :cond_return
+
+ # Check if we were tracking at all (skip if not - e.g. after two-finger pan)
+ iget-boolean v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->tracking:Z
+ if-eqz v4, :cond_cleanup
+
+ # Check if we were dragging
+ iget-boolean v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->dragging:Z
+ if-eqz v4, :cond_not_dragging
+
+ # Was dragging - release left button
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseLeftButton()V
+ goto :cond_cleanup
+
+ :cond_not_dragging
+ # Not dragging - check for long press (right click) vs tap (left click)
+ # Calculate touch duration
+ invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
+ move-result-wide v4
+ iget-wide v6, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->downTime:J
+ sub-long/2addr v4, v6 # v4 = elapsed time in ms
+
+ # If this was flagged as a double tap and already delivered on ACTION_DOWN, just clean up
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapCandidate:Z
+ if-eqz v0, :cond_check_longpress
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapDelivered:Z
+ if-eqz v0, :cond_check_longpress
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseLeftButton()V
+ const/4 v0, 0x0
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapCandidate:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapDelivered:Z
+ invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
+ move-result-wide v4
+ iput-wide v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapTime:J
+ iput v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapX:F
+ iput v3, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapY:F
+ goto :cond_cleanup
+
+ :cond_check_longpress
+
+ # Check duration: >= 300ms = long press = right click
+ const-wide/16 v6, 0x12c # 300ms
+ cmp-long v0, v4, v6
+ if-ltz v0, :cond_left_click
+
+ # Long press - check if LONG_PRESS gesture is enabled
+ const-string v0, "LONG_PRESS"
+ invoke-static {v0}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v0
+ if-eqz v0, :cond_cleanup # Skip right click if disabled
+
+ # Long press - do right click only (no left button involved)
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->doRightClick()V
+ goto :cond_cleanup
+
+ :cond_left_click
+ # Normal tap - check if TAP gesture is enabled
+ const-string v0, "TAP"
+ invoke-static {v0}, Lcom/xj/pcvirtualbtn/inputcontrols/InputControlsManager;->getRtsGestureEnabled(Ljava/lang/String;)Z
+ move-result v0
+ if-eqz v0, :cond_skip_tap # Skip tap action if disabled
+
+ # Normal tap: do a complete click (press + release)
+ invoke-virtual {p0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->doClick()V
+
+ # Save tap time and position (still tracked for future heuristics)
+ invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
+ move-result-wide v4
+ iput-wide v4, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapTime:J
+ iput v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapX:F
+ iput v3, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTapY:F
+ goto :cond_cleanup
+
+ :cond_skip_tap
+ # Tap disabled - no action needed
+
+ :cond_cleanup
+ # Stop tracking
+ const/4 v1, 0x0
+ iput-boolean v1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->tracking:Z
+ iput-boolean v1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->dragging:Z
+ iput-boolean v1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapCandidate:Z
+ iput-boolean v1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->doubleTapDelivered:Z
+
+ :cond_return
+ # Forward touch to buttons at end (for all events)
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->b:Landroid/view/View;
+ if-eqz v0, :cond_no_buttons
+ invoke-virtual {v0, p1}, Landroid/view/View;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z
+ :cond_no_buttons
+
+ # When RTS enabled, consume the event (return true)
+ const/4 v0, 0x1
+ return v0
+.end method
+
+
+# Warp cursor to absolute position using absolute coordinates (no reset needed)
+# Parameters: p1 = targetX, p2 = targetY (screen coordinates)
+# Maps touch on overlay to game coordinates using X11View's actual screen bounds
+# Also saves the game coordinates to lastGameX/Y for delta tracking
+.method public warpCursorTo(FF)V
+ .locals 12
+
+ # Get WinUIBridge from our field
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ # Check X11Controller is ready
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Get X11View from X11Controller
+ iget-object v2, v1, Lcom/winemu/core/controller/X11Controller;->a:Lcom/winemu/ui/X11View;
+ if-eqz v2, :cond_no_scale
+
+ # Get game screen size from X11View (actual game resolution, e.g. 1600x1200)
+ invoke-virtual {v2}, Lcom/winemu/ui/X11View;->getScreenSize()Landroid/graphics/Point;
+ move-result-object v3
+ if-eqz v3, :cond_no_scale
+
+ # Get game dimensions from Point
+ iget v4, v3, Landroid/graphics/Point;->x:I # gameWidth (e.g. 1600)
+ iget v5, v3, Landroid/graphics/Point;->y:I # gameHeight (e.g. 1200)
+ int-to-float v4, v4
+ int-to-float v5, v5
+
+ # Get X11View's position on screen (where the game view starts)
+ invoke-virtual {v2}, Landroid/view/View;->getX()F
+ move-result v6 # viewX (left edge of game on screen)
+
+ invoke-virtual {v2}, Landroid/view/View;->getY()F
+ move-result v7 # viewY (top edge of game on screen)
+
+ # Get X11View's size on screen (how big the game appears, may be letterboxed)
+ invoke-virtual {v2}, Landroid/view/View;->getWidth()I
+ move-result v8
+ int-to-float v8, v8 # viewWidth on screen
+
+ invoke-virtual {v2}, Landroid/view/View;->getHeight()I
+ move-result v9
+ int-to-float v9, v9 # viewHeight on screen
+
+ # Avoid division by zero
+ const/4 v10, 0x0
+ cmpg-float v11, v8, v10
+ if-lez v11, :cond_no_scale
+ cmpg-float v11, v9, v10
+ if-lez v11, :cond_no_scale
+
+ # Convert touch coordinates to be relative to X11View position
+ # relativeX = touchX - viewX
+ # relativeY = touchY - viewY
+ sub-float p1, p1, v6 # relativeX = touchX - viewX
+ sub-float p2, p2, v7 # relativeY = touchY - viewY
+
+ # Scale from X11View screen size to game resolution
+ # scaledX = relativeX * (gameWidth / viewWidth)
+ # scaledY = relativeY * (gameHeight / viewHeight)
+ div-float v10, v4, v8 # scaleX = gameWidth / viewWidth
+ div-float v11, v5, v9 # scaleY = gameHeight / viewHeight
+
+ mul-float p1, p1, v10 # scaledX = relativeX * scaleX
+ mul-float p2, p2, v11 # scaledY = relativeY * scaleY
+
+ # Clamp to game bounds (0 to gameWidth/gameHeight)
+ const/4 v6, 0x0
+
+ # Clamp X: max(0, min(scaledX, gameWidth))
+ invoke-static {p1, v6}, Ljava/lang/Math;->max(FF)F
+ move-result p1
+ invoke-static {p1, v4}, Ljava/lang/Math;->min(FF)F
+ move-result p1
+
+ # Clamp Y: max(0, min(scaledY, gameHeight))
+ invoke-static {p2, v6}, Ljava/lang/Math;->max(FF)F
+ move-result p2
+ invoke-static {p2, v5}, Ljava/lang/Math;->min(FF)F
+ move-result p2
+
+ # Save game coordinates for delta tracking
+ iput p1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastGameX:F
+ iput p2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastGameY:F
+
+ :cond_no_scale
+ # Use absolute positioning (isRelative=false) - single call, no flicker
+ move v1, p1 # absX = scaledX
+ move v2, p2 # absY = scaledY
+ const/4 v3, 0x0 # button = 0 (move only)
+ const/4 v4, 0x0 # isDown = false
+ const/4 v5, 0x0 # isRelative = false (absolute positioning!)
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Convert touch coordinates to game coordinates (without moving cursor)
+# Returns float array [gameX, gameY] or null if can't convert
+.method public touchToGameCoords(FF)[F
+ .locals 12
+
+ # Get WinUIBridge from our field
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_fail
+
+ # Check X11Controller is ready
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_fail
+
+ # Get X11View from X11Controller
+ iget-object v2, v1, Lcom/winemu/core/controller/X11Controller;->a:Lcom/winemu/ui/X11View;
+ if-eqz v2, :cond_fail
+
+ # Get game screen size from X11View
+ invoke-virtual {v2}, Lcom/winemu/ui/X11View;->getScreenSize()Landroid/graphics/Point;
+ move-result-object v3
+ if-eqz v3, :cond_fail
+
+ # Get game dimensions from Point
+ iget v4, v3, Landroid/graphics/Point;->x:I # gameWidth
+ iget v5, v3, Landroid/graphics/Point;->y:I # gameHeight
+ int-to-float v4, v4
+ int-to-float v5, v5
+
+ # Get X11View's position on screen
+ invoke-virtual {v2}, Landroid/view/View;->getX()F
+ move-result v6 # viewX
+
+ invoke-virtual {v2}, Landroid/view/View;->getY()F
+ move-result v7 # viewY
+
+ # Get X11View's size on screen
+ invoke-virtual {v2}, Landroid/view/View;->getWidth()I
+ move-result v8
+ int-to-float v8, v8 # viewWidth
+
+ invoke-virtual {v2}, Landroid/view/View;->getHeight()I
+ move-result v9
+ int-to-float v9, v9 # viewHeight
+
+ # Avoid division by zero
+ const/4 v10, 0x0
+ cmpg-float v11, v8, v10
+ if-lez v11, :cond_fail
+ cmpg-float v11, v9, v10
+ if-lez v11, :cond_fail
+
+ # Convert touch to relative
+ sub-float p1, p1, v6 # relativeX = touchX - viewX
+ sub-float p2, p2, v7 # relativeY = touchY - viewY
+
+ # Scale to game coordinates
+ div-float v10, v4, v8 # scaleX = gameWidth / viewWidth
+ div-float v11, v5, v9 # scaleY = gameHeight / viewHeight
+
+ mul-float p1, p1, v10 # gameX = relativeX * scaleX
+ mul-float p2, p2, v11 # gameY = relativeY * scaleY
+
+ # Clamp to game bounds
+ const/4 v6, 0x0
+
+ invoke-static {p1, v6}, Ljava/lang/Math;->max(FF)F
+ move-result p1
+ invoke-static {p1, v4}, Ljava/lang/Math;->min(FF)F
+ move-result p1
+
+ invoke-static {p2, v6}, Ljava/lang/Math;->max(FF)F
+ move-result p2
+ invoke-static {p2, v5}, Ljava/lang/Math;->min(FF)F
+ move-result p2
+
+ # Create float array with results
+ const/4 v0, 0x2
+ new-array v0, v0, [F
+ const/4 v1, 0x0
+ aput p1, v0, v1
+ const/4 v1, 0x1
+ aput p2, v0, v1
+ return-object v0
+
+ :cond_fail
+ const/4 v0, 0x0
+ return-object v0
+.end method
+
+
+# Move cursor by delta (relative movement)
+# Parameters: p1 = deltaX, p2 = deltaY
+.method public moveCursorBy(FF)V
+ .locals 6
+
+ # Get WinUIBridge from our field
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ # Check X11Controller is ready
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Use raw delta coordinates - no scaling
+ move v1, p1 # deltaX
+ move v2, p2 # deltaY
+ const/4 v3, 0x0 # button = 0 (move only)
+ const/4 v4, 0x0 # isDown = false
+ const/4 v5, 0x1 # isRelative = true
+
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Do a simple click (press + release)
+.method public doClick()V
+ .locals 8
+
+ # Get WinUIBridge from our field
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ # Check X11Controller is ready
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Absolute warp back to last touch to guarantee position before click
+ iget v1, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchX:F
+ iget v2, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->lastTouchY:F
+ invoke-virtual {p0, v1, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->warpCursorTo(FF)V
+
+ # Absolute nudge: warp to a nearby offset then back to force hover/move without drift
+ const/high16 v3, 0x3f800000 # 1.0f
+ add-float v4, v1, v3
+ add-float v5, v2, v3
+ invoke-virtual {p0, v4, v5}, Lcom/xj/winemu/view/RtsTouchOverlayView;->warpCursorTo(FF)V
+ invoke-virtual {p0, v1, v2}, Lcom/xj/winemu/view/RtsTouchOverlayView;->warpCursorTo(FF)V
+
+ # Press: c0(0, 0, button=1, isDown=true, isRelative=true)
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x1
+ const/4 v4, 0x1
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ # Release: c0(0, 0, button=1, isDown=false, isRelative=true)
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x1
+ const/4 v4, 0x0
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Do a right click (press + release with button 3)
+# Note: Unlike left click, we don't warp cursor here - assume it's already positioned
+.method public doRightClick()V
+ .locals 6
+
+ # Get WinUIBridge from our field
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ # Check X11Controller is ready
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Press: c0(0, 0, button=3, isDown=true, isRelative=true)
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x3 # button 3 = right click
+ const/4 v4, 0x1
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ # Release: c0(0, 0, button=3, isDown=false, isRelative=true)
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x3 # button 3 = right click
+ const/4 v4, 0x0
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Press left button (for drag start)
+.method public pressLeftButton()V
+ .locals 6
+
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Press: c0(0, 0, button=1, isDown=true, isRelative=true)
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x1 # button 1 = left click
+ const/4 v4, 0x1 # isDown = true
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Release left button (for drag end)
+.method public releaseLeftButton()V
+ .locals 6
+
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Release: c0(0, 0, button=1, isDown=false, isRelative=true)
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x1 # button 1 = left click
+ const/4 v4, 0x0 # isDown = false
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Press an arrow key
+# p1 = direction: 1=left, 2=right, 3=up, 4=down
+.method public pressArrowKey(I)V
+ .locals 4
+
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Convert direction to Android keycode
+ # 1=left -> KEYCODE_DPAD_LEFT (21)
+ # 2=right -> KEYCODE_DPAD_RIGHT (22)
+ # 3=up -> KEYCODE_DPAD_UP (19)
+ # 4=down -> KEYCODE_DPAD_DOWN (20)
+ const/4 v2, 0x1
+ if-ne p1, v2, :cond_not_left
+ const/16 p1, 0x15 # 21 = DPAD_LEFT
+ goto :cond_send
+
+ :cond_not_left
+ const/4 v2, 0x2
+ if-ne p1, v2, :cond_not_right
+ const/16 p1, 0x16 # 22 = DPAD_RIGHT
+ goto :cond_send
+
+ :cond_not_right
+ const/4 v2, 0x3
+ if-ne p1, v2, :cond_not_up
+ const/16 p1, 0x13 # 19 = DPAD_UP
+ goto :cond_send
+
+ :cond_not_up
+ const/4 v2, 0x4
+ if-ne p1, v2, :cond_end
+ const/16 p1, 0x14 # 20 = DPAD_DOWN
+
+ :cond_send
+ # Send key press via X11Controller.p(modifiers, keyCode, isDown)
+ const/4 v2, 0x0 # modifiers = 0
+ const/4 v3, 0x1 # isDown = true
+ invoke-virtual {v1, v2, p1, v3}, Lcom/winemu/core/controller/X11Controller;->p(IIZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Release an arrow key
+# p1 = direction: 1=left, 2=right, 3=up, 4=down
+.method public releaseArrowKey(I)V
+ .locals 4
+
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Convert direction to Android keycode
+ const/4 v2, 0x1
+ if-ne p1, v2, :cond_not_left
+ const/16 p1, 0x15 # 21 = DPAD_LEFT
+ goto :cond_send
+
+ :cond_not_left
+ const/4 v2, 0x2
+ if-ne p1, v2, :cond_not_right
+ const/16 p1, 0x16 # 22 = DPAD_RIGHT
+ goto :cond_send
+
+ :cond_not_right
+ const/4 v2, 0x3
+ if-ne p1, v2, :cond_not_up
+ const/16 p1, 0x13 # 19 = DPAD_UP
+ goto :cond_send
+
+ :cond_not_up
+ const/4 v2, 0x4
+ if-ne p1, v2, :cond_end
+ const/16 p1, 0x14 # 20 = DPAD_DOWN
+
+ :cond_send
+ # Send key release via X11Controller.p(modifiers, keyCode, isDown)
+ const/4 v2, 0x0 # modifiers = 0
+ const/4 v3, 0x0 # isDown = false
+ invoke-virtual {v1, v2, p1, v3}, Lcom/winemu/core/controller/X11Controller;->p(IIZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# End two-finger pan - release all arrow keys that are pressed
+.method public endTwoFingerPan()V
+ .locals 2
+
+ # Release all pressed arrow keys
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ if-eqz v0, :cond_check_right
+ const/4 v0, 0x1
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+
+ :cond_check_right
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ if-eqz v0, :cond_check_up
+ const/4 v0, 0x2
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+
+ :cond_check_up
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ if-eqz v0, :cond_check_down
+ const/4 v0, 0x3
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+
+ :cond_check_down
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ if-eqz v0, :cond_reset
+ const/4 v0, 0x4
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseArrowKey(I)V
+
+ :cond_reset
+ # Reset all flags
+ const/4 v0, 0x0
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->twoFingerPanning:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ iput-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+
+ return-void
+.end method
+
+
+# Send mouse wheel scroll event
+# Parameter: p1 = button code (4 = scroll up/zoom in, 5 = scroll down/zoom out)
+# Mouse wheel is implemented as button press+release events in X11
+.method public sendScrollWheel(I)V
+ .locals 6
+
+ # Get WinUIBridge from our field
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ # GameHub uses button 4 with Y coordinate for scroll direction
+ # direction: -1 = zoom in (scroll up, negative Y), +1 = zoom out (scroll down, positive Y)
+ # Calculate Y value: direction * -2.0f (much lower sensitivity)
+ int-to-float v1, p1
+ const/high16 v2, 0xc0000000 # -2.0f
+ mul-float v2, v1, v2
+
+ # Send scroll event: c0(x=0, y=calculated, button=4, isDown=false, isRelative=true)
+ const/4 v1, 0x0 # x = 0
+ # v2 already has Y value
+ const/4 v3, 0x4 # button = 4 (scroll)
+ const/4 v4, 0x0 # isDown = false
+ const/4 v5, 0x1 # isRelative = true
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Press middle mouse button (button=2)
+.method public pressMiddleButton()V
+ .locals 6
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x2
+ const/4 v4, 0x1
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+ :cond_end
+ return-void
+.end method
+
+# Release middle mouse button (button=2)
+.method public releaseMiddleButton()V
+ .locals 6
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+ const/4 v1, 0x0
+ const/4 v2, 0x0
+ const/4 v3, 0x2
+ const/4 v4, 0x0
+ const/4 v5, 0x1
+ invoke-virtual/range {v0 .. v5}, Lcom/winemu/openapi/WinUIBridge;->c0(FFIZZ)V
+ :cond_end
+ return-void
+.end method
+
+
+# Send plus or minus key for pinch zoom (action 1)
+# p1 = direction: 1 = plus (zoom out/spread), -1 = minus (zoom in/pinch)
+.method public sendPlusMinusKey(I)V
+ .locals 4
+
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Determine keycode: plus = 0x51 (81 = KEYCODE_NUMPAD_ADD), minus = 0x4e (78 = KEYCODE_MINUS)
+ # Actually using KEYCODE_EQUALS (70) with shift for plus, KEYCODE_MINUS (69) for minus
+ const/4 v2, 0x1
+ if-ne p1, v2, :cond_minus
+ # Plus key (KEYCODE_EQUALS = 70 in Android, will map to = which often is +)
+ const/16 v2, 0x46 # 70 = KEYCODE_EQUALS
+ goto :cond_send
+
+ :cond_minus
+ # Minus key (KEYCODE_MINUS = 69)
+ const/16 v2, 0x45 # 69 = KEYCODE_MINUS
+
+ :cond_send
+ # Send key press
+ const/4 v3, 0x0 # modifiers = 0
+ const/4 p1, 0x1 # isDown = true
+ invoke-virtual {v1, v3, v2, p1}, Lcom/winemu/core/controller/X11Controller;->p(IIZ)V
+
+ # Send key release
+ const/4 p1, 0x0 # isDown = false
+ invoke-virtual {v1, v3, v2, p1}, Lcom/winemu/core/controller/X11Controller;->p(IIZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Send Page Up or Page Down key for pinch zoom (action 2)
+# p1 = direction: 1 = page down (zoom out/spread), -1 = page up (zoom in/pinch)
+.method public sendPageUpDownKey(I)V
+ .locals 4
+
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Determine keycode: PageUp = 92, PageDown = 93
+ const/4 v2, 0x1
+ if-ne p1, v2, :cond_pageup
+ # Page Down (KEYCODE_PAGE_DOWN = 93)
+ const/16 v2, 0x5d # 93 = KEYCODE_PAGE_DOWN
+ goto :cond_send
+
+ :cond_pageup
+ # Page Up (KEYCODE_PAGE_UP = 92)
+ const/16 v2, 0x5c # 92 = KEYCODE_PAGE_UP
+
+ :cond_send
+ # Send key press
+ const/4 v3, 0x0 # modifiers = 0
+ const/4 p1, 0x1 # isDown = true
+ invoke-virtual {v1, v3, v2, p1}, Lcom/winemu/core/controller/X11Controller;->p(IIZ)V
+
+ # Send key release
+ const/4 p1, 0x0 # isDown = false
+ invoke-virtual {v1, v3, v2, p1}, Lcom/winemu/core/controller/X11Controller;->p(IIZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Press WASD key for two-finger pan (action 1)
+# p1 = direction: 1=left(A), 2=right(D), 3=up(W), 4=down(S)
+.method public pressWasdKey(I)V
+ .locals 4
+
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Convert direction to WASD keycode
+ # 1=left -> A (29), 2=right -> D (32), 3=up -> W (51), 4=down -> S (47)
+ const/4 v2, 0x1
+ if-ne p1, v2, :cond_not_left
+ const/16 p1, 0x1d # 29 = KEYCODE_A
+ goto :cond_send
+
+ :cond_not_left
+ const/4 v2, 0x2
+ if-ne p1, v2, :cond_not_right
+ const/16 p1, 0x20 # 32 = KEYCODE_D
+ goto :cond_send
+
+ :cond_not_right
+ const/4 v2, 0x3
+ if-ne p1, v2, :cond_not_up
+ const/16 p1, 0x33 # 51 = KEYCODE_W
+ goto :cond_send
+
+ :cond_not_up
+ const/4 v2, 0x4
+ if-ne p1, v2, :cond_end
+ const/16 p1, 0x2f # 47 = KEYCODE_S
+
+ :cond_send
+ # Send key press via X11Controller.p(modifiers, keyCode, isDown)
+ const/4 v2, 0x0 # modifiers = 0
+ const/4 v3, 0x1 # isDown = true
+ invoke-virtual {v1, v2, p1, v3}, Lcom/winemu/core/controller/X11Controller;->p(IIZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# Release WASD key for two-finger pan
+# p1 = direction: 1=left(A), 2=right(D), 3=up(W), 4=down(S)
+.method public releaseWasdKey(I)V
+ .locals 4
+
+ iget-object v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->a:Lcom/winemu/openapi/WinUIBridge;
+ if-eqz v0, :cond_end
+
+ iget-object v1, v0, Lcom/winemu/openapi/WinUIBridge;->k:Lcom/winemu/core/controller/X11Controller;
+ if-eqz v1, :cond_end
+
+ # Convert direction to WASD keycode
+ const/4 v2, 0x1
+ if-ne p1, v2, :cond_not_left
+ const/16 p1, 0x1d # 29 = KEYCODE_A
+ goto :cond_send
+
+ :cond_not_left
+ const/4 v2, 0x2
+ if-ne p1, v2, :cond_not_right
+ const/16 p1, 0x20 # 32 = KEYCODE_D
+ goto :cond_send
+
+ :cond_not_right
+ const/4 v2, 0x3
+ if-ne p1, v2, :cond_not_up
+ const/16 p1, 0x33 # 51 = KEYCODE_W
+ goto :cond_send
+
+ :cond_not_up
+ const/4 v2, 0x4
+ if-ne p1, v2, :cond_end
+ const/16 p1, 0x2f # 47 = KEYCODE_S
+
+ :cond_send
+ # Send key release via X11Controller.p(modifiers, keyCode, isDown)
+ const/4 v2, 0x0 # modifiers = 0
+ const/4 v3, 0x0 # isDown = false
+ invoke-virtual {v1, v2, p1, v3}, Lcom/winemu/core/controller/X11Controller;->p(IIZ)V
+
+ :cond_end
+ return-void
+.end method
+
+
+# End WASD pan - release all WASD keys that might be pressed
+.method public endWasdPan()V
+ .locals 2
+
+ # Release all WASD keys
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panLeft:Z
+ if-eqz v0, :cond_check_right
+ const/4 v0, 0x1
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+
+ :cond_check_right
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panRight:Z
+ if-eqz v0, :cond_check_up
+ const/4 v0, 0x2
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+
+ :cond_check_up
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panUp:Z
+ if-eqz v0, :cond_check_down
+ const/4 v0, 0x3
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+
+ :cond_check_down
+ iget-boolean v0, p0, Lcom/xj/winemu/view/RtsTouchOverlayView;->panDown:Z
+ if-eqz v0, :cond_end
+ const/4 v0, 0x4
+ invoke-virtual {p0, v0}, Lcom/xj/winemu/view/RtsTouchOverlayView;->releaseWasdKey(I)V
+
+ :cond_end
+ return-void
+.end method