@ -16,6 +16,7 @@
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2023-01-04: Inputs: Fixed mods state on Linux when using Alt-GR text input (e.g. German keyboard layout), could lead to broken text input. Revert a 2022/01/17 change were we resumed using mods provided by GLFW, turns out they were faulty.
// 2022-11-22: Perform a dummy glfwGetError() read to cancel missing names with glfwGetKeyName(). (#5908)
// 2022-10-18: Perform a dummy glfwGetError() read to cancel missing mouse cursors errors. Using GLFW_VERSION_COMBINED directly. (#5785)
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
@ -251,26 +252,16 @@ static ImGuiKey ImGui_ImplGlfw_KeyToImGuiKey(int key)
}
}
static int ImGui_ImplGlfw_KeyToModifier ( int key )
{
if ( key = = GLFW_KEY_LEFT_CONTROL | | key = = GLFW_KEY_RIGHT_CONTROL )
return GLFW_MOD_CONTROL ;
if ( key = = GLFW_KEY_LEFT_SHIFT | | key = = GLFW_KEY_RIGHT_SHIFT )
return GLFW_MOD_SHIFT ;
if ( key = = GLFW_KEY_LEFT_ALT | | key = = GLFW_KEY_RIGHT_ALT )
return GLFW_MOD_ALT ;
if ( key = = GLFW_KEY_LEFT_SUPER | | key = = GLFW_KEY_RIGHT_SUPER )
return GLFW_MOD_SUPER ;
return 0 ;
}
static void ImGui_ImplGlfw_UpdateKeyModifiers ( int mods )
// X11 does not include current pressed/released modifier key in 'mods' flags submitted by GLFW
// See https://github.com/ocornut/imgui/issues/6034 and https://github.com/glfw/glfw/issues/1630
static void ImGui_ImplGlfw_UpdateKeyModifiers ( )
{
ImGuiIO & io = ImGui : : GetIO ( ) ;
io . AddKeyEvent ( ImGuiMod_Ctrl , ( mods & GLFW_MOD_CONTROL ) ! = 0 ) ;
io . AddKeyEvent ( ImGuiMod_Shift , ( mods & GLFW_MOD_SHIFT ) ! = 0 ) ;
io . AddKeyEvent ( ImGuiMod_Alt , ( mods & GLFW_MOD_ALT ) ! = 0 ) ;
io . AddKeyEvent ( ImGuiMod_Super , ( mods & GLFW_MOD_SUPER ) ! = 0 ) ;
ImGui_ImplGlfw_Data * bd = ImGui_ImplGlfw_GetBackendData ( ) ;
io . AddKeyEvent ( ImGuiMod_Ctrl , ( glfwGetKey ( bd - > Window , GLFW_KEY_LEFT_CONTROL ) = = GLFW_PRESS ) | | ( glfwGetKey ( bd - > Window , GLFW_KEY_RIGHT_CONTROL ) = = GLFW_PRESS ) ) ;
io . AddKeyEvent ( ImGuiMod_Shift , ( glfwGetKey ( bd - > Window , GLFW_KEY_LEFT_SHIFT ) = = GLFW_PRESS ) | | ( glfwGetKey ( bd - > Window , GLFW_KEY_RIGHT_SHIFT ) = = GLFW_PRESS ) ) ;
io . AddKeyEvent ( ImGuiMod_Alt , ( glfwGetKey ( bd - > Window , GLFW_KEY_LEFT_ALT ) = = GLFW_PRESS ) | | ( glfwGetKey ( bd - > Window , GLFW_KEY_RIGHT_ALT ) = = GLFW_PRESS ) ) ;
io . AddKeyEvent ( ImGuiMod_Super , ( glfwGetKey ( bd - > Window , GLFW_KEY_LEFT_SUPER ) = = GLFW_PRESS ) | | ( glfwGetKey ( bd - > Window , GLFW_KEY_RIGHT_SUPER ) = = GLFW_PRESS ) ) ;
}
void ImGui_ImplGlfw_MouseButtonCallback ( GLFWwindow * window , int button , int action , int mods )
@ -279,7 +270,7 @@ void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int acti
if ( bd - > PrevUserCallbackMousebutton ! = nullptr & & window = = bd - > Window )
bd - > PrevUserCallbackMousebutton ( window , button , action , mods ) ;
ImGui_ImplGlfw_UpdateKeyModifiers ( mods ) ;
ImGui_ImplGlfw_UpdateKeyModifiers ( ) ;
ImGuiIO & io = ImGui : : GetIO ( ) ;
if ( button > = 0 & & button < ImGuiMouseButton_COUNT )
@ -338,10 +329,7 @@ void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int keycode, int scancode, i
if ( action ! = GLFW_PRESS & & action ! = GLFW_RELEASE )
return ;
// Workaround: X11 does not include current pressed/released modifier key in 'mods' flags. https://github.com/glfw/glfw/issues/1630
if ( int keycode_to_mod = ImGui_ImplGlfw_KeyToModifier ( keycode ) )
mods = ( action = = GLFW_PRESS ) ? ( mods | keycode_to_mod ) : ( mods & ~ keycode_to_mod ) ;
ImGui_ImplGlfw_UpdateKeyModifiers ( mods ) ;
ImGui_ImplGlfw_UpdateKeyModifiers ( ) ;
keycode = ImGui_ImplGlfw_TranslateUntranslatedKey ( keycode , scancode ) ;