[sim] GUI: Fix Keyboard Joystick (#3052)

This was broken by #3010.

Also fix a few unknown key cases and a nullptr return that could cause a crash.
This commit is contained in:
Peter Johnson
2021-01-05 17:55:11 -08:00
committed by GitHub
parent cd4a2265b9
commit 78147aa342

View File

@@ -146,12 +146,7 @@ class GlfwKeyboardJoystick : public KeyboardJoystick {
public:
explicit GlfwKeyboardJoystick(int index, bool noDefaults = false);
const char* GetKeyName(int key) const override {
if (key < 0) {
return "(None)";
}
return glfwGetKeyName(key, 0);
}
const char* GetKeyName(int key) const override;
};
struct RobotJoystick {
@@ -274,7 +269,7 @@ class FMSSimModel : public glass::FMSModel {
// system joysticks
static std::vector<std::unique_ptr<SystemJoystick>> gGlfwJoysticks;
static int gNumGlfwJoysticks = 0;
static std::vector<std::unique_ptr<KeyboardJoystick>> gKeyboardJoysticks;
static std::vector<std::unique_ptr<GlfwKeyboardJoystick>> gKeyboardJoysticks;
// robot joysticks
static RobotJoystick gRobotJoysticks[HAL_kMaxJoysticks];
@@ -427,9 +422,9 @@ static void* KeyboardJoystickReadOpen(ImGuiContext* ctx,
if (num < 0 || num >= static_cast<int>(gKeyboardJoysticks.size())) {
return nullptr;
}
auto& joy = gKeyboardJoysticks[num];
joy = std::make_unique<GlfwKeyboardJoystick>(num, true);
return joy.get();
auto joy = gKeyboardJoysticks[num].get();
*joy = GlfwKeyboardJoystick(num, true);
return joy;
}
static void KeyboardJoystickReadLine(ImGuiContext* ctx,
@@ -1088,6 +1083,40 @@ GlfwKeyboardJoystick::GlfwKeyboardJoystick(int index, bool noDefaults)
}
}
const char* GlfwKeyboardJoystick::GetKeyName(int key) const {
if (key < 0) {
return "(None)";
}
const char* name = glfwGetKeyName(key, 0);
if (name) {
return name;
}
// glfwGetKeyName sometimes doesn't have these keys
switch (key) {
case GLFW_KEY_RIGHT:
return "Right";
case GLFW_KEY_LEFT:
return "Left";
case GLFW_KEY_DOWN:
return "Down";
case GLFW_KEY_UP:
return "Up";
case GLFW_KEY_INSERT:
return "Insert";
case GLFW_KEY_HOME:
return "Home";
case GLFW_KEY_PAGE_UP:
return "PgUp";
case GLFW_KEY_DELETE:
return "Delete";
case GLFW_KEY_END:
return "End";
case GLFW_KEY_PAGE_DOWN:
return "PgDn";
}
return "(Unknown)";
}
void RobotJoystick::Update() {
Clear();
if (sys) {