diff --git a/demo/sdl3_renderer/nuklear_sdl3_renderer.h b/demo/sdl3_renderer/nuklear_sdl3_renderer.h index 9f6ca953e..51cdf907f 100644 --- a/demo/sdl3_renderer/nuklear_sdl3_renderer.h +++ b/demo/sdl3_renderer/nuklear_sdl3_renderer.h @@ -319,20 +319,12 @@ nk_sdl_clipboard_paste(nk_handle usr, struct nk_text_edit *edit) char *text; int len; NK_UNUSED(usr); - /* this function returns empty string on failure, not NULL */ text = SDL_GetClipboardText(); NK_ASSERT(text); if (text[0] != '\0') { - /* FIXME: there is a bug in Nuklear that affects UTF8 clipboard handling - * "len" should be a buffer length, but due to bug it must be a glyph count - * see: https://github.com/Immediate-Mode-UI/Nuklear/pull/841 */ -#if 0 len = nk_strlen(text); -#else - len = SDL_utf8strlen(text); -#endif nk_textedit_paste(edit, text, len); } SDL_free(text); @@ -341,27 +333,13 @@ nk_sdl_clipboard_paste(nk_handle usr, struct nk_text_edit *edit) NK_INTERN void nk_sdl_clipboard_copy(nk_handle usr, const char *text, int len) { - const char *ptext; char *str; size_t buflen; - int i; struct nk_sdl* sdl = (struct nk_sdl*)usr.ptr; NK_ASSERT(sdl); if (len <= 0 || text == NULL) return; - /* FIXME: there is a bug in Nuklear that affects UTF8 clipboard handling - * "len" is expected to be a buffer length, but due to bug it actually is a glyph count - * see: https://github.com/Immediate-Mode-UI/Nuklear/pull/841 */ -#if 0 buflen = len + 1; - NK_UNUSED(ptext); -#else - ptext = text; - for (i = len; i > 0; i--) - (void)SDL_StepUTF8(&ptext, NULL); - buflen = (size_t)(ptext - text) + 1; -#endif - str = sdl->allocator.alloc(sdl->allocator.userdata, 0, buflen); if (!str) return; SDL_strlcpy(str, text, buflen); diff --git a/nuklear.h b/nuklear.h index e6df337b1..968441cf5 100644 --- a/nuklear.h +++ b/nuklear.h @@ -8989,12 +8989,12 @@ nk_str_insert_at_rune(struct nk_str *str, int pos, const char *cstr, int len) NK_API int nk_str_insert_text_char(struct nk_str *str, int pos, const char *text, int len) { - return nk_str_insert_text_utf8(str, pos, text, len); + return nk_str_insert_at_rune(str, pos, text, len) ? len : 0; } NK_API int nk_str_insert_str_char(struct nk_str *str, int pos, const char *text) { - return nk_str_insert_text_utf8(str, pos, text, nk_strlen(text)); + return nk_str_insert_text_char(str, pos, text, nk_strlen(text)); } NK_API int nk_str_insert_text_utf8(struct nk_str *str, int pos, const char *text, int len) @@ -27239,7 +27239,7 @@ nk_textedit_paste(struct nk_text_edit *state, char const *ctext, int len) glyphs = nk_utf_len(ctext, len); if (nk_str_insert_text_char(&state->string, state->cursor, text, len)) { nk_textedit_makeundo_insert(state, state->cursor, glyphs); - state->cursor += len; + state->cursor += glyphs; state->has_preferred_x = 0; return 1; } @@ -28198,17 +28198,19 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out, int cut = nk_input_is_key_pressed(in, NK_KEY_CUT); if ((copy || cut) && (flags & NK_EDIT_CLIPBOARD)) { - int glyph_len; - nk_rune unicode; - const char *text; - int b = edit->select_start; - int e = edit->select_end; - - int begin = NK_MIN(b, e); - int end = NK_MAX(b, e); - text = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len); - if (edit->clip.copy) - edit->clip.copy(edit->clip.userdata, text, end - begin); + int begin = NK_MIN(edit->select_start, edit->select_end); + int end = NK_MAX(edit->select_start, edit->select_end); + + if (edit->clip.copy) { + int glyph_len; + nk_rune unicode; + const char *text_begin, *text_end; + text_begin = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len); + /*Reuse temporary variables (unicode, glyph_len)*/ + text_end = nk_str_at_const(&edit->string, end, &unicode, &glyph_len); + + edit->clip.copy(edit->clip.userdata, text_begin, (int)(text_end - text_begin)); + } if (cut && !(flags & NK_EDIT_READ_ONLY)){ nk_textedit_cut(edit); cursor_follow = nk_true; diff --git a/src/nuklear_edit.c b/src/nuklear_edit.c index ae5daed02..6ef034c24 100644 --- a/src/nuklear_edit.c +++ b/src/nuklear_edit.c @@ -278,17 +278,19 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out, int cut = nk_input_is_key_pressed(in, NK_KEY_CUT); if ((copy || cut) && (flags & NK_EDIT_CLIPBOARD)) { - int glyph_len; - nk_rune unicode; - const char *text; - int b = edit->select_start; - int e = edit->select_end; - - int begin = NK_MIN(b, e); - int end = NK_MAX(b, e); - text = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len); - if (edit->clip.copy) - edit->clip.copy(edit->clip.userdata, text, end - begin); + int begin = NK_MIN(edit->select_start, edit->select_end); + int end = NK_MAX(edit->select_start, edit->select_end); + + if (edit->clip.copy) { + int glyph_len; + nk_rune unicode; + const char *text_begin, *text_end; + text_begin = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len); + /*Reuse temporary variables (unicode, glyph_len)*/ + text_end = nk_str_at_const(&edit->string, end, &unicode, &glyph_len); + + edit->clip.copy(edit->clip.userdata, text_begin, (int)(text_end - text_begin)); + } if (cut && !(flags & NK_EDIT_READ_ONLY)){ nk_textedit_cut(edit); cursor_follow = nk_true; diff --git a/src/nuklear_string.c b/src/nuklear_string.c index 583789391..40ee6f3b2 100644 --- a/src/nuklear_string.c +++ b/src/nuklear_string.c @@ -167,12 +167,12 @@ nk_str_insert_at_rune(struct nk_str *str, int pos, const char *cstr, int len) NK_API int nk_str_insert_text_char(struct nk_str *str, int pos, const char *text, int len) { - return nk_str_insert_text_utf8(str, pos, text, len); + return nk_str_insert_at_rune(str, pos, text, len) ? len : 0; } NK_API int nk_str_insert_str_char(struct nk_str *str, int pos, const char *text) { - return nk_str_insert_text_utf8(str, pos, text, nk_strlen(text)); + return nk_str_insert_text_char(str, pos, text, nk_strlen(text)); } NK_API int nk_str_insert_text_utf8(struct nk_str *str, int pos, const char *text, int len) diff --git a/src/nuklear_text_editor.c b/src/nuklear_text_editor.c index 7534b8c58..082480ff1 100644 --- a/src/nuklear_text_editor.c +++ b/src/nuklear_text_editor.c @@ -355,7 +355,7 @@ nk_textedit_paste(struct nk_text_edit *state, char const *ctext, int len) glyphs = nk_utf_len(ctext, len); if (nk_str_insert_text_char(&state->string, state->cursor, text, len)) { nk_textedit_makeundo_insert(state, state->cursor, glyphs); - state->cursor += len; + state->cursor += glyphs; state->has_preferred_x = 0; return 1; }