Added io.AddKeyModEvent() and updated backends accordingly.
diff --git a/backends/imgui_impl_allegro5.cpp b/backends/imgui_impl_allegro5.cpp
index 71e32cb..91f57a9 100644
--- a/backends/imgui_impl_allegro5.cpp
+++ b/backends/imgui_impl_allegro5.cpp
@@ -567,10 +567,12 @@
// Setup inputs
ALLEGRO_KEYBOARD_STATE keys;
al_get_keyboard_state(&keys);
- io.KeyCtrl = al_key_down(&keys, ALLEGRO_KEY_LCTRL) || al_key_down(&keys, ALLEGRO_KEY_RCTRL);
- io.KeyShift = al_key_down(&keys, ALLEGRO_KEY_LSHIFT) || al_key_down(&keys, ALLEGRO_KEY_RSHIFT);
- io.KeyAlt = al_key_down(&keys, ALLEGRO_KEY_ALT) || al_key_down(&keys, ALLEGRO_KEY_ALTGR);
- io.KeySuper = al_key_down(&keys, ALLEGRO_KEY_LWIN) || al_key_down(&keys, ALLEGRO_KEY_RWIN);
+ ImGuiKeyModFlags key_mods =
+ ((al_key_down(&keys, ALLEGRO_KEY_LCTRL) || al_key_down(&keys, ALLEGRO_KEY_RCTRL)) ? ImGuiKeyModFlags_Ctrl : 0) |
+ ((al_key_down(&keys, ALLEGRO_KEY_LSHIFT) || al_key_down(&keys, ALLEGRO_KEY_RSHIFT)) ? ImGuiKeyModFlags_Shift : 0) |
+ ((al_key_down(&keys, ALLEGRO_KEY_ALT) || al_key_down(&keys, ALLEGRO_KEY_ALTGR)) ? ImGuiKeyModFlags_Alt : 0) |
+ ((al_key_down(&keys, ALLEGRO_KEY_LWIN) || al_key_down(&keys, ALLEGRO_KEY_RWIN)) ? ImGuiKeyModFlags_Super : 0);
+ io.AddKeyModEvent(key_mods);
ImGui_ImplAllegro5_UpdateMouseCursor();
}
diff --git a/backends/imgui_impl_android.cpp b/backends/imgui_impl_android.cpp
index 0a2bcba..a6811b3 100644
--- a/backends/imgui_impl_android.cpp
+++ b/backends/imgui_impl_android.cpp
@@ -278,11 +278,7 @@
io.AddKeyEvent(&key_queue.second.front());
key_queue.second.pop();
}
-
- io.KeyCtrl = ((g_KeyModFlags & ImGuiKeyModFlags_Ctrl) != 0);
- io.KeyShift = ((g_KeyModFlags & ImGuiKeyModFlags_Shift) != 0);
- io.KeyAlt = ((g_KeyModFlags & ImGuiKeyModFlags_Alt) != 0);
- io.KeySuper = ((g_KeyModFlags & ImGuiKeyModFlags_Super) != 0);
+ io.AddKeyModEvent(g_KeyModFlags);
// Setup display size (every frame to accommodate for window resizing)
int32_t window_width = ANativeWindow_getWidth(g_Window);
diff --git a/backends/imgui_impl_glfw.cpp b/backends/imgui_impl_glfw.cpp
index 1421272..db8ddde 100644
--- a/backends/imgui_impl_glfw.cpp
+++ b/backends/imgui_impl_glfw.cpp
@@ -547,10 +547,12 @@
{
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
ImGuiIO& io = ImGui::GetIO();
- io.KeyShift = ((glfwGetKey(bd->Window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS));
- io.KeyCtrl = ((glfwGetKey(bd->Window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS));
- io.KeyAlt = ((glfwGetKey(bd->Window, GLFW_KEY_LEFT_ALT) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_ALT) == GLFW_PRESS));
- io.KeySuper = ((glfwGetKey(bd->Window, GLFW_KEY_LEFT_SUPER) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_SUPER) == GLFW_PRESS));
+ ImGuiKeyModFlags key_mods =
+ (((glfwGetKey(bd->Window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS)) ? ImGuiKeyModFlags_Ctrl : 0) |
+ (((glfwGetKey(bd->Window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS)) ? ImGuiKeyModFlags_Shift : 0) |
+ (((glfwGetKey(bd->Window, GLFW_KEY_LEFT_ALT) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_ALT) == GLFW_PRESS)) ? ImGuiKeyModFlags_Alt : 0) |
+ (((glfwGetKey(bd->Window, GLFW_KEY_LEFT_SUPER) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_SUPER) == GLFW_PRESS)) ? ImGuiKeyModFlags_Super : 0);
+ io.AddKeyModEvent(key_mods);
}
void ImGui_ImplGlfw_NewFrame()
diff --git a/backends/imgui_impl_glut.cpp b/backends/imgui_impl_glut.cpp
index 21cf0a9..cab989d 100644
--- a/backends/imgui_impl_glut.cpp
+++ b/backends/imgui_impl_glut.cpp
@@ -205,11 +205,12 @@
static void ImGui_ImplGLUT_UpdateKeyboardMods()
{
ImGuiIO& io = ImGui::GetIO();
- int mods = glutGetModifiers();
- io.KeyCtrl = (mods & GLUT_ACTIVE_CTRL) != 0;
- io.KeyShift = (mods & GLUT_ACTIVE_SHIFT) != 0;
- io.KeyAlt = (mods & GLUT_ACTIVE_ALT) != 0;
- io.KeySuper = false;
+ int glut_key_mods = glutGetModifiers();
+ ImGuiKeyModFlags key_mods =
+ ((glut_key_mods & GLUT_ACTIVE_CTRL) ? ImGuiKeyModFlags_Ctrl : 0) |
+ ((glut_key_mods & GLUT_ACTIVE_SHIFT) ? ImGuiKeyModFlags_Shift : 0) |
+ ((glut_key_mods & GLUT_ACTIVE_ALT) ? ImGuiKeyModFlags_Alt : 0);
+ io.AddKeyModEvent(key_mods);
}
static void ImGui_ImplGLUT_AddKeyEvent(ImGuiKey key, bool down, int native_keycode)
diff --git a/backends/imgui_impl_osx.mm b/backends/imgui_impl_osx.mm
index 9a9aeae..2c77255 100644
--- a/backends/imgui_impl_osx.mm
+++ b/backends/imgui_impl_osx.mm
@@ -496,10 +496,7 @@
static void ImGui_ImplOSX_UpdateKeyModifiers()
{
ImGuiIO& io = ImGui::GetIO();
- io.KeyCtrl = (g_KeyModifiers & ImGuiKeyModFlags_Ctrl) != 0;
- io.KeyShift = (g_KeyModifiers & ImGuiKeyModFlags_Shift) != 0;
- io.KeyAlt = (g_KeyModifiers & ImGuiKeyModFlags_Alt) != 0;
- io.KeySuper = (g_KeyModifiers & ImGuiKeyModFlags_Super) != 0;
+ io.AddKeyModEvent(g_KeyModifiers);
}
void ImGui_ImplOSX_NewFrame(NSView* view)
diff --git a/backends/imgui_impl_sdl.cpp b/backends/imgui_impl_sdl.cpp
index 19cbce0..4ad2a75 100644
--- a/backends/imgui_impl_sdl.cpp
+++ b/backends/imgui_impl_sdl.cpp
@@ -506,13 +506,15 @@
static void ImGui_ImplSDL2_UpdateKeyModifiers()
{
- SDL_Keymod keymod = SDL_GetModState();
-
ImGuiIO& io = ImGui::GetIO();
- io.KeyShift = (keymod & KMOD_SHIFT) != 0;
- io.KeyCtrl = (keymod & KMOD_CTRL) != 0;
- io.KeyAlt = (keymod & KMOD_ALT) != 0;
- io.KeySuper = (keymod & KMOD_GUI) != 0;
+ SDL_Keymod sdl_key_mods = SDL_GetModState();
+ ImGuiKeyModFlags key_mods =
+ ((sdl_key_mods & KMOD_CTRL) ? ImGuiKeyModFlags_Ctrl : 0) |
+ ((sdl_key_mods & KMOD_SHIFT) ? ImGuiKeyModFlags_Shift : 0) |
+ ((sdl_key_mods & KMOD_ALT) ? ImGuiKeyModFlags_Alt : 0) |
+ ((sdl_key_mods & KMOD_GUI) ? ImGuiKeyModFlags_Super : 0);
+ io.AddKeyModEvent(key_mods);
+
}
void ImGui_ImplSDL2_NewFrame()
diff --git a/backends/imgui_impl_win32.cpp b/backends/imgui_impl_win32.cpp
index e91dd2f..c18b462 100644
--- a/backends/imgui_impl_win32.cpp
+++ b/backends/imgui_impl_win32.cpp
@@ -232,10 +232,12 @@
static void ImGui_ImplWin32_UpdateKeyModifiers()
{
ImGuiIO& io = ImGui::GetIO();
- io.KeyShift = IsVkDown(VK_LSHIFT) || IsVkDown(VK_RSHIFT);
- io.KeyCtrl = IsVkDown(VK_LCONTROL) || IsVkDown(VK_RCONTROL);
- io.KeyAlt = IsVkDown(VK_LMENU) || IsVkDown(VK_RMENU);
- io.KeySuper = IsVkDown(VK_LWIN) || IsVkDown(VK_RWIN);
+ ImGuiKeyModFlags key_mods =
+ ((IsVkDown(VK_LCONTROL) || IsVkDown(VK_RCONTROL)) ? ImGuiKeyModFlags_Ctrl : 0) |
+ ((IsVkDown(VK_LSHIFT) || IsVkDown(VK_RSHIFT)) ? ImGuiKeyModFlags_Shift : 0) |
+ ((IsVkDown(VK_LMENU) || IsVkDown(VK_RMENU)) ? ImGuiKeyModFlags_Alt : 0) |
+ ((IsVkDown(VK_LWIN) || IsVkDown(VK_RWIN)) ? ImGuiKeyModFlags_Super : 0);
+ io.AddKeyModEvent(key_mods);
}
static void ImGui_ImplWin32_UpdateMousePos()
diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt
index f4c3b13..e796724 100644
--- a/docs/CHANGELOG.txt
+++ b/docs/CHANGELOG.txt
@@ -38,7 +38,8 @@
Breaking Changes:
- Reworked IO keyboard input system. (#2625, #3724) [@thedmd]
- - Added io.AddKeyEvent() function obsoleting writing directly to io.KeyMap[], io.KeysDown[] arrays.
+ - Added io.AddKeyEvent() function, obsoleting writing directly to io.KeyMap[], io.KeysDown[] arrays.
+ - Added io.AddKeyModEvent() functio, obsoleting writing directly to io.KeyCtrl, io.KeyShift etc.
- Added full range of key enums in ImGuiKey (e.g. ImGuiKey_F1).
- Added GetKeyName() helper function.
- Obsoleted GetKeyIndex(): it is now unnecessary and will now return the same value.
diff --git a/imgui.cpp b/imgui.cpp
index befa40d..f06f4c7 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -390,6 +390,7 @@
- IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX)
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
- Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent()
+ - inputs: added io.AddKeyModEvent() instead of writing directly to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper.
- 2022/01/05 (1.87) - inputs: renamed ImGuiKey_KeyPadEnter to ImGuiKey_KeypadEnter to align with new symbols. Kept redirection enum.
- 2022/01/05 (1.87) - removed io.ImeSetInputScreenPosFn() in favor of more flexible io.SetPlatformImeDataFn(). Removed 'void* io.ImeWindowHandle' in favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'.
- 2022/01/01 (1.87) - commented out redirecting functions/enums names that were marked obsolete in 1.69, 1.70, 1.71, 1.72 (March-July 2019)
@@ -1264,6 +1265,15 @@
#endif
}
+void ImGuiIO::AddKeyModEvent(ImGuiKeyModFlags modifiers)
+{
+ KeyMods = modifiers;
+ KeyCtrl = (modifiers & ImGuiKeyModFlags_Ctrl) != 0;
+ KeyShift = (modifiers & ImGuiKeyModFlags_Shift) != 0;
+ KeyAlt = (modifiers & ImGuiKeyModFlags_Alt) != 0;
+ KeySuper = (modifiers & ImGuiKeyModFlags_Super) != 0;
+}
+
void ImGuiIO::AddFocusEvent(bool focused)
{
// We intentionally overwrite this and process in NewFrame(), in order to give a chance
diff --git a/imgui.h b/imgui.h
index f24d905..d14cdf4 100644
--- a/imgui.h
+++ b/imgui.h
@@ -2019,6 +2019,7 @@
// Input Functions
IMGUI_API void AddKeyEvent(const ImGuiIOKeyEvent* event); // Queue a new key down/up event
+ IMGUI_API void AddKeyModEvent(ImGuiKeyModFlags modifiers); // Queue a change of Ctrl/Shift/Alt/Super modifiers
IMGUI_API void AddFocusEvent(bool focused); // Queue an hosting application/platform windows gain or loss of focus
IMGUI_API void AddInputCharacter(unsigned int c); // Queue new character input
IMGUI_API void AddInputCharacterUTF16(ImWchar16 c); // Queue new character input from an UTF-16 character, it can be a surrogate