]> granicus.if.org Git - vim/commitdiff
updated for version 7.2-201 v7.2.201
authorBram Moolenaar <Bram@vim.org>
Tue, 16 Jun 2009 13:23:06 +0000 (13:23 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 16 Jun 2009 13:23:06 +0000 (13:23 +0000)
runtime/doc/options.txt
src/globals.h
src/gui_gtk_x11.c
src/mbyte.c
src/option.c
src/version.c

index bebaa03b5bf60e262609d1d197b2e1a9d4f30642..84cff68576ecc9dcdf227afb0c3e30fbe6dfde61 100644 (file)
@@ -1443,6 +1443,14 @@ A jump table for the options with a short description can be found at |Q_op|.
        autoselectml    Like "autoselect", but for the modeless selection
                        only.  Compare to the 'A' flag in 'guioptions'.
 
+       html            When the clipboard contains HTML, use this when
+                       pasting.  When putting text on the clipboard, mark it
+                       as HTML.  This works to copy rendered HTML from
+                       Firefox, paste it as raw HTML in Vim, select the HTML
+                       in Vim and paste it in a rich edit box in Firefox.
+                       Only supported for GTK version 2 and later.
+                       Only available with the |+multi_byte| feature.
+
        exclude:{pattern}
                        Defines a pattern that is matched against the name of
                        the terminal 'term'.  If there is a match, no
index 6f69fcd2d04a4373f0e0d50b76183ebd271e908e..8fad5231733345fa0cd7e7e2a10301d83af4e044 100644 (file)
@@ -509,6 +509,7 @@ EXTERN VimClipboard clip_plus;      /* CLIPBOARD selection in X11 */
 EXTERN int     clip_unnamed INIT(= FALSE);
 EXTERN int     clip_autoselect INIT(= FALSE);
 EXTERN int     clip_autoselectml INIT(= FALSE);
+EXTERN int     clip_html INIT(= FALSE);
 EXTERN regprog_T *clip_exclude_prog INIT(= NULL);
 #endif
 
index e44ae0628eb33697c790c45ba87b4a5c9eb0f222..29ab9a799141dfcf0d705dd06f920183251c1189 100644 (file)
@@ -107,6 +107,7 @@ enum
     TARGET_UTF8_STRING,
     TARGET_STRING,
     TARGET_COMPOUND_TEXT,
+    TARGET_HTML,
     TARGET_TEXT,
     TARGET_TEXT_URI_LIST,
     TARGET_TEXT_PLAIN,
@@ -123,6 +124,7 @@ static const GtkTargetEntry selection_targets[] =
     {VIMENC_ATOM_NAME, 0, TARGET_VIMENC},
     {VIM_ATOM_NAME,    0, TARGET_VIM},
 #ifdef FEAT_MBYTE
+    {"text/html",      0, TARGET_HTML},
     {"UTF8_STRING",    0, TARGET_UTF8_STRING},
 #endif
     {"COMPOUND_TEXT",  0, TARGET_COMPOUND_TEXT},
@@ -140,6 +142,7 @@ static const GtkTargetEntry dnd_targets[] =
 {
     {"text/uri-list",  0, TARGET_TEXT_URI_LIST},
 # ifdef FEAT_MBYTE
+    {"text/html",      0, TARGET_HTML},
     {"UTF8_STRING",    0, TARGET_UTF8_STRING},
 # endif
     {"STRING",         0, TARGET_STRING},
@@ -178,6 +181,7 @@ static GdkAtom save_yourself_atom = GDK_NONE;
  * Atoms used to control/reference X11 selections.
  */
 #ifdef FEAT_MBYTE
+static GdkAtom html_atom = GDK_NONE;
 static GdkAtom utf8_string_atom = GDK_NONE;
 #endif
 #ifndef HAVE_GTK2
@@ -1364,6 +1368,24 @@ selection_received_cb(GtkWidget          *widget UNUSED,
            else
                text = tmpbuf_utf8;
        }
+       else if (len >= 2 && text[0] == 0xff && text[1] == 0xfe)
+       {
+           vimconv_T conv;
+
+           /* UTF-16, we get this for HTML */
+           conv.vc_type = CONV_NONE;
+           convert_setup_ext(&conv, (char_u *)"utf-16le", FALSE, p_enc, TRUE);
+
+           if (conv.vc_type != CONV_NONE)
+           {
+               text += 2;
+               len -= 2;
+               tmpbuf = string_convert(&conv, text, &len);
+               convert_setup(&conv, NULL, NULL);
+           }
+           if (tmpbuf != NULL)
+               text = tmpbuf;
+       }
     }
 #else /* !HAVE_GTK2 */
 # ifdef FEAT_MBYTE
@@ -1451,6 +1473,7 @@ selection_get_cb(GtkWidget            *widget UNUSED,
 
     if (info != (guint)TARGET_STRING
 #ifdef FEAT_MBYTE
+           && (!clip_html || info != (guint)TARGET_HTML)
            && info != (guint)TARGET_UTF8_STRING
            && info != (guint)TARGET_VIMENC
 #endif
@@ -1486,6 +1509,40 @@ selection_get_cb(GtkWidget           *widget UNUSED,
     }
 
 #ifdef FEAT_MBYTE
+    else if (info == (guint)TARGET_HTML)
+    {
+       vimconv_T conv;
+
+       /* Since we get utf-16, we probably should set it as well. */
+       conv.vc_type = CONV_NONE;
+       convert_setup_ext(&conv, p_enc, TRUE, (char_u *)"utf-16le", FALSE);
+       if (conv.vc_type != CONV_NONE)
+       {
+           tmpbuf = string_convert(&conv, string, &length);
+           convert_setup(&conv, NULL, NULL);
+           vim_free(string);
+           string = tmpbuf;
+       }
+
+       /* Prepend the BOM: "fffe" */
+       if (string != NULL)
+       {
+           tmpbuf = alloc(length + 2);
+           tmpbuf[0] = 0xff;
+           tmpbuf[1] = 0xfe;
+           mch_memmove(tmpbuf + 2, string, (size_t)length);
+           vim_free(string);
+           string = tmpbuf;
+           length += 2;
+
+           selection_data->type = selection_data->target;
+           selection_data->format = 16;        /* 16 bits per char */
+           gtk_selection_data_set(selection_data, html_atom, 16,
+                                                             string, length);
+           vim_free(string);
+       }
+       return;
+    }
     else if (info == (guint)TARGET_VIMENC)
     {
        int l = STRLEN(p_enc);
@@ -3464,6 +3521,7 @@ gui_mch_init(void)
 
     /* Initialise atoms */
 #ifdef FEAT_MBYTE
+    html_atom = gdk_atom_intern("text/html", FALSE);
     utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE);
 #endif
 #ifndef HAVE_GTK2
@@ -6665,6 +6723,10 @@ clip_mch_request_selection(VimClipboard *cbd)
 
     for (i = 0; i < N_SELECTION_TARGETS; ++i)
     {
+#ifdef FEAT_MBYTE
+       if (!clip_html && selection_targets[i].info == TARGET_HTML)
+           continue;
+#endif
        received_selection = RS_NONE;
        target = gdk_atom_intern(selection_targets[i].target, FALSE);
 
index bb3db5b9b5fc908ce3bfe57b07af27ab06961ff8..87683ba08f7c77a681684f0179dc8a36964ddf17 100644 (file)
@@ -3265,7 +3265,7 @@ encname2codepage(name)
 
 # if defined(USE_ICONV) || defined(PROTO)
 
-static char_u *iconv_string __ARGS((vimconv_T *vcp, char_u *str, int slen, int *unconvlenp));
+static char_u *iconv_string __ARGS((vimconv_T *vcp, char_u *str, int slen, int *unconvlenp, int *resultlenp));
 
 /*
  * Call iconv_open() with a check if iconv() works properly (there are broken
@@ -3326,13 +3326,15 @@ my_iconv_open(to, from)
  * If "unconvlenp" is not NULL handle the string ending in an incomplete
  * sequence and set "*unconvlenp" to the length of it.
  * Returns the converted string in allocated memory.  NULL for an error.
+ * If resultlenp is not NULL, sets it to the result length in bytes.
  */
     static char_u *
-iconv_string(vcp, str, slen, unconvlenp)
+iconv_string(vcp, str, slen, unconvlenp, resultlenp)
     vimconv_T  *vcp;
     char_u     *str;
     int                slen;
     int                *unconvlenp;
+    int                *resultlenp;
 {
     const char *from;
     size_t     fromlen;
@@ -3418,6 +3420,9 @@ iconv_string(vcp, str, slen, unconvlenp)
        /* Not enough room or skipping illegal sequence. */
        done = to - (char *)result;
     }
+
+    if (resultlenp != NULL)
+       *resultlenp = (int)(to - (char *)result);
     return result;
 }
 
@@ -5836,9 +5841,26 @@ convert_setup(vcp, from, to)
     vimconv_T  *vcp;
     char_u     *from;
     char_u     *to;
+{
+    return convert_setup_ext(vcp, from, TRUE, to, TRUE);
+}
+
+/*
+ * As convert_setup(), but only when from_unicode_is_utf8 is TRUE will all
+ * "from" unicode charsets be considered utf-8.  Same for "to".
+ */
+    int
+convert_setup_ext(vcp, from, from_unicode_is_utf8, to, to_unicode_is_utf8)
+    vimconv_T  *vcp;
+    char_u     *from;
+    int                from_unicode_is_utf8;
+    char_u     *to;
+    int                to_unicode_is_utf8;
 {
     int                from_prop;
     int                to_prop;
+    int                from_is_utf8;
+    int                to_is_utf8;
 
     /* Reset to no conversion. */
 # ifdef USE_ICONV
@@ -5856,37 +5878,46 @@ convert_setup(vcp, from, to)
 
     from_prop = enc_canon_props(from);
     to_prop = enc_canon_props(to);
-    if ((from_prop & ENC_LATIN1) && (to_prop & ENC_UNICODE))
+    if (from_unicode_is_utf8)
+       from_is_utf8 = from_prop & ENC_UNICODE;
+    else
+       from_is_utf8 = from_prop == ENC_UNICODE;
+    if (to_unicode_is_utf8)
+       to_is_utf8 = to_prop & ENC_UNICODE;
+    else
+       to_is_utf8 = to_prop == ENC_UNICODE;
+
+    if ((from_prop & ENC_LATIN1) && to_is_utf8)
     {
        /* Internal latin1 -> utf-8 conversion. */
        vcp->vc_type = CONV_TO_UTF8;
        vcp->vc_factor = 2;     /* up to twice as long */
     }
-    else if ((from_prop & ENC_LATIN9) && (to_prop & ENC_UNICODE))
+    else if ((from_prop & ENC_LATIN9) && to_is_utf8)
     {
        /* Internal latin9 -> utf-8 conversion. */
        vcp->vc_type = CONV_9_TO_UTF8;
        vcp->vc_factor = 3;     /* up to three as long (euro sign) */
     }
-    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN1))
+    else if (from_is_utf8 && (to_prop & ENC_LATIN1))
     {
        /* Internal utf-8 -> latin1 conversion. */
        vcp->vc_type = CONV_TO_LATIN1;
     }
-    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN9))
+    else if (from_is_utf8 && (to_prop & ENC_LATIN9))
     {
        /* Internal utf-8 -> latin9 conversion. */
        vcp->vc_type = CONV_TO_LATIN9;
     }
 #ifdef WIN3264
     /* Win32-specific codepage <-> codepage conversion without iconv. */
