From 9c27d8932f9c870ce5521d5c2284057e82564338 Mon Sep 17 00:00:00 2001 From: Nightwalker743 Date: Wed, 21 Jan 2026 23:10:56 -0600 Subject: [PATCH 1/6] Add RTS touch controls for PC games --- ...winemu_sidebar_controls_fragment.xml.patch | 15 + patches/diffs/res/values/ids.xml.patch | 23 +- patches/diffs/res/values/strings.xml.patch | 58 + patches/diffs/res/values/styles.xml.patch | 22 + .../core/controller/X11Controller.smali.patch | 21 + .../winemu/openapi/WinUIBridge.smali.patch | 35 + .../xj/winemu/WineActivity_rts.smali.patch | Bin 0 -> 15014 bytes .../SidebarControlsFragment.smali.patch | 61 + .../InputControlsManager.smali.patch | 190 ++ patches/files_to_add.txt | 50 +- patches/files_to_patch.txt | 5 + .../new_files/res/color/rts_checkbox_tint.xml | 5 + .../res/drawable/rts_checkbox_button.xml | 5 + .../res/drawable/rts_checkbox_checked.xml | 21 + .../res/drawable/rts_checkbox_unchecked.xml | 7 + .../res/drawable/rts_dialog_background.xml | 6 + .../res/layout/rts_action_picker_dialog.xml | 102 + .../res/layout/rts_action_picker_item.xml | 30 + .../res/layout/rts_gesture_config_dialog.xml | 247 +++ ...tureConfigDialog$ActionClickListener.smali | 36 + ...ConfigDialog$AppPopupDismissListener.smali | 22 + ...stureConfigDialog$CloseClickListener.smali | 45 + ...sGestureConfigDialog$DismissListener.smali | 29 + ...estureConfigDialog$MenuClickListener.smali | 43 + ...ureConfigDialog$PendingClickListener.smali | 53 + ...nfigDialog$PickerOptionClickListener.smali | 57 + ...stureConfigDialog$ResetClickListener.smali | 48 + ...sGestureConfigDialog$SpinnerListener.smali | 51 + ...figDialog$WidgetPopupDismissListener.smali | 29 + .../sidebar/RtsGestureConfigDialog.smali | 1035 ++++++++++ .../RtsGestureSettingsClickListener.smali | 40 + .../sidebar/RtsSwitchClickListener.smali | 87 + ...verlayView$RightClickReleaseRunnable.smali | 52 + .../xj/winemu/view/RtsTouchOverlayView.smali | 1796 +++++++++++++++++ .../inputcontrols/RangeScrollerRtsTask.smali | 34 + 35 files changed, 4358 insertions(+), 2 deletions(-) create mode 100644 patches/diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch create mode 100644 patches/diffs/smali_classes4/com/winemu/core/controller/X11Controller.smali.patch create mode 100644 patches/diffs/smali_classes4/com/winemu/openapi/WinUIBridge.smali.patch create mode 100644 patches/diffs/smali_classes4/com/xj/winemu/WineActivity_rts.smali.patch create mode 100644 patches/diffs/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali.patch create mode 100644 patches/diffs/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali.patch create mode 100644 patches/new_files/res/color/rts_checkbox_tint.xml create mode 100644 patches/new_files/res/drawable/rts_checkbox_button.xml create mode 100644 patches/new_files/res/drawable/rts_checkbox_checked.xml create mode 100644 patches/new_files/res/drawable/rts_checkbox_unchecked.xml create mode 100644 patches/new_files/res/drawable/rts_dialog_background.xml create mode 100644 patches/new_files/res/layout/rts_action_picker_dialog.xml create mode 100644 patches/new_files/res/layout/rts_action_picker_item.xml create mode 100644 patches/new_files/res/layout/rts_gesture_config_dialog.xml create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ActionClickListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$AppPopupDismissListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$CloseClickListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$DismissListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$MenuClickListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PendingClickListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$PickerOptionClickListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$ResetClickListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$SpinnerListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog$WidgetPopupDismissListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureConfigDialog.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsGestureSettingsClickListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/sidebar/RtsSwitchClickListener.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/view/RtsTouchOverlayView$RightClickReleaseRunnable.smali create mode 100644 patches/new_files/smali_classes4/com/xj/winemu/view/RtsTouchOverlayView.smali create mode 100644 patches/new_files/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali 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..c1fb662de8 --- /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..6848a761b9 100644 --- a/patches/diffs/res/values/ids.xml.patch +++ b/patches/diffs/res/values/ids.xml.patch @@ -10,4 +10,25 @@ + + + - ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + \ 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..9c713d410a 100644 --- a/patches/diffs/res/values/strings.xml.patch +++ b/patches/diffs/res/values/strings.xml.patch @@ -91,3 +91,61 @@ Failed to obtain the configuration scheme GPU Driver Sync Steam play data, click to log in to your Steam account +@@ -3448,6 +3448,28 @@ + 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 ++ FPS Touch Controls + Performance + Screen Brightness + Switch Touch Control Layout +@@ -3448,6 +3448,28 @@ + 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 ++ FPS Touch Controls + Performance + Screen Brightness + Switch Touch Control Layout \ No newline at end of file diff --git a/patches/diffs/res/values/styles.xml.patch b/patches/diffs/res/values/styles.xml.patch index 8fcfc7b065..4fa0575f79 100644 --- a/patches/diffs/res/values/styles.xml.patch +++ b/patches/diffs/res/values/styles.xml.patch @@ -10,3 +10,25 @@ ++ + +@@ -3360,4 +3357,10 @@ + @style/Theme.MaterialComponents.Light + @style/Theme.MaterialComponents.Light + ++ + \ No newline at end of file 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_rts.smali.patch b/patches/diffs/smali_classes4/com/xj/winemu/WineActivity_rts.smali.patch new file mode 100644 index 0000000000000000000000000000000000000000..0c0a35d20580791eca3ee372157e575b1aeaa7ef GIT binary patch literal 15014 zcmd^GT~8ZF6rJZv{SPbA2M__100~XnCHo?Kz)HaYb>R)er&Rk#S zYu9VQm_!jW_Ih?_@7#OtxgWFs@87ys;QWsImLSm-yE1jyjSr} z&ouB_!swytV7y{Jnh*GYiL=@mJ2mGx`h9Tp5@+@C`2w%L`DEt3IWtqknRk1S@6C5s zk~$>&h*do@kMU{2JjD9~R?&b&^JdZfh>>M{bA<0}_>|#{1^hk6IZKAKP&acE(F^Z3 zYyT#tp%>-_RyJo=u;K?;bB4RiXKEqC=nJcZZ18^`dTK&dTtR_!>2Z^Pt5T8zP+N2_byP?0xBwI^J;7r-}z(v_U@PFnJ3jO>^MxS zg&es;%u>Pza9lAvkfUezaMyFlb!^^3`UWJU2YfQ&-Dj-~!|&e1d{w-fn2j2GSSm}A z|Hz8vp4re9pO@Z)T5k??t@qo2oTpgpJFLG7E@(gtU3@w;CsqT##)sdZwrJzZ7FK)# zSzcQ`Dbg08eS8bEe1a@Q8=0YMbwMw0 zLMIY8>I0c8Knc-Ci~863sB>1C!m3_k4suXAS7fk#%}PPNwPEKOT=yDR?wDPmTrgFp z#S4pBYLiS^rbX3GtToZkb7%P7mm!0Y1(7(NK474i1ZSCSB^ zYP(?>+x2ClkN;$Kz})URG?;p~a3Af&_+2p?$(fDyfe+Gk)L%Vn26VyZ%?@eeUe?@+bceroj z8ggjN>ni(QA&*wBj%`h9-_S03)($<8o+a5?W>J1*ZA@K?-}Qh3BEh$PhB0zO2EXp$ zs!JSoZM0wnkj##?OejmSo`v!6QqQ&A2&pTt6l9*NQ)=-I*2qk)$RDT^)^p6~7~Na; zT+yD?eZnCPoI_nQ8*#UG%9BytCWr(UU z-o8QBwTJJ1LH4?7TpK`AHQi|q9d%rp8y$sK3Bo|t^ z5UEp;MlBsARXe7q% zbiiPtuC@Qc{)&D+fGtJ8by%0NBTv8O_E4_$EkRDFUtY%+8@9p}E36E)0=vfG zSjm{L8Ex_vV(E2WYgjKwDDVcSUIjJkD znE3hB_LMk>bPZbI#Sl@k_lmFkXmS0413Np}^#HH%&hf0mTSZmdIC8=9Rh(+8SQo+% zx79_;JCYCiyyGM&s}NjHrMZ;Gq%aE}wdQ69bpqcD>jaf&3W(YUqjW7x5uH*65l5^D z&M`t9c7SkVybPUEk+K@&mCTk{Q!!^|Bx7YEmD#1u3plgJ1m_v4_e>sp-O?&VdmS~b zkx^Z{9t~uk;ojhy_08&FSI6&s_=`+Sr+2oZB%*Hf781y+o)2`J>qY=cgNm@TuCkFV`LK9@Ui8oQ4myA zb@s45g0q zLFt71C>9%sSA|D;x{P~HL_2rZ!Yhk+ZKR(%9^KttKXo*nrcVourc=LjL_7Hvm1Ggj zO1Y=$S5Pt%>)Fq&bse}Yvnd&n=bv&X*0nvKoU*=6^6 z3!Q*f^Xt`kD0dp$rFJWi?J2vuPR7zzbQd|?6AOw`e?Nv za#Oi|o3V4|o|AFxNYo6AO}E$H_4jSotiB!E$|^6eLHh!%uC&t9`YPt6ye>tEzhZvU z8uj+iirjaNPcBj&hpSIf{N-2m;R<|)^E2V%HIw7+s~ZsGHO{%U>!~a=33PtxU4UXs zmNQyWl^1rIzJ*Res>NbID((iPvnWziCK*ph;5v8w_PPS9{m_=WrxHHDN=?esw=O3L zuk*PyKU*Ys#xdL9*V;rLm}ZGfs8yLIuG#&q{5-LZJhzR?D$N(UpTOO0p3z0MDSM@H z=RQN_!SR!%yO1K&Wtj1^!sU#jRm)8?wee(_y3?ojzk9jYy&U3e$}o3Old|g9r-QDO zVb*{()&=Z;$j;XFJO23@sb9@;{?HF65%upQC-oU9Trqh?do^V`=I(oVb+NwmnVs9` z@b{4=iS#}z7e(e+A7z!EdxnYZ=$-}nI`Sgvy1FPP9WJ*+lIpE!$3gTKYVZ2`P9scO zMHSy;xNP|hANDc1uTf;tN$h95LdRjW-3)!6M^}}qlm-*Ii^*Y=@{G&z^Fz zJ$;tbbr$#7`P(zOBJHueUyAwN_qfL%{z_`m+TsLW-N(KQ^8)#;Cp%#Bn=$$cf1$T( nW12jj#^3ev6QdlT>(965TRcIdze&%Y-n{ONP*48@5XxS| literal 0 HcmV?d00001 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..fdde9e22a9 --- /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..2bd0c7b90b --- /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..636ffc0687 100644 --- a/patches/files_to_add.txt +++ b/patches/files_to_add.txt @@ -1,4 +1,4 @@ -original/META-INF/MANIFEST.MF +original/META-INF/MANIFEST.MF original/META-INF/GAMEHUB.SF original/META-INF/GAMEHUB.RSA res/drawable/app_update_dialog_close.webp @@ -2857,3 +2857,51 @@ 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 +smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.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 +smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.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 diff --git a/patches/new_files/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali b/patches/new_files/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali new file mode 100644 index 0000000000..843ad8a74b --- /dev/null +++ b/patches/new_files/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali @@ -0,0 +1,34 @@ +.class public Lcom/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask; +.super Ljava/util/TimerTask; +.source "RangeScrollerRtsTask.kt" + + +# instance fields +.field public final a:Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller; + + +# direct methods +.method public constructor (Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller;)V + .locals 0 + + invoke-direct {p0}, Ljava/util/TimerTask;->()V + + iput-object p1, p0, Lcom/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask;->a:Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller; + + return-void +.end method + + +# virtual methods +.method public run()V + .locals 2 + + # Set rtslongPress flag to true (held for 1 second) + iget-object v0, p0, Lcom/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask;->a:Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller; + + const/4 v1, 0x1 + + iput-boolean v1, v0, Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller;->rtslongPress:Z + + return-void +.end method From a210025eca21d6c0ad0f824838be42665eeaa278 Mon Sep 17 00:00:00 2001 From: ObfuscatedVoid Date: Sat, 24 Jan 2026 09:04:38 +0100 Subject: [PATCH 2/6] chore: BOM removed --- patches/files_to_add.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/files_to_add.txt b/patches/files_to_add.txt index 636ffc0687..bec9270010 100644 --- a/patches/files_to_add.txt +++ b/patches/files_to_add.txt @@ -1,4 +1,4 @@ -original/META-INF/MANIFEST.MF +original/META-INF/MANIFEST.MF original/META-INF/GAMEHUB.SF original/META-INF/GAMEHUB.RSA res/drawable/app_update_dialog_close.webp From 400df39952dc4178c7d80351018c864692e21563 Mon Sep 17 00:00:00 2001 From: Nightwalker743 Date: Sat, 24 Jan 2026 12:26:06 -0600 Subject: [PATCH 3/6] Fix BOM and duplicate content in patches - Removed UTF-8 BOM from strings.xml.patch and styles.xml.patch - Removed duplicate RTS string entries from strings.xml.patch - Removed duplicate RtsGestureConfigDialogTheme from styles.xml.patch - Removed 24 duplicate file entries from files_to_add.txt Addresses maintainer feedback from PR #73 --- patches/diffs/res/values/strings.xml.patch | 124 +-------------------- patches/diffs/res/values/styles.xml.patch | 38 ++----- patches/files_to_add.txt | 24 ---- 3 files changed, 12 insertions(+), 174 deletions(-) diff --git a/patches/diffs/res/values/strings.xml.patch b/patches/diffs/res/values/strings.xml.patch index 9c713d410a..047370967f 100644 --- a/patches/diffs/res/values/strings.xml.patch +++ b/patches/diffs/res/values/strings.xml.patch @@ -1,97 +1,8 @@ +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,28 @@ +@@ -3448,6 +3448,28 @@ Supports browsers on PC, mobile, and other devices." Touch Control Opacity Input Mapping Mouse Speed @@ -120,32 +31,3 @@ Performance Screen Brightness Switch Touch Control Layout -@@ -3448,6 +3448,28 @@ - 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 -+ FPS Touch Controls - Performance - Screen Brightness - Switch Touch Control Layout \ No newline at end of file diff --git a/patches/diffs/res/values/styles.xml.patch b/patches/diffs/res/values/styles.xml.patch index 4fa0575f79..5a18834e15 100644 --- a/patches/diffs/res/values/styles.xml.patch +++ b/patches/diffs/res/values/styles.xml.patch @@ -1,34 +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 @@ - -- - -+ -@@ -3360,4 +3357,10 @@ - @style/Theme.MaterialComponents.Light - @style/Theme.MaterialComponents.Light - -+ - \ No newline at end of file diff --git a/patches/files_to_add.txt b/patches/files_to_add.txt index 636ffc0687..451b2b7c80 100644 --- a/patches/files_to_add.txt +++ b/patches/files_to_add.txt @@ -2881,27 +2881,3 @@ 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 smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.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 -smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali From 58aa973ade048b05a55610e2ce6b673496e48759 Mon Sep 17 00:00:00 2001 From: Nightwalker743 Date: Sat, 24 Jan 2026 12:46:29 -0600 Subject: [PATCH 4/6] Fix malformed hunk headers in ids.xml.patch Regenerated ids.xml.patch from source using git diff. Now has proper hunk headers with multiple sections: - @@ -2309,6 +2309,18 @@ (adds 12 RTS IDs) - @@ -2596,6 +2608,7 @@ (adds switch_rts_touch_controls) - @@ -3344,4 +3357,13 @@ (adds action option IDs) --- patches/diffs/res/values/ids.xml.patch | 55 +++++++++++++++----------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/patches/diffs/res/values/ids.xml.patch b/patches/diffs/res/values/ids.xml.patch index 6848a761b9..aa0cc463cd 100644 --- a/patches/diffs/res/values/ids.xml.patch +++ b/patches/diffs/res/values/ids.xml.patch @@ -1,34 +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 From cacf619cff73036d3bea8fe9f435782b336cf450 Mon Sep 17 00:00:00 2001 From: Nightwalker743 Date: Sat, 24 Jan 2026 12:52:52 -0600 Subject: [PATCH 5/6] Remove remaining BOM from all patch files Removed UTF-8 BOM from: - winemu_sidebar_controls_fragment.xml.patch - strings.xml.patch - styles.xml.patch - SidebarControlsFragment.smali.patch - InputControlsManager.smali.patch --- .../diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch | 2 +- patches/diffs/res/values/strings.xml.patch | 2 +- patches/diffs/res/values/styles.xml.patch | 2 +- .../com/xj/winemu/sidebar/SidebarControlsFragment.smali.patch | 2 +- .../pcvirtualbtn/inputcontrols/InputControlsManager.smali.patch | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/patches/diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch b/patches/diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch index c1fb662de8..6507df1c73 100644 --- a/patches/diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch +++ b/patches/diffs/res/layout/winemu_sidebar_controls_fragment.xml.patch @@ -1,4 +1,4 @@ -diff --git a/res/layout/winemu_sidebar_controls_fragment.xml b/res/layout/winemu_sidebar_controls_fragment.xml +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 diff --git a/patches/diffs/res/values/strings.xml.patch b/patches/diffs/res/values/strings.xml.patch index 047370967f..65b6481290 100644 --- a/patches/diffs/res/values/strings.xml.patch +++ b/patches/diffs/res/values/strings.xml.patch @@ -1,4 +1,4 @@ -diff --git a/res/values/strings.xml b/res/values/strings.xml +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 diff --git a/patches/diffs/res/values/styles.xml.patch b/patches/diffs/res/values/styles.xml.patch index 5a18834e15..bc90a9c5c2 100644 --- a/patches/diffs/res/values/styles.xml.patch +++ b/patches/diffs/res/values/styles.xml.patch @@ -1,4 +1,4 @@ -diff --git a/res/values/styles.xml b/res/values/styles.xml +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 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 index fdde9e22a9..f092c71f6a 100644 --- a/patches/diffs/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali.patch +++ b/patches/diffs/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali.patch @@ -1,4 +1,4 @@ -diff --git a/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali b/smali_classes4/com/xj/winemu/sidebar/SidebarControlsFragment.smali +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 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 index 2bd0c7b90b..12be90252f 100644 --- a/patches/diffs/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali.patch +++ b/patches/diffs/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali.patch @@ -1,4 +1,4 @@ -diff --git a/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali b/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/InputControlsManager.smali +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 From 8b36bd830647ba02223185359d302730ccd9fc3c Mon Sep 17 00:00:00 2001 From: Nightwalker743 Date: Wed, 18 Feb 2026 00:10:57 -0600 Subject: [PATCH 6/6] Fix dead code: merge WineActivity_rts patch, remove orphaned files - Merged WineActivity_rts.smali.patch hunks into WineActivity.smali.patch (the _rts patch was never applied because it wasn't in files_to_patch.txt, causing RtsSwitchClickListener to call a non-existent toggleRtsTouchOverlay method) - Removed orphaned RangeScrollerRtsTask.smali (unreferenced by any code) - Removed unused winemu_sidebar_fps_touch_controls string resource --- patches/diffs/res/values/strings.xml.patch | 3 +- .../com/xj/winemu/WineActivity.smali.patch | 272 +++++++++++++++--- .../xj/winemu/WineActivity_rts.smali.patch | Bin 15014 -> 0 bytes patches/files_to_add.txt | 1 - .../inputcontrols/RangeScrollerRtsTask.smali | 34 --- 5 files changed, 232 insertions(+), 78 deletions(-) delete mode 100644 patches/diffs/smali_classes4/com/xj/winemu/WineActivity_rts.smali.patch delete mode 100644 patches/new_files/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali diff --git a/patches/diffs/res/values/strings.xml.patch b/patches/diffs/res/values/strings.xml.patch index 65b6481290..29df0a9e52 100644 --- a/patches/diffs/res/values/strings.xml.patch +++ b/patches/diffs/res/values/strings.xml.patch @@ -2,7 +2,7 @@ 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 -@@ -3448,6 +3448,28 @@ Supports browsers on PC, mobile, and other devices." +@@ -3448,6 +3448,27 @@ Supports browsers on PC, mobile, and other devices." Touch Control Opacity Input Mapping Mouse Speed @@ -27,7 +27,6 @@ index 5397bfabd..0ba13d3bb 100644 + Middle Mouse Button + WASD Keys + Arrow Keys -+ FPS Touch Controls Performance Screen Brightness Switch Touch Control Layout 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/WineActivity_rts.smali.patch b/patches/diffs/smali_classes4/com/xj/winemu/WineActivity_rts.smali.patch deleted file mode 100644 index 0c0a35d20580791eca3ee372157e575b1aeaa7ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15014 zcmd^GT~8ZF6rJZv{SPbA2M__100~XnCHo?Kz)HaYb>R)er&Rk#S zYu9VQm_!jW_Ih?_@7#OtxgWFs@87ys;QWsImLSm-yE1jyjSr} z&ouB_!swytV7y{Jnh*GYiL=@mJ2mGx`h9Tp5@+@C`2w%L`DEt3IWtqknRk1S@6C5s zk~$>&h*do@kMU{2JjD9~R?&b&^JdZfh>>M{bA<0}_>|#{1^hk6IZKAKP&acE(F^Z3 zYyT#tp%>-_RyJo=u;K?;bB4RiXKEqC=nJcZZ18^`dTK&dTtR_!>2Z^Pt5T8zP+N2_byP?0xBwI^J;7r-}z(v_U@PFnJ3jO>^MxS zg&es;%u>Pza9lAvkfUezaMyFlb!^^3`UWJU2YfQ&-Dj-~!|&e1d{w-fn2j2GSSm}A z|Hz8vp4re9pO@Z)T5k??t@qo2oTpgpJFLG7E@(gtU3@w;CsqT##)sdZwrJzZ7FK)# zSzcQ`Dbg08eS8bEe1a@Q8=0YMbwMw0 zLMIY8>I0c8Knc-Ci~863sB>1C!m3_k4suXAS7fk#%}PPNwPEKOT=yDR?wDPmTrgFp z#S4pBYLiS^rbX3GtToZkb7%P7mm!0Y1(7(NK474i1ZSCSB^ zYP(?>+x2ClkN;$Kz})URG?;p~a3Af&_+2p?$(fDyfe+Gk)L%Vn26VyZ%?@eeUe?@+bceroj z8ggjN>ni(QA&*wBj%`h9-_S03)($<8o+a5?W>J1*ZA@K?-}Qh3BEh$PhB0zO2EXp$ zs!JSoZM0wnkj##?OejmSo`v!6QqQ&A2&pTt6l9*NQ)=-I*2qk)$RDT^)^p6~7~Na; zT+yD?eZnCPoI_nQ8*#UG%9BytCWr(UU z-o8QBwTJJ1LH4?7TpK`AHQi|q9d%rp8y$sK3Bo|t^ z5UEp;MlBsARXe7q% zbiiPtuC@Qc{)&D+fGtJ8by%0NBTv8O_E4_$EkRDFUtY%+8@9p}E36E)0=vfG zSjm{L8Ex_vV(E2WYgjKwDDVcSUIjJkD znE3hB_LMk>bPZbI#Sl@k_lmFkXmS0413Np}^#HH%&hf0mTSZmdIC8=9Rh(+8SQo+% zx79_;JCYCiyyGM&s}NjHrMZ;Gq%aE}wdQ69bpqcD>jaf&3W(YUqjW7x5uH*65l5^D z&M`t9c7SkVybPUEk+K@&mCTk{Q!!^|Bx7YEmD#1u3plgJ1m_v4_e>sp-O?&VdmS~b zkx^Z{9t~uk;ojhy_08&FSI6&s_=`+Sr+2oZB%*Hf781y+o)2`J>qY=cgNm@TuCkFV`LK9@Ui8oQ4myA zb@s45g0q zLFt71C>9%sSA|D;x{P~HL_2rZ!Yhk+ZKR(%9^KttKXo*nrcVourc=LjL_7Hvm1Ggj zO1Y=$S5Pt%>)Fq&bse}Yvnd&n=bv&X*0nvKoU*=6^6 z3!Q*f^Xt`kD0dp$rFJWi?J2vuPR7zzbQd|?6AOw`e?Nv za#Oi|o3V4|o|AFxNYo6AO}E$H_4jSotiB!E$|^6eLHh!%uC&t9`YPt6ye>tEzhZvU z8uj+iirjaNPcBj&hpSIf{N-2m;R<|)^E2V%HIw7+s~ZsGHO{%U>!~a=33PtxU4UXs zmNQyWl^1rIzJ*Res>NbID((iPvnWziCK*ph;5v8w_PPS9{m_=WrxHHDN=?esw=O3L zuk*PyKU*Ys#xdL9*V;rLm}ZGfs8yLIuG#&q{5-LZJhzR?D$N(UpTOO0p3z0MDSM@H z=RQN_!SR!%yO1K&Wtj1^!sU#jRm)8?wee(_y3?ojzk9jYy&U3e$}o3Old|g9r-QDO zVb*{()&=Z;$j;XFJO23@sb9@;{?HF65%upQC-oU9Trqh?do^V`=I(oVb+NwmnVs9` z@b{4=iS#}z7e(e+A7z!EdxnYZ=$-}nI`Sgvy1FPP9WJ*+lIpE!$3gTKYVZ2`P9scO zMHSy;xNP|hANDc1uTf;tN$h95LdRjW-3)!6M^}}qlm-*Ii^*Y=@{G&z^Fz zJ$;tbbr$#7`P(zOBJHueUyAwN_qfL%{z_`m+TsLW-N(KQ^8)#;Cp%#Bn=$$cf1$T( nW12jj#^3ev6QdlT>(965TRcIdze&%Y-n{ONP*48@5XxS| diff --git a/patches/files_to_add.txt b/patches/files_to_add.txt index aa732649f4..5921847874 100644 --- a/patches/files_to_add.txt +++ b/patches/files_to_add.txt @@ -2880,4 +2880,3 @@ 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 -smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali diff --git a/patches/new_files/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali b/patches/new_files/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali deleted file mode 100644 index 843ad8a74b..0000000000 --- a/patches/new_files/smali_classes5/com/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask.smali +++ /dev/null @@ -1,34 +0,0 @@ -.class public Lcom/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask; -.super Ljava/util/TimerTask; -.source "RangeScrollerRtsTask.kt" - - -# instance fields -.field public final a:Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller; - - -# direct methods -.method public constructor (Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller;)V - .locals 0 - - invoke-direct {p0}, Ljava/util/TimerTask;->()V - - iput-object p1, p0, Lcom/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask;->a:Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller; - - return-void -.end method - - -# virtual methods -.method public run()V - .locals 2 - - # Set rtslongPress flag to true (held for 1 second) - iget-object v0, p0, Lcom/xj/pcvirtualbtn/inputcontrols/RangeScrollerRtsTask;->a:Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller; - - const/4 v1, 0x1 - - iput-boolean v1, v0, Lcom/xj/pcvirtualbtn/inputcontrols/RangeScroller;->rtslongPress:Z - - return-void -.end method