Mercurial > vim
changeset 4201:3fd805ca2a6a v7.3.852
updated for version 7.3.852
Problem: system() breaks clipboard text. (Yukihiro Nakadaira)
Solution: Use Xutf8TextPropertyToTextList(). (Christian Brabandt)
Also do not put the text in the clip buffer if conversion fails.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Thu, 07 Mar 2013 18:02:30 +0100 |
parents | 606423157270 |
children | 97591d534d42 |
files | src/ops.c src/ui.c src/version.c |
diffstat | 3 files changed, 29 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ops.c +++ b/src/ops.c @@ -5828,6 +5828,8 @@ x11_export_final_selection() && len < 1024*1024 && len > 0) { #ifdef FEAT_MBYTE + int ok = TRUE; + /* The CUT_BUFFER0 is supposed to always contain latin1. Convert from * 'enc' when it is a multi-byte encoding. When 'enc' is an 8-bit * encoding conversion usually doesn't work, so keep the text as-is. @@ -5842,6 +5844,7 @@ x11_export_final_selection() int intlen = len; char_u *conv_str; + vc.vc_fail = TRUE; conv_str = string_convert(&vc, str, &intlen); len = intlen; if (conv_str != NULL) @@ -5849,12 +5852,26 @@ x11_export_final_selection() vim_free(str); str = conv_str; } + else + { + ok = FALSE; + } convert_setup(&vc, NULL, NULL); } + else + { + ok = FALSE; + } } -#endif - XStoreBuffer(dpy, (char *)str, (int)len, 0); - XFlush(dpy); + + /* Do not store the string if conversion failed. Better to use any + * other selection than garbled text. */ + if (ok) +#endif + { + XStoreBuffer(dpy, (char *)str, (int)len, 0); + XFlush(dpy); + } } vim_free(str);
--- a/src/ui.c +++ b/src/ui.c @@ -2119,7 +2119,13 @@ clip_x11_request_selection_cb(w, success text_prop.encoding = *type; text_prop.format = *format; text_prop.nitems = len; - status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop, +#ifdef FEAT_MBYTE + if (*type == utf8_atom) + status = Xutf8TextPropertyToTextList(X_DISPLAY, &text_prop, + &text_list, &n_text); + else +#endif + status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop, &text_list, &n_text); if (status != Success || n_text < 1) {