mirror of
https://github.com/Drezil/imgui.git
synced 2025-07-06 04:58:47 +02:00
Merge branch 'master' into docking
This commit is contained in:
55
imgui.cpp
55
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.
|
||||
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
||||
const int legacy_key = (native_legacy_index != -1) ? native_legacy_index : native_keycode;
|
||||
if (ImGui::IsLegacyKey(legacy_key))
|
||||
KeyMap[legacy_key] = key;
|
||||
if (!ImGui::IsLegacyKey(legacy_key))
|
||||
return;
|
||||
KeyMap[legacy_key] = key;
|
||||
KeyMap[key] = legacy_key;
|
||||
#else
|
||||
IM_UNUSED(key);
|
||||
IM_UNUSED(native_legacy_index);
|
||||
@ -2648,6 +2650,7 @@ bool ImGuiListClipper::Step()
|
||||
ImGuiContext& g = *GImGui;
|
||||
ImGuiWindow* window = g.CurrentWindow;
|
||||
ImGuiListClipperData* data = (ImGuiListClipperData*)TempData;
|
||||
IM_ASSERT(data != NULL && "Called ImGuiListClipper::Step() too many times, or before ImGuiListClipper::Begin() ?");
|
||||
|
||||
ImGuiTable* table = g.CurrentTable;
|
||||
if (table && table->IsInsideRow)
|
||||
@ -4094,9 +4097,9 @@ static void ImGui::UpdateKeyboardInputs()
|
||||
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
||||
if (io.BackendUsingLegacyKeyArrays == 0)
|
||||
{
|
||||
// Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written too.
|
||||
for (int n = 0; n < IM_ARRAYSIZE(io.KeysDown); 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!");
|
||||
// Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written to externally.
|
||||
for (int n = 0; n < ImGuiKey_LegacyNativeKey_END; n++)
|
||||
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
|
||||
{
|
||||
@ -4119,6 +4122,8 @@ static void ImGui::UpdateKeyboardInputs()
|
||||
const ImGuiKey key = (ImGuiKey)(io.KeyMap[n] != -1 ? io.KeyMap[n] : n);
|
||||
IM_ASSERT(io.KeyMap[n] == -1 || IsNamedKey(key));
|
||||
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;
|
||||
}
|
||||
if (io.BackendUsingLegacyKeyArrays == 1)
|
||||
@ -8391,8 +8396,18 @@ static const char* GetInputSourceName(ImGuiInputSource 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
|
||||
// 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 = 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)
|
||||
@ -8400,7 +8415,12 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
|
||||
ImGuiContext& g = *GImGui;
|
||||
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;
|
||||
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)
|
||||
{
|
||||
// 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;
|
||||
io.MousePos = event_pos;
|
||||
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)
|
||||
{
|
||||
// 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;
|
||||
keydata->Down = e->Key.Down;
|
||||
keydata->AnalogValue = e->Key.AnalogValue;
|
||||
@ -8475,16 +8495,24 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
|
||||
if (key == ImGuiKey_ModSuper) { io.KeySuper = keydata->Down; }
|
||||
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)
|
||||
{
|
||||
// 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;
|
||||
unsigned int c = e->Text.Char;
|
||||
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)
|
||||
{
|
||||
@ -8503,6 +8531,11 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
|
||||
for (int n = 0; n < event_n; 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
|
||||
if (event_n == g.InputEventsQueue.Size)
|
||||
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);
|
||||
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
||||
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)
|
||||
if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && g.IO.BackendUsingLegacyKeyArrays == 1)
|
||||
|
Reference in New Issue
Block a user