-    else if (((from_prop & ENC_UNICODE) || encname2codepage(from) > 0)
-           && ((to_prop & ENC_UNICODE) || encname2codepage(to) > 0))
+    else if ((from_is_utf8 || encname2codepage(from) > 0)
+           && (to_is_utf8 || encname2codepage(to) > 0))
     {
        vcp->vc_type = CONV_CODEPAGE;
        vcp->vc_factor = 2;     /* up to twice as long */
-       vcp->vc_cpfrom = (from_prop & ENC_UNICODE) ? 0 : encname2codepage(from);
-       vcp->vc_cpto = (to_prop & ENC_UNICODE) ? 0 : encname2codepage(to);
+       vcp->vc_cpfrom = from_is_utf8 ? 0 : encname2codepage(from);
+       vcp->vc_cpto = to_is_utf8 ? 0 : encname2codepage(to);
     }
 #endif
 #ifdef MACOS_X
@@ -5894,7 +5925,7 @@ convert_setup(vcp, from, to)
     {
        vcp->vc_type = CONV_MAC_LATIN1;
     }
-    else if ((from_prop & ENC_MACROMAN) && (to_prop & ENC_UNICODE))
+    else if ((from_prop & ENC_MACROMAN) && to_is_utf8)
     {
        vcp->vc_type = CONV_MAC_UTF8;
        vcp->vc_factor = 2;     /* up to twice as long */
@@ -5903,7 +5934,7 @@ convert_setup(vcp, from, to)
     {
        vcp->vc_type = CONV_LATIN1_MAC;
     }
-    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_MACROMAN))
+    else if (from_is_utf8 && (to_prop & ENC_MACROMAN))
     {
        vcp->vc_type = CONV_UTF8_MAC;
     }
@@ -5913,8 +5944,8 @@ convert_setup(vcp, from, to)
     {
        /* Use iconv() for conversion. */
        vcp->vc_fd = (iconv_t)my_iconv_open(
-               (to_prop & ENC_UNICODE) ? (char_u *)"utf-8" : to,
-               (from_prop & ENC_UNICODE) ? (char_u *)"utf-8" : from);
+               to_is_utf8 ? (char_u *)"utf-8" : to,
+               from_is_utf8 ? (char_u *)"utf-8" : from);
        if (vcp->vc_fd != (iconv_t)-1)
        {
            vcp->vc_type = CONV_ICONV;
@@ -6170,9 +6201,7 @@ string_convert_ext(vcp, ptr, lenp, unconvlenp)
 
 # ifdef USE_ICONV
        case CONV_ICONV:        /* conversion with output_conv.vc_fd */
-           retval = iconv_string(vcp, ptr, len, unconvlenp);
-           if (retval != NULL && lenp != NULL)
-               *lenp = (int)STRLEN(retval);
+           retval = iconv_string(vcp, ptr, len, unconvlenp, lenp);
            break;
 # endif
 # ifdef WIN3264
index 69cdd2b57d9a5b010af32b0a997c0c1072987083..141329121bbb179404e6ed18e068e028eadb4139 100644 (file)
@@ -7024,6 +7024,7 @@ check_clipboard_option()
     int                new_unnamed = FALSE;
     int                new_autoselect = FALSE;
     int                new_autoselectml = FALSE;
+    int                new_html = FALSE;
     regprog_T  *new_exclude_prog = NULL;
     char_u     *errmsg = NULL;
     char_u     *p;
@@ -7047,6 +7048,11 @@ check_clipboard_option()
            new_autoselectml = TRUE;
            p += 12;
        }
+       else if (STRNCMP(p, "html", 4) == 0 && (p[4] == ',' || p[4] == NUL))
+       {
+           new_html = TRUE;
+           p += 4;
+       }
        else if (STRNCMP(p, "exclude:", 8) == 0 && new_exclude_prog == NULL)
        {
            p += 8;
@@ -7068,6 +7074,7 @@ check_clipboard_option()
        clip_unnamed = new_unnamed;
        clip_autoselect = new_autoselect;
        clip_autoselectml = new_autoselectml;
+       clip_html = new_html;
        vim_free(clip_exclude_prog);
        clip_exclude_prog = new_exclude_prog;
     }
index a0a595167ce7b3ba24a474895aa882977cd4dee8..72208d1b5a8022586fe29ea0a1963f5da5d1ae93 100644 (file)
@@ -676,6 +676,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    201,
 /**/
     200,
 /**/