0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

updated for version 7.3.440

Problem:    Vim does not support UTF8_STRING for the X selection.
Solution:   Add UTF8_STRING atom support. (Alex Efros) Use it only when
            'encoding' is set to Unicode.
This commit is contained in:
Bram Moolenaar 2012-02-12 01:35:10 +01:00
parent be74734429
commit efcb54b78c
2 changed files with 35 additions and 10 deletions

View File

@ -1917,6 +1917,7 @@ open_app_context()
static Atom vim_atom; /* Vim's own special selection format */ static Atom vim_atom; /* Vim's own special selection format */
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
static Atom vimenc_atom; /* Vim's extended selection format */ static Atom vimenc_atom; /* Vim's extended selection format */
static Atom utf8_atom;
#endif #endif
static Atom compound_text_atom; static Atom compound_text_atom;
static Atom text_atom; static Atom text_atom;
@ -1930,6 +1931,7 @@ x11_setup_atoms(dpy)
vim_atom = XInternAtom(dpy, VIM_ATOM_NAME, False); vim_atom = XInternAtom(dpy, VIM_ATOM_NAME, False);
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
vimenc_atom = XInternAtom(dpy, VIMENC_ATOM_NAME,False); vimenc_atom = XInternAtom(dpy, VIMENC_ATOM_NAME,False);
utf8_atom = XInternAtom(dpy, "UTF8_STRING", False);
#endif #endif
compound_text_atom = XInternAtom(dpy, "COMPOUND_TEXT", False); compound_text_atom = XInternAtom(dpy, "COMPOUND_TEXT", False);
text_atom = XInternAtom(dpy, "TEXT", False); text_atom = XInternAtom(dpy, "TEXT", False);
@ -2074,7 +2076,11 @@ clip_x11_request_selection_cb(w, success, sel_atom, type, value, length,
} }
#endif #endif
else if (*type == compound_text_atom || ( else if (*type == compound_text_atom
#ifdef FEAT_MBYTE
|| *type == utf8_atom
#endif
|| (
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
enc_dbcs != 0 && enc_dbcs != 0 &&
#endif #endif
@ -2128,7 +2134,7 @@ clip_x11_request_selection(myShell, dpy, cbd)
#else #else
1 1
#endif #endif
; i < 5; i++) ; i < 6; i++)
{ {
switch (i) switch (i)
{ {
@ -2136,10 +2142,18 @@ clip_x11_request_selection(myShell, dpy, cbd)
case 0: type = vimenc_atom; break; case 0: type = vimenc_atom; break;
#endif #endif
case 1: type = vim_atom; break; case 1: type = vim_atom; break;
case 2: type = compound_text_atom; break; #ifdef FEAT_MBYTE
case 3: type = text_atom; break; case 2: type = utf8_atom; break;
#endif
case 3: type = compound_text_atom; break;
case 4: type = text_atom; break;
default: type = XA_STRING; default: type = XA_STRING;
} }
#ifdef FEAT_MBYTE
if (type == utf8_atom && !enc_utf8)
/* Only request utf-8 when 'encoding' is utf8. */
continue;
#endif
success = MAYBE; success = MAYBE;
XtGetSelectionValue(myShell, cbd->sel_atom, type, XtGetSelectionValue(myShell, cbd->sel_atom, type,
clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime); clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
@ -2230,18 +2244,23 @@ clip_x11_convert_selection_cb(w, sel_atom, target, type, value, length, format)
{ {
Atom *array; Atom *array;
if ((array = (Atom *)XtMalloc((unsigned)(sizeof(Atom) * 6))) == NULL) if ((array = (Atom *)XtMalloc((unsigned)(sizeof(Atom) * 7))) == NULL)
return False; return False;
*value = (XtPointer)array; *value = (XtPointer)array;
i = 0; i = 0;
array[i++] = XA_STRING;
array[i++] = targets_atom; array[i++] = targets_atom;
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
array[i++] = vimenc_atom; array[i++] = vimenc_atom;
#endif #endif
array[i++] = vim_atom; array[i++] = vim_atom;
#ifdef FEAT_MBYTE
if (enc_utf8)
array[i++] = utf8_atom;
#endif
array[i++] = XA_STRING;
array[i++] = text_atom; array[i++] = text_atom;
array[i++] = compound_text_atom; array[i++] = compound_text_atom;
*type = XA_ATOM; *type = XA_ATOM;
/* This used to be: *format = sizeof(Atom) * 8; but that caused /* This used to be: *format = sizeof(Atom) * 8; but that caused
* crashes on 64 bit machines. (Peter Derr) */ * crashes on 64 bit machines. (Peter Derr) */
@ -2253,6 +2272,7 @@ clip_x11_convert_selection_cb(w, sel_atom, target, type, value, length, format)
if ( *target != XA_STRING if ( *target != XA_STRING
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
&& *target != vimenc_atom && *target != vimenc_atom
&& *target != utf8_atom
#endif #endif
&& *target != vim_atom && *target != vim_atom
&& *target != text_atom && *target != text_atom
@ -2282,13 +2302,16 @@ clip_x11_convert_selection_cb(w, sel_atom, target, type, value, length, format)
return False; return False;
} }
if (*target == XA_STRING) if (*target == XA_STRING
#ifdef FEAT_MBYTE
|| (*target == utf8_atom && enc_utf8)
#endif
)
{ {
mch_memmove(result, string, (size_t)(*length)); mch_memmove(result, string, (size_t)(*length));
*type = XA_STRING; *type = *target;
} }
else if (*target == compound_text_atom else if (*target == compound_text_atom || *target == text_atom)
|| *target == text_atom)
{ {
XTextProperty text_prop; XTextProperty text_prop;
char *string_nt = (char *)alloc((unsigned)*length + 1); char *string_nt = (char *)alloc((unsigned)*length + 1);

View File

@ -714,6 +714,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
440,
/**/ /**/
439, 439,
/**/ /**/