mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Inputs: Fixed IsMouseClicked() repeat mode rate being half of keyboard repeat rate. Using KeyModAlt. Removed KeyModsPrev.
This commit is contained in:
		| @@ -39,6 +39,7 @@ Breaking changes: | |||||||
|  |  | ||||||
| Other Changes: | Other Changes: | ||||||
|  |  | ||||||
|  | - Inputs: Fixed IsMouseClicked() repeat mode rate being half of keyboard repeat rate. | ||||||
| - Stack Tool: Added option to copy item path to clipboard. (#4631) | - Stack Tool: Added option to copy item path to clipboard. (#4631) | ||||||
| - Misc: Added constexpr to ImVec2/ImVec4 inline constructors. (#4995) [@Myriachan] | - Misc: Added constexpr to ImVec2/ImVec4 inline constructors. (#4995) [@Myriachan] | ||||||
| - Misc: binary_to_compressed_c tool: Added -nostatic option. (#5021) [@podsvirov] | - Misc: binary_to_compressed_c tool: Added -nostatic option. (#5021) [@podsvirov] | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -1250,7 +1250,7 @@ void ImGuiIO::ClearInputKeys() | |||||||
|         KeysData[n].DownDurationPrev = -1.0f; |         KeysData[n].DownDurationPrev = -1.0f; | ||||||
|     } |     } | ||||||
|     KeyCtrl = KeyShift = KeyAlt = KeySuper = false; |     KeyCtrl = KeyShift = KeyAlt = KeySuper = false; | ||||||
|     KeyMods = KeyModsPrev = ImGuiKeyModFlags_None; |     KeyMods = ImGuiKeyModFlags_None; | ||||||
|     for (int n = 0; n < IM_ARRAYSIZE(NavInputsDownDuration); n++) |     for (int n = 0; n < IM_ARRAYSIZE(NavInputsDownDuration); n++) | ||||||
|         NavInputsDownDuration[n] = NavInputsDownDurationPrev[n] = -1.0f; |         NavInputsDownDuration[n] = NavInputsDownDurationPrev[n] = -1.0f; | ||||||
| } | } | ||||||
| @@ -3938,9 +3938,6 @@ static void ImGui::UpdateKeyboardInputs() | |||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     ImGuiIO& io = g.IO; |     ImGuiIO& io = g.IO; | ||||||
|  |  | ||||||
|     // Synchronize io.KeyMods with individual modifiers io.KeyXXX bools |  | ||||||
|     io.KeyMods = GetMergedKeyModFlags(); |  | ||||||
|  |  | ||||||
|     // Import legacy keys or verify they are not used |     // Import legacy keys or verify they are not used | ||||||
| #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO | #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO | ||||||
|     if (io.BackendUsingLegacyKeyArrays == 0) |     if (io.BackendUsingLegacyKeyArrays == 0) | ||||||
| @@ -3982,6 +3979,9 @@ static void ImGui::UpdateKeyboardInputs() | |||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |     // Synchronize io.KeyMods with individual modifiers io.KeyXXX bools | ||||||
|  |     io.KeyMods = GetMergedKeyModFlags(); | ||||||
|  |  | ||||||
|     // Clear gamepad data if disabled |     // Clear gamepad data if disabled | ||||||
|     if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0) |     if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0) | ||||||
|         for (int i = ImGuiKey_Gamepad_BEGIN; i < ImGuiKey_Gamepad_END; i++) |         for (int i = ImGuiKey_Gamepad_BEGIN; i < ImGuiKey_Gamepad_END; i++) | ||||||
| @@ -4864,7 +4864,6 @@ void ImGui::EndFrame() | |||||||
|     // Clear Input data for next frame |     // Clear Input data for next frame | ||||||
|     g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; |     g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; | ||||||
|     g.IO.InputQueueCharacters.resize(0); |     g.IO.InputQueueCharacters.resize(0); | ||||||
|     g.IO.KeyModsPrev = g.IO.KeyMods; // doing it here is better than in NewFrame() as we'll tolerate backend writing to KeyMods. If we want to firmly disallow it we should detect it. |  | ||||||
|     memset(g.IO.NavInputs, 0, sizeof(g.IO.NavInputs)); |     memset(g.IO.NavInputs, 0, sizeof(g.IO.NavInputs)); | ||||||
|  |  | ||||||
|     CallContextHooks(&g, ImGuiContextHookType_EndFramePost); |     CallContextHooks(&g, ImGuiContextHookType_EndFramePost); | ||||||
| @@ -7657,14 +7656,8 @@ bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat) | |||||||
|     const float t = g.IO.MouseDownDuration[button]; |     const float t = g.IO.MouseDownDuration[button]; | ||||||
|     if (t == 0.0f) |     if (t == 0.0f) | ||||||
|         return true; |         return true; | ||||||
|  |  | ||||||
|     if (repeat && t > g.IO.KeyRepeatDelay) |     if (repeat && t > g.IO.KeyRepeatDelay) | ||||||
|     { |         return CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0; | ||||||
|         // FIXME: 2019/05/03: Our old repeat code was wrong here and led to doubling the repeat rate, which made it an ok rate for repeat on mouse hold. |  | ||||||
|         int amount = CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate * 0.50f); |  | ||||||
|         if (amount > 0) |  | ||||||
|             return true; |  | ||||||
|     } |  | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -10796,7 +10789,7 @@ static void ImGui::NavUpdateWindowing() | |||||||
|     // - Testing that only Alt is tested prevents Alt+Shift or AltGR from toggling menu layer. |     // - Testing that only Alt is tested prevents Alt+Shift or AltGR from toggling menu layer. | ||||||
|     // - AltGR is normally Alt+Ctrl but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). But even on keyboards without AltGR we don't want Alt+Ctrl to open menu anyway. |     // - AltGR is normally Alt+Ctrl but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). But even on keyboards without AltGR we don't want Alt+Ctrl to open menu anyway. | ||||||
| 	const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; | 	const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; | ||||||
|     if (nav_keyboard_active && io.KeyMods == ImGuiKeyModFlags_Alt && (io.KeyModsPrev & ImGuiKeyModFlags_Alt) == 0) |     if (nav_keyboard_active && IsKeyPressed(ImGuiKey_ModAlt)) | ||||||
|     { |     { | ||||||
|         g.NavWindowingToggleLayer = true; |         g.NavWindowingToggleLayer = true; | ||||||
|         g.NavInputSource = ImGuiInputSource_Keyboard; |         g.NavInputSource = ImGuiInputSource_Keyboard; | ||||||
| @@ -10809,13 +10802,12 @@ static void ImGui::NavUpdateWindowing() | |||||||
|             g.NavWindowingToggleLayer = false; |             g.NavWindowingToggleLayer = false; | ||||||
|  |  | ||||||
|         // Apply layer toggle on release |         // Apply layer toggle on release | ||||||
|         // Important: we don't assume that Alt was previously held in order to handle loss of focus when backend calls io.AddFocusEvent(false) |  | ||||||
|         // Important: as before version <18314 we lacked an explicit IO event for focus gain/loss, we also compare mouse validity to detect old backends clearing mouse pos on focus loss. |         // Important: as before version <18314 we lacked an explicit IO event for focus gain/loss, we also compare mouse validity to detect old backends clearing mouse pos on focus loss. | ||||||
|         if (!(io.KeyMods & ImGuiKeyModFlags_Alt) && (io.KeyModsPrev & ImGuiKeyModFlags_Alt) && g.NavWindowingToggleLayer) |         if (IsKeyReleased(ImGuiKey_ModAlt) && g.NavWindowingToggleLayer) | ||||||
|             if (g.ActiveId == 0 || g.ActiveIdAllowOverlap) |             if (g.ActiveId == 0 || g.ActiveIdAllowOverlap) | ||||||
|                 if (IsMousePosValid(&io.MousePos) == IsMousePosValid(&io.MousePosPrev)) |                 if (IsMousePosValid(&io.MousePos) == IsMousePosValid(&io.MousePosPrev)) | ||||||
|                     apply_toggle_layer = true; |                     apply_toggle_layer = true; | ||||||
|         if (!io.KeyAlt) |         if (!IsKeyDown(ImGuiKey_ModAlt)) | ||||||
|             g.NavWindowingToggleLayer = false; |             g.NavWindowingToggleLayer = false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -65,7 +65,7 @@ Index of this file: | |||||||
| // Version | // Version | ||||||
| // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | ||||||
| #define IMGUI_VERSION               "1.88 WIP" | #define IMGUI_VERSION               "1.88 WIP" | ||||||
| #define IMGUI_VERSION_NUM           18704 | #define IMGUI_VERSION_NUM           18705 | ||||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||||
| #define IMGUI_HAS_TABLE | #define IMGUI_HAS_TABLE | ||||||
|  |  | ||||||
| @@ -2029,7 +2029,6 @@ struct ImGuiIO | |||||||
|  |  | ||||||
|     // Other state maintained from data above + IO function calls |     // Other state maintained from data above + IO function calls | ||||||
|     ImGuiKeyModFlags KeyMods;                       // Key mods flags (same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags), updated by NewFrame() |     ImGuiKeyModFlags KeyMods;                       // Key mods flags (same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags), updated by NewFrame() | ||||||
|     ImGuiKeyModFlags KeyModsPrev;                   // Key mods flags (from previous frame) |  | ||||||
|     ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE];  // Key state for all known keys. Use IsKeyXXX() functions to access this. |     ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE];  // Key state for all known keys. Use IsKeyXXX() functions to access this. | ||||||
|     bool        WantCaptureMouseUnlessPopupClose;   // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup. |     bool        WantCaptureMouseUnlessPopupClose;   // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup. | ||||||
|     ImVec2      MousePosPrev;                       // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid) |     ImVec2      MousePosPrev;                       // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid) | ||||||
|   | |||||||
| @@ -547,11 +547,11 @@ struct ImBitArray | |||||||
|     ImBitArray()                                { ClearAllBits(); } |     ImBitArray()                                { ClearAllBits(); } | ||||||
|     void            ClearAllBits()              { memset(Storage, 0, sizeof(Storage)); } |     void            ClearAllBits()              { memset(Storage, 0, sizeof(Storage)); } | ||||||
|     void            SetAllBits()                { memset(Storage, 255, sizeof(Storage)); } |     void            SetAllBits()                { memset(Storage, 255, sizeof(Storage)); } | ||||||
|     bool            TestBit(int n) const        { IM_ASSERT(n + OFFSET < BITCOUNT); return ImBitArrayTestBit(Storage, n + OFFSET); } |     bool            TestBit(int n) const        { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } | ||||||
|     void            SetBit(int n)               { IM_ASSERT(n + OFFSET < BITCOUNT); ImBitArraySetBit(Storage, n + OFFSET); } |     void            SetBit(int n)               { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Storage, n); } | ||||||
|     void            ClearBit(int n)             { IM_ASSERT(n + OFFSET < BITCOUNT); ImBitArrayClearBit(Storage, n + OFFSET); } |     void            ClearBit(int n)             { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Storage, n); } | ||||||
|     void            SetBitRange(int n, int n2)  { ImBitArraySetBitRange(Storage, n + OFFSET, n2 + OFFSET); } // Works on range [n..n2) |     void            SetBitRange(int n, int n2)  { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2) | ||||||
|     bool            operator[](int n) const     { IM_ASSERT(n + OFFSET < BITCOUNT); return ImBitArrayTestBit(Storage, n + OFFSET); } |     bool            operator[](int n) const     { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Helper: ImBitVector | // Helper: ImBitVector | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user