mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Merge branch 'master' into docking
This commit is contained in:
		@@ -650,7 +650,7 @@ bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view)
 | 
				
			|||||||
            wheel_dx = [event deltaX];
 | 
					            wheel_dx = [event deltaX];
 | 
				
			||||||
            wheel_dy = [event deltaY];
 | 
					            wheel_dy = [event deltaY];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (wheel_dx != 0.0 || wheel_dx != 0.0)
 | 
					        if (wheel_dx != 0.0 || wheel_dy != 0.0)
 | 
				
			||||||
            io.AddMouseWheelEvent((float)wheel_dx * 0.1f, (float)wheel_dy * 0.1f);
 | 
					            io.AddMouseWheelEvent((float)wheel_dx * 0.1f, (float)wheel_dy * 0.1f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return io.WantCaptureMouse;
 | 
					        return io.WantCaptureMouse;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,6 +106,18 @@ Breaking changes:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Other Changes:
 | 
					Other Changes:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- IO: Fixed backward-compatibility regression introduced in 1.87: (#4921, #4858)
 | 
				
			||||||
 | 
					  - Direct accesses to io.KeysDown[] with legacy indices didn't work (with new backends).
 | 
				
			||||||
 | 
					  - Direct accesses to io.KeysDown[GetKeyIndex(XXX)] would access invalid data (with old/new backends).
 | 
				
			||||||
 | 
					  - Calling IsKeyDown() didn't have those problems, and is recommended as io.KeysDown[] is obsolete.
 | 
				
			||||||
 | 
					- IO: Fixed input queue trickling of interleaved keys/chars events (which are frequent especially
 | 
				
			||||||
 | 
					  when holding down a key as OS submits chars repeat events) delaying key presses and mouse movements.
 | 
				
			||||||
 | 
					  In particular, using the input system for fast game-like actions (e.g. WASD camera move) would
 | 
				
			||||||
 | 
					  typically have been impacted, as well as holding a key while dragging mouse. Constraints have
 | 
				
			||||||
 | 
					  been lifted and are now only happening when e.g. an InputText() widget is active. (#4921, #4858)
 | 
				
			||||||
 | 
					  Not that even thought you shouldn't need to disable io.ConfigInputTrickleEventQueue, you can
 | 
				
			||||||
 | 
					  technically dynamically change its setting based on the context (e.g. disable only when hovering
 | 
				
			||||||
 | 
					  or interacting with a game/3D view).
 | 
				
			||||||
- Clipper: Fixed a regression in 1.86 when not calling clipper.End() and late destructing the
 | 
					- Clipper: Fixed a regression in 1.86 when not calling clipper.End() and late destructing the
 | 
				
			||||||
  clipper instance. High-level languages (Lua,Rust etc.) would typically be affected. (#4822)
 | 
					  clipper instance. High-level languages (Lua,Rust etc.) would typically be affected. (#4822)
 | 
				
			||||||
- IsItemHovered(): added ImGuiHoveredFlags_NoNavOverride to disable the behavior where the
 | 
					- IsItemHovered(): added ImGuiHoveredFlags_NoNavOverride to disable the behavior where the
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										53
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -1357,8 +1357,10 @@ void ImGuiIO::SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native
 | 
				
			|||||||
    // Build native->imgui map so old user code can still call key functions with native 0..511 values.
 | 
					    // Build native->imgui map so old user code can still call key functions with native 0..511 values.
 | 
				
			||||||
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
					#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
				
			||||||
    const int legacy_key = (native_legacy_index != -1) ? native_legacy_index : native_keycode;
 | 
					    const int legacy_key = (native_legacy_index != -1) ? native_legacy_index : native_keycode;
 | 
				
			||||||
    if (ImGui::IsLegacyKey(legacy_key))
 | 
					    if (!ImGui::IsLegacyKey(legacy_key))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
    KeyMap[legacy_key] = key;
 | 
					    KeyMap[legacy_key] = key;
 | 
				
			||||||
 | 
					    KeyMap[key] = legacy_key;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    IM_UNUSED(key);
 | 
					    IM_UNUSED(key);
 | 
				
			||||||
    IM_UNUSED(native_legacy_index);
 | 
					    IM_UNUSED(native_legacy_index);
 | 
				
			||||||
@@ -2648,6 +2650,7 @@ bool ImGuiListClipper::Step()
 | 
				
			|||||||
    ImGuiContext& g = *GImGui;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
					    ImGuiWindow* window = g.CurrentWindow;
 | 
				
			||||||
    ImGuiListClipperData* data = (ImGuiListClipperData*)TempData;
 | 
					    ImGuiListClipperData* data = (ImGuiListClipperData*)TempData;
 | 
				
			||||||
 | 
					    IM_ASSERT(data != NULL && "Called ImGuiListClipper::Step() too many times, or before ImGuiListClipper::Begin() ?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiTable* table = g.CurrentTable;
 | 
					    ImGuiTable* table = g.CurrentTable;
 | 
				
			||||||
    if (table && table->IsInsideRow)
 | 
					    if (table && table->IsInsideRow)
 | 
				
			||||||
@@ -4094,9 +4097,9 @@ static void ImGui::UpdateKeyboardInputs()
 | 
				
			|||||||
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
					#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
				
			||||||
    if (io.BackendUsingLegacyKeyArrays == 0)
 | 
					    if (io.BackendUsingLegacyKeyArrays == 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written too.
 | 
					        // Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written to externally.
 | 
				
			||||||
        for (int n = 0; n < IM_ARRAYSIZE(io.KeysDown); n++)
 | 
					        for (int n = 0; n < ImGuiKey_LegacyNativeKey_END; n++)
 | 
				
			||||||
            IM_ASSERT(io.KeysDown[n] == false && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!");
 | 
					            IM_ASSERT((io.KeysDown[n] == false || IsKeyDown(n)) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -4119,6 +4122,8 @@ static void ImGui::UpdateKeyboardInputs()
 | 
				
			|||||||
                const ImGuiKey key = (ImGuiKey)(io.KeyMap[n] != -1 ? io.KeyMap[n] : n);
 | 
					                const ImGuiKey key = (ImGuiKey)(io.KeyMap[n] != -1 ? io.KeyMap[n] : n);
 | 
				
			||||||
                IM_ASSERT(io.KeyMap[n] == -1 || IsNamedKey(key));
 | 
					                IM_ASSERT(io.KeyMap[n] == -1 || IsNamedKey(key));
 | 
				
			||||||
                io.KeysData[key].Down = io.KeysDown[n];
 | 
					                io.KeysData[key].Down = io.KeysDown[n];
 | 
				
			||||||
 | 
					                if (key != n)
 | 
				
			||||||
 | 
					                    io.KeysDown[key] = io.KeysDown[n]; // Allow legacy code using io.KeysDown[GetKeyIndex()] with old backends
 | 
				
			||||||
                io.BackendUsingLegacyKeyArrays = 1;
 | 
					                io.BackendUsingLegacyKeyArrays = 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        if (io.BackendUsingLegacyKeyArrays == 1)
 | 
					        if (io.BackendUsingLegacyKeyArrays == 1)
 | 
				
			||||||
@@ -8391,8 +8396,18 @@ static const char* GetInputSourceName(ImGuiInputSource source)
 | 
				
			|||||||
    return input_source_names[source];
 | 
					    return input_source_names[source];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*static void DebugLogInputEvent(const char* prefix, const ImGuiInputEvent* e)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (e->Type == ImGuiInputEventType_MousePos)    { IMGUI_DEBUG_LOG("%s: MousePos (%.1f %.1f)\n", prefix, e->MousePos.PosX, e->MousePos.PosY); return; }
 | 
				
			||||||
 | 
					    if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG("%s: MouseButton %d %s\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up"); return; }
 | 
				
			||||||
 | 
					    if (e->Type == ImGuiInputEventType_MouseWheel)  { IMGUI_DEBUG_LOG("%s: MouseWheel (%.1f %.1f)\n", prefix, e->MouseWheel.WheelX, e->MouseWheel.WheelY); return; }
 | 
				
			||||||
 | 
					    if (e->Type == ImGuiInputEventType_Key)         { IMGUI_DEBUG_LOG("%s: Key \"%s\" %s\n", prefix, ImGui::GetKeyName(e->Key.Key), e->Key.Down ? "Down" : "Up"); return; }
 | 
				
			||||||
 | 
					    if (e->Type == ImGuiInputEventType_Text)        { IMGUI_DEBUG_LOG("%s: Text: %c (U+%08X)\n", prefix, e->Text.Char, e->Text.Char); return; }
 | 
				
			||||||
 | 
					    if (e->Type == ImGuiInputEventType_Focus)       { IMGUI_DEBUG_LOG("%s: AppFocused %d\n", prefix, e->AppFocused.Focused); return; }
 | 
				
			||||||
 | 
					}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Process input queue
 | 
					// Process input queue
 | 
				
			||||||
 | 
					// We always call this with the value of 'bool g.IO.ConfigInputTrickleEventQueue'.
 | 
				
			||||||
// - trickle_fast_inputs = false : process all events, turn into flattened input state (e.g. successive down/up/down/up will be lost)
 | 
					// - trickle_fast_inputs = false : process all events, turn into flattened input state (e.g. successive down/up/down/up will be lost)
 | 
				
			||||||
// - trickle_fast_inputs = true  : process as many events as possible (successive down/up/down/up will be trickled over several frames so nothing is lost) (new feature in 1.87)
 | 
					// - trickle_fast_inputs = true  : process as many events as possible (successive down/up/down/up will be trickled over several frames so nothing is lost) (new feature in 1.87)
 | 
				
			||||||
void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
 | 
					void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
 | 
				
			||||||
@@ -8400,7 +8415,12 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
 | 
				
			|||||||
    ImGuiContext& g = *GImGui;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    ImGuiIO& io = g.IO;
 | 
					    ImGuiIO& io = g.IO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool mouse_moved = false, mouse_wheeled = false, key_changed = false, text_inputed = false;
 | 
					    // Only trickle chars<>key when working with InputText()
 | 
				
			||||||
 | 
					    // FIXME: InputText() could parse event trail?
 | 
				
			||||||
 | 
					    // FIXME: Could specialize chars<>keys trickling rules for control keys (those not typically associated to characters)
 | 
				
			||||||
 | 
					    const bool trickle_interleaved_keys_and_text = (trickle_fast_inputs && g.WantTextInputNextFrame == 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool mouse_moved = false, mouse_wheeled = false, key_changed = false, text_inputted = false;
 | 
				
			||||||
    int  mouse_button_changed = 0x00;
 | 
					    int  mouse_button_changed = 0x00;
 | 
				
			||||||
    ImBitArray<ImGuiKey_KeysData_SIZE> key_changed_mask;
 | 
					    ImBitArray<ImGuiKey_KeysData_SIZE> key_changed_mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -8416,7 +8436,7 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
 | 
				
			|||||||
            if (io.MousePos.x != event_pos.x || io.MousePos.y != event_pos.y)
 | 
					            if (io.MousePos.x != event_pos.x || io.MousePos.y != event_pos.y)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                // Trickling Rule: Stop processing queued events if we already handled a mouse button change
 | 
					                // Trickling Rule: Stop processing queued events if we already handled a mouse button change
 | 
				
			||||||
                if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_wheeled || key_changed || text_inputed))
 | 
					                if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_wheeled || key_changed || text_inputted))
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                io.MousePos = event_pos;
 | 
					                io.MousePos = event_pos;
 | 
				
			||||||
                mouse_moved = true;
 | 
					                mouse_moved = true;
 | 
				
			||||||
@@ -8460,7 +8480,7 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
 | 
				
			|||||||
            if (keydata->Down != e->Key.Down || keydata->AnalogValue != e->Key.AnalogValue)
 | 
					            if (keydata->Down != e->Key.Down || keydata->AnalogValue != e->Key.AnalogValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                // Trickling Rule: Stop processing queued events if we got multiple action on the same button
 | 
					                // Trickling Rule: Stop processing queued events if we got multiple action on the same button
 | 
				
			||||||
                if (trickle_fast_inputs && keydata->Down != e->Key.Down && (key_changed_mask.TestBit(keydata_index) || text_inputed || mouse_button_changed != 0))
 | 
					                if (trickle_fast_inputs && keydata->Down != e->Key.Down && (key_changed_mask.TestBit(keydata_index) || text_inputted || mouse_button_changed != 0))
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                keydata->Down = e->Key.Down;
 | 
					                keydata->Down = e->Key.Down;
 | 
				
			||||||
                keydata->AnalogValue = e->Key.AnalogValue;
 | 
					                keydata->AnalogValue = e->Key.AnalogValue;
 | 
				
			||||||
@@ -8475,16 +8495,24 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
 | 
				
			|||||||
                    if (key == ImGuiKey_ModSuper) { io.KeySuper = keydata->Down; }
 | 
					                    if (key == ImGuiKey_ModSuper) { io.KeySuper = keydata->Down; }
 | 
				
			||||||
                    io.KeyMods = GetMergedKeyModFlags();
 | 
					                    io.KeyMods = GetMergedKeyModFlags();
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Allow legacy code using io.KeysDown[GetKeyIndex()] with new backends
 | 
				
			||||||
 | 
					#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
				
			||||||
 | 
					                io.KeysDown[key] = keydata->Down;
 | 
				
			||||||
 | 
					                if (io.KeyMap[key] != -1)
 | 
				
			||||||
 | 
					                    io.KeysDown[io.KeyMap[key]] = keydata->Down;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (e->Type == ImGuiInputEventType_Text)
 | 
					        else if (e->Type == ImGuiInputEventType_Text)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            // Trickling Rule: Stop processing queued events if keys/mouse have been interacted with
 | 
					            // Trickling Rule: Stop processing queued events if keys/mouse have been interacted with
 | 
				
			||||||
            if (trickle_fast_inputs && (key_changed || mouse_button_changed != 0 || mouse_moved || mouse_wheeled))
 | 
					            if (trickle_fast_inputs && ((key_changed && trickle_interleaved_keys_and_text) || mouse_button_changed != 0 || mouse_moved || mouse_wheeled))
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            unsigned int c = e->Text.Char;
 | 
					            unsigned int c = e->Text.Char;
 | 
				
			||||||
            io.InputQueueCharacters.push_back(c <= IM_UNICODE_CODEPOINT_MAX ? (ImWchar)c : IM_UNICODE_CODEPOINT_INVALID);
 | 
					            io.InputQueueCharacters.push_back(c <= IM_UNICODE_CODEPOINT_MAX ? (ImWchar)c : IM_UNICODE_CODEPOINT_INVALID);
 | 
				
			||||||
            text_inputed = true;
 | 
					            if (trickle_interleaved_keys_and_text)
 | 
				
			||||||
 | 
					                text_inputted = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (e->Type == ImGuiInputEventType_Focus)
 | 
					        else if (e->Type == ImGuiInputEventType_Focus)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -8503,6 +8531,11 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
 | 
				
			|||||||
    for (int n = 0; n < event_n; n++)
 | 
					    for (int n = 0; n < event_n; n++)
 | 
				
			||||||
        g.InputEventsTrail.push_back(g.InputEventsQueue[n]);
 | 
					        g.InputEventsTrail.push_back(g.InputEventsQueue[n]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // [DEBUG]
 | 
				
			||||||
 | 
					    /*if (event_n != 0)
 | 
				
			||||||
 | 
					        for (int n = 0; n < g.InputEventsQueue.Size; n++)
 | 
				
			||||||
 | 
					            DebugLogInputEvent(n < event_n ? "Processed" : "Remaining", &g.InputEventsQueue[n]);*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Remaining events will be processed on the next frame
 | 
					    // Remaining events will be processed on the next frame
 | 
				
			||||||
    if (event_n == g.InputEventsQueue.Size)
 | 
					    if (event_n == g.InputEventsQueue.Size)
 | 
				
			||||||
        g.InputEventsQueue.resize(0);
 | 
					        g.InputEventsQueue.resize(0);
 | 
				
			||||||
@@ -8567,7 +8600,7 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
 | 
				
			|||||||
    IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right);
 | 
					    IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right);
 | 
				
			||||||
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
					#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
				
			||||||
    for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_COUNT; n++)
 | 
					    for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_COUNT; n++)
 | 
				
			||||||
        IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < IM_ARRAYSIZE(g.IO.KeysDown) && "io.KeyMap[] contains an out of bound value (need to be 0..511, or -1 for unmapped key)");
 | 
					        IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < ImGuiKey_LegacyNativeKey_END && "io.KeyMap[] contains an out of bound value (need to be 0..511, or -1 for unmapped key)");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only added in 1.60 WIP)
 | 
					    // Check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only added in 1.60 WIP)
 | 
				
			||||||
    if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && g.IO.BackendUsingLegacyKeyArrays == 1)
 | 
					    if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && g.IO.BackendUsingLegacyKeyArrays == 1)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								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           18707
 | 
					#define IMGUI_VERSION_NUM           18709
 | 
				
			||||||
#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
 | 
				
			||||||
#define IMGUI_HAS_VIEWPORT          // Viewport WIP branch
 | 
					#define IMGUI_HAS_VIEWPORT          // Viewport WIP branch
 | 
				
			||||||
@@ -1484,7 +1484,7 @@ enum ImGuiKey_
 | 
				
			|||||||
    ImGuiKey_GamepadRStickLeft,     // [Analog]
 | 
					    ImGuiKey_GamepadRStickLeft,     // [Analog]
 | 
				
			||||||
    ImGuiKey_GamepadRStickRight,    // [Analog]
 | 
					    ImGuiKey_GamepadRStickRight,    // [Analog]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Keyboard Modifiers
 | 
					    // Keyboard Modifiers (explicitly submitted by backend via AddKeyEvent() calls)
 | 
				
			||||||
    // - This is mirroring the data also written to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper, in a format allowing
 | 
					    // - This is mirroring the data also written to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper, in a format allowing
 | 
				
			||||||
    //   them to be accessed via standard key API, allowing calls such as IsKeyPressed(), IsKeyReleased(), querying duration etc.
 | 
					    //   them to be accessed via standard key API, allowing calls such as IsKeyPressed(), IsKeyReleased(), querying duration etc.
 | 
				
			||||||
    // - Code polling every keys (e.g. an interface to detect a key press for input mapping) might want to ignore those
 | 
					    // - Code polling every keys (e.g. an interface to detect a key press for input mapping) might want to ignore those
 | 
				
			||||||
@@ -1492,11 +1492,9 @@ enum ImGuiKey_
 | 
				
			|||||||
    // - In theory the value of keyboard modifiers should be roughly equivalent to a logical or of the equivalent left/right keys.
 | 
					    // - In theory the value of keyboard modifiers should be roughly equivalent to a logical or of the equivalent left/right keys.
 | 
				
			||||||
    //   In practice: it's complicated; mods are often provided from different sources. Keyboard layout, IME, sticky keys and
 | 
					    //   In practice: it's complicated; mods are often provided from different sources. Keyboard layout, IME, sticky keys and
 | 
				
			||||||
    //   backends tend to interfere and break that equivalence. The safer decision is to relay that ambiguity down to the end-user...
 | 
					    //   backends tend to interfere and break that equivalence. The safer decision is to relay that ambiguity down to the end-user...
 | 
				
			||||||
    ImGuiKey_ModCtrl,
 | 
					    ImGuiKey_ModCtrl, ImGuiKey_ModShift, ImGuiKey_ModAlt, ImGuiKey_ModSuper,
 | 
				
			||||||
    ImGuiKey_ModShift,
 | 
					 | 
				
			||||||
    ImGuiKey_ModAlt,
 | 
					 | 
				
			||||||
    ImGuiKey_ModSuper,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // End of list
 | 
				
			||||||
    ImGuiKey_COUNT,                 // No valid ImGuiKey is ever greater than this value
 | 
					    ImGuiKey_COUNT,                 // No valid ImGuiKey is ever greater than this value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // [Internal] Prior to 1.87 we required user to fill io.KeysDown[512] using their own native index + a io.KeyMap[] array.
 | 
					    // [Internal] Prior to 1.87 we required user to fill io.KeysDown[512] using their own native index + a io.KeyMap[] array.
 | 
				
			||||||
@@ -1982,13 +1980,13 @@ struct ImGuiKeyData
 | 
				
			|||||||
struct ImGuiIO
 | 
					struct ImGuiIO
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    //------------------------------------------------------------------
 | 
					    //------------------------------------------------------------------
 | 
				
			||||||
    // Configuration (fill once)                // Default value
 | 
					    // Configuration                            // Default value
 | 
				
			||||||
    //------------------------------------------------------------------
 | 
					    //------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiConfigFlags   ConfigFlags;             // = 0              // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc.
 | 
					    ImGuiConfigFlags   ConfigFlags;             // = 0              // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc.
 | 
				
			||||||
    ImGuiBackendFlags  BackendFlags;            // = 0              // See ImGuiBackendFlags_ enum. Set by backend (imgui_impl_xxx files or custom backend) to communicate features supported by the backend.
 | 
					    ImGuiBackendFlags  BackendFlags;            // = 0              // See ImGuiBackendFlags_ enum. Set by backend (imgui_impl_xxx files or custom backend) to communicate features supported by the backend.
 | 
				
			||||||
    ImVec2      DisplaySize;                    // <unset>          // Main display size, in pixels (generally == GetMainViewport()->Size)
 | 
					    ImVec2      DisplaySize;                    // <unset>          // Main display size, in pixels (generally == GetMainViewport()->Size). May change every frame.
 | 
				
			||||||
    float       DeltaTime;                      // = 1.0f/60.0f     // Time elapsed since last frame, in seconds.
 | 
					    float       DeltaTime;                      // = 1.0f/60.0f     // Time elapsed since last frame, in seconds. May change every frame.
 | 
				
			||||||
    float       IniSavingRate;                  // = 5.0f           // Minimum time between saving positions/sizes to .ini file, in seconds.
 | 
					    float       IniSavingRate;                  // = 5.0f           // Minimum time between saving positions/sizes to .ini file, in seconds.
 | 
				
			||||||
    const char* IniFilename;                    // = "imgui.ini"    // Path to .ini file (important: default "imgui.ini" is relative to current working dir!). Set NULL to disable automatic .ini loading/saving or if you want to manually call LoadIniSettingsXXX() / SaveIniSettingsXXX() functions.
 | 
					    const char* IniFilename;                    // = "imgui.ini"    // Path to .ini file (important: default "imgui.ini" is relative to current working dir!). Set NULL to disable automatic .ini loading/saving or if you want to manually call LoadIniSettingsXXX() / SaveIniSettingsXXX() functions.
 | 
				
			||||||
    const char* LogFilename;                    // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified).
 | 
					    const char* LogFilename;                    // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified).
 | 
				
			||||||
@@ -2099,7 +2097,7 @@ struct ImGuiIO
 | 
				
			|||||||
    // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent().
 | 
					    // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent().
 | 
				
			||||||
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
					#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
 | 
				
			||||||
    int         KeyMap[ImGuiKey_COUNT];             // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512.
 | 
					    int         KeyMap[ImGuiKey_COUNT];             // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512.
 | 
				
			||||||
    bool        KeysDown[512];                      // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys).
 | 
					    bool        KeysDown[ImGuiKey_COUNT];           // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //------------------------------------------------------------------
 | 
					    //------------------------------------------------------------------
 | 
				
			||||||
@@ -2133,7 +2131,7 @@ struct ImGuiIO
 | 
				
			|||||||
    ImU16       MouseClickedLastCount[5];           // Count successive number of clicks. Stays valid after mouse release. Reset after another click is done.
 | 
					    ImU16       MouseClickedLastCount[5];           // Count successive number of clicks. Stays valid after mouse release. Reset after another click is done.
 | 
				
			||||||
    bool        MouseReleased[5];                   // Mouse button went from Down to !Down
 | 
					    bool        MouseReleased[5];                   // Mouse button went from Down to !Down
 | 
				
			||||||
    bool        MouseDownOwned[5];                  // Track if button was clicked inside a dear imgui window or over void blocked by a popup. We don't request mouse capture from the application if click started outside ImGui bounds.
 | 
					    bool        MouseDownOwned[5];                  // Track if button was clicked inside a dear imgui window or over void blocked by a popup. We don't request mouse capture from the application if click started outside ImGui bounds.
 | 
				
			||||||
    bool        MouseDownOwnedUnlessPopupClose[5];  //Track if button was clicked inside a dear imgui window.
 | 
					    bool        MouseDownOwnedUnlessPopupClose[5];  // Track if button was clicked inside a dear imgui window.
 | 
				
			||||||
    float       MouseDownDuration[5];               // Duration the mouse button has been down (0.0f == just clicked)
 | 
					    float       MouseDownDuration[5];               // Duration the mouse button has been down (0.0f == just clicked)
 | 
				
			||||||
    float       MouseDownDurationPrev[5];           // Previous time the mouse button has been down
 | 
					    float       MouseDownDurationPrev[5];           // Previous time the mouse button has been down
 | 
				
			||||||
    ImVec2      MouseDragMaxDistanceAbs[5];         // Maximum distance, absolute, on each axis, of how much mouse has traveled from the clicking point
 | 
					    ImVec2      MouseDragMaxDistanceAbs[5];         // Maximum distance, absolute, on each axis, of how much mouse has traveled from the clicking point
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5739,12 +5739,18 @@ static void ShowDemoWindowMisc()
 | 
				
			|||||||
        ImGuiIO& io = ImGui::GetIO();
 | 
					        ImGuiIO& io = ImGui::GetIO();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Display ImGuiIO output flags
 | 
					        // Display ImGuiIO output flags
 | 
				
			||||||
        ImGui::Text("WantCaptureMouse: %d", io.WantCaptureMouse);
 | 
					        IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Output");
 | 
				
			||||||
        ImGui::Text("WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose);
 | 
					        ImGui::SetNextItemOpen(true, ImGuiCond_Once);
 | 
				
			||||||
        ImGui::Text("WantCaptureKeyboard: %d", io.WantCaptureKeyboard);
 | 
					        if (ImGui::TreeNode("Output"))
 | 
				
			||||||
        ImGui::Text("WantTextInput: %d", io.WantTextInput);
 | 
					        {
 | 
				
			||||||
        ImGui::Text("WantSetMousePos: %d", io.WantSetMousePos);
 | 
					            ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse);
 | 
				
			||||||
        ImGui::Text("NavActive: %d, NavVisible: %d", io.NavActive, io.NavVisible);
 | 
					            ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose);
 | 
				
			||||||
 | 
					            ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard);
 | 
				
			||||||
 | 
					            ImGui::Text("io.WantTextInput: %d", io.WantTextInput);
 | 
				
			||||||
 | 
					            ImGui::Text("io.WantSetMousePos: %d", io.WantSetMousePos);
 | 
				
			||||||
 | 
					            ImGui::Text("io.NavActive: %d, io.NavVisible: %d", io.NavActive, io.NavVisible);
 | 
				
			||||||
 | 
					            ImGui::TreePop();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Display Mouse state
 | 
					        // Display Mouse state
 | 
				
			||||||
        IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Mouse State");
 | 
					        IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Mouse State");
 | 
				
			||||||
@@ -5777,6 +5783,7 @@ static void ShowDemoWindowMisc()
 | 
				
			|||||||
#else
 | 
					#else
 | 
				
			||||||
            struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && ImGui::GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array
 | 
					            struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && ImGui::GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array
 | 
				
			||||||
            const ImGuiKey key_first = 0;
 | 
					            const ImGuiKey key_first = 0;
 | 
				
			||||||
 | 
					            //ImGui::Text("Legacy raw:");       for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (io.KeysDown[key]) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
            ImGui::Text("Keys down:");          for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyDown(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d (%.02f secs)", ImGui::GetKeyName(key), key, ImGui::GetKeyData(key)->DownDuration); } }
 | 
					            ImGui::Text("Keys down:");          for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyDown(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d (%.02f secs)", ImGui::GetKeyName(key), key, ImGui::GetKeyData(key)->DownDuration); } }
 | 
				
			||||||
            ImGui::Text("Keys pressed:");       for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyPressed(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } }
 | 
					            ImGui::Text("Keys pressed:");       for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyPressed(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user