mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Internals, Inputs: *Breaking* Swapped parameter order of owner-aware versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(). (#456)
For several reasons those changes makes sense. They are being made because making some of those API public.
Only past users of imgui_internal.h with the extra parameters will be affected.
Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL.
Amend 4448d975 (#456, #2637, #2620, #2891, #3370, #4828, #5108, #5242, #5641)
			
			
This commit is contained in:
		| @@ -53,16 +53,6 @@ Breaking changes: | |||||||
| - Backends: SDL_Renderer2/SDL_Renderer3: and ImGui_ImplSDLRenderer2_RenderDrawData() and | - Backends: SDL_Renderer2/SDL_Renderer3: and ImGui_ImplSDLRenderer2_RenderDrawData() and | ||||||
|   ImGui_ImplSDLRenderer3_RenderDrawData() now takes a SDL_Renderer* parameter. This was previously |   ImGui_ImplSDLRenderer3_RenderDrawData() now takes a SDL_Renderer* parameter. This was previously | ||||||
|   overlooked from the API but it will facilitate eventual support for multi-viewports. |   overlooked from the API but it will facilitate eventual support for multi-viewports. | ||||||
| - Inputs: (not public nor documented yet, but disclosing breaking changes |  | ||||||
|   because I expect a few advanced users caught on owner-aware inputs system): |  | ||||||
|   - (Internals) Renamed ImGuiKeyOwner_None to ImGuiKeyOwner_NoOwner, to make use more explicit and |  | ||||||
|     reduce confusion with the default it is a non-zero value and cannot be the default value. |  | ||||||
|   - (Internals) Shortcut(), SetShortcutRouting(): swapped last two parameters order in function signatures: |  | ||||||
|       Before: Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); |  | ||||||
|       After:  Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0, ImGuiID owner_id = 0); |  | ||||||
|   - For several reasons those changes makes sense. They are being made because making some of |  | ||||||
|     those API public. Only past users of imgui_internal.h with the extra parameters will be affected. |  | ||||||
|     Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL. |  | ||||||
|  |  | ||||||
| Other changes: | Other changes: | ||||||
|  |  | ||||||
| @@ -86,6 +76,26 @@ Other changes: | |||||||
|   calls in WndProc this is facilitating. (#6275) [@MennoVink] |   calls in WndProc this is facilitating. (#6275) [@MennoVink] | ||||||
| - Backends, Examples: SDL3: updates for latest SDL3 API changes. (#7580) [@kuvaus, @ocornut] | - Backends, Examples: SDL3: updates for latest SDL3 API changes. (#7580) [@kuvaus, @ocornut] | ||||||
|  |  | ||||||
|  | Breaking changes IF you were using imgui_internal.h versions of Shortcut() or owner-aware | ||||||
|  | versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked() prior to this version: | ||||||
|  |  | ||||||
|  | - Inputs (Internals) Renamed ImGuiKeyOwner_None to ImGuiKeyOwner_NoOwner, to make use more | ||||||
|  |   explicit and reduce confusion with the fact it is a non-zero value and cannot be the | ||||||
|  |   default value. | ||||||
|  | - Inputs (Internals) Shortcut(), SetShortcutRouting(): swapped last two parameters order | ||||||
|  |   in function signatures: | ||||||
|  |       Before: Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); | ||||||
|  |       After:  Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0, ImGuiID owner_id = 0); | ||||||
|  | - Inputs (Internals): owner-aware versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(): | ||||||
|  |   swapped last two parameters order in function signatures: | ||||||
|  |       Before: IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); | ||||||
|  |       After:  IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); | ||||||
|  |       Before: IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0); | ||||||
|  |       After:  IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0); | ||||||
|  | - For several reasons those changes makes sense. They are being made because making some of | ||||||
|  |   those API public. Only past users of imgui_internal.h with the extra parameters will be affected. | ||||||
|  |   Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL. | ||||||
|  |  | ||||||
|  |  | ||||||
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ||||||
|  VERSION 1.90.6 (Released 2024-05-08) |  VERSION 1.90.6 (Released 2024-05-08) | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -434,6 +434,11 @@ CODE | |||||||
|                        - inputs (internals): Shortcut(), SetShortcutRouting(): swapped last two parameters order in function signatures: |                        - inputs (internals): Shortcut(), SetShortcutRouting(): swapped last two parameters order in function signatures: | ||||||
|                             - old: Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); |                             - old: Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); | ||||||
|                             - new: Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0, ImGuiID owner_id = 0); |                             - new: Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0, ImGuiID owner_id = 0); | ||||||
|  |                        - inputs (internals): owner-aware versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(): swapped last two parameters order in function signatures. | ||||||
|  |                             - old: IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); | ||||||
|  |                             - new: IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); | ||||||
|  |                             - old: IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0); | ||||||
|  |                             - new: IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0); | ||||||
|                          for various reasons those changes makes sense. They are being made because making some of those API public. |                          for various reasons those changes makes sense. They are being made because making some of those API public. | ||||||
|                          only past users of imgui_internal.h with the extra parameters will be affected. Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL. |                          only past users of imgui_internal.h with the extra parameters will be affected. Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL. | ||||||
|  - 2024/05/16 (1.90.7) - inputs: on macOS X, Cmd and Ctrl keys are now automatically swapped by io.AddKeyEvent() as this naturally align with how macOS X uses those keys. |  - 2024/05/16 (1.90.7) - inputs: on macOS X, Cmd and Ctrl keys are now automatically swapped by io.AddKeyEvent() as this naturally align with how macOS X uses those keys. | ||||||
| @@ -8749,11 +8754,11 @@ bool ImGui::IsKeyDown(ImGuiKey key, ImGuiID owner_id) | |||||||
|  |  | ||||||
| bool ImGui::IsKeyPressed(ImGuiKey key, bool repeat) | bool ImGui::IsKeyPressed(ImGuiKey key, bool repeat) | ||||||
| { | { | ||||||
|     return IsKeyPressed(key, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); |     return IsKeyPressed(key, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None, ImGuiKeyOwner_Any); | ||||||
| } | } | ||||||
|  |  | ||||||
| // Important: unless legacy IsKeyPressed(ImGuiKey, bool repeat=true) which DEFAULT to repeat, this requires EXPLICIT repeat. | // Important: unless legacy IsKeyPressed(ImGuiKey, bool repeat=true) which DEFAULT to repeat, this requires EXPLICIT repeat. | ||||||
| bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) | bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id) | ||||||
| { | { | ||||||
|     const ImGuiKeyData* key_data = GetKeyData(key); |     const ImGuiKeyData* key_data = GetKeyData(key); | ||||||
|     if (!key_data->Down) // In theory this should already be encoded as (DownDuration < 0.0f), but testing this facilitates eating mechanism (until we finish work on key ownership) |     if (!key_data->Down) // In theory this should already be encoded as (DownDuration < 0.0f), but testing this facilitates eating mechanism (until we finish work on key ownership) | ||||||
| @@ -8826,7 +8831,7 @@ bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat) | |||||||
|     return IsMouseClicked(button, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); |     return IsMouseClicked(button, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags) | bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); |     IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); | ||||||
| @@ -9652,7 +9657,7 @@ bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord) | |||||||
| } | } | ||||||
|  |  | ||||||
| // This is equivalent to comparing KeyMods + doing a IsKeyPressed() | // This is equivalent to comparing KeyMods + doing a IsKeyPressed() | ||||||
| bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags) | bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     key_chord = FixupKeyChord(key_chord); |     key_chord = FixupKeyChord(key_chord); | ||||||
| @@ -9664,7 +9669,7 @@ bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiIn | |||||||
|     ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); |     ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); | ||||||
|     if (key == ImGuiKey_None) |     if (key == ImGuiKey_None) | ||||||
|         key = ConvertSingleModFlagToKey(mods); |         key = ConvertSingleModFlagToKey(mods); | ||||||
|     if (!IsKeyPressed(key, owner_id, (flags & ImGuiInputFlags_RepeatMask_))) |     if (!IsKeyPressed(key, (flags & ImGuiInputFlags_RepeatMask_), owner_id)) | ||||||
|         return false; |         return false; | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| @@ -9699,7 +9704,7 @@ bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID own | |||||||
|     if ((flags & ImGuiInputFlags_Repeat) != 0 && (flags & ImGuiInputFlags_RepeatUntilMask_) == 0) |     if ((flags & ImGuiInputFlags_Repeat) != 0 && (flags & ImGuiInputFlags_RepeatUntilMask_) == 0) | ||||||
|         flags |= ImGuiInputFlags_RepeatUntilKeyModsChange; |         flags |= ImGuiInputFlags_RepeatUntilKeyModsChange; | ||||||
|  |  | ||||||
|     if (!IsKeyChordPressed(key_chord, owner_id, flags)) |     if (!IsKeyChordPressed(key_chord, flags, owner_id)) | ||||||
|         return false; |         return false; | ||||||
|     IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function! |     IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function! | ||||||
|     return true; |     return true; | ||||||
| @@ -12130,9 +12135,9 @@ static void ImGui::NavUpdate() | |||||||
|     if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) |     if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) | ||||||
|     { |     { | ||||||
|         const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate, ImGuiKeyOwner_NoOwner)); |         const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate, ImGuiKeyOwner_NoOwner)); | ||||||
|         const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, ImGuiKeyOwner_NoOwner))); |         const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, 0, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, 0, ImGuiKeyOwner_NoOwner))); | ||||||
|         const bool input_down = (nav_keyboard_active && (IsKeyDown(ImGuiKey_Enter, ImGuiKeyOwner_NoOwner) || IsKeyDown(ImGuiKey_KeypadEnter, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput, ImGuiKeyOwner_NoOwner)); |         const bool input_down = (nav_keyboard_active && (IsKeyDown(ImGuiKey_Enter, ImGuiKeyOwner_NoOwner) || IsKeyDown(ImGuiKey_KeypadEnter, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput, ImGuiKeyOwner_NoOwner)); | ||||||
|         const bool input_pressed = input_down && ((nav_keyboard_active && (IsKeyPressed(ImGuiKey_Enter, ImGuiKeyOwner_NoOwner) || IsKeyPressed(ImGuiKey_KeypadEnter, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, ImGuiKeyOwner_NoOwner))); |         const bool input_pressed = input_down && ((nav_keyboard_active && (IsKeyPressed(ImGuiKey_Enter, 0, ImGuiKeyOwner_NoOwner) || IsKeyPressed(ImGuiKey_KeypadEnter, 0, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, 0, ImGuiKeyOwner_NoOwner))); | ||||||
|         if (g.ActiveId == 0 && activate_pressed) |         if (g.ActiveId == 0 && activate_pressed) | ||||||
|         { |         { | ||||||
|             g.NavActivateId = g.NavId; |             g.NavActivateId = g.NavId; | ||||||
| @@ -12306,10 +12311,10 @@ void ImGui::NavUpdateCreateMoveRequest() | |||||||
|         if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) |         if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) | ||||||
|         { |         { | ||||||
|             const ImGuiInputFlags repeat_mode = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateNavMove; |             const ImGuiInputFlags repeat_mode = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateNavMove; | ||||||
|             if (!IsActiveIdUsingNavDir(ImGuiDir_Left)  && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft,  ImGuiKeyOwner_NoOwner, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow,  ImGuiKeyOwner_NoOwner, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Left; } |             if (!IsActiveIdUsingNavDir(ImGuiDir_Left)  && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft,  repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow,  repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Left; } | ||||||
|             if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, ImGuiKeyOwner_NoOwner, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, ImGuiKeyOwner_NoOwner, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Right; } |             if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Right; } | ||||||
|             if (!IsActiveIdUsingNavDir(ImGuiDir_Up)    && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp,    ImGuiKeyOwner_NoOwner, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow,    ImGuiKeyOwner_NoOwner, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Up; } |             if (!IsActiveIdUsingNavDir(ImGuiDir_Up)    && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp,    repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow,    repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Up; } | ||||||
|             if (!IsActiveIdUsingNavDir(ImGuiDir_Down)  && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown,  ImGuiKeyOwner_NoOwner, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow,  ImGuiKeyOwner_NoOwner, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Down; } |             if (!IsActiveIdUsingNavDir(ImGuiDir_Down)  && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown,  repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow,  repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Down; } | ||||||
|         } |         } | ||||||
|         g.NavMoveClipDir = g.NavMoveDir; |         g.NavMoveClipDir = g.NavMoveDir; | ||||||
|         g.NavScoringNoClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); |         g.NavScoringNoClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); | ||||||
| @@ -12405,7 +12410,7 @@ void ImGui::NavUpdateCreateTabbingRequest() | |||||||
|     if (window == NULL || g.NavWindowingTarget != NULL || (window->Flags & ImGuiWindowFlags_NoNavInputs)) |     if (window == NULL || g.NavWindowingTarget != NULL || (window->Flags & ImGuiWindowFlags_NoNavInputs)) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiKeyOwner_NoOwner, ImGuiInputFlags_Repeat) && !g.IO.KeyCtrl && !g.IO.KeyAlt; |     const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner) && !g.IO.KeyCtrl && !g.IO.KeyAlt; | ||||||
|     if (!tab_pressed) |     if (!tab_pressed) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
| @@ -12543,7 +12548,7 @@ static void ImGui::NavUpdateCancelRequest() | |||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     const bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; |     const bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; | ||||||
|     const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; |     const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; | ||||||
|     if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, ImGuiKeyOwner_NoOwner)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, ImGuiKeyOwner_NoOwner))) |     if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, 0, ImGuiKeyOwner_NoOwner)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, 0, ImGuiKeyOwner_NoOwner))) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     IMGUI_DEBUG_LOG_NAV("[nav] NavUpdateCancelRequest()\n"); |     IMGUI_DEBUG_LOG_NAV("[nav] NavUpdateCancelRequest()\n"); | ||||||
| @@ -12594,8 +12599,8 @@ static float ImGui::NavUpdatePageUpPageDown() | |||||||
|  |  | ||||||
|     const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_NoOwner); |     const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_NoOwner); | ||||||
|     const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_NoOwner); |     const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_NoOwner); | ||||||
|     const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiKeyOwner_NoOwner, ImGuiInputFlags_Repeat); |     const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner); | ||||||
|     const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiKeyOwner_NoOwner, ImGuiInputFlags_Repeat); |     const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner); | ||||||
|     if (page_up_held == page_down_held && home_pressed == end_pressed) // Proceed if either (not both) are pressed, otherwise early out |     if (page_up_held == page_down_held && home_pressed == end_pressed) // Proceed if either (not both) are pressed, otherwise early out | ||||||
|         return 0.0f; |         return 0.0f; | ||||||
|  |  | ||||||
| @@ -12605,9 +12610,9 @@ static float ImGui::NavUpdatePageUpPageDown() | |||||||
|     if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavWindowHasScrollY) |     if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavWindowHasScrollY) | ||||||
|     { |     { | ||||||
|         // Fallback manual-scroll when window has no navigable item |         // Fallback manual-scroll when window has no navigable item | ||||||
|         if (IsKeyPressed(ImGuiKey_PageUp, ImGuiKeyOwner_NoOwner, ImGuiInputFlags_Repeat)) |         if (IsKeyPressed(ImGuiKey_PageUp, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner)) | ||||||
|             SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight()); |             SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight()); | ||||||
|         else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiKeyOwner_NoOwner, ImGuiInputFlags_Repeat)) |         else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner)) | ||||||
|             SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight()); |             SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight()); | ||||||
|         else if (home_pressed) |         else if (home_pressed) | ||||||
|             SetScrollY(window, 0.0f); |             SetScrollY(window, 0.0f); | ||||||
| @@ -12802,7 +12807,7 @@ static void ImGui::NavUpdateWindowing() | |||||||
|     const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; |     const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; | ||||||
|     const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id); |     const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id); | ||||||
|     const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id); |     const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id); | ||||||
|     const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, 0, ImGuiInputFlags_None); |     const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, ImGuiInputFlags_None); | ||||||
|     const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && (keyboard_next_window || keyboard_prev_window); // Note: enabled even without NavEnableKeyboard! |     const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && (keyboard_next_window || keyboard_prev_window); // Note: enabled even without NavEnableKeyboard! | ||||||
|     if (start_windowing_with_gamepad || start_windowing_with_keyboard) |     if (start_windowing_with_gamepad || start_windowing_with_keyboard) | ||||||
|         if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) |         if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) | ||||||
| @@ -12861,7 +12866,7 @@ static void ImGui::NavUpdateWindowing() | |||||||
|     // Keyboard: Press and Release ALT to toggle menu layer |     // Keyboard: Press and Release ALT to toggle menu layer | ||||||
|     const ImGuiKey windowing_toggle_keys[] = { ImGuiKey_LeftAlt, ImGuiKey_RightAlt }; |     const ImGuiKey windowing_toggle_keys[] = { ImGuiKey_LeftAlt, ImGuiKey_RightAlt }; | ||||||
|     for (ImGuiKey windowing_toggle_key : windowing_toggle_keys) |     for (ImGuiKey windowing_toggle_key : windowing_toggle_keys) | ||||||
|         if (nav_keyboard_active && IsKeyPressed(windowing_toggle_key, ImGuiKeyOwner_NoOwner)) |         if (nav_keyboard_active && IsKeyPressed(windowing_toggle_key, 0, ImGuiKeyOwner_NoOwner)) | ||||||
|         { |         { | ||||||
|             g.NavWindowingToggleLayer = true; |             g.NavWindowingToggleLayer = true; | ||||||
|             g.NavWindowingToggleKey = windowing_toggle_key; |             g.NavWindowingToggleKey = windowing_toggle_key; | ||||||
|   | |||||||
| @@ -3267,11 +3267,11 @@ namespace ImGui | |||||||
|     //   Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease. |     //   Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease. | ||||||
|     // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API. |     // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API. | ||||||
|     IMGUI_API bool          IsKeyDown(ImGuiKey key, ImGuiID owner_id); |     IMGUI_API bool          IsKeyDown(ImGuiKey key, ImGuiID owner_id); | ||||||
|     IMGUI_API bool          IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);    // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat. |     IMGUI_API bool          IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0);    // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat. | ||||||
|     IMGUI_API bool          IsKeyReleased(ImGuiKey key, ImGuiID owner_id); |     IMGUI_API bool          IsKeyReleased(ImGuiKey key, ImGuiID owner_id); | ||||||
|     IMGUI_API bool          IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags = 0); |     IMGUI_API bool          IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id = 0); | ||||||
|     IMGUI_API bool          IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id); |     IMGUI_API bool          IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id); | ||||||
|     IMGUI_API bool          IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0); |     IMGUI_API bool          IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0); | ||||||
|     IMGUI_API bool          IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id); |     IMGUI_API bool          IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id); | ||||||
|     IMGUI_API bool          IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id); |     IMGUI_API bool          IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -547,7 +547,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool | |||||||
|         for (int button = 0; button < 3; button++) |         for (int button = 0; button < 3; button++) | ||||||
|             if (flags & (ImGuiButtonFlags_MouseButtonLeft << button)) // Handle ImGuiButtonFlags_MouseButtonRight and ImGuiButtonFlags_MouseButtonMiddle here. |             if (flags & (ImGuiButtonFlags_MouseButtonLeft << button)) // Handle ImGuiButtonFlags_MouseButtonRight and ImGuiButtonFlags_MouseButtonMiddle here. | ||||||
|             { |             { | ||||||
|                 if (IsMouseClicked(button, test_owner_id) && mouse_button_clicked == -1) { mouse_button_clicked = button; } |                 if (IsMouseClicked(button, ImGuiInputFlags_None, test_owner_id) && mouse_button_clicked == -1) { mouse_button_clicked = button; } | ||||||
|                 if (IsMouseReleased(button, test_owner_id) && mouse_button_released == -1) { mouse_button_released = button; } |                 if (IsMouseReleased(button, test_owner_id) && mouse_button_released == -1) { mouse_button_released = button; } | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -595,7 +595,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool | |||||||
|             // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). |             // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). | ||||||
|             // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. |             // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. | ||||||
|             if (g.ActiveId == id && (item_flags & ImGuiItemFlags_ButtonRepeat)) |             if (g.ActiveId == id && (item_flags & ImGuiItemFlags_ButtonRepeat)) | ||||||
|                 if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, test_owner_id, ImGuiInputFlags_Repeat)) |                 if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, ImGuiInputFlags_Repeat, test_owner_id)) | ||||||
|                     pressed = true; |                     pressed = true; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -2468,7 +2468,7 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, | |||||||
|     if (!temp_input_is_active) |     if (!temp_input_is_active) | ||||||
|     { |     { | ||||||
|         // Tabbing or CTRL-clicking on Drag turns it into an InputText |         // Tabbing or CTRL-clicking on Drag turns it into an InputText | ||||||
|         const bool clicked = hovered && IsMouseClicked(0, id); |         const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); | ||||||
|         const bool double_clicked = (hovered && g.IO.MouseClickedCount[0] == 2 && TestKeyOwner(ImGuiKey_MouseLeft, id)); |         const bool double_clicked = (hovered && g.IO.MouseClickedCount[0] == 2 && TestKeyOwner(ImGuiKey_MouseLeft, id)); | ||||||
|         const bool make_active = (clicked || double_clicked || g.NavActivateId == id); |         const bool make_active = (clicked || double_clicked || g.NavActivateId == id); | ||||||
|         if (make_active && (clicked || double_clicked)) |         if (make_active && (clicked || double_clicked)) | ||||||
| @@ -3059,7 +3059,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat | |||||||
|     if (!temp_input_is_active) |     if (!temp_input_is_active) | ||||||
|     { |     { | ||||||
|         // Tabbing or CTRL-clicking on Slider turns it into an input box |         // Tabbing or CTRL-clicking on Slider turns it into an input box | ||||||
|         const bool clicked = hovered && IsMouseClicked(0, id); |         const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); | ||||||
|         const bool make_active = (clicked || g.NavActivateId == id); |         const bool make_active = (clicked || g.NavActivateId == id); | ||||||
|         if (make_active && clicked) |         if (make_active && clicked) | ||||||
|             SetKeyOwner(ImGuiKey_MouseLeft, id); |             SetKeyOwner(ImGuiKey_MouseLeft, id); | ||||||
| @@ -3221,7 +3221,7 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d | |||||||
|         format = DataTypeGetInfo(data_type)->PrintFmt; |         format = DataTypeGetInfo(data_type)->PrintFmt; | ||||||
|  |  | ||||||
|     const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); |     const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); | ||||||
|     const bool clicked = hovered && IsMouseClicked(0, id); |     const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); | ||||||
|     if (clicked || g.NavActivateId == id) |     if (clicked || g.NavActivateId == id) | ||||||
|     { |     { | ||||||
|         if (clicked) |         if (clicked) | ||||||
| @@ -6769,7 +6769,7 @@ ImGuiTypingSelectRequest* ImGui::GetTypingSelectRequest(ImGuiTypingSelectFlags f | |||||||
|     g.IO.InputQueueCharacters.resize(0); |     g.IO.InputQueueCharacters.resize(0); | ||||||
|  |  | ||||||
|     // Handle backspace |     // Handle backspace | ||||||
|     if ((flags & ImGuiTypingSelectFlags_AllowBackspace) && IsKeyPressed(ImGuiKey_Backspace, 0, ImGuiInputFlags_Repeat)) |     if ((flags & ImGuiTypingSelectFlags_AllowBackspace) && IsKeyPressed(ImGuiKey_Backspace, ImGuiInputFlags_Repeat)) | ||||||
|     { |     { | ||||||
|         char* p = (char*)(void*)ImTextFindPreviousUtf8Codepoint(data->SearchBuffer, data->SearchBuffer + buffer_len); |         char* p = (char*)(void*)ImTextFindPreviousUtf8Codepoint(data->SearchBuffer, data->SearchBuffer + buffer_len); | ||||||
|         *p = 0; |         *p = 0; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ocornut
					ocornut