|
@@ -438,6 +438,10 @@ CODE
|
|
|
- likewise io.MousePos and GetMousePos() will use OS coordinates.
|
|
|
If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
|
|
|
|
|
|
+ - 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.
|
|
|
+ - it shouldn't really affect you unless you had custom shortcut swapping in place for macOS X apps.
|
|
|
+ - removed ImGuiMod_Shortcut which was previously dynamically remapping to Ctrl or Cmd/Super. It is now unnecessary to specific cross-platform idiomatic shortcuts. (#2343, #4084, #5923, #456)
|
|
|
+ - 2024/05/14 (1.90.7) - backends: SDL_Renderer2 and SDL_Renderer3 backend now take a SDL_Renderer* in their RenderDrawData() functions.
|
|
|
- 2024/04/18 (1.90.6) - TreeNode: Fixed a layout inconsistency when using an empty/hidden label followed by a SameLine() call. (#7505, #282)
|
|
|
- old: TreeNode("##Hidden"); SameLine(); Text("Hello"); // <-- This was actually incorrect! BUT appeared to look ok with the default style where ItemSpacing.x == FramePadding.x * 2 (it didn't look aligned otherwise).
|
|
|
- new: TreeNode("##Hidden"); SameLine(0, 0); Text("Hello"); // <-- This is correct for all styles values.
|
|
@@ -559,7 +563,7 @@ CODE
|
|
|
- Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only]
|
|
|
note: for all calls to IO new functions, the Dear ImGui context should be bound/current.
|
|
|
read https://github.com/ocornut/imgui/issues/4921 for details.
|
|
|
- - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
|
|
+ - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
|
|
- 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() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes).
|
|
@@ -1008,7 +1012,8 @@ CODE
|
|
|
#else
|
|
|
#include <windows.h>
|
|
|
#endif
|
|
|
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have all Win32 functions
|
|
|
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_GAMES)
|
|
|
+// The UWP and GDK Win32 API subsets don't support clipboard nor IME functions
|
|
|
#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
|
|
|
#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
|
|
|
#endif
|
|
@@ -1525,7 +1530,17 @@ void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value)
|
|
|
ImGuiContext& g = *Ctx;
|
|
|
IM_ASSERT(ImGui::IsNamedKeyOrModKey(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API.
|
|
|
IM_ASSERT(ImGui::IsAliasKey(key) == false); // Backend cannot submit ImGuiKey_MouseXXX values they are automatically inferred from AddMouseXXX() events.
|
|
|
- IM_ASSERT(key != ImGuiMod_Shortcut); // We could easily support the translation here but it seems saner to not accept it (TestEngine perform a translation itself)
|
|
|
+
|
|
|
+ // MacOS: swap Cmd(Super) and Ctrl
|
|
|
+ if (g.IO.ConfigMacOSXBehaviors)
|
|
|
+ {
|
|
|
+ if (key == ImGuiMod_Super) { key = ImGuiMod_Ctrl; }
|
|
|
+ else if (key == ImGuiMod_Ctrl) { key = ImGuiMod_Super; }
|
|
|
+ else if (key == ImGuiKey_LeftSuper) { key = ImGuiKey_LeftCtrl; }
|
|
|
+ else if (key == ImGuiKey_RightSuper){ key = ImGuiKey_RightCtrl; }
|
|
|
+ else if (key == ImGuiKey_LeftCtrl) { key = ImGuiKey_LeftSuper; }
|
|
|
+ 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
|
|
@@ -6753,7 +6768,7 @@ void ImGui::UpdateWindowSkipRefresh(ImGuiWindow* window)
|
|
|
// - WindowE // .. returns NULL
|
|
|
// Notes:
|
|
|
// - FindBlockingModal(NULL) == NULL is generally equivalent to GetTopMostPopupModal() == NULL.
|
|
|
-// Only difference is here we check for ->Active/WasActive but it may be unecessary.
|
|
|
+// Only difference is here we check for ->Active/WasActive but it may be unnecessary.
|
|
|
ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
@@ -7123,7 +7138,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// SIZE
|
|
|
|
|
|
// Outer Decoration Sizes
|
|
|
- // (we need to clear ScrollbarSize immediatly as CalcWindowAutoFitSize() needs it and can be called from other locations).
|
|
|
+ // (we need to clear ScrollbarSize immediately as CalcWindowAutoFitSize() needs it and can be called from other locations).
|
|
|
const ImVec2 scrollbar_sizes_from_last_frame = window->ScrollbarSizes;
|
|
|
window->DecoOuterSizeX1 = 0.0f;
|
|
|
window->DecoOuterSizeX2 = 0.0f;
|
|
@@ -8168,7 +8183,7 @@ bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)
|
|
|
|
|
|
// When changing hovered window we requires a bit of stationary delay before activating hover timer.
|
|
|
// FIXME: We don't support delay other than stationary one for now, other delay would need a way
|
|
|
- // to fullfill the possibility that multiple IsWindowHovered() with varying flag could return true
|
|
|
+ // to fulfill the possibility that multiple IsWindowHovered() with varying flag could return true
|
|
|
// for different windows of the hierarchy. Possibly need a Hash(Current+Flags) ==> (Timer) cache.
|
|
|
// We can implement this for _Stationary because the data is linked to HoveredWindow rather than CurrentWindow.
|
|
|
if (flags & ImGuiHoveredFlags_ForTooltip)
|
|
@@ -8894,9 +8909,9 @@ ImGuiID ImGui::GetID(const void* ptr_id)
|
|
|
// - Shortcut() [Internal]
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
-ImGuiKeyChord ImGui::FixupKeyChord(ImGuiContext* ctx, ImGuiKeyChord key_chord)
|
|
|
+ImGuiKeyChord ImGui::FixupKeyChord(ImGuiKeyChord key_chord)
|
|
|
{
|
|
|
- // Convert ImGuiMod_Shortcut and add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified.
|
|
|
+ // Add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified.
|
|
|
ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
|
|
|
if (IsModKey(key))
|
|
|
{
|
|
@@ -8909,8 +8924,6 @@ ImGuiKeyChord ImGui::FixupKeyChord(ImGuiContext* ctx, ImGuiKeyChord key_chord)
|
|
|
if (key == ImGuiKey_LeftSuper || key == ImGuiKey_RightSuper)
|
|
|
key_chord |= ImGuiMod_Super;
|
|
|
}
|
|
|
- if (key_chord & ImGuiMod_Shortcut)
|
|
|
- return (key_chord & ~ImGuiMod_Shortcut) | (ctx->IO.ConfigMacOSXBehaviors ? ImGuiMod_Super : ImGuiMod_Ctrl);
|
|
|
return key_chord;
|
|
|
}
|
|
|
|
|
@@ -8920,7 +8933,7 @@ ImGuiKeyData* ImGui::GetKeyData(ImGuiContext* ctx, ImGuiKey key)
|
|
|
|
|
|
// Special storage location for mods
|
|
|
if (key & ImGuiMod_Mask_)
|
|
|
- key = ConvertSingleModFlagToKey(ctx, key);
|
|
|
+ key = ConvertSingleModFlagToKey(key);
|
|
|
|
|
|
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
IM_ASSERT(key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_NamedKey_END);
|
|
@@ -8971,10 +8984,10 @@ IM_STATIC_ASSERT(ImGuiKey_NamedKey_COUNT == IM_ARRAYSIZE(GKeyNames));
|
|
|
|
|
|
const char* ImGui::GetKeyName(ImGuiKey key)
|
|
|
{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
|
IM_ASSERT((IsNamedKeyOrModKey(key) || key == ImGuiKey_None) && "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)
|
|
@@ -8986,23 +8999,22 @@ const char* ImGui::GetKeyName(ImGuiKey key)
|
|
|
if (key == ImGuiKey_None)
|
|
|
return "None";
|
|
|
if (key & ImGuiMod_Mask_)
|
|
|
- key = ConvertSingleModFlagToKey(&g, key);
|
|
|
+ key = ConvertSingleModFlagToKey(key);
|
|
|
if (!IsNamedKey(key))
|
|
|
return "Unknown";
|
|
|
|
|
|
return GKeyNames[key - ImGuiKey_NamedKey_BEGIN];
|
|
|
}
|
|
|
|
|
|
-// ImGuiMod_Shortcut is translated to either Ctrl or Super.
|
|
|
const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- key_chord = FixupKeyChord(&g, key_chord);
|
|
|
+ key_chord = FixupKeyChord(key_chord);
|
|
|
ImFormatString(g.TempKeychordName, IM_ARRAYSIZE(g.TempKeychordName), "%s%s%s%s%s",
|
|
|
(key_chord & ImGuiMod_Ctrl) ? "Ctrl+" : "",
|
|
|
(key_chord & ImGuiMod_Shift) ? "Shift+" : "",
|
|
|
(key_chord & ImGuiMod_Alt) ? "Alt+" : "",
|
|
|
- (key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "",
|
|
|
+ (key_chord & ImGuiMod_Super) ? "Super+" : "",
|
|
|
GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_)));
|
|
|
return g.TempKeychordName;
|
|
|
}
|
|
@@ -9121,8 +9133,8 @@ ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord)
|
|
|
ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
|
|
|
ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_);
|
|
|
if (key == ImGuiKey_None)
|
|
|
- key = ConvertSingleModFlagToKey(&g, mods);
|
|
|
- IM_ASSERT(IsNamedKey(key) && (key_chord & ImGuiMod_Shortcut) == 0); // Please call ConvertShortcutMod() in calling function.
|
|
|
+ key = ConvertSingleModFlagToKey(mods);
|
|
|
+ IM_ASSERT(IsNamedKey(key));
|
|
|
|
|
|
// Get (in the majority of case, the linked list will have one element so this should be 2 reads.
|
|
|
// Subsequent elements will be contiguous in memory as list is sorted/rebuilt in NewFrame).
|
|
@@ -9195,7 +9207,7 @@ static bool IsKeyChordPotentiallyCharInput(ImGuiKeyChord key_chord)
|
|
|
|
|
|
// When the right mods are pressed it cannot be a char input so we won't filter the shortcut out.
|
|
|
ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_);
|
|
|
- const bool ignore_char_inputs = ((mods & ImGuiMod_Ctrl) && !(mods & ImGuiMod_Alt)) || (g.IO.ConfigMacOSXBehaviors && (mods & ImGuiMod_Super));
|
|
|
+ const bool ignore_char_inputs = ((mods & ImGuiMod_Ctrl) && !(mods & ImGuiMod_Alt)) || (g.IO.ConfigMacOSXBehaviors && (mods & ImGuiMod_Ctrl));
|
|
|
if (ignore_char_inputs)
|
|
|
return false;
|
|
|
|
|
@@ -9218,8 +9230,8 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
|
|
|
IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteMask_)); // Check that only 1 routing flag is used
|
|
|
IM_ASSERT(owner_id != ImGuiKeyOwner_Any && owner_id != ImGuiKeyOwner_None);
|
|
|
|
|
|
- // Convert ImGuiMod_Shortcut and add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified.
|
|
|
- key_chord = FixupKeyChord(&g, key_chord);
|
|
|
+ // Add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified.
|
|
|
+ key_chord = FixupKeyChord(key_chord);
|
|
|
|
|
|
// [DEBUG] Debug break requested by user
|
|
|
if (g.DebugBreakInShortcutRouting == key_chord)
|
|
@@ -9255,7 +9267,7 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
|
|
|
{
|
|
|
ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
|
|
|
if (key == ImGuiKey_None)
|
|
|
- key = ConvertSingleModFlagToKey(&g, (ImGuiKey)(key_chord & ImGuiMod_Mask_));
|
|
|
+ key = ConvertSingleModFlagToKey((ImGuiKey)(key_chord & ImGuiMod_Mask_));
|
|
|
if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END)
|
|
|
return false;
|
|
|
}
|
|
@@ -9287,9 +9299,8 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
|
|
|
// Note: this cannot be turned into GetShortcutRouting() because we do the owner_id->routing_id translation, name would be more misleading.
|
|
|
bool ImGui::TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id)
|
|
|
{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id);
|
|
|
- key_chord = FixupKeyChord(&g, key_chord);
|
|
|
+ key_chord = FixupKeyChord(key_chord);
|
|
|
ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord); // FIXME: Could avoid creating entry.
|
|
|
return routing_data->RoutingCurr == routing_id;
|
|
|
}
|
|
@@ -10195,7 +10206,6 @@ void ImGui::SetKeyOwnersForKeyChord(ImGuiKeyChord key_chord, ImGuiID owner_id, I
|
|
|
if (key_chord & ImGuiMod_Shift) { SetKeyOwner(ImGuiMod_Shift, owner_id, flags); }
|
|
|
if (key_chord & ImGuiMod_Alt) { SetKeyOwner(ImGuiMod_Alt, owner_id, flags); }
|
|
|
if (key_chord & ImGuiMod_Super) { SetKeyOwner(ImGuiMod_Super, owner_id, flags); }
|
|
|
- if (key_chord & ImGuiMod_Shortcut) { SetKeyOwner(ImGuiMod_Shortcut, owner_id, flags); }
|
|
|
if (key_chord & ~ImGuiMod_Mask_) { SetKeyOwner((ImGuiKey)(key_chord & ~ImGuiMod_Mask_), owner_id, flags); }
|
|
|
}
|
|
|
|
|
@@ -10230,7 +10240,7 @@ bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord)
|
|
|
bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- key_chord = FixupKeyChord(&g, key_chord);
|
|
|
+ key_chord = FixupKeyChord(key_chord);
|
|
|
ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_);
|
|
|
if (g.IO.KeyMods != mods)
|
|
|
return false;
|
|
@@ -10238,7 +10248,7 @@ bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiIn
|
|
|
// Special storage location for mods
|
|
|
ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
|
|
|
if (key == ImGuiKey_None)
|
|
|
- key = ConvertSingleModFlagToKey(&g, mods);
|
|
|
+ key = ConvertSingleModFlagToKey(mods);
|
|
|
if (!IsKeyPressed(key, owner_id, (flags & ImGuiInputFlags_RepeatMask_)))
|
|
|
return false;
|
|
|
return true;
|