Skip to content

Commit aedc337

Browse files
committed
fix clipboard UTF8 handling
Changes: (1) length as byte count in copy callback (instead of glyph count) (2) fix nk_str_insert_text_char and nk_str_insert_str_char (3) correct UTF-8 cursor handling Fixes: #840 Fixes: #764 Obsoletes: #543 BREAKING CHANGE: If your custom backed has a workaround for this issue, it will break.
1 parent fcd64f8 commit aedc337

File tree

3 files changed

+16
-14
lines changed

3 files changed

+16
-14
lines changed

src/nuklear_edit.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -278,17 +278,19 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
278278
int cut = nk_input_is_key_pressed(in, NK_KEY_CUT);
279279
if ((copy || cut) && (flags & NK_EDIT_CLIPBOARD))
280280
{
281-
int glyph_len;
282-
nk_rune unicode;
283-
const char *text;
284-
int b = edit->select_start;
285-
int e = edit->select_end;
286-
287-
int begin = NK_MIN(b, e);
288-
int end = NK_MAX(b, e);
289-
text = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len);
290-
if (edit->clip.copy)
291-
edit->clip.copy(edit->clip.userdata, text, end - begin);
281+
int begin = NK_MIN(edit->select_start, edit->select_end);
282+
int end = NK_MAX(edit->select_start, edit->select_end);
283+
284+
if (edit->clip.copy) {
285+
int glyph_len;
286+
nk_rune unicode;
287+
const char *text_begin, *text_end;
288+
text_begin = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len);
289+
/*Reuse temporary variables (unicode, glyph_len)*/
290+
text_end = nk_str_at_const(&edit->string, end, &unicode, &glyph_len);
291+
292+
edit->clip.copy(edit->clip.userdata, text_begin, text_end - text_begin);
293+
}
292294
if (cut && !(flags & NK_EDIT_READ_ONLY)){
293295
nk_textedit_cut(edit);
294296
cursor_follow = nk_true;

src/nuklear_string.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,12 @@ nk_str_insert_at_rune(struct nk_str *str, int pos, const char *cstr, int len)
167167
NK_API int
168168
nk_str_insert_text_char(struct nk_str *str, int pos, const char *text, int len)
169169
{
170-
return nk_str_insert_text_utf8(str, pos, text, len);
170+
return nk_str_insert_at_rune(str, pos, text, len) ? len : 0;
171171
}
172172
NK_API int
173173
nk_str_insert_str_char(struct nk_str *str, int pos, const char *text)
174174
{
175-
return nk_str_insert_text_utf8(str, pos, text, nk_strlen(text));
175+
return nk_str_insert_text_char(str, pos, text, nk_strlen(text));
176176
}
177177
NK_API int
178178
nk_str_insert_text_utf8(struct nk_str *str, int pos, const char *text, int len)

src/nuklear_text_editor.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ nk_textedit_paste(struct nk_text_edit *state, char const *ctext, int len)
355355
glyphs = nk_utf_len(ctext, len);
356356
if (nk_str_insert_text_char(&state->string, state->cursor, text, len)) {
357357
nk_textedit_makeundo_insert(state, state->cursor, glyphs);
358-
state->cursor += len;
358+
state->cursor += glyphs;
359359
state->has_preferred_x = 0;
360360
return 1;
361361
}

0 commit comments

Comments
 (0)