Commit: 0e07cae8f3147470cdf775cb280216d6c3106125
Author: Dalai Felinto
Date:   Thu Feb 11 15:27:03 2016 -0200
Branches: tmp_text_copy_paste
https://developer.blender.org/rB0e07cae8f3147470cdf775cb280216d6c3106125

Fixups to handle utf8 strings properly

===================================================================

M       source/blender/blenkernel/BKE_font.h
M       source/blender/editors/curve/editfont.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_font.h 
b/source/blender/blenkernel/BKE_font.h
index 5dcc6f8..996c176 100644
--- a/source/blender/blenkernel/BKE_font.h
+++ b/source/blender/blenkernel/BKE_font.h
@@ -56,9 +56,6 @@ typedef struct EditFontSelBox {
 } EditFontSelBox;
 
 typedef struct EditFont {
-       wchar_t *copybuf;
-       struct CharInfo *copybufinfo;
-       
        wchar_t *textbuf;
        struct CharInfo *textbufinfo;
        
diff --git a/source/blender/editors/curve/editfont.c 
b/source/blender/editors/curve/editfont.c
index 84e214f..9b01cf1 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -710,12 +710,14 @@ static void copy_selection(Object *obedit)
 
                /* internal clipboard (for style) */
                memcpy(&G.copybuf[0], ef->textbuf + selstart, len * 
sizeof(wchar_t));
-               G.copybuf[(selend - selstart) + 1] = 0;
-               memcpy(&G.copybufinfo[0], ef->textbufinfo + selstart, ((selend 
- selstart) + 1) * sizeof(CharInfo));
+               G.copybuf[len] = 0;
+               memcpy(&G.copybufinfo[0], ef->textbufinfo + selstart, len * 
sizeof(CharInfo));
+
+               len = BLI_wstrlen_utf8(&G.copybuf[0]);
 
                /* system clipboard */
-               buf = MEM_mallocN(len * sizeof(char), __func__);
-               BLI_strncpy_wchar_as_utf8(buf, ef->textbuf + selstart, len - 1);
+               buf = MEM_mallocN(len + sizeof(wchar_t), __func__);
+               BLI_strncpy_wchar_as_utf8(buf, &G.copybuf[0], len);
                WM_clipboard_text_set(buf, false);
        }
 
@@ -782,9 +784,7 @@ void FONT_OT_text_cut(wmOperatorType *ot)
 
 static bool paste_selection(Object *obedit, ReportList *reports)
 {
-       Curve *cu = obedit->data;
-       EditFont *ef = cu->editfont;
-       int len = wcslen(ef->copybuf);
+       int len = wcslen(&G.copybuf[0]);
 
        if (font_paste_wchar(obedit, &G.copybuf[0], len, &G.copybufinfo[0])) {
                return true;
@@ -800,6 +800,7 @@ static int paste_text_exec(bContext *C, wmOperator *op)
        Object *obedit = CTX_data_edit_object(C);
        char *strp, *buf = NULL;
        int len, retval;
+       size_t len_utf8;
 
        /* get text from system */
        strp = WM_clipboard_text_get(false, &len);
@@ -810,14 +811,16 @@ static int paste_text_exec(bContext *C, wmOperator *op)
        }
 
        /* get text from internal buffer */
-       buf = MEM_mallocN(len * sizeof(char), __func__);
-       BLI_strncpy_wchar_as_utf8(buf, &G.copybuf[0], len - 1);
+       len_utf8 = BLI_wstrlen_utf8(&G.copybuf[0]);
+       buf = MEM_mallocN(len_utf8 + sizeof(wchar_t), __func__);
+       BLI_strncpy_wchar_as_utf8(buf, &G.copybuf[0], len_utf8 + 1);
 
-       /* if they match, get textinfo from internall buffer */
-       if (STREQLEN(strp, buf, len)) {
+       if (STREQ(strp, buf)) {
+               /* get textinfo from internal buffer */
                retval = paste_selection(obedit, op->reports) ? 
OPERATOR_FINISHED : OPERATOR_CANCELLED;
        }
        else {
+               /* get text from clipboard */
                if ((len <= MAXTEXT) && font_paste_utf8(C, strp, len)) {
                        text_update_edited(C, obedit, FO_EDIT);
                        retval = OPERATOR_FINISHED;
@@ -826,6 +829,9 @@ static int paste_text_exec(bContext *C, wmOperator *op)
                        BKE_report(op->reports, RPT_ERROR, "Clipboard too 
long");
                        retval = OPERATOR_CANCELLED;
                }
+
+               /* free the buffer */
+               G.copybuf[0] = 0;
        }
 
        if (retval != OPERATOR_CANCELLED) {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to