From 78147aa3424f1247aa80c7022533e14d195834d0 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Tue, 5 Jan 2021 17:55:11 -0800 Subject: [PATCH] [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. --- .../src/main/native/cpp/DriverStationGui.cpp | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp b/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp index e52558bce7..360dcaac9a 100644 --- a/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp +++ b/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp @@ -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> gGlfwJoysticks; static int gNumGlfwJoysticks = 0; -static std::vector> gKeyboardJoysticks; +static std::vector> gKeyboardJoysticks; // robot joysticks static RobotJoystick gRobotJoysticks[HAL_kMaxJoysticks]; @@ -427,9 +422,9 @@ static void* KeyboardJoystickReadOpen(ImGuiContext* ctx, if (num < 0 || num >= static_cast(gKeyboardJoysticks.size())) { return nullptr; } - auto& joy = gKeyboardJoysticks[num]; - joy = std::make_unique(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) {