Browse Source

InputTextMultiline: Fixed a crash pressing Down on last empty line of a multiline buffer. (#6783, #6000)

Amend 57a5b73a4c
ocornut 1 year ago
parent
commit
d8ef864b02
3 changed files with 8 additions and 3 deletions
  1. 3 1
      docs/CHANGELOG.txt
  2. 1 1
      imgui_widgets.cpp
  3. 4 1
      imstb_textedit.h

+ 3 - 1
docs/CHANGELOG.txt

@@ -44,7 +44,9 @@ Breaking changes:
 
 
 Other changes:
 Other changes:
 
 
-- BeginListBox(): fixed not consuming SetNextWindowXXX data when returning false.
+- InputTextMultiline: Fixed a crash pressing Down on last empty line of a multiline buffer.
+  (regression from 1.89.2, only happened in some states). (#6783, #6000)
+- BeginListBox(): Fixed not consuming SetNextWindowXXX data when returning false.
 
 
 
 
 -----------------------------------------------------------------------
 -----------------------------------------------------------------------

+ 1 - 1
imgui_widgets.cpp

@@ -3693,7 +3693,7 @@ namespace ImStb
 {
 {
 
 
 static int     STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj)                             { return obj->CurLenW; }
 static int     STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj)                             { return obj->CurLenW; }
-static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx)                      { return obj->TextW[idx]; }
+static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx)                      { IM_ASSERT(idx <= obj->CurLenW); return obj->TextW[idx]; }
 static float   STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx)  { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *obj->Ctx; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); }
 static float   STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx)  { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *obj->Ctx; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); }
 static int     STB_TEXTEDIT_KEYTOTEXT(int key)                                                    { return key >= 0x200000 ? 0 : key; }
 static int     STB_TEXTEDIT_KEYTOTEXT(int key)                                                    { return key >= 0x200000 ? 0 : key; }
 static ImWchar STB_TEXTEDIT_NEWLINE = '\n';
 static ImWchar STB_TEXTEDIT_NEWLINE = '\n';

+ 4 - 1
imstb_textedit.h

@@ -2,7 +2,7 @@
 // This is a slightly modified version of stb_textedit.h 1.14.
 // This is a slightly modified version of stb_textedit.h 1.14.
 // Those changes would need to be pushed into nothings/stb:
 // Those changes would need to be pushed into nothings/stb:
 // - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321)
 // - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321)
-// - Fix in stb_textedit_find_charpos to handle last line (see https://github.com/ocornut/imgui/issues/6000)
+// - Fix in stb_textedit_find_charpos to handle last line (see https://github.com/ocornut/imgui/issues/6000 + #6783)
 // Grep for [DEAR IMGUI] to find the changes.
 // Grep for [DEAR IMGUI] to find the changes.
 
 
 // stb_textedit.h - v1.14  - public domain - Sean Barrett
 // stb_textedit.h - v1.14  - public domain - Sean Barrett
@@ -549,7 +549,10 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s
       i += r.num_chars;
       i += r.num_chars;
       find->y += r.baseline_y_delta;
       find->y += r.baseline_y_delta;
       if (i == z) // [DEAR IMGUI]
       if (i == z) // [DEAR IMGUI]
+      {
+         r.num_chars = 0; // [DEAR IMGUI]
          break;   // [DEAR IMGUI]
          break;   // [DEAR IMGUI]
+      }
    }
    }
 
 
    find->first_char = first = i;
    find->first_char = first = i;