Browse Source

InputText: Fixed a case where deactivation frame would write to underlying buffer or call CallbackResize although unnecessary, in a frame where the return value was false.

ocornut 2 years ago
parent
commit
b32ef809c3
2 changed files with 5 additions and 2 deletions
  1. 3 0
      docs/CHANGELOG.txt
  2. 2 2
      imgui_widgets.cpp

+ 3 - 0
docs/CHANGELOG.txt

@@ -42,6 +42,9 @@ Breaking changes:
 
 
 Other changes:
 Other changes:
 
 
+- InputText: Fixed a case where deactivation frame would write to underlying
+  buffer or call CallbackResize although unnecessary, in a frame where the
+  return value was false.
 - IO: Added io.ClearEventsQueue() to clear incoming inputs events. (#4921)
 - IO: Added io.ClearEventsQueue() to clear incoming inputs events. (#4921)
   May be useful in conjunction with io.ClearInputsKeys() if you need to clear
   May be useful in conjunction with io.ClearInputsKeys() if you need to clear
   both current inputs state and queued events (e.g. when using blocking native
   both current inputs state and queued events (e.g. when using blocking native

+ 2 - 2
imgui_widgets.cpp

@@ -4719,11 +4719,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
     // Handle reapplying final data on deactivation (see InputTextDeactivateHook() for details)
     // Handle reapplying final data on deactivation (see InputTextDeactivateHook() for details)
     if (g.InputTextDeactivatedState.ID == id)
     if (g.InputTextDeactivatedState.ID == id)
     {
     {
-        if (g.ActiveId != id && IsItemDeactivatedAfterEdit() && !is_readonly)
+        if (g.ActiveId != id && IsItemDeactivatedAfterEdit() && !is_readonly && strcmp(g.InputTextDeactivatedState.TextA.Data, buf) != 0)
         {
         {
             apply_new_text = g.InputTextDeactivatedState.TextA.Data;
             apply_new_text = g.InputTextDeactivatedState.TextA.Data;
             apply_new_text_length = g.InputTextDeactivatedState.TextA.Size - 1;
             apply_new_text_length = g.InputTextDeactivatedState.TextA.Size - 1;
-            value_changed |= (strcmp(g.InputTextDeactivatedState.TextA.Data, buf) != 0);
+            value_changed = true;
             //IMGUI_DEBUG_LOG("InputText(): apply Deactivated data for 0x%08X: \"%.*s\".\n", id, apply_new_text_length, apply_new_text);
             //IMGUI_DEBUG_LOG("InputText(): apply Deactivated data for 0x%08X: \"%.*s\".\n", id, apply_new_text_length, apply_new_text);
         }
         }
         g.InputTextDeactivatedState.ID = 0;
         g.InputTextDeactivatedState.ID = 0;