diff --git a/demo/glfw_opengl2/nuklear_glfw_gl2.h b/demo/glfw_opengl2/nuklear_glfw_gl2.h index fb8b31e..738b6eb 100644 --- a/demo/glfw_opengl2/nuklear_glfw_gl2.h +++ b/demo/glfw_opengl2/nuklear_glfw_gl2.h @@ -240,15 +240,26 @@ nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit) } NK_INTERN void -nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len) +nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int glyphs) { - char *str = 0; - (void)usr; - if (!len) return; - str = (char*)malloc((size_t)len+1); + NK_UNUSED(usr); + if (!glyphs) return; + + int bytes = 0; + for (int i = 0; i < glyphs; i++) + { + int glyph_bytes; + // Find out how many bytes in a glyph + for (glyph_bytes = 1; (nk_byte)text[bytes] >= nk_utfmask[glyph_bytes]; glyph_bytes++) + ; + bytes += glyph_bytes; + } + + char* str = (char*)malloc(bytes + 1); if (!str) return; - memcpy(str, text, (size_t)len); - str[len] = '\0'; + + memcpy(str, text, bytes); + str[bytes] = '\0'; glfwSetClipboardString(glfw.win, str); free(str); } diff --git a/demo/glfw_opengl3/nuklear_glfw_gl3.h b/demo/glfw_opengl3/nuklear_glfw_gl3.h index cef59e5..12d8a4b 100644 --- a/demo/glfw_opengl3/nuklear_glfw_gl3.h +++ b/demo/glfw_opengl3/nuklear_glfw_gl3.h @@ -353,16 +353,27 @@ nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit) } NK_INTERN void -nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len) +nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int glyphs) { - struct nk_glfw* glfw = (struct nk_glfw*)usr.ptr; - char *str = 0; - if (!len) return; - str = (char*)malloc((size_t)len+1); + NK_UNUSED(usr); + if (!glyphs) return; + + int bytes = 0; + for (int i = 0; i < glyphs; i++) + { + int glyph_bytes; + // Find out how many bytes in a glyph + for (glyph_bytes = 1; (nk_byte)text[bytes] >= nk_utfmask[glyph_bytes]; glyph_bytes++) + ; + bytes += glyph_bytes; + } + + char* str = (char*)malloc(bytes + 1); if (!str) return; - memcpy(str, text, (size_t)len); - str[len] = '\0'; - glfwSetClipboardString(glfw->win, str); + + memcpy(str, text, bytes); + str[bytes] = '\0'; + glfwSetClipboardString(glfw.win, str); free(str); } diff --git a/demo/glfw_opengl4/nuklear_glfw_gl4.h b/demo/glfw_opengl4/nuklear_glfw_gl4.h index 781bfc3..4c5c888 100644 --- a/demo/glfw_opengl4/nuklear_glfw_gl4.h +++ b/demo/glfw_opengl4/nuklear_glfw_gl4.h @@ -499,15 +499,26 @@ nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit) } NK_INTERN void -nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len) +nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int glyphs) { - char *str = 0; - (void)usr; - if (!len) return; - str = (char*)malloc((size_t)len+1); + NK_UNUSED(usr); + if (!glyphs) return; + + int bytes = 0; + for (int i = 0; i < glyphs; i++) + { + int glyph_bytes; + // Find out how many bytes in a glyph + for (glyph_bytes = 1; (nk_byte)text[bytes] >= nk_utfmask[glyph_bytes]; glyph_bytes++) + ; + bytes += glyph_bytes; + } + + char* str = (char*)malloc(bytes + 1); if (!str) return; - memcpy(str, text, (size_t)len); - str[len] = '\0'; + + memcpy(str, text, bytes); + str[bytes] = '\0'; glfwSetClipboardString(glfw.win, str); free(str); }