@@ -8931,12 +8931,12 @@ nk_str_insert_at_rune(struct nk_str *str, int pos, const char *cstr, int len)
89318931NK_API int
89328932nk_str_insert_text_char(struct nk_str *str, int pos, const char *text, int len)
89338933{
8934- return nk_str_insert_text_utf8 (str, pos, text, len);
8934+ return nk_str_insert_at_rune (str, pos, text, len) ? len : 0 ;
89358935}
89368936NK_API int
89378937nk_str_insert_str_char(struct nk_str *str, int pos, const char *text)
89388938{
8939- return nk_str_insert_text_utf8 (str, pos, text, nk_strlen(text));
8939+ return nk_str_insert_text_char (str, pos, text, nk_strlen(text));
89408940}
89418941NK_API int
89428942nk_str_insert_text_utf8(struct nk_str *str, int pos, const char *text, int len)
@@ -27155,7 +27155,7 @@ nk_textedit_paste(struct nk_text_edit *state, char const *ctext, int len)
2715527155 glyphs = nk_utf_len(ctext, len);
2715627156 if (nk_str_insert_text_char(&state->string, state->cursor, text, len)) {
2715727157 nk_textedit_makeundo_insert(state, state->cursor, glyphs);
27158- state->cursor += len ;
27158+ state->cursor += glyphs ;
2715927159 state->has_preferred_x = 0;
2716027160 return 1;
2716127161 }
@@ -28114,17 +28114,19 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
2811428114 int cut = nk_input_is_key_pressed(in, NK_KEY_CUT);
2811528115 if ((copy || cut) && (flags & NK_EDIT_CLIPBOARD))
2811628116 {
28117- int glyph_len;
28118- nk_rune unicode;
28119- const char *text;
28120- int b = edit->select_start;
28121- int e = edit->select_end;
28122-
28123- int begin = NK_MIN(b, e);
28124- int end = NK_MAX(b, e);
28125- text = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len);
28126- if (edit->clip.copy)
28127- edit->clip.copy(edit->clip.userdata, text, end - begin);
28117+ int begin = NK_MIN(edit->select_start, edit->select_end);
28118+ int end = NK_MAX(edit->select_start, edit->select_end);
28119+
28120+ if (edit->clip.copy) {
28121+ int glyph_len;
28122+ nk_rune unicode;
28123+ const char *text_begin, *text_end;
28124+ text_begin = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len);
28125+ /*Reuse temporary variables (unicode, glyph_len)*/
28126+ text_end = nk_str_at_const(&edit->string, end, &unicode, &glyph_len);
28127+
28128+ edit->clip.copy(edit->clip.userdata, text_begin, text_end - text_begin);
28129+ }
2812828130 if (cut && !(flags & NK_EDIT_READ_ONLY)){
2812928131 nk_textedit_cut(edit);
2813028132 cursor_follow = nk_true;
@@ -30736,6 +30738,11 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
3073630738/// - [y]: Minor version with non-breaking API and library changes
3073730739/// - [z]: Patch version with no direct changes to the API
3073830740///
30741+ /// - 2025/10/18 (4.13.1) - Fix UTF-8 clipboard handling
30742+ /// POSSIBLE BREAKING CHANGE for custom backend (copy/paste)
30743+ /// (1) length as byte count in copy callback(nk_do_edit)
30744+ /// (2) Fix nk_str_insert_text_char and nk_str_insert_str_char
30745+ /// (3) Fix UTF-8 cursor(nk_textedit_paste)
3073930746/// - 2025/11/15 (4.13.0) - Fix: nk_property not updating 'win->edit.active'
3074030747/// Add new updated demo: sdl3_renderer
3074130748/// - 2025/10/08 (4.12.8) - Fix nk_widget_text to use NK_TEXT_ALIGN_LEFT by default,
@@ -30747,7 +30754,7 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
3074730754/// - 2025/04/06 (4.12.7) - Fix text input navigation and mouse scrolling
3074830755/// - 2025/03/29 (4.12.6) - Fix unitialized data in nk_input_char
3074930756/// - 2025/03/05 (4.12.5) - Fix scrolling knob also scrolling parent window, remove dead code
30750- /// - 2024/12/11 (4.12.4) - Fix array subscript [0, 0] is outside array bounds of ‘ char[1]’
30757+ /// - 2024/12/11 (4.12.4) - Fix array subscript [0, 0] is outside array bounds of � char[1]�
3075130758/// - 2024/12/11 (4.12.3) - Fix border color for property widgets
3075230759/// - 2024/11/20 (4.12.2) - Fix int/float type conversion warnings in `nk_roundf`
3075330760/// - 2024/03/07 (4.12.1) - Fix bitwise operations warnings in C++20
0 commit comments