|
@@ -174,7 +174,6 @@ CODE
|
|
|
- Set 'io.BackendFlags |= ImGuiBackendFlags_HasGamepad' + call io.AddKeyEvent/AddKeyAnalogEvent() with ImGuiKey_Gamepad_XXX keys.
|
|
|
- For analog values (0.0f to 1.0f), backend is responsible to handling a dead-zone and rescaling inputs accordingly.
|
|
|
Backend code will probably need to transform your raw inputs (such as e.g. remapping your 0.2..0.9 raw input range to 0.0..1.0 imgui range, etc.).
|
|
|
- - BEFORE 1.87, BACKENDS USED TO WRITE TO io.NavInputs[]. This is now obsolete. Please call io functions instead!
|
|
|
- If you need to share inputs between your game and the Dear ImGui interface, the easiest approach is to go all-or-nothing,
|
|
|
with a buttons combo to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved.
|
|
|
|
|
@@ -430,6 +429,16 @@ CODE
|
|
|
When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
|
|
|
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
|
|
|
|
|
|
+ - 2024/11/06 (1.91.5) - commented/obsoleted out pre-1.87 IO system (equivalent to using IMGUI_DISABLE_OBSOLETE_KEYIO or IMGUI_DISABLE_OBSOLETE_FUNCTIONS before)
|
|
|
+ - io.KeyMap[] and io.KeysDown[] are removed (obsoleted February 2022).
|
|
|
+ - io.NavInputs[] and ImGuiNavInput are removed (obsoleted July 2022).
|
|
|
+ - pre-1.87 backends are not supported:
|
|
|
+ - backends need to call io.AddKeyEvent(), io.AddMouseEvent() instead of writing to io.KeysDown[], io.MouseDown[] fields.
|
|
|
+ - backends need to call io.AddKeyAnalogEvent() for gamepad values instead of writing to io.NavInputs[] fields.
|
|
|
+ - for more reference:
|
|
|
+ - read 1.87 and 1.88 part of this section or read Changelog for 1.87 and 1.88.
|
|
|
+ - read https://github.com/ocornut/imgui/issues/4921
|
|
|
+ - if you have trouble updating a very old codebase using legacy backend-specific key codes: consider updating to 1.91.4 first, then #define IMGUI_DISABLE_OBSOLETE_KEYIO, then update to latest.
|
|
|
- 2024/10/18 (1.91.4) - renamed ImGuiCol_NavHighlight to ImGuiCol_NavCursor (for consistency with newly exposed and reworked features). Kept inline redirection enum (will obsolete).
|
|
|
- 2024/10/14 (1.91.4) - moved ImGuiConfigFlags_NavEnableSetMousePos to standalone io.ConfigNavMoveSetMousePos bool.
|
|
|
moved ImGuiConfigFlags_NavNoCaptureKeyboard to standalone io.ConfigNavCaptureKeyboard bool (note the inverted value!).
|
|
@@ -1390,10 +1399,6 @@ ImGuiIO::ImGuiIO()
|
|
|
IniSavingRate = 5.0f;
|
|
|
IniFilename = "imgui.ini"; // Important: "imgui.ini" is relative to current working dir, most apps will want to lock this to an absolute path (e.g. same path as executables).
|
|
|
LogFilename = "imgui_log.txt";
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- for (int i = 0; i < ImGuiKey_COUNT; i++)
|
|
|
- KeyMap[i] = -1;
|
|
|
-#endif
|
|
|
UserData = NULL;
|
|
|
|
|
|
Fonts = NULL;
|
|
@@ -1456,8 +1461,6 @@ ImGuiIO::ImGuiIO()
|
|
|
for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f;
|
|
|
for (int i = 0; i < IM_ARRAYSIZE(KeysData); i++) { KeysData[i].DownDuration = KeysData[i].DownDurationPrev = -1.0f; }
|
|
|
AppAcceptingEvents = true;
|
|
|
- BackendUsingLegacyKeyArrays = (ImS8)-1;
|
|
|
- BackendUsingLegacyNavInputArray = true; // assume using legacy array until proven wrong
|
|
|
}
|
|
|
|
|
|
// Pass in translated ASCII characters for text input.
|
|
@@ -1538,9 +1541,6 @@ void ImGuiIO::ClearEventsQueue()
|
|
|
// Clear current keyboard/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons.
|
|
|
void ImGuiIO::ClearInputKeys()
|
|
|
{
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- memset(KeysDown, 0, sizeof(KeysDown));
|
|
|
-#endif
|
|
|
for (int n = 0; n < IM_ARRAYSIZE(KeysData); n++)
|
|
|
{
|
|
|
if (ImGui::IsMouseKey((ImGuiKey)(n + ImGuiKey_KeysData_OFFSET)))
|
|
@@ -1625,17 +1625,6 @@ void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value)
|
|
|
else if (key == ImGuiKey_RightCtrl) { key = ImGuiKey_RightSuper; }
|
|
|
}
|
|
|
|
|
|
- // Verify that backend isn't mixing up using new io.AddKeyEvent() api and old io.KeysDown[] + io.KeyMap[] data.
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- IM_ASSERT((BackendUsingLegacyKeyArrays == -1 || BackendUsingLegacyKeyArrays == 0) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!");
|
|
|
- if (BackendUsingLegacyKeyArrays == -1)
|
|
|
- for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++)
|
|
|
- IM_ASSERT(KeyMap[n] == -1 && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!");
|
|
|
- BackendUsingLegacyKeyArrays = 0;
|
|
|
-#endif
|
|
|
- if (ImGui::IsGamepadKey(key))
|
|
|
- BackendUsingLegacyNavInputArray = false;
|
|
|
-
|
|
|
// Filter duplicate (in particular: key mods and gamepad analog values are commonly spammed)
|
|
|
const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_Key, (int)key);
|
|
|
const ImGuiKeyData* key_data = ImGui::GetKeyData(&g, key);
|
|
@@ -1671,20 +1660,10 @@ void ImGuiIO::SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native
|
|
|
return;
|
|
|
IM_ASSERT(ImGui::IsNamedKey(key)); // >= 512
|
|
|
IM_ASSERT(native_legacy_index == -1 || ImGui::IsLegacyKey((ImGuiKey)native_legacy_index)); // >= 0 && <= 511
|
|
|
- IM_UNUSED(native_keycode); // Yet unused
|
|
|
- IM_UNUSED(native_scancode); // Yet unused
|
|
|
-
|
|
|
- // Build native->imgui map so old user code can still call key functions with native 0..511 values.
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- const int legacy_key = (native_legacy_index != -1) ? native_legacy_index : native_keycode;
|
|
|
- if (!ImGui::IsLegacyKey((ImGuiKey)legacy_key))
|
|
|
- return;
|
|
|
- KeyMap[legacy_key] = key;
|
|
|
- KeyMap[key] = legacy_key;
|
|
|
-#else
|
|
|
- IM_UNUSED(key);
|
|
|
- IM_UNUSED(native_legacy_index);
|
|
|
-#endif
|
|
|
+ IM_UNUSED(key); // Yet unused
|
|
|
+ IM_UNUSED(native_keycode); // Yet unused
|
|
|
+ IM_UNUSED(native_scancode); // Yet unused
|
|
|
+ IM_UNUSED(native_legacy_index); // Yet unused
|
|
|
}
|
|
|
|
|
|
// Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen.
|
|
@@ -8928,27 +8907,10 @@ ImGuiKeyData* ImGui::GetKeyData(ImGuiContext* ctx, ImGuiKey key)
|
|
|
if (key & ImGuiMod_Mask_)
|
|
|
key = ConvertSingleModFlagToKey(key);
|
|
|
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- IM_ASSERT(key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_NamedKey_END);
|
|
|
- if (IsLegacyKey(key) && g.IO.KeyMap[key] != -1)
|
|
|
- key = (ImGuiKey)g.IO.KeyMap[key]; // Remap native->imgui or imgui->native
|
|
|
-#else
|
|
|
IM_ASSERT(IsNamedKey(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend & user code.");
|
|
|
-#endif
|
|
|
return &g.IO.KeysData[key - ImGuiKey_KeysData_OFFSET];
|
|
|
}
|
|
|
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
-// Formally moved to obsolete section in 1.90.5 in spite of documented as obsolete since 1.87
|
|
|
-ImGuiKey ImGui::GetKeyIndex(ImGuiKey key)
|
|
|
-{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- IM_ASSERT(IsNamedKey(key));
|
|
|
- const ImGuiKeyData* key_data = GetKeyData(key);
|
|
|
- return (ImGuiKey)(key_data - g.IO.KeysData);
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
// Those names a provided for debugging purpose and are not meant to be saved persistently not compared.
|
|
|
static const char* const GKeyNames[] =
|
|
|
{
|
|
@@ -8980,18 +8942,7 @@ const char* ImGui::GetKeyName(ImGuiKey key)
|
|
|
{
|
|
|
if (key == ImGuiKey_None)
|
|
|
return "None";
|
|
|
-#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
IM_ASSERT(IsNamedKeyOrMod(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code.");
|
|
|
-#else
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- if (IsLegacyKey(key))
|
|
|
- {
|
|
|
- if (g.IO.KeyMap[key] == -1)
|
|
|
- return "N/A";
|
|
|
- IM_ASSERT(IsNamedKey((ImGuiKey)g.IO.KeyMap[key]));
|
|
|
- key = (ImGuiKey)g.IO.KeyMap[key];
|
|
|
- }
|
|
|
-#endif
|
|
|
if (key & ImGuiMod_Mask_)
|
|
|
key = ConvertSingleModFlagToKey(key);
|
|
|
if (!IsNamedKey(key))
|
|
@@ -9635,74 +9586,6 @@ static void ImGui::UpdateKeyboardInputs()
|
|
|
if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard)
|
|
|
io.ClearInputKeys();
|
|
|
|
|
|
- // Import legacy keys or verify they are not used
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- if (io.BackendUsingLegacyKeyArrays == 0)
|
|
|
- {
|
|
|
- // Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written to externally.
|
|
|
- for (int n = 0; n < ImGuiKey_LegacyNativeKey_END; n++)
|
|
|
- IM_ASSERT((io.KeysDown[n] == false || IsKeyDown((ImGuiKey)n)) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (g.FrameCount == 0)
|
|
|
- for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++)
|
|
|
- IM_ASSERT(g.IO.KeyMap[n] == -1 && "Backend is not allowed to write to io.KeyMap[0..511]!");
|
|
|
-
|
|
|
- // Build reverse KeyMap (Named -> Legacy)
|
|
|
- for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++)
|
|
|
- if (io.KeyMap[n] != -1)
|
|
|
- {
|
|
|
- IM_ASSERT(IsLegacyKey((ImGuiKey)io.KeyMap[n]));
|
|
|
- io.KeyMap[io.KeyMap[n]] = n;
|
|
|
- }
|
|
|
-
|
|
|
- // Import legacy keys into new ones
|
|
|
- for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++)
|
|
|
- if (io.KeysDown[n] || io.BackendUsingLegacyKeyArrays == 1)
|
|
|
- {
|
|
|
- const ImGuiKey key = (ImGuiKey)(io.KeyMap[n] != -1 ? io.KeyMap[n] : n);
|
|
|
- IM_ASSERT(io.KeyMap[n] == -1 || IsNamedKey(key));
|
|
|
- io.KeysData[key].Down = io.KeysDown[n];
|
|
|
- if (key != n)
|
|
|
- io.KeysDown[key] = io.KeysDown[n]; // Allow legacy code using io.KeysDown[GetKeyIndex()] with old backends
|
|
|
- io.BackendUsingLegacyKeyArrays = 1;
|
|
|
- }
|
|
|
- if (io.BackendUsingLegacyKeyArrays == 1)
|
|
|
- {
|
|
|
- GetKeyData(ImGuiMod_Ctrl)->Down = io.KeyCtrl;
|
|
|
- GetKeyData(ImGuiMod_Shift)->Down = io.KeyShift;
|
|
|
- GetKeyData(ImGuiMod_Alt)->Down = io.KeyAlt;
|
|
|
- GetKeyData(ImGuiMod_Super)->Down = io.KeySuper;
|
|
|
- }
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- // Import legacy ImGuiNavInput_ io inputs and convert to gamepad keys
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0;
|
|
|
- if (io.BackendUsingLegacyNavInputArray && nav_gamepad_active)
|
|
|
- {
|
|
|
- #define MAP_LEGACY_NAV_INPUT_TO_KEY1(_KEY, _NAV1) do { io.KeysData[_KEY].Down = (io.NavInputs[_NAV1] > 0.0f); io.KeysData[_KEY].AnalogValue = io.NavInputs[_NAV1]; } while (0)
|
|
|
- #define MAP_LEGACY_NAV_INPUT_TO_KEY2(_KEY, _NAV1, _NAV2) do { io.KeysData[_KEY].Down = (io.NavInputs[_NAV1] > 0.0f) || (io.NavInputs[_NAV2] > 0.0f); io.KeysData[_KEY].AnalogValue = ImMax(io.NavInputs[_NAV1], io.NavInputs[_NAV2]); } while (0)
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceDown, ImGuiNavInput_Activate);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceRight, ImGuiNavInput_Cancel);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceLeft, ImGuiNavInput_Menu);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceUp, ImGuiNavInput_Input);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadLeft, ImGuiNavInput_DpadLeft);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadRight, ImGuiNavInput_DpadRight);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadUp, ImGuiNavInput_DpadUp);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadDown, ImGuiNavInput_DpadDown);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY2(ImGuiKey_GamepadL1, ImGuiNavInput_FocusPrev, ImGuiNavInput_TweakSlow);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY2(ImGuiKey_GamepadR1, ImGuiNavInput_FocusNext, ImGuiNavInput_TweakFast);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickLeft, ImGuiNavInput_LStickLeft);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickRight, ImGuiNavInput_LStickRight);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickUp, ImGuiNavInput_LStickUp);
|
|
|
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickDown, ImGuiNavInput_LStickDown);
|
|
|
- #undef NAV_MAP_KEY
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
// Update aliases
|
|
|
for (int n = 0; n < ImGuiMouseButton_COUNT; n++)
|
|
|
UpdateAliasKey(MouseButtonToKey(n), io.MouseDown[n], io.MouseDown[n] ? 1.0f : 0.0f);
|
|
@@ -10100,13 +9983,6 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
|
|
|
key_changed_mask.SetBit(key_data_index);
|
|
|
if (trickle_interleaved_nonchar_keys_and_text && !key_is_potentially_for_char_input)
|
|
|
key_changed_nonchar = true;
|
|
|
-
|
|
|
- // Allow legacy code using io.KeysDown[GetKeyIndex()] with new backends
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- io.KeysDown[key_data_index] = key_data->Down;
|
|
|
- if (io.KeyMap[key_data_index] != -1)
|
|
|
- io.KeysDown[io.KeyMap[key_data_index]] = key_data->Down;
|
|
|
-#endif
|
|
|
}
|
|
|
else if (e->Type == ImGuiInputEventType_Text)
|
|
|
{
|
|
@@ -10468,14 +10344,6 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
|
|
|
IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting.");
|
|
|
IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right);
|
|
|
IM_ASSERT(g.Style.ColorButtonPosition == ImGuiDir_Left || g.Style.ColorButtonPosition == ImGuiDir_Right);
|
|
|
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_COUNT; n++)
|
|
|
- IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < ImGuiKey_LegacyNativeKey_END && "io.KeyMap[] contains an out of bound value (need to be 0..511, or -1 for unmapped key)");
|
|
|
-
|
|
|
- // Check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only added in 1.60 WIP)
|
|
|
- if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && g.IO.BackendUsingLegacyKeyArrays == 1)
|
|
|
- IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation.");
|
|
|
-#endif
|
|
|
|
|
|
// Error handling: we do not accept 100% silent recovery! Please contact me if you feel this is getting in your way.
|
|
|
if (g.IO.ConfigErrorRecovery)
|
|
@@ -15732,18 +15600,11 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
|
{
|
|
|
Text("KEYBOARD/GAMEPAD/MOUSE KEYS");
|
|
|
{
|
|
|
- // We iterate both legacy native range and named ImGuiKey ranges, which is a little odd but this allows displaying the data for old/new backends.
|
|
|
// User code should never have to go through such hoops! You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END.
|
|
|
Indent();
|
|
|
-#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
- struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } };
|
|
|
-#else
|
|
|
- struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key >= 0 && key < 512 && GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array
|
|
|
- //Text("Legacy raw:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key++) { if (io.KeysDown[key]) { SameLine(); Text("\"%s\" %d", GetKeyName(key), key); } }
|
|
|
-#endif
|
|
|
- Text("Keys down:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !IsKeyDown(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); SameLine(); Text("(%.02f)", GetKeyData(key)->DownDuration); }
|
|
|
- Text("Keys pressed:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !IsKeyPressed(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); }
|
|
|
- Text("Keys released:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !IsKeyReleased(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); }
|
|
|
+ Text("Keys down:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (!IsKeyDown(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); SameLine(); Text("(%.02f)", GetKeyData(key)->DownDuration); }
|
|
|
+ Text("Keys pressed:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (!IsKeyPressed(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); }
|
|
|
+ Text("Keys released:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (!IsKeyReleased(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); }
|
|
|
Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : "");
|
|
|
Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; SameLine(); Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public.
|
|
|
DebugRenderKeyboardPreview(GetWindowDrawList());
|