Skip to content

Commit 81c06e2

Browse files
author
Karim Mreisi
committed
game menu: add toggle keyboard and toggle mouse
Changes: * Include toggle keyboard action in game menu * Add generic game input device abstraction (which can be implemented by all kind of input devices) * Show input device game menu options * Implement for controller to provide mouse emulation selection
1 parent 2772ab1 commit 81c06e2

File tree

6 files changed

+73
-15
lines changed

6 files changed

+73
-15
lines changed

app/src/main/java/com/limelight/Game.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.limelight.binding.PlatformBinding;
55
import com.limelight.binding.audio.AndroidAudioRenderer;
66
import com.limelight.binding.input.ControllerHandler;
7+
import com.limelight.binding.input.GameInputDevice;
78
import com.limelight.binding.input.KeyboardTranslator;
89
import com.limelight.binding.input.capture.InputCaptureManager;
910
import com.limelight.binding.input.capture.InputCaptureProvider;
@@ -2260,6 +2261,11 @@ public void onUsbPermissionPromptCompleted() {
22602261
updatePipAutoEnter();
22612262
}
22622263

2264+
@Override
2265+
public void showGameMenu(GameInputDevice device) {
2266+
new GameMenu(this, conn, device);
2267+
}
2268+
22632269
@Override
22642270
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
22652271
switch (keyEvent.getAction()) {
@@ -2271,7 +2277,7 @@ public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
22712277
// Intercept back key event before android handles it
22722278
// Always handle the request, the user has to select "Disconnect" within the game menu to actually disconnect
22732279
if (keyCode == keyEvent.KEYCODE_BACK) {
2274-
new GameMenu(this, conn);
2280+
showGameMenu(null);
22752281
return true;
22762282
}
22772283
case KeyEvent.ACTION_UP:

app/src/main/java/com/limelight/GameMenu.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
import android.os.Handler;
55
import android.widget.ArrayAdapter;
66

7+
import com.limelight.binding.input.GameInputDevice;
78
import com.limelight.binding.input.KeyboardTranslator;
89
import com.limelight.nvstream.NvConnection;
910
import com.limelight.nvstream.input.KeyboardPacket;
1011

12+
import java.util.ArrayList;
13+
import java.util.List;
14+
1115
/**
1216
* Provide options for ongoing Game Stream.
1317
* <p>
@@ -17,22 +21,24 @@ public class GameMenu {
1721

1822
private static final long KEY_UP_DELAY = 25;
1923

20-
private static class MenuOption {
24+
public static class MenuOption {
2125
private final String label;
2226
private final Runnable runnable;
2327

24-
MenuOption(String label, Runnable runnable) {
28+
public MenuOption(String label, Runnable runnable) {
2529
this.label = label;
2630
this.runnable = runnable;
2731
}
2832
}
2933

3034
private final Game game;
3135
private final NvConnection conn;
36+
private final GameInputDevice device;
3237

33-
public GameMenu(Game game, NvConnection conn) {
38+
public GameMenu(Game game, NvConnection conn, GameInputDevice device) {
3439
this.game = game;
3540
this.conn = conn;
41+
this.device = device;
3642

3743
showMenu();
3844
}
@@ -128,10 +134,19 @@ private void showSpecialKeysMenu() {
128134
}
129135

130136
private void showMenu() {
131-
showMenuDialog("Game Menu", new MenuOption[]{
132-
new MenuOption(getString(R.string.game_menu_send_keys), () -> showSpecialKeysMenu()),
133-
new MenuOption(getString(R.string.game_menu_disconnect), () -> game.onBackPressed()),
134-
new MenuOption(getString(R.string.game_menu_cancel), null),
135-
});
137+
List<MenuOption> options = new ArrayList<>();
138+
139+
options.add(new MenuOption(getString(R.string.game_menu_toggle_keyboard),
140+
() -> game.toggleKeyboard()));
141+
142+
if (device != null) {
143+
options.addAll(device.getGameMenuOptions());
144+
}
145+
146+
options.add(new MenuOption(getString(R.string.game_menu_send_keys), () -> showSpecialKeysMenu()));
147+
options.add(new MenuOption(getString(R.string.game_menu_disconnect), () -> game.onBackPressed()));
148+
options.add(new MenuOption(getString(R.string.game_menu_cancel), null));
149+
150+
showMenuDialog("Game Menu", options.toArray(new MenuOption[options.size()]));
136151
}
137152
}

app/src/main/java/com/limelight/binding/input/ControllerHandler.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import android.view.MotionEvent;
2323
import android.widget.Toast;
2424

25+
import com.limelight.GameMenu;
2526
import com.limelight.LimeLog;
27+
import com.limelight.R;
2628
import com.limelight.binding.input.driver.AbstractController;
2729
import com.limelight.binding.input.driver.UsbDriverListener;
2830
import com.limelight.binding.input.driver.UsbDriverService;
@@ -36,6 +38,8 @@
3638
import org.cgutman.shieldcontrollerextensions.SceManager;
3739

3840
import java.lang.reflect.InvocationTargetException;
41+
import java.util.ArrayList;
42+
import java.util.List;
3943

4044
public class ControllerHandler implements InputManager.InputDeviceListener, UsbDriverListener {
4145

@@ -1511,7 +1515,7 @@ public boolean handleButtonUp(KeyEvent event) {
15111515
if ((context.inputMap & ControllerPacket.PLAY_FLAG) != 0 &&
15121516
event.getEventTime() - context.startDownTime > ControllerHandler.START_DOWN_TIME_MOUSE_MODE_MS &&
15131517
prefConfig.mouseEmulation) {
1514-
context.toggleMouseEmulation();
1518+
gestures.showGameMenu(context);
15151519
}
15161520
context.inputMap &= ~ControllerPacket.PLAY_FLAG;
15171521
break;
@@ -1858,7 +1862,7 @@ public void deviceAdded(AbstractController controller) {
18581862
usbDeviceContexts.put(controller.getControllerId(), context);
18591863
}
18601864

1861-
class GenericControllerContext {
1865+
class GenericControllerContext implements GameInputDevice {
18621866
public int id;
18631867
public boolean external;
18641868

@@ -1901,6 +1905,16 @@ public void run() {
19011905
}
19021906
};
19031907

1908+
@Override
1909+
public List<GameMenu.MenuOption> getGameMenuOptions() {
1910+
List<GameMenu.MenuOption> options = new ArrayList<>();
1911+
options.add(new GameMenu.MenuOption(activityContext.getString(mouseEmulationActive ?
1912+
R.string.game_menu_toggle_mouse_off : R.string.game_menu_toggle_mouse_on),
1913+
() -> toggleMouseEmulation()));
1914+
1915+
return options;
1916+
}
1917+
19041918
public void toggleMouseEmulation() {
19051919
handler.removeCallbacks(mouseEmulationRunnable);
19061920
mouseEmulationActive = !mouseEmulationActive;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.limelight.binding.input;
2+
3+
import com.limelight.GameMenu;
4+
5+
import java.util.List;
6+
7+
/**
8+
* Generic Input Device
9+
*/
10+
public interface GameInputDevice {
11+
12+
/**
13+
* @return list of device specific game menu options, e.g. configure a controller's mouse mode
14+
*/
15+
List<GameMenu.MenuOption> getGameMenuOptions();
16+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.limelight.ui;
22

3+
import com.limelight.binding.input.GameInputDevice;
4+
35
public interface GameGestures {
46
void toggleKeyboard();
7+
8+
void showGameMenu(GameInputDevice device);
59
}

app/src/main/res/values/strings.xml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,16 @@
132132
<string name="applist_details_id">App ID:</string>
133133

134134
<!-- In Game menu -->
135+
<string name="game_menu_toggle_keyboard">Toggle On-screen Keyboard</string>
136+
<string name="game_menu_toggle_mouse_on">Enable Controller Mouse Emulation</string>
137+
<string name="game_menu_toggle_mouse_off">Disable Controller Mouse Emulation</string>
135138
<string name="game_menu_disconnect">Disconnect</string>
136139
<string name="game_menu_cancel">Cancel</string>
137-
<string name="game_menu_send_keys">Send special key(s)</string>
140+
<string name="game_menu_send_keys">Send special Key(s)</string>
138141
<string name="game_menu_send_keys_esc">Send ESC (Menu)</string>
139-
<string name="game_menu_send_keys_f11">Send F11 (Toggle full screen)</string>
140-
<string name="game_menu_send_keys_ctrl_v">Send CTRL + V (Paste clipboard)</string>
141-
<string name="game_menu_send_keys_win">Send WIN (Toggle Windows start menu)</string>
142+
<string name="game_menu_send_keys_f11">Send F11 (Toggle Full Screen)</string>
143+
<string name="game_menu_send_keys_ctrl_v">Send CTRL + V (Paste Clipboard)</string>
144+
<string name="game_menu_send_keys_win">Send WIN (Toggle Windows Start Menu)</string>
142145
<string name="game_menu_send_keys_win_d">Send WIN + D (Switch to Desktop)</string>
143146
<string name="game_menu_send_keys_win_g">Send WIN + G (Open Xbox Game Bar)</string>
144147
<string name="game_menu_send_keys_shift_tab">Send SHIFT + TAB (Open Steam Overlay)</string>

0 commit comments

Comments
 (0)