input(iOS): let the controller Options and Home buttons be mapped

Only the Menu button could be mapped to the guest. Options and Home were
left out because the system uses them for its own gestures (screenshots,
recording, opening the game overlay), so a press never did anything useful
for the guest.

Add both to the gamepad settings with the same choices as the other
buttons. They default to Disabled, which leaves the system gestures alone.
Once a button is mapped we ask the system to give up its gesture through
preferredSystemGestureState, which the system honours according to the
user's Home button setting.

Not tested with a physical controller.

Assisted-by: Claude:claude-fable-5-1
This commit is contained in:
osy
2026-09-20 03:45:31 -05:00
parent 9d00a54833
commit 17244e6f6c
5 changed files with 388 additions and 0 deletions
@@ -23,6 +23,9 @@ NS_ASSUME_NONNULL_BEGIN
- (void)initGamepad;
/// Takes the buttons mapped to the guest away from the system, or gives them back.
- (void)setSystemGestureButtonsClaimed:(BOOL)isClaimed;
@end
NS_ASSUME_NONNULL_END
@@ -127,6 +127,25 @@ const CGFloat kThumbstickSpeedMultiplier = 1000; // in points per second
gamepad.buttonMenu.pressedChangedHandler = ^(GCControllerButtonInput * _Nonnull button, float value, BOOL pressed) {
[_self gamepadButton:@"GCButtonMenu" pressed:pressed];
};
gamepad.buttonOptions.pressedChangedHandler = ^(GCControllerButtonInput * _Nonnull button, float value, BOOL pressed) {
[_self gamepadButton:@"GCButtonOptions" pressed:pressed];
};
gamepad.buttonHome.pressedChangedHandler = ^(GCControllerButtonInput * _Nonnull button, float value, BOOL pressed) {
[_self gamepadButton:@"GCButtonHome" pressed:pressed];
};
[self setSystemGestureButtonsClaimed:YES];
}
- (void)setSystemGestureButtonsClaimed:(BOOL)isClaimed {
// the system uses these buttons for its own gestures, so we only ask for them while they are mapped to the guest
GCExtendedGamepad *gamepad = self.controller.extendedGamepad;
BOOL isOptionsClaimed = isClaimed && [self integerForSetting:@"GCButtonOptions"] != 0;
BOOL isHomeClaimed = isClaimed && [self integerForSetting:@"GCButtonHome"] != 0;
gamepad.buttonOptions.preferredSystemGestureState = isOptionsClaimed ? GCSystemGestureStateDisabled : GCSystemGestureStateEnabled;
gamepad.buttonHome.preferredSystemGestureState = isHomeClaimed ? GCSystemGestureStateDisabled : GCSystemGestureStateEnabled;
}
- (void)gamepadButton:(NSString *)identifier pressed:(BOOL)isPressed {
@@ -112,6 +112,7 @@ static const NSInteger kResizeTimeoutSecs = 5;
#if !TARGET_OS_VISION
[self startGCMouse];
#endif
[self setSystemGestureButtonsClaimed:YES];
[self.vmDisplay addRenderer:self.renderer];
}
@@ -120,6 +121,7 @@ static const NSInteger kResizeTimeoutSecs = 5;
#if !TARGET_OS_VISION
[self stopGCMouse];
#endif
[self setSystemGestureButtonsClaimed:NO];
[self.vmDisplay removeRenderer:self.renderer];
[self removeObserver:self forKeyPath:@"vmDisplay.displaySize"];
}
+364
View File
@@ -661,6 +661,370 @@
<integer>88</integer>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Title</key>
<string>Options</string>
<key>Key</key>
<string>GCButtonOptions</string>
<key>DefaultValue</key>
<integer>0</integer>
<key>Titles</key>
<array>
<string>Disabled</string>
<string>Mouse Left Button</string>
<string>Mouse Right Button</string>
<string>Mouse Middle Button</string>
<string>Ctrl</string>
<string>Command/Windows</string>
<string>Option/Alt</string>
<string>Shift</string>
<string>Tab</string>
<string>Space</string>
<string>Enter</string>
<string>Backspace</string>
<string>Esc</string>
<string>Caps</string>
<string>`</string>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
<string>8</string>
<string>9</string>
<string>0</string>
<string>-</string>
<string>=</string>
<string>[</string>
<string>]</string>
<string>;</string>
<string>&apos;</string>
<string>\</string>
<string>,</string>
<string>.</string>
<string>/</string>
<string>Ins</string>
<string>Home</string>
<string>PgUp</string>
<string>PgDn</string>
<string>Del</string>
<string>End</string>
<string>Up</string>
<string>Left</string>
<string>Down</string>
<string>Right</string>
<string>A</string>
<string>B</string>
<string>C</string>
<string>D</string>
<string>E</string>
<string>F</string>
<string>G</string>
<string>H</string>
<string>I</string>
<string>J</string>
<string>K</string>
<string>L</string>
<string>M</string>
<string>N</string>
<string>O</string>
<string>P</string>
<string>Q</string>
<string>R</string>
<string>S</string>
<string>T</string>
<string>U</string>
<string>V</string>
<string>W</string>
<string>X</string>
<string>Y</string>
<string>Z</string>
<string>F1</string>
<string>F2</string>
<string>F3</string>
<string>F4</string>
<string>F5</string>
<string>F6</string>
<string>F7</string>
<string>F8</string>
<string>F9</string>
<string>F10</string>
<string>F11</string>
<string>F12</string>
</array>
<key>Values</key>
<array>
<integer>0</integer>
<integer>-1</integer>
<integer>-3</integer>
<integer>-2</integer>
<integer>29</integer>
<integer>57435</integer>
<integer>56</integer>
<integer>42</integer>
<integer>15</integer>
<integer>57</integer>
<integer>28</integer>
<integer>14</integer>
<integer>1</integer>
<integer>58</integer>
<integer>41</integer>
<integer>2</integer>
<integer>3</integer>
<integer>4</integer>
<integer>5</integer>
<integer>6</integer>
<integer>7</integer>
<integer>8</integer>
<integer>9</integer>
<integer>10</integer>
<integer>11</integer>
<integer>12</integer>
<integer>13</integer>
<integer>26</integer>
<integer>27</integer>
<integer>39</integer>
<integer>40</integer>
<integer>43</integer>
<integer>51</integer>
<integer>52</integer>
<integer>53</integer>
<integer>57426</integer>
<integer>57415</integer>
<integer>57417</integer>
<integer>57425</integer>
<integer>57427</integer>
<integer>57423</integer>
<integer>200</integer>
<integer>203</integer>
<integer>208</integer>
<integer>205</integer>
<integer>30</integer>
<integer>48</integer>
<integer>46</integer>
<integer>32</integer>
<integer>18</integer>
<integer>33</integer>
<integer>34</integer>
<integer>35</integer>
<integer>23</integer>
<integer>36</integer>
<integer>37</integer>
<integer>38</integer>
<integer>50</integer>
<integer>49</integer>
<integer>24</integer>
<integer>25</integer>
<integer>16</integer>
<integer>19</integer>
<integer>31</integer>
<integer>20</integer>
<integer>22</integer>
<integer>47</integer>
<integer>17</integer>
<integer>45</integer>
<integer>21</integer>
<integer>44</integer>
<integer>59</integer>
<integer>60</integer>
<integer>61</integer>
<integer>62</integer>
<integer>63</integer>
<integer>64</integer>
<integer>65</integer>
<integer>66</integer>
<integer>67</integer>
<integer>68</integer>
<integer>87</integer>
<integer>88</integer>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Title</key>
<string>Home</string>
<key>Key</key>
<string>GCButtonHome</string>
<key>DefaultValue</key>
<integer>0</integer>
<key>Titles</key>
<array>
<string>Disabled</string>
<string>Mouse Left Button</string>
<string>Mouse Right Button</string>
<string>Mouse Middle Button</string>
<string>Ctrl</string>
<string>Command/Windows</string>
<string>Option/Alt</string>
<string>Shift</string>
<string>Tab</string>
<string>Space</string>
<string>Enter</string>
<string>Backspace</string>
<string>Esc</string>
<string>Caps</string>
<string>`</string>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
<string>8</string>
<string>9</string>
<string>0</string>
<string>-</string>
<string>=</string>
<string>[</string>
<string>]</string>
<string>;</string>
<string>&apos;</string>
<string>\</string>
<string>,</string>
<string>.</string>
<string>/</string>
<string>Ins</string>
<string>Home</string>
<string>PgUp</string>
<string>PgDn</string>
<string>Del</string>
<string>End</string>
<string>Up</string>
<string>Left</string>
<string>Down</string>
<string>Right</string>
<string>A</string>
<string>B</string>
<string>C</string>
<string>D</string>
<string>E</string>
<string>F</string>
<string>G</string>
<string>H</string>
<string>I</string>
<string>J</string>
<string>K</string>
<string>L</string>
<string>M</string>
<string>N</string>
<string>O</string>
<string>P</string>
<string>Q</string>
<string>R</string>
<string>S</string>
<string>T</string>
<string>U</string>
<string>V</string>
<string>W</string>
<string>X</string>
<string>Y</string>
<string>Z</string>
<string>F1</string>
<string>F2</string>
<string>F3</string>
<string>F4</string>
<string>F5</string>
<string>F6</string>
<string>F7</string>
<string>F8</string>
<string>F9</string>
<string>F10</string>
<string>F11</string>
<string>F12</string>
</array>
<key>Values</key>
<array>
<integer>0</integer>
<integer>-1</integer>
<integer>-3</integer>
<integer>-2</integer>
<integer>29</integer>
<integer>57435</integer>
<integer>56</integer>
<integer>42</integer>
<integer>15</integer>
<integer>57</integer>
<integer>28</integer>
<integer>14</integer>
<integer>1</integer>
<integer>58</integer>
<integer>41</integer>
<integer>2</integer>
<integer>3</integer>
<integer>4</integer>
<integer>5</integer>
<integer>6</integer>
<integer>7</integer>
<integer>8</integer>
<integer>9</integer>
<integer>10</integer>
<integer>11</integer>
<integer>12</integer>
<integer>13</integer>
<integer>26</integer>
<integer>27</integer>
<integer>39</integer>
<integer>40</integer>
<integer>43</integer>
<integer>51</integer>
<integer>52</integer>
<integer>53</integer>
<integer>57426</integer>
<integer>57415</integer>
<integer>57417</integer>
<integer>57425</integer>
<integer>57427</integer>
<integer>57423</integer>
<integer>200</integer>
<integer>203</integer>
<integer>208</integer>
<integer>205</integer>
<integer>30</integer>
<integer>48</integer>
<integer>46</integer>
<integer>32</integer>
<integer>18</integer>
<integer>33</integer>
<integer>34</integer>
<integer>35</integer>
<integer>23</integer>
<integer>36</integer>
<integer>37</integer>
<integer>38</integer>
<integer>50</integer>
<integer>49</integer>
<integer>24</integer>
<integer>25</integer>
<integer>16</integer>
<integer>19</integer>
<integer>31</integer>
<integer>20</integer>
<integer>22</integer>
<integer>47</integer>
<integer>17</integer>
<integer>45</integer>
<integer>21</integer>
<integer>44</integer>
<integer>59</integer>
<integer>60</integer>
<integer>61</integer>
<integer>62</integer>
<integer>63</integer>
<integer>64</integer>
<integer>65</integer>
<integer>66</integer>
<integer>67</integer>
<integer>68</integer>
<integer>87</integer>
<integer>88</integer>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
Binary file not shown.