summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Chavez <david@dcvz.io>2022-09-22 03:32:27 +0200
committerGitHub <noreply@github.com>2022-09-21 21:32:27 -0400
commitfa8d64ec3a78604d98e59daa46bf34004957c1de (patch)
tree05ea9c737e088a2bceb47c046263ebc92f552c8b
parentb4740d131f4754db44133705b5fd50d513f708dc (diff)
Disable game input when typing into a textfield (#1398)
* Disable game input when typing into a textfield * Only block keyboard input when typing in textfield * Address PR comments * Fix spacing * Generalize check on input device Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
-rw-r--r--libultraship/libultraship/ControlDeck.cpp25
-rw-r--r--libultraship/libultraship/ControlDeck.h2
2 files changed, 22 insertions, 5 deletions
diff --git a/libultraship/libultraship/ControlDeck.cpp b/libultraship/libultraship/ControlDeck.cpp
index 499d34d72..a1ef4da7f 100644
--- a/libultraship/libultraship/ControlDeck.cpp
+++ b/libultraship/libultraship/ControlDeck.cpp
@@ -5,6 +5,7 @@
#include "DummyController.h"
#include <Utils/StringHelper.h>
#include "Cvar.h"
+#include "Lib/ImGui/imgui.h"
#ifndef __WIIU__
#include "KeyboardController.h"
@@ -75,20 +76,26 @@ namespace Ship {
void ControlDeck::WriteToPad(OSContPad* pad) const {
for (size_t i = 0; i < virtualDevices.size(); i++) {
const std::shared_ptr<Controller> backend = physicalDevices[virtualDevices[i]];
+
+ // If the controller backend is "Auto" we need to get the real device
+ // we search for the real device to read input from it
if (backend->GetGuid() == "Auto") {
for (const auto& device : physicalDevices) {
- if(ShouldBlockGameInput() && device->GetGuid() != "Keyboard") {
+ if(ShouldBlockGameInput(device->GetGuid())) {
device->Read(nullptr, i);
continue;
}
+
device->Read(&pad[i], i);
}
continue;
}
- if(ShouldBlockGameInput() && backend->GetGuid() != "Keyboard") {
+
+ if(ShouldBlockGameInput(backend->GetGuid())) {
backend->Read(nullptr, i);
continue;
}
+
backend->Read(&pad[i], i);
}
}
@@ -264,7 +271,17 @@ namespace Ship {
shouldBlockGameInput = false;
}
- bool ControlDeck::ShouldBlockGameInput() const {
- return shouldBlockGameInput || (CVar_GetS32("gOpenMenuBar", 0) && CVar_GetS32("gControlNav", 0));
+ bool ControlDeck::ShouldBlockGameInput(std::string inputDeviceGuid) const {
+ // We block controller input if F1 menu is open and control navigation is on.
+ // This is because we don't want controller inputs to affect the game
+ bool shouldBlockControllerInput = CVar_GetS32("gOpenMenuBar", 0) && CVar_GetS32("gControlNav", 0);
+
+ // We block keyboard input if you're currently typing into a textfield.
+ // This is because we don't want your keyboard typing to affect the game.
+ ImGuiIO io = ImGui::GetIO();
+ bool shouldBlockKeyboardInput = io.WantCaptureKeyboard;
+
+ bool inputDeviceIsKeyboard = inputDeviceGuid == "Keyboard";
+ return shouldBlockGameInput || (inputDeviceIsKeyboard ? shouldBlockKeyboardInput : shouldBlockControllerInput);
}
}
diff --git a/libultraship/libultraship/ControlDeck.h b/libultraship/libultraship/ControlDeck.h
index b72f8c3ce..2e330850c 100644
--- a/libultraship/libultraship/ControlDeck.h
+++ b/libultraship/libultraship/ControlDeck.h
@@ -22,7 +22,7 @@ namespace Ship {
uint8_t* GetControllerBits();
void BlockGameInput();
void UnblockGameInput();
- bool ShouldBlockGameInput() const;
+ bool ShouldBlockGameInput(std::string inputDeviceGuid) const;
private:
std::vector<int32_t> virtualDevices = {};
std::vector<std::shared_ptr<Controller>> physicalDevices = {};