- fixed: memory leak and UI stuck caused by MenuSenctionView
- feat: memorize content offset for settings menu - optimize gesture passthrough for relative touch & absolute touch - feat: passthroughGesturesSwitch, ctrlDownForPinchSwitch, leftClickDelaySlider, touchModeSelector2 in experimental section
This commit is contained in:
1 parent
cc35e6b3a4
commit
5750b99af3
18 files changed
+556
-77
No files matched your search
@@ -1403,16 +1403,16 @@
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="Oyk-L5-WTt" userLabel="singleTapSensitivityStack">
|
||||
<rect key="frame" x="440" y="307" width="824" height="55.5"/>
|
||||
<rect key="frame" x="440" y="307" width="428" height="55.5"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Single Tap Sensitivity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SuN-S2-8hj">
|
||||
<rect key="frame" x="0.0" y="0.0" width="824" height="20.5"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="428" height="20.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<slider verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="2" minValue="0.0" maxValue="5" minimumValueImage="0.square" catalog="system" maximumValueImage="5.square" translatesAutoresizingMaskIntoConstraints="NO" id="j4n-De-TRX" userLabel="Single Tap Sensitivity Slider">
|
||||
<rect key="frame" x="-2" y="25.5" width="828" height="31"/>
|
||||
<rect key="frame" x="-2" y="25.5" width="432" height="31"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="30" id="qOF-42-hPO"/>
|
||||
</constraints>
|
||||
@@ -1578,7 +1578,7 @@
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="uEq-Pc-Fum">
|
||||
<rect key="frame" x="463" y="544" width="257" height="31"/>
|
||||
<rect key="frame" x="440" y="621" width="257" height="31"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Pinch Gesture" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.64999997615814209" adjustsLetterSpacingToFitWidth="YES" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Evh-LH-rdh" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="107" height="31"/>
|
||||
@@ -1597,8 +1597,28 @@
|
||||
<constraint firstAttribute="height" constant="31" id="3jV-tZ-Mi1"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="4Jb-ey-ca7">
|
||||
<rect key="frame" x="440" y="573" width="297.5" height="31"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Ctrl Down for Pinch" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.64999997615814209" adjustsLetterSpacingToFitWidth="YES" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="BsJ-eo-2Ac" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="147.5" height="31"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zfr-Wn-dB4">
|
||||
<rect key="frame" x="167.5" y="0.0" width="132" height="31"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="130" id="P1q-30-0uK"/>
|
||||
</constraints>
|
||||
</switch>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="31" id="yy0-9H-bjl"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="aEs-8U-RwE">
|
||||
<rect key="frame" x="440" y="606" width="380" height="55.5"/>
|
||||
<rect key="frame" x="440" y="676" width="380" height="55.5"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Scroll Sensitivity" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hDf-9O-NGp" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="380" height="20.5"/>
|
||||
@@ -1618,7 +1638,7 @@
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="t6B-h4-iY7">
|
||||
<rect key="frame" x="440" y="686" width="380" height="55.5"/>
|
||||
<rect key="frame" x="440" y="756" width="380" height="55.5"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Pinch Sensitivity" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Zsj-Fa-IgS" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="380" height="20.5"/>
|
||||
@@ -1637,6 +1657,46 @@
|
||||
<constraint firstAttribute="width" constant="380" id="c4j-rz-SyJ"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="q0S-CP-V6v">
|
||||
<rect key="frame" x="440" y="451" width="380" height="55.5"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Left Click Delay" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aDg-5A-6M9" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="380" height="20.5"/>
|
||||
<color key="tintColor" red="0.81533776120000001" green="0.85979419950000002" blue="0.91372549020000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<slider verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1000" translatesAutoresizingMaskIntoConstraints="NO" id="Mh4-1P-bSv">
|
||||
<rect key="frame" x="-2" y="25.5" width="384" height="31"/>
|
||||
<color key="tintColor" systemColor="linkColor"/>
|
||||
</slider>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="55.5" id="aRb-oZ-ZQp"/>
|
||||
<constraint firstAttribute="width" constant="380" id="oo6-nE-eT1"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="wUP-2q-5vh">
|
||||
<rect key="frame" x="668" y="621" width="318.5" height="31"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Passthrough Gestures" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.64999997615814209" adjustsLetterSpacingToFitWidth="YES" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="dfj-BB-Vby" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="168.5" height="31"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="eO1-kV-e9j">
|
||||
<rect key="frame" x="188.5" y="0.0" width="132" height="31"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="130" id="qZg-EX-I27"/>
|
||||
</constraints>
|
||||
</switch>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="31" id="bkz-ks-hpu"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</view>
|
||||
@@ -1661,6 +1721,8 @@
|
||||
<outlet property="citrixX1MouseSwitch" destination="GQM-NR-WIO" id="RNm-18-mrK"/>
|
||||
<outlet property="codecSelector" destination="aFy-0w-YPe" id="DlU-0l-gwz"/>
|
||||
<outlet property="codecStack" destination="gWg-BF-yDI" id="GGc-JQ-N8y"/>
|
||||
<outlet property="ctrlDownForPinchStack" destination="4Jb-ey-ca7" id="Ou2-Qz-VO6"/>
|
||||
<outlet property="ctrlDownForPinchSwitch" destination="zfr-Wn-dB4" id="GXR-zn-daI"/>
|
||||
<outlet property="customResolutionSwitch" destination="E5w-kK-dOo" id="hrt-v2-8dY"/>
|
||||
<outlet property="delayLeftClickStack" destination="Xp7-7O-Ndt" id="CwB-Wy-beh"/>
|
||||
<outlet property="delayLeftClickSwitch" destination="Haf-rg-zLB" id="FaA-3p-JDw"/>
|
||||
@@ -1694,6 +1756,8 @@
|
||||
<outlet property="hapticEngineStack" destination="MUp-Hc-VgH" id="XuW-ww-cmv"/>
|
||||
<outlet property="hdrStack" destination="dH7-Sy-EdJ" id="cJm-bj-Aqo"/>
|
||||
<outlet property="hdrSwitch" destination="wIq-fF-X8l" id="Ozz-h0-nJL"/>
|
||||
<outlet property="leftClickDelaySlider" destination="Mh4-1P-bSv" id="Tbj-Y0-t1x"/>
|
||||
<outlet property="leftClickDelayStack" destination="q0S-CP-V6v" id="0lz-MN-OEb"/>
|
||||
<outlet property="liftStreamViewForKeyboardSelector" destination="MM5-O0-vK3" id="tSC-Rp-Qfg"/>
|
||||
<outlet property="liftStreamViewForKeyboardStack" destination="mes-so-dfK" id="nXR-Ot-Ydf"/>
|
||||
<outlet property="localMousePointerModeSelector" destination="4FU-iP-c6T" id="4Gz-ao-xH2"/>
|
||||
@@ -1717,6 +1781,8 @@
|
||||
<outlet property="onscreenControllerLabel" destination="LGV-5y-piG" id="GsV-fS-lX9"/>
|
||||
<outlet property="optimizeGamesStack" destination="TvS-69-vcF" id="pm1-0c-dCR"/>
|
||||
<outlet property="optimizeGamesSwitch" destination="Sui-Ig-YxN" id="Lxu-si-ugy"/>
|
||||
<outlet property="passthroughGesturesStack" destination="wUP-2q-5vh" id="a4w-16-lLs"/>
|
||||
<outlet property="passthroughGesturesSwitch" destination="eO1-kV-e9j" id="5r8-o4-t9J"/>
|
||||
<outlet property="performanceGraphStack" destination="H8p-G9-pnl" id="9RJ-uO-IpF"/>
|
||||
<outlet property="pinchGestureStack" destination="uEq-Pc-Fum" id="68g-K6-P87"/>
|
||||
<outlet property="pinchGestureSwitch" destination="TJy-Zp-DKM" id="Haj-ha-vNy"/>
|
||||
@@ -1769,7 +1835,7 @@
|
||||
<outlet property="swapAbxySwitch" destination="hv7-6b-rez" id="iKX-qk-Dep"/>
|
||||
<outlet property="testStack" destination="aP7-M9-psT" id="xAv-s6-rea"/>
|
||||
<outlet property="touchModeLabel" destination="MUY-2Y-bHi" id="6jD-aq-rmE"/>
|
||||
<outlet property="touchModeSelector" destination="bhC-da-VGd" id="hna-Cr-kyd"/>
|
||||
<outlet property="touchModeSelector1" destination="bhC-da-VGd" id="hna-Cr-kyd"/>
|
||||
<outlet property="touchModeSelector2" destination="Bkf-0d-XuA" id="iY6-nI-QrW"/>
|
||||
<outlet property="touchModeStack" destination="M78-Pw-jWx" id="mdl-y3-54B"/>
|
||||
<outlet property="touchModeStack2" destination="MFl-tk-Uji" id="3ev-wc-kGK"/>
|
||||
@@ -1803,7 +1869,7 @@
|
||||
</items>
|
||||
</navigationBar>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-503.59712230215831" y="1977.520661157025"/>
|
||||
<point key="canvasLocation" x="-503.95683453237416" y="1977.520661157025"/>
|
||||
</scene>
|
||||
<!--Reveal View Controller-->
|
||||
<scene sceneID="rR7-ZT-bc7">
|
||||
|
||||
@@ -2284,16 +2284,16 @@
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="N0i-z6-WgC" userLabel="singleTapSensitivityStack">
|
||||
<rect key="frame" x="437" y="2383" width="540" height="55.5"/>
|
||||
<rect key="frame" x="437" y="2383" width="580" height="55.5"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Single Tap Sensitivity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WzD-wo-Wum">
|
||||
<rect key="frame" x="0.0" y="0.0" width="540" height="20.5"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="580" height="20.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<slider verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="2" minValue="0.0" maxValue="5" minimumValueImage="0.square" catalog="system" maximumValueImage="5.square" translatesAutoresizingMaskIntoConstraints="NO" id="uCa-Oa-7mv" userLabel="Single Tap Sensitivity Slider">
|
||||
<rect key="frame" x="-2" y="25.5" width="544" height="31"/>
|
||||
<rect key="frame" x="-2" y="25.5" width="584" height="31"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="30" id="XXP-GP-uhn"/>
|
||||
</constraints>
|
||||
@@ -2470,6 +2470,66 @@
|
||||
<constraint firstAttribute="height" constant="31" id="T1t-8e-I8X"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="eYW-eD-LTg">
|
||||
<rect key="frame" x="437" y="289" width="297.5" height="31"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Ctrl Down for Pinch" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.64999997615814209" adjustsLetterSpacingToFitWidth="YES" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ICY-9b-uFD" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="147.5" height="31"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q46-JG-pX4">
|
||||
<rect key="frame" x="167.5" y="0.0" width="132" height="31"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="130" id="ee9-Uw-3XB"/>
|
||||
</constraints>
|
||||
</switch>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="31" id="bcL-21-TrI"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="muF-2y-dHu">
|
||||
<rect key="frame" x="676" y="328" width="380" height="55.5"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Left Click Delay" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5S1-w1-Wnq" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="380" height="20.5"/>
|
||||
<color key="tintColor" red="0.81533776120000001" green="0.85979419950000002" blue="0.91372549020000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<slider verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1000" translatesAutoresizingMaskIntoConstraints="NO" id="HNu-vj-Q0t">
|
||||
<rect key="frame" x="-2" y="25.5" width="384" height="31"/>
|
||||
<color key="tintColor" systemColor="linkColor"/>
|
||||
</slider>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="380" id="6bB-ha-UGL"/>
|
||||
<constraint firstAttribute="height" constant="55.5" id="SUg-XN-Moi"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="F8I-3L-7uS">
|
||||
<rect key="frame" x="437" y="232" width="318.5" height="31"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Passthrough Gestures" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.64999997615814209" adjustsLetterSpacingToFitWidth="YES" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="A5m-3n-5qc" userLabel="uiLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="168.5" height="31"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="XrB-Rl-noQ">
|
||||
<rect key="frame" x="188.5" y="0.0" width="132" height="31"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="130" id="3YP-WA-0B5"/>
|
||||
</constraints>
|
||||
</switch>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="31" id="qut-MF-kwq"/>
|
||||
</constraints>
|
||||
</stackView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</view>
|
||||
@@ -2494,6 +2554,8 @@
|
||||
<outlet property="citrixX1MouseSwitch" destination="zw9-ok-nQC" id="5w4-2h-gCP"/>
|
||||
<outlet property="codecSelector" destination="5Y7-To-ca2" id="Kmt-sp-eXj"/>
|
||||
<outlet property="codecStack" destination="cVe-Uk-gXv" id="826-Tv-rMl"/>
|
||||
<outlet property="ctrlDownForPinchStack" destination="eYW-eD-LTg" id="eQS-WT-74l"/>
|
||||
<outlet property="ctrlDownForPinchSwitch" destination="q46-JG-pX4" id="jjp-BU-9RP"/>
|
||||
<outlet property="customResolutionSwitch" destination="kRO-HO-zKO" id="ZUP-Yd-QDY"/>
|
||||
<outlet property="delayLeftClickStack" destination="fjb-oT-r1E" id="0Tb-f9-Pym"/>
|
||||
<outlet property="delayLeftClickSwitch" destination="YB5-xe-Zdx" id="FEK-Lb-f0r"/>
|
||||
@@ -2528,6 +2590,8 @@
|
||||
<outlet property="hapticEngineStack" destination="kiR-q0-FQX" id="zj5-eD-N5a"/>
|
||||
<outlet property="hdrStack" destination="kFw-d7-BTn" id="3aT-Gh-bDO"/>
|
||||
<outlet property="hdrSwitch" destination="Kgb-YU-AFW" id="ksG-A4-HhS"/>
|
||||
<outlet property="leftClickDelaySlider" destination="HNu-vj-Q0t" id="X9f-ya-wVv"/>
|
||||
<outlet property="leftClickDelayStack" destination="muF-2y-dHu" id="rmd-Pm-nfV"/>
|
||||
<outlet property="liftStreamViewForKeyboardSelector" destination="TJx-6E-kgr" id="KnL-15-Q6G"/>
|
||||
<outlet property="liftStreamViewForKeyboardStack" destination="mgf-RQ-AVP" id="xH0-F0-dth"/>
|
||||
<outlet property="localMousePointerModeSelector" destination="zLl-8w-K8J" id="jsc-Tp-zwe"/>
|
||||
@@ -2550,6 +2614,8 @@
|
||||
<outlet property="onscreenControllerLabel" destination="5uF-E5-hpX" id="Ntz-sT-O6S"/>
|
||||
<outlet property="optimizeGamesStack" destination="Col-Dm-lwT" id="ng3-CV-HLd"/>
|
||||
<outlet property="optimizeGamesSwitch" destination="zGD-yR-gUS" id="Gji-vK-txl"/>
|
||||
<outlet property="passthroughGesturesStack" destination="F8I-3L-7uS" id="M6R-70-8nf"/>
|
||||
<outlet property="passthroughGesturesSwitch" destination="XrB-Rl-noQ" id="UXc-O3-nWr"/>
|
||||
<outlet property="performanceGraphStack" destination="9r0-OX-NYn" id="wQE-tW-wtN"/>
|
||||
<outlet property="pinchGestureStack" destination="HWI-UV-lqB" id="d01-s2-BYB"/>
|
||||
<outlet property="pinchGestureSwitch" destination="VHo-r1-Z1H" id="lvd-eF-did"/>
|
||||
@@ -2601,7 +2667,7 @@
|
||||
<outlet property="swapAbxyStack" destination="reE-vr-Mdk" id="y3v-ac-LHy"/>
|
||||
<outlet property="swapAbxySwitch" destination="T5q-1k-zB3" id="153-6O-0Pv"/>
|
||||
<outlet property="touchModeLabel" destination="v5B-5J-veL" id="ewI-fd-FnI"/>
|
||||
<outlet property="touchModeSelector" destination="A9r-dE-rT4" id="DBR-8D-QTL"/>
|
||||
<outlet property="touchModeSelector1" destination="A9r-dE-rT4" id="DBR-8D-QTL"/>
|
||||
<outlet property="touchModeSelector2" destination="n8C-pt-nPE" id="N2Y-O4-zK6"/>
|
||||
<outlet property="touchModeStack" destination="2bi-tR-7sa" id="Fh0-Q4-fiq"/>
|
||||
<outlet property="touchModeStack2" destination="cNd-hI-JAS" id="tOg-4I-grM"/>
|
||||
@@ -2640,19 +2706,19 @@
|
||||
<image name="trash.fill" catalog="system" width="117" height="128"/>
|
||||
<image name="tray.full.fill" catalog="system" width="128" height="88"/>
|
||||
<systemColor name="linkColor">
|
||||
<color red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<color red="0.0" green="0.47843137254901963" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</systemColor>
|
||||
<systemColor name="secondarySystemGroupedBackgroundColor">
|
||||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</systemColor>
|
||||
<systemColor name="systemBrownColor">
|
||||
<color red="0.63529411759999999" green="0.51764705879999995" blue="0.36862745099999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<color red="0.63529411764705879" green="0.51764705882352946" blue="0.36862745098039218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</systemColor>
|
||||
<systemColor name="systemGray2Color">
|
||||
<color red="0.68235294120000001" green="0.68235294120000001" blue="0.69803921570000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<color red="0.68235294117647061" green="0.68235294117647061" blue="0.69803921568627447" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</systemColor>
|
||||
<systemColor name="systemTealColor">
|
||||
<color red="0.18823529410000001" green="0.69019607839999997" blue="0.78039215689999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<color red="0.18823529411764706" green="0.69019607843137254" blue="0.7803921568627451" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</systemColor>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -133,6 +133,10 @@ typedef NS_ENUM(NSInteger, WidgetSizeTransition) {
|
||||
enablePinch:(BOOL)enablePinch
|
||||
scrollSensitivity:(CGFloat)scrollSensitivity
|
||||
pinchSensitivity:(CGFloat)pinchSensitivity
|
||||
ctrlDownForPinch:(BOOL)ctrlDownForPinch
|
||||
leftClickDelayMs:(CGFloat)leftClickDelayMs
|
||||
settingsMenuOffset:(CGFloat)settingsMenuOffset
|
||||
passthroughGestures:(BOOL)passthroughGestures
|
||||
backgroundSessionTimer:(NSInteger)backgroundSessionTimer;
|
||||
|
||||
- (NSArray*) getHosts;
|
||||
|
||||
@@ -116,6 +116,10 @@
|
||||
enablePinch:(BOOL)enablePinch
|
||||
scrollSensitivity:(CGFloat)scrollSensitivity
|
||||
pinchSensitivity:(CGFloat)pinchSensitivity
|
||||
ctrlDownForPinch:(BOOL)ctrlDownForPinch
|
||||
leftClickDelayMs:(CGFloat)leftClickDelayMs
|
||||
settingsMenuOffset:(CGFloat)settingsMenuOffset
|
||||
passthroughGestures:(BOOL)passthroughGestures
|
||||
backgroundSessionTimer:(NSInteger)backgroundSessionTimer{
|
||||
|
||||
[_managedObjectContext performBlockAndWait:^{
|
||||
@@ -182,6 +186,10 @@
|
||||
settingsToSave.enablePinch = enablePinch;
|
||||
settingsToSave.scrollSensitivity = [NSNumber numberWithFloat:scrollSensitivity];
|
||||
settingsToSave.pinchSensitivity = [NSNumber numberWithFloat:pinchSensitivity];
|
||||
settingsToSave.ctrlDownForPinch = ctrlDownForPinch;
|
||||
settingsToSave.leftClickDelayMs = [NSNumber numberWithFloat:leftClickDelayMs];
|
||||
settingsToSave.settingsMenuOffset = [NSNumber numberWithFloat:settingsMenuOffset];
|
||||
settingsToSave.passthroughGestures = passthroughGestures;
|
||||
settingsToSave.rememberFoldState = rememberFoldState;
|
||||
[self saveData];
|
||||
}];
|
||||
|
||||
@@ -87,10 +87,14 @@
|
||||
@property (nonatomic) BOOL duckOtherApps;
|
||||
@property (nonatomic) BOOL muteInBackground;
|
||||
@property (nonatomic) BOOL enablePinch;
|
||||
@property (nonatomic) BOOL ctrlDownForPinch;
|
||||
@property (nonatomic) BOOL passthroughGestures;
|
||||
@property (nonatomic, retain) NSNumber * framePacingMode;
|
||||
@property (nonatomic, retain) NSNumber * scrollSensitivity;
|
||||
@property (nonatomic, retain) NSNumber * pinchSensitivity;
|
||||
@property (nonatomic, retain) NSNumber * relativeTouchSlideThreshold;
|
||||
@property (nonatomic, retain) NSNumber * leftClickDelayMs;
|
||||
@property (nonatomic, retain) NSNumber * settingsMenuOffset;
|
||||
|
||||
- (id) initFromSettings:(Settings*)settings;
|
||||
|
||||
|
||||
@@ -147,6 +147,10 @@
|
||||
self.enablePinch = settings.enablePinch;
|
||||
self.scrollSensitivity = settings.scrollSensitivity;
|
||||
self.pinchSensitivity = settings.pinchSensitivity;
|
||||
self.leftClickDelayMs = settings.leftClickDelayMs;
|
||||
self.ctrlDownForPinch = settings.ctrlDownForPinch;
|
||||
self.settingsMenuOffset = settings.settingsMenuOffset;
|
||||
self.passthroughGestures = settings.passthroughGestures;
|
||||
#endif
|
||||
|
||||
return self;
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
@implementation AbsoluteTouchHandler {
|
||||
StreamView* streamView;
|
||||
|
||||
bool multiTouchesDetected;
|
||||
bool passthroughGestures;
|
||||
|
||||
NSTimer* longPressTimer;
|
||||
UITouch* lastTouchDown;
|
||||
CGPoint lastTouchDownLocation;
|
||||
@@ -50,6 +53,8 @@
|
||||
CGFloat _edgeTolerance;
|
||||
|
||||
bool _delayMouseLeftClick;
|
||||
NSTimeInterval leftClickDelay;
|
||||
|
||||
bool dragButtonDown;
|
||||
UInt8 currentTouchesCount;
|
||||
|
||||
@@ -60,10 +65,13 @@
|
||||
self = [self init];
|
||||
self->streamView = view;
|
||||
|
||||
// _delayMouseLeftClick = settings.delayLeftClick;
|
||||
_delayMouseLeftClick = true; // deprecate legacy absolute touch
|
||||
multiTouchesDetected = false;
|
||||
passthroughGestures = settings.passthroughGestures;
|
||||
|
||||
_delayMouseLeftClick = settings.delayLeftClick;
|
||||
// _delayMouseLeftClick = true;
|
||||
dragButtonDown = false;
|
||||
|
||||
|
||||
leftClickTimeThreshold = 0.1;
|
||||
|
||||
// upper screen check
|
||||
@@ -74,6 +82,8 @@
|
||||
|
||||
_mouseButtonForCursorMove = BUTTON_LEFT;
|
||||
|
||||
leftClickDelay = ((CGFloat)settings.leftClickDelayMs.intValue)/1000;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -97,6 +107,10 @@
|
||||
|
||||
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
|
||||
rightButtonClicked = false;
|
||||
|
||||
|
||||
if([UITouchUtil touchesIn:streamView from:event].count>=2) multiTouchesDetected = true;
|
||||
|
||||
|
||||
CGPoint initialPoint = [[touches anyObject] locationInView:streamView];
|
||||
if(initialPoint.y < slideGestureVerticalThreshold && (initialPoint.x < _edgeTolerance || initialPoint.x > screenWidthWithThreshold)) {
|
||||
@@ -126,7 +140,6 @@
|
||||
|
||||
// Press the left button down
|
||||
if(!_delayMouseLeftClick){
|
||||
// _delayMouseLeftClick will always be true.
|
||||
LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_LEFT); //deprecated
|
||||
}
|
||||
|
||||
@@ -169,10 +182,10 @@
|
||||
|
||||
if(currentTouchesCount == 2){
|
||||
if(_mouseButtonForCursorMove!=BUTTON_LEFT) LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, _mouseButtonForCursorMove);
|
||||
[TouchPadGestureHandler handleGestureIn:streamView with:event];
|
||||
if(passthroughGestures) [TouchPadGestureHandler handleGestureIn:streamView with:event];
|
||||
}
|
||||
|
||||
if(currentTouchesCount>=2) return;
|
||||
if(multiTouchesDetected) return;
|
||||
|
||||
if(![currentTouches containsObject:capturedTouch]) return;
|
||||
|
||||
@@ -197,8 +210,17 @@
|
||||
|
||||
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
|
||||
|
||||
if(TouchPadGestureHandler.ctrlDown) LiSendKeyboardEvent(CommandManager.keyboardButtonMappings[@"CTRL"].shortValue,KEY_ACTION_UP,0);
|
||||
|
||||
if(touchPointSpawnedAtUpperScreenEdge) return; // we're done here. this touch event will not be sent to the remote PC.
|
||||
|
||||
if(multiTouchesDetected) {
|
||||
if([UITouchUtil touchesIn:streamView from:event].count == touches.count) multiTouchesDetected = false;
|
||||
return;
|
||||
};
|
||||
|
||||
if([UITouchUtil touchesIn:streamView from:event].count == touches.count) multiTouchesDetected = false;
|
||||
|
||||
// Only fire this logic if all touches have ended
|
||||
if ([touches containsObject:capturedTouch]) {
|
||||
// Cancel the long press timer
|
||||
@@ -220,17 +242,14 @@
|
||||
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_RIGHT);
|
||||
}
|
||||
}
|
||||
else{ // deprecated
|
||||
/*
|
||||
else{
|
||||
// Left button up on finger up
|
||||
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT);
|
||||
|
||||
// Raise right button too in case we triggered a long press gesture
|
||||
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_RIGHT); */
|
||||
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_RIGHT);
|
||||
}
|
||||
|
||||
if(TouchPadGestureHandler.ctrlDown) LiSendKeyboardEvent(CommandManager.keyboardButtonMappings[@"CTRL"].shortValue,KEY_ACTION_UP,0);
|
||||
|
||||
|
||||
lastTouchUp = [touches anyObject];
|
||||
lastTouchUpLocation = [lastTouchUp locationInView:streamView];
|
||||
|
||||
@@ -244,7 +263,7 @@
|
||||
}
|
||||
|
||||
- (void)sendShortMouseLeftButtonClickEvent{
|
||||
dispatch_time_t delayShort = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC));
|
||||
dispatch_time_t delayShort = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(leftClickDelay * NSEC_PER_SEC));
|
||||
dispatch_time_t delayLong = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.03 * NSEC_PER_SEC));
|
||||
dispatch_after(delayShort, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_LEFT);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// RelativeTouchHandler.m
|
||||
// Moonlight
|
||||
// VoidLink
|
||||
//
|
||||
// Completely refactored by True砖家 on 2024.9.13
|
||||
// Copyright © 2024 True砖家 on Bilibili. All rights reserved.
|
||||
@@ -33,6 +33,8 @@ static const float QUICK_TAP_TIME_INTERVAL = 0.2;
|
||||
UITouch* touchLockedForMouseMove;
|
||||
UITouch* quickTapTouch;
|
||||
|
||||
bool multiTouchesDetected;
|
||||
|
||||
CADisplayLink *displayLink;
|
||||
|
||||
#if TARGET_OS_TV
|
||||
@@ -129,7 +131,12 @@ static const float QUICK_TAP_TIME_INTERVAL = 0.2;
|
||||
}
|
||||
|
||||
touchPointSpawnedAtUpperScreenEdge = false; // reset this flag immediately if we get a touch event passing the check above, this fixes irresponsive touch after closing the command tool menu.
|
||||
|
||||
|
||||
if([UITouchUtil touchesIn:streamView from:event].count>=2){
|
||||
multiTouchesDetected = true;
|
||||
return;
|
||||
}
|
||||
|
||||
UITouch* candidateTouch = nil;
|
||||
|
||||
// the onscreen controllers are implmented by CALayer, which can not intercept UITouch event, touch will penetrate to the streamView level and captured in the touches callback of this touchHandler class.
|
||||
@@ -166,11 +173,10 @@ static const float QUICK_TAP_TIME_INTERVAL = 0.2;
|
||||
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
|
||||
|
||||
NSSet* currentTouches = [UITouchUtil touchesIn:streamView from:event];
|
||||
uint8_t currentTouchesCount = currentTouches.count;
|
||||
|
||||
if(![self isOnScreenControllerBeingPressed:currentTouches]) [TouchPadGestureHandler handleGestureIn:streamView with:event];
|
||||
|
||||
if(currentTouchesCount>=2) return;
|
||||
if(multiTouchesDetected) return;
|
||||
|
||||
if([touches containsObject:touchLockedForMouseMove]){
|
||||
CGPoint currentLocation = [touchLockedForMouseMove locationInView:streamView];
|
||||
@@ -184,6 +190,15 @@ static const float QUICK_TAP_TIME_INTERVAL = 0.2;
|
||||
|
||||
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
|
||||
|
||||
if(TouchPadGestureHandler.ctrlDown) LiSendKeyboardEvent(CommandManager.keyboardButtonMappings[@"CTRL"].shortValue,KEY_ACTION_UP,0);
|
||||
|
||||
if(multiTouchesDetected){
|
||||
if([UITouchUtil touchesIn:streamView from:event].count == touches.count) multiTouchesDetected = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if([UITouchUtil touchesIn:streamView from:event].count == touches.count) multiTouchesDetected = false;
|
||||
|
||||
if([touches containsObject:touchLockedForMouseMove]){
|
||||
// dealing with a single first tap, whether the button will be released, is going to be decided in sendLongMouseLeftButtonClickEvent
|
||||
if(!mousePointerMoved && !self->quickTapDetected) [self sendLongMouseLeftButtonClickEvent];
|
||||
@@ -202,14 +217,12 @@ static const float QUICK_TAP_TIME_INTERVAL = 0.2;
|
||||
for(UITouch* touch in touches){
|
||||
[OnScreenControls.touchesCapturedByOnScreenControls removeObject:touch];
|
||||
}
|
||||
|
||||
if(TouchPadGestureHandler.ctrlDown) LiSendKeyboardEvent(CommandManager.keyboardButtonMappings[@"CTRL"].shortValue,KEY_ACTION_UP,0);
|
||||
|
||||
|
||||
if([UITouchUtil touchesIn:streamView from:event].count == [touches count]){
|
||||
touchLockedForMouseMove = nil;
|
||||
mousePointerMoved = false; // need to reset this anyway
|
||||
}
|
||||
|
||||
|
||||
touchPointSpawnedAtUpperScreenEdge = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ import UIKit
|
||||
|
||||
@objc public static var ctrlDown:Bool = false
|
||||
@objc public static var enablePinch:Bool = true
|
||||
@objc public static var ctrlDownForPinch:Bool = true
|
||||
@objc public static var enableHorizontalScroll:Bool = true
|
||||
@objc public static var scrollSensitivity:CGFloat = 1.0
|
||||
@objc public static var pinchSensitivity:CGFloat = 1.0
|
||||
@@ -36,7 +37,8 @@ import UIKit
|
||||
LiSendHighResScrollEvent(Int16(pinchDelta + midPointDeltaY*5*scrollSensitivity))
|
||||
if enableHorizontalScroll {LiSendHighResHScrollEvent(Int16(-midPointDeltaX*5*scrollSensitivity))}
|
||||
|
||||
if !enablePinch {return};
|
||||
if !enablePinch || !ctrlDownForPinch {return};
|
||||
|
||||
if abs(currentDistance - previousDistance) > abs(midPointDeltaY) {
|
||||
LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["CTRL"]!, CChar(KEY_ACTION_DOWN), 0)
|
||||
ctrlDown = true
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23788.4" systemVersion="24F74" minimumToolsVersion="Xcode 7.3" sourceLanguage="Objective-C" userDefinedModelVersionIdentifier="">
|
||||
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23788.4" systemVersion="24G325" minimumToolsVersion="Xcode 7.3" sourceLanguage="Objective-C" userDefinedModelVersionIdentifier="">
|
||||
<entity name="App" representedClassName="App" syncable="YES" codeGenerationType="class">
|
||||
<attribute name="hdrSupported" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="hidden" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||
@@ -29,6 +29,7 @@
|
||||
<attribute name="bitrate" attributeType="Integer 32" defaultValueString="10000" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="btMouseSupport" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="buttonVisualFeedback" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="ctrlDownForPinch" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="delayLeftClick" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="deviceGyroMode" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="duckOtherApps" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||
@@ -52,6 +53,7 @@
|
||||
<attribute name="hapticEngine" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="height" attributeType="Integer 32" defaultValueString="720" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="keyboardToggleFingers" optional="YES" attributeType="Integer 16" defaultValueString="3" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="leftClickDelayMs" optional="YES" attributeType="Float" defaultValueString="15" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="liftStreamViewForKeyboard" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="localMousePointerMode" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="localVolume" optional="YES" attributeType="Float" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/>
|
||||
@@ -62,6 +64,7 @@
|
||||
<attribute name="onscreenControls" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="optimizeGames" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="oscLayoutToolFingers" optional="YES" attributeType="Integer 16" defaultValueString="4" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="passthroughGestures" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="pinchSensitivity" optional="YES" attributeType="Float" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="playAudioOnPC" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="pointerVelocityModeDivider" optional="YES" attributeType="Float" defaultValueString="0.5" usesScalarValueType="NO" syncable="YES"/>
|
||||
@@ -75,6 +78,7 @@
|
||||
<attribute name="scrollSensitivity" optional="YES" attributeType="Float" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="sendDummyEvent" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="settingsMenuMode" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="settingsMenuOffset" optional="YES" attributeType="Float" defaultValueString="22" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="settingsMenuWidth" attributeType="Float" defaultValueString="370" usesScalarValueType="NO" syncable="YES"/>
|
||||
<attribute name="showKeyboardToolbar" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
|
||||
<attribute name="singleTapSensitivity" optional="YES" attributeType="Double" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/>
|
||||
|
||||
@@ -1422,6 +1422,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ctrlDownForPinchStackTip" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "When disabled, pinch gesture equals vertical scrolling. Works for some games that use vertical scrolling for zooming."
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "关闭此选项时, 捏合缩手势相当于垂直滚动. 对一些使用垂直滚动缩放画面的游戏有效."
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "關閉此選項時, 捏合縮手勢相當於垂直滾動. 對一些使用垂直滾動縮放畫面的遊戲有效."
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "關閉此選項時, 捏合縮手勢相當於垂直滾動. 對一些使用垂直滾動縮放畫面的遊戲有效."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Current profile updated successfully" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
|
||||
@@ -58,7 +58,7 @@ static BOOL overridePersistedFoldState = YES;
|
||||
_isExpanded = YES;
|
||||
_expandable = true;
|
||||
_backgroundColor = [UIColor clearColor];
|
||||
_rootStackViewSpacing = [self isIPhone] ? 10 : 13.8;
|
||||
_rootStackViewSpacing = [self isIPhone] ? 10 : 12;
|
||||
_subStackViews = [NSMutableArray array];
|
||||
_headerViewHeight = 37;
|
||||
_headerViewVerticalSpacing = 25;
|
||||
@@ -342,7 +342,9 @@ static BOOL overridePersistedFoldState = YES;
|
||||
|
||||
|
||||
- (void)updateViewForFoldState {
|
||||
[self setupConstraints];
|
||||
// [self setupConstraints];
|
||||
// don't run this repeatedly
|
||||
|
||||
NSInteger visibleCount = 0;
|
||||
for (UIView *subview in _rootStackView.arrangedSubviews) {
|
||||
if (!subview.isHidden) {
|
||||
|
||||
@@ -1183,7 +1183,7 @@ static NSMutableSet* hostList;
|
||||
// [settingsViewController widget:settingsViewController.bitrateSlider setEnabled:!self.settingsExpandedInStreamView];
|
||||
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.optimizeGamesStack];
|
||||
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.audioOnPcStack];
|
||||
[settingsViewController.touchModeSelector setEnabled:!_settingsExpandedInStreamView || !_sessionLaunchedWithAbsoluteTouch];
|
||||
[settingsViewController.touchModeSelector1 setEnabled:!_settingsExpandedInStreamView || !_sessionLaunchedWithAbsoluteTouch];
|
||||
[settingsViewController.codecSelector setEnabled:!_settingsExpandedInStreamView];
|
||||
[settingsViewController.yuv444Switch setEnabled:!_settingsExpandedInStreamView];
|
||||
[settingsViewController.hdrSwitch setEnabled:!_settingsExpandedInStreamView && [settingsViewController hdrSupported]];
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
@property (strong, nonatomic) IBOutlet UISegmentedControl *resolutionSelector;
|
||||
@property (strong, nonatomic) IBOutlet UISwitch *customResolutionSwitch;
|
||||
@property (strong, nonatomic) IBOutlet UILabel *touchModeLabel;
|
||||
@property (strong, nonatomic) IBOutlet UISegmentedControl *touchModeSelector;
|
||||
@property (strong, nonatomic) IBOutlet UISegmentedControl *touchModeSelector1;
|
||||
@property (strong, nonatomic) IBOutlet UISwitch *enableOswForNativeTouchSwitch;
|
||||
@property (strong, nonatomic) IBOutlet UILabel *onscreenControllerLabel;
|
||||
@property (strong, nonatomic) IBOutlet UISegmentedControl *onScreenWidgetSelector;
|
||||
@@ -205,6 +205,14 @@
|
||||
@property (strong, nonatomic) IBOutlet UIStackView *touchModeStack2;
|
||||
@property (strong, nonatomic) IBOutlet UISegmentedControl *touchModeSelector2;
|
||||
|
||||
@property (strong, nonatomic) IBOutlet UIStackView *ctrlDownForPinchStack;
|
||||
@property (strong, nonatomic) IBOutlet UISwitch *ctrlDownForPinchSwitch;
|
||||
|
||||
@property (strong, nonatomic) IBOutlet UIStackView *leftClickDelayStack;
|
||||
@property (strong, nonatomic) IBOutlet UISlider *leftClickDelaySlider;
|
||||
|
||||
@property (strong, nonatomic) IBOutlet UIStackView *passthroughGesturesStack;
|
||||
@property (strong, nonatomic) IBOutlet UISwitch *passthroughGesturesSwitch;
|
||||
|
||||
@property (strong, nonatomic) IBOutlet UIStackView *testStack;
|
||||
|
||||
|
||||
@@ -460,7 +460,9 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
//CGSize currentResolution = CGSizeMake(currentSettings.width.intValue, currentSettings.height.intValue);
|
||||
[self.customResolutionSwitch setOn: isCustomResolution(self->tempSettings.resolutionSelected.intValue)];
|
||||
[self.resolutionSelector setEnabled:!self.customResolutionSwitch.isOn];
|
||||
[self touchModeChanged:self.touchModeSelector]; // a special fix for iOS 14 to set hidden for the "enableOswStack"
|
||||
[self touchModeChanged:self.touchModeSelector1]; // a special fix for iOS 14 to set hidden for the "enableOswStack"
|
||||
|
||||
_scrollView.contentOffset = CGPointMake(_scrollView.contentOffset.x, tempSettings.settingsMenuOffset.floatValue);
|
||||
|
||||
settingsViewJustExpanded = false;
|
||||
}
|
||||
@@ -712,14 +714,16 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
[touchAndControlSection setSectionWithIcon:[UIImage imageNamed:@"arcade.stick.console"] andSize:20.5];
|
||||
}
|
||||
[self addSetting:self.touchModeStack ofId:@"touchModeStack" withInfoTag:YES withDynamicLabel:NO to:touchAndControlSection];
|
||||
[self addSetting:self.mousePointerVelocityStack ofId:@"mousePointerVelocityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection];
|
||||
[self addSetting:self.pointerVelocityDividerStack ofId:@"pointerVelocityDividerStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection];
|
||||
[self addSetting:self.pointerVelocityFactorStack ofId:@"pointerVelocityFactorStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection];
|
||||
[self addSetting:self.delayLeftClickStack ofId:@"delayLeftClickStack" withInfoTag:YES withDynamicLabel:NO to:touchAndControlSection];
|
||||
[self addSetting:self.passthroughGesturesStack ofId:@"passthroughGesturesStack" withInfoTag:NO withDynamicLabel:NO to:touchAndControlSection];
|
||||
[self addSetting:self.pinchGestureStack ofId:@"pinchGestureStack" withInfoTag:NO withDynamicLabel:NO to:touchAndControlSection];
|
||||
[self addSetting:self.mousePointerVelocityStack ofId:@"mousePointerVelocityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection];
|
||||
[self addSetting:self.ctrlDownForPinchStack ofId:@"ctrlDownForPinchStack" withInfoTag:YES withDynamicLabel:NO to:touchAndControlSection];
|
||||
[self addSetting:self.scrollSensitivityStack ofId:@"scrollSensitivityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection];
|
||||
[self addSetting:self.pinchSensitivityStack ofId:@"pinchSensitivityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection];
|
||||
[self addSetting:self.mousePointerVelocityStack ofId:@"mousePointerVelocityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection];
|
||||
// [self addSetting:self.delayLeftClickStack ofId:@"delayLeftClickStack" withInfoTag:YES withDynamicLabel:NO to:touchAndControlSection];
|
||||
[self addSetting:self.onScreenWidgetStack ofId:@"onScreenWidgetStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection];
|
||||
[self addSetting:self.buttonVisualFeedbackStack ofId:@"buttonVisualFeedbackStack" withInfoTag:NO withDynamicLabel:NO to:touchAndControlSection];
|
||||
[self addSetting:self.swapAbxyStack ofId:@"swapAbaxyStack" withInfoTag:NO withDynamicLabel:NO to:touchAndControlSection];
|
||||
@@ -832,10 +836,11 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
}
|
||||
|
||||
[self addSetting:self.touchModeStack2 ofId:@"touchModeStack2" withInfoTag:NO withDynamicLabel:NO to:experimentalSection];
|
||||
[self.touchModeSelector2 setEnabled:false];
|
||||
// [self.touchModeSelector2 setEnabled:false];
|
||||
[self addSetting:self.touchMoveEventIntervalStack ofId:@"touchMoveEventIntervalStack" withInfoTag:NO withDynamicLabel:YES to:experimentalSection];
|
||||
[self addSetting:self.relativeTouchSlideThresholdStack ofId:@"relativeTouchSlideThresholdStack" withInfoTag:YES withDynamicLabel:YES to:experimentalSection];
|
||||
[self addSetting:self.singleTapSensitivityStack ofId:@"singleTapSensitivityStack" withInfoTag:NO withDynamicLabel:YES to:experimentalSection];
|
||||
[self addSetting:self.leftClickDelayStack ofId:@"leftClickDelayStack" withInfoTag:NO withDynamicLabel:YES to:experimentalSection];
|
||||
[self addSetting:self.renderingBackendStack ofId:@"renderingBackendStack" withInfoTag:YES withDynamicLabel:NO to:experimentalSection];
|
||||
[self addSetting:self.performanceGraphStack ofId:@"performanceGraphStack" withInfoTag:YES withDynamicLabel:NO to:experimentalSection];
|
||||
[self addDynamicLabelForStack:self.graphOpacityStack];
|
||||
@@ -970,12 +975,14 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)highlightedBackgroundForView:(UIView* )view animateWithDuration:(CGFloat)duration{
|
||||
- (void)highlightedBackgroundForView:(UIView* )view animateWithDuration:(CGFloat)duration completion: (void (^)(void))completion{
|
||||
[UIView animateWithDuration:duration animations:^{
|
||||
view.layer.cornerRadius = 6;
|
||||
view.layer.masksToBounds = YES;
|
||||
view.clipsToBounds = YES;
|
||||
view.backgroundColor = [ThemeManager appPrimaryColorWithAlpha];
|
||||
} completion:^(BOOL finished){
|
||||
completion();
|
||||
}];
|
||||
}
|
||||
|
||||
@@ -994,7 +1001,7 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
settingStackWillBeRelocatedToLowestPosition = true;
|
||||
}
|
||||
else{
|
||||
[self highlightedBackgroundForView:currentStack animateWithDuration:0];
|
||||
[self highlightedBackgroundForView:currentStack animateWithDuration:0 completion:nil];
|
||||
snapshot.backgroundColor = [UIColor clearColor];
|
||||
}
|
||||
}
|
||||
@@ -1052,7 +1059,7 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
if(currentSettingsMenuMode == AllSettings &&gesture.state == UIGestureRecognizerStateBegan) {
|
||||
[self findCapturedStackByTouchLocation:locationInParentStack];
|
||||
if(capturedStack == nil) return;
|
||||
[self highlightedBackgroundForView:capturedStack animateWithDuration:0];
|
||||
[self highlightedBackgroundForView:capturedStack animateWithDuration:0 completion:nil];
|
||||
UIAlertController* actionSheet = [self prepareAddToFavoriteActionSheet];
|
||||
actionSheet.popoverPresentationController.sourceView = capturedStack;
|
||||
[self presentViewController:actionSheet animated:YES completion:nil];
|
||||
@@ -1300,6 +1307,11 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
showOnlineDocAction = true;
|
||||
onlineDocLink = [LocalizationHelper localizedStringForKey:@"relativeTouchSlideThresholdStackLink"];
|
||||
}
|
||||
if([sender.superview.accessibilityIdentifier isEqualToString: @"ctrlDownForPinchStack"]){
|
||||
tipText = [LocalizationHelper localizedStringForKey:@"ctrlDownForPinchStackTip"];
|
||||
showOnlineDocAction = false;
|
||||
}
|
||||
|
||||
|
||||
UIAlertController *tipsAlertController = [UIAlertController alertControllerWithTitle: [LocalizationHelper localizedStringForKey:@"Tips"] message:tipText preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
@@ -1731,7 +1743,7 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
|
||||
[self.duckOtherAppSwitch setOn:self->tempSettings.duckOtherApps];
|
||||
|
||||
[self.muteInBackgroundSwitch setOn:tempSettings.muteInBackground];
|
||||
[self.muteInBackgroundSwitch setOn:self->tempSettings.muteInBackground];
|
||||
[self.muteInBackgroundSwitch addTarget:self action:@selector(muteInBackgroundSwitchFlipped:) forControlEvents:UIControlEventValueChanged];
|
||||
|
||||
[self.micVolumeSlider setValue:self->tempSettings.micVolume.floatValue*100];
|
||||
@@ -1856,8 +1868,13 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
[self.mousePointerVelocityFactorSlider addTarget:self action:@selector(mousePointerVelocityFactorSliderMoved:) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved.
|
||||
[self mousePointerVelocityFactorSliderMoved:self.mousePointerVelocityFactorSlider];
|
||||
|
||||
[self.passthroughGesturesSwitch setOn:self->tempSettings.passthroughGestures];
|
||||
[self.passthroughGesturesSwitch addTarget:self action:@selector(passthroughGesturesSwitchFlipped:) forControlEvents:(UIControlEventValueChanged)];
|
||||
|
||||
[self.pinchGestureSwitch setOn:self->tempSettings.enablePinch];
|
||||
[self.pinchGestureSwitch addTarget:self action:@selector(pinchGestureSwitchFlipped:) forControlEvents:(UIControlEventValueChanged)];
|
||||
|
||||
[self.ctrlDownForPinchSwitch setOn:self->tempSettings.ctrlDownForPinch];
|
||||
|
||||
[self.scrollSensitivitySlider setValue:self->tempSettings.scrollSensitivity.floatValue animated:NO];
|
||||
[self.scrollSensitivitySlider addTarget:self action:@selector(scrollSensitivitySliderMoved:) forControlEvents:(UIControlEventValueChanged)];
|
||||
@@ -1895,12 +1912,19 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
[self.touchMoveEventIntervalSlider addTarget:self action:@selector(touchMoveEventIntervalSliderMoved:) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved.
|
||||
[self touchMoveEventIntervalSliderMoved:self.touchMoveEventIntervalSlider];
|
||||
|
||||
// touch move event interval for native-touch.
|
||||
[self.leftClickDelaySlider setValue:self->tempSettings.leftClickDelayMs.intValue animated:NO]; // Load old setting.
|
||||
[self.leftClickDelaySlider addTarget:self action:@selector(leftClickDelaySliderMoved:) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved.
|
||||
[self leftClickDelaySliderMoved:self.leftClickDelaySlider];
|
||||
|
||||
// this part will enable/disable oscSelector & the asyncNativeTouchPriority selector
|
||||
uint8_t touchModeSelectorIndex = self->tempSettings.touchMode.intValue == NativeTouchOnly ? NativeTouch : self->tempSettings.touchMode.intValue;
|
||||
[self.touchModeSelector setSelectedSegmentIndex:touchModeSelectorIndex]; //Load old touchMode setting
|
||||
[self.touchModeSelector addTarget:self action:@selector(touchModeChanged:) forControlEvents:UIControlEventValueChanged];
|
||||
[self touchModeChanged:self.touchModeSelector];
|
||||
[self.touchModeSelector1 setSelectedSegmentIndex:touchModeSelectorIndex]; //Load old touchMode setting
|
||||
[self.touchModeSelector1 addTarget:self action:@selector(touchMode1Changed:) forControlEvents:UIControlEventValueChanged];
|
||||
[self touchModeChanged:self.touchModeSelector1];
|
||||
|
||||
[self.touchModeSelector2 addTarget:self action:@selector(touchMode2Changed:) forControlEvents:UIControlEventValueChanged];
|
||||
|
||||
|
||||
// self.enableOswSwitchStack.hidden = !(self->tempSettings.touchMode.intValue == NativeTouch || self->tempSettings.touchMode.intValue == NativeTouchOnly); // do not use setHidden to stack wrapped by a settingStack
|
||||
|
||||
@@ -1927,7 +1951,7 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
completion:^{
|
||||
if(!CountdownAlertController.actionCancelled){
|
||||
[weakSelf.onScreenWidgetSelector setSelectedSegmentIndex:OnScreenControlsLevelCustom];
|
||||
if(weakSelf.touchModeSelector.selectedSegmentIndex == NativeTouch){
|
||||
if(weakSelf.touchModeSelector1.selectedSegmentIndex == NativeTouch){
|
||||
[weakSelf.enableOswForNativeTouchSwitch setOn:true];
|
||||
[weakSelf enableOswForNativeTouchSwitchFlipped:weakSelf.enableOswForNativeTouchSwitch];
|
||||
}
|
||||
@@ -2013,7 +2037,7 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
}
|
||||
|
||||
- (bool)isNotNativeTouchOnly{
|
||||
return (self.enableOswForNativeTouchSwitch.isOn && self.touchModeSelector.selectedSegmentIndex == NativeTouch) || self.touchModeSelector.selectedSegmentIndex != NativeTouch;
|
||||
return (self.enableOswForNativeTouchSwitch.isOn && self.touchModeSelector1.selectedSegmentIndex == NativeTouch) || self.touchModeSelector1.selectedSegmentIndex != NativeTouch;
|
||||
}
|
||||
|
||||
- (void)handleOswGestureChange{
|
||||
@@ -2357,14 +2381,32 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
}
|
||||
*/
|
||||
|
||||
- (void)touchMode2Changed:(UISegmentedControl* )sender {
|
||||
// [UIView animateWithDuration:0 animations:^{
|
||||
[self.touchModeSelector1 setSelectedSegmentIndex: sender.selectedSegmentIndex];
|
||||
// } completion:^(BOOL finished) {
|
||||
// 动画完成时执行的代码
|
||||
[self touchModeChanged:sender];
|
||||
// }];
|
||||
}
|
||||
|
||||
- (void)touchMode1Changed:(UISegmentedControl* )sender {
|
||||
// [UIView animateWithDuration:0 animations:^{
|
||||
self.touchModeSelector2.selectedSegmentIndex = sender.selectedSegmentIndex;
|
||||
// } completion:^(BOOL finished) {
|
||||
// 动画完成时执行的代码
|
||||
[self touchModeChanged:sender];
|
||||
// }];
|
||||
}
|
||||
|
||||
- (void)touchModeChanged:(UISegmentedControl* )sender {
|
||||
// Disable On-Screen Controls & Widgets in non-relative touch mode
|
||||
// bool customOscEnabled = [self isOswEnabled] && [self.onScreenWidgetSelector selectedSegmentIndex] == OnScreenControlsLevelCustom;
|
||||
self.touchModeSelector2.selectedSegmentIndex = sender.selectedSegmentIndex;
|
||||
bool isNativeTouch = sender.selectedSegmentIndex == NativeTouch;
|
||||
//bool asyncNativeTouchEnabled = [self.asyncNativeTouchPrioritySelector selectedSegmentIndex] != AsyncNativeTouchOff;
|
||||
if(self.enableOswSwitchStack.hidden != !isNativeTouch && isNativeTouch) [self highlightEmergingStack:self.enableOswSwitchStack];
|
||||
bool isEgmerging = self.enableOswSwitchStack.hidden != !isNativeTouch && isNativeTouch;
|
||||
self.enableOswSwitchStack.hidden = !isNativeTouch;
|
||||
if(isEgmerging) [self highlightEmergingStack:self.enableOswSwitchStack];
|
||||
|
||||
|
||||
[self setHidden:!isNativeTouch forStack:self.pointerVelocityDividerStack];
|
||||
|
||||
@@ -2373,14 +2415,28 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
[self setHidden:!isNativeTouch forStack:self.pointerVelocityFactorStack];
|
||||
[self setHidden:!isNativeTouch forStack:self.touchMoveEventIntervalStack];
|
||||
|
||||
/*
|
||||
[self setHidden:(sender.selectedSegmentIndex!=RelativeTouch
|
||||
&& sender.selectedSegmentIndex!=AbsoluteTouch) forStack:self.pinchGestureStack];
|
||||
[self setHidden:(sender.selectedSegmentIndex!=RelativeTouch
|
||||
&& sender.selectedSegmentIndex!=AbsoluteTouch) forStack:self.scrollSensitivityStack];
|
||||
&& sender.selectedSegmentIndex!=AbsoluteTouch) forStack:self.scrollSensitivityStack];*/
|
||||
|
||||
[self setHidden:sender.selectedSegmentIndex!=AbsoluteTouch forStack:self.passthroughGesturesStack];
|
||||
UISwitch* dummySwitch = [[UISwitch alloc] init];
|
||||
[dummySwitch setOn:(sender.selectedSegmentIndex==RelativeTouch
|
||||
|| (sender.selectedSegmentIndex==AbsoluteTouch && _passthroughGesturesSwitch.isOn))];
|
||||
[self passthroughGesturesSwitchFlipped:dummySwitch];
|
||||
|
||||
/*
|
||||
[self setHidden:((sender.selectedSegmentIndex!=RelativeTouch
|
||||
&& sender.selectedSegmentIndex!=AbsoluteTouch)
|
||||
|| !_pinchGestureSwitch.isOn) forStack:self.pinchSensitivityStack];
|
||||
[self setHidden:((sender.selectedSegmentIndex!=RelativeTouch
|
||||
&& sender.selectedSegmentIndex!=AbsoluteTouch)
|
||||
|| !_pinchGestureSwitch.isOn) forStack:self.ctrlDownForPinchStack];*/
|
||||
|
||||
[self setHidden:sender.selectedSegmentIndex!=AbsoluteTouch forStack:self.leftClickDelayStack];
|
||||
|
||||
[self setHidden:sender.selectedSegmentIndex!=RelativeTouch forStack:self.mousePointerVelocityStack];
|
||||
[self setHidden:sender.selectedSegmentIndex!=RelativeTouch forStack:self.singleTapSensitivityStack];
|
||||
[self setHidden:sender.selectedSegmentIndex!=RelativeTouch forStack:self.relativeTouchSlideThresholdStack];
|
||||
@@ -2431,16 +2487,22 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
}
|
||||
}
|
||||
|
||||
- (void)passthroughGesturesSwitchFlipped:(UISwitch* )sender{
|
||||
[self setHidden:!sender.isOn forStack:_pinchGestureStack];
|
||||
[self setHidden:!sender.isOn forStack:_scrollSensitivityStack];
|
||||
if(!sender.isOn) [self pinchGestureSwitchFlipped:sender];
|
||||
else [self pinchGestureSwitchFlipped:_pinchGestureSwitch];
|
||||
}
|
||||
|
||||
- (void)pinchGestureSwitchFlipped:(UISwitch* )sender{
|
||||
[self setHidden:!sender.isOn forStack:_pinchSensitivityStack];
|
||||
[self setHidden:!sender.isOn forStack:_ctrlDownForPinchStack];
|
||||
}
|
||||
|
||||
- (void)highlightEmergingStack:(UIStackView* )stack{
|
||||
[self highlightedBackgroundForView:stack animateWithDuration:0.2];
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)),
|
||||
dispatch_get_main_queue(), ^{
|
||||
[self highlightedBackgroundForView:stack animateWithDuration:0.2 completion:^{
|
||||
[self clearBackgroundColorForView:stack animateWithDuration:0.2];
|
||||
});
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)muteInBackgroundSwitchFlipped:(UISwitch* )sender{
|
||||
@@ -2652,6 +2714,9 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
[NSString stringWithFormat:@" %d μs ", (uint16_t)self.touchMoveEventIntervalSlider.value] : @"";
|
||||
}
|
||||
|
||||
- (void) leftClickDelaySliderMoved:(UISlider* )sender{
|
||||
[self findDynamicLabelFromStack:self.leftClickDelayStack].text = [NSString stringWithFormat:@" %d ms ", (uint16_t)sender.value];
|
||||
}
|
||||
|
||||
- (void) slideToMenuDistanceSliderMoved:(UISlider* )sender{
|
||||
UILabel* displayLabel = [self findDynamicLabelFromStack:_slideToSettingsDistanceStack];
|
||||
@@ -2870,6 +2935,8 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
|
||||
Settings* currentSettings = [dataMan retrieveSettings];
|
||||
|
||||
CGFloat settingsMenuOffset = _rememberFoldStateSwitch.isOn ? _scrollView.contentOffset.y : 0;
|
||||
|
||||
NSInteger height = self.mainFrameViewController.settingsExpandedInStreamView ? currentSettings.height.intValue : [self getChosenStreamHeight];
|
||||
NSInteger width = self.mainFrameViewController.settingsExpandedInStreamView ? currentSettings.width.intValue : [self getChosenStreamWidth];
|
||||
|
||||
@@ -2912,7 +2979,7 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
BOOL enableYUV444 = self.yuv444Switch.isOn;
|
||||
BOOL enablePIP = self.pipSwitch.isOn;
|
||||
BOOL btMouseSupport = self.citrixX1MouseSwitch.isOn;
|
||||
NSInteger touchMode = [self isNotNativeTouchOnly] ? self.touchModeSelector.selectedSegmentIndex : NativeTouchOnly;
|
||||
NSInteger touchMode = [self isNotNativeTouchOnly] ? self.touchModeSelector1.selectedSegmentIndex : NativeTouchOnly;
|
||||
NSInteger statsOverlayLevel = [self.statsOverlaySelector selectedSegmentIndex];
|
||||
BOOL statsOverlayEnabled = statsOverlayLevel != 0;
|
||||
BOOL enableHdr = self.hdrSwitch.isOn;
|
||||
@@ -2932,14 +2999,17 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
NSInteger hapticEngine = self.hapticEngineSelector.selectedSegmentIndex;
|
||||
CGFloat edgeSlidingSensitivity = self.edgeSlidingSensitivitySlider.value;
|
||||
NSInteger audioEngine = self.audioEngineSelector.selectedSegmentIndex;
|
||||
// BOOL delayLeftClick = self.delayLeftClickSwitch.isOn;
|
||||
BOOL delayLeftClick = true;
|
||||
BOOL delayLeftClick = self.delayLeftClickSwitch.isOn;
|
||||
// BOOL delayLeftClick = true;
|
||||
BOOL duckOtherApps = self.duckOtherAppSwitch.isOn;
|
||||
BOOL muteInBackground = self.muteInBackgroundSwitch.isOn;
|
||||
CGFloat relativeTouchSlideThreshold = self.relativeTouchSlideThresholdSlider.value;
|
||||
BOOL enablePinch = self.pinchGestureSwitch.isOn;
|
||||
CGFloat scrollSensitivity = self.scrollSensitivitySlider.value;
|
||||
CGFloat pinchSensitivity = self.pinchSensitivitySlider.value;
|
||||
BOOL ctrlDownForPinch = self.ctrlDownForPinchSwitch.isOn;
|
||||
CGFloat leftClickDelayMs = self.leftClickDelaySlider.value;
|
||||
BOOL passthroughGestures = self.passthroughGesturesSwitch.isOn;
|
||||
NSInteger backgroundSessionTimer = self.backgroundSessionTimerSlider.value == self.backgroundSessionTimerSlider.maximumValue ? (uint32_t) INT16_MAX : (uint32_t)self.backgroundSessionTimerSlider.value;
|
||||
|
||||
[dataMan saveSettingsWithBitrate:_bitrate
|
||||
@@ -3002,6 +3072,10 @@ BOOL isCustomResolution(int resolutionSelected) {
|
||||
enablePinch:enablePinch
|
||||
scrollSensitivity:scrollSensitivity
|
||||
pinchSensitivity:pinchSensitivity
|
||||
ctrlDownForPinch:ctrlDownForPinch
|
||||
leftClickDelayMs:leftClickDelayMs
|
||||
settingsMenuOffset:settingsMenuOffset
|
||||
passthroughGestures:passthroughGestures
|
||||
backgroundSessionTimer:backgroundSessionTimer];
|
||||
}
|
||||
|
||||
|
||||
@@ -310,11 +310,6 @@
|
||||
|
||||
}
|
||||
|
||||
- (void)handleAbsTouchPanGesture:(UIPanGestureRecognizer* )gesture{
|
||||
NSLog(@"handleAbsTouchPanGesture %f", CACurrentMediaTime());
|
||||
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT);
|
||||
}
|
||||
|
||||
- (void)configZoomGestureAndAddStreamView{
|
||||
if (_settings.touchMode.intValue == AbsoluteTouch) {
|
||||
if(!_scrollView) _scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
|
||||
@@ -322,17 +317,17 @@
|
||||
[_scrollView.panGestureRecognizer setMinimumNumberOfTouches:2];
|
||||
[_scrollView.panGestureRecognizer setMaximumNumberOfTouches:2]; // reduce competing with keyboardToggleRecognizer in StreamView.
|
||||
#endif
|
||||
[_scrollView.panGestureRecognizer addTarget:self action:@selector(handleAbsTouchPanGesture:)];
|
||||
[_scrollView setShowsHorizontalScrollIndicator:NO];
|
||||
[_scrollView setShowsVerticalScrollIndicator:NO];
|
||||
[_scrollView setDelegate:self];
|
||||
[_scrollView setMaximumZoomScale:1.0f];
|
||||
[_scrollView setMaximumZoomScale:_settings.passthroughGestures ? 1.0 : 10.0f];
|
||||
if(!_mainFrameViewcontroller.settingsExpandedInStreamView){
|
||||
// Add StreamView inside a UIScrollView for absolute mode
|
||||
[_scrollView addSubview:_streamView];
|
||||
// Insert at index 0 to ensure it doesn't cover OSC controls (CALayers)
|
||||
[self.view insertSubview:_scrollView atIndex:0];
|
||||
}
|
||||
_scrollView.panGestureRecognizer.enabled = !_settings.passthroughGestures;
|
||||
}
|
||||
else{
|
||||
// Add streamView directly to self.view in other touch modes
|
||||
@@ -453,6 +448,7 @@
|
||||
[_streamView.onScreenControls sendInstance];
|
||||
|
||||
TouchPadGestureHandler.enablePinch = _settings.enablePinch;
|
||||
TouchPadGestureHandler.ctrlDownForPinch = _settings.ctrlDownForPinch;
|
||||
TouchPadGestureHandler.scrollSensitivity = _settings.scrollSensitivity.floatValue;
|
||||
TouchPadGestureHandler.pinchSensitivity = _settings.pinchSensitivity.floatValue;
|
||||
|
||||
|
||||
@@ -583,7 +583,7 @@
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "needs_review",
|
||||
"state" : "translated",
|
||||
"value" : "延遲滑鼠左單擊"
|
||||
}
|
||||
}
|
||||
@@ -811,6 +811,36 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"aDg-5A-6M9.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Left Click Delay\"; ObjectID = \"aDg-5A-6M9\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Left Click Delay"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "左单击延迟"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "左單擊延遲"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "左單擊延遲"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"AeU-kl-XFa.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Local Volume\"; ObjectID = \"AeU-kl-XFa\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
@@ -1447,6 +1477,36 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"BsJ-eo-2Ac.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Ctrl Down for Pinch\"; ObjectID = \"BsJ-eo-2Ac\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Ctrl Down for Pinch"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "捏合时按下Ctrl"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "捏合時按下Ctrl"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "捏合時按下Ctrl"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"c1r-Hf-b7t.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Down button\"; ObjectID = \"c1r-Hf-b7t\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
@@ -1885,6 +1945,36 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"dfj-BB-Vby.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Passthrough Gestures\"; ObjectID = \"dfj-BB-Vby\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Passthrough Gestures"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透传手势"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透傳手勢"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透傳手勢"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"dOF-FW-cBU.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \" \"; ObjectID = \"dOF-FW-cBU\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
|
||||
@@ -373,6 +373,36 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"5S1-w1-Wnq.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Left Click Delay\"; ObjectID = \"5S1-w1-Wnq\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Left Click Delay"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "左单击延迟"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "左單擊延遲"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "左單擊延遲"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"5uF-E5-hpX.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"On-Screen Widgets \"; ObjectID = \"5uF-E5-hpX\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
@@ -1009,6 +1039,36 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"A5m-3n-5qc.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Passthrough Gestures\"; ObjectID = \"A5m-3n-5qc\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Passthrough Gestures"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透传手势"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透傳手勢"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透傳手勢"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"A9r-dE-rT4.segmentTitles[0]" : {
|
||||
"comment" : "Class = \"UISegmentedControl\"; A9r-dE-rT4.segmentTitles[0] = \"Touchpad\"; ObjectID = \"A9r-dE-rT4\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
@@ -2377,6 +2437,36 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ICY-9b-uFD.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Ctrl Down for Pinch\"; ObjectID = \"ICY-9b-uFD\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Ctrl Down for Pinch"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "捏合时按下Ctrl"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "捏合時按下Ctrl"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "捏合時按下Ctrl"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Idx-O1-5dn.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Height\"; ObjectID = \"Idx-O1-5dn\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
@@ -3787,13 +3877,13 @@
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "needs_review",
|
||||
"state" : "translated",
|
||||
"value" : "延迟鼠标左单击"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "needs_review",
|
||||
"state" : "translated",
|
||||
"value" : "延遲滑鼠左單擊"
|
||||
}
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user