]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.202 v7.4.202
authorBram Moolenaar <Bram@vim.org>
Wed, 12 Mar 2014 18:24:37 +0000 (19:24 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 12 Mar 2014 18:24:37 +0000 (19:24 +0100)
Problem:    MS-Windows: non-ASCII font names don't work.
Solution:   Convert between the current code page and 'encoding'. (Ken Takata)

src/gui_w48.c
src/os_mswin.c
src/proto/winclip.pro
src/version.c
src/winclip.c

index d8ffc1529212e7733061170481857c5455cd6fa7..f4473f62c82d20adcd39525dc82c278a3f4687e6 100644 (file)
@@ -3069,15 +3069,26 @@ logfont2name(LOGFONT lf)
     char       *p;
     char       *res;
     char       *charset_name;
+    char       *font_name = lf.lfFaceName;
 
     charset_name = charset_id2name((int)lf.lfCharSet);
-    res = alloc((unsigned)(strlen(lf.lfFaceName) + 20
+#ifdef FEAT_MBYTE
+    /* Convert a font name from the current codepage to 'encoding'.
+     * TODO: Use Wide APIs (including LOGFONTW) instead of ANSI APIs. */
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+    {
+       int     len;
+       acp_to_enc(lf.lfFaceName, strlen(lf.lfFaceName),
+                                               (char_u **)&font_name, &len);
+    }
+#endif
+    res = alloc((unsigned)(strlen(font_name) + 20
                    + (charset_name == NULL ? 0 : strlen(charset_name) + 2)));
     if (res != NULL)
     {
        p = res;
        /* make a normal font string out of the lf thing:*/
-       sprintf((char *)p, "%s:h%d", lf.lfFaceName, pixels_to_points(
+       sprintf((char *)p, "%s:h%d", font_name, pixels_to_points(
                         lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight, TRUE));
        while (*p)
        {
@@ -3102,6 +3113,10 @@ logfont2name(LOGFONT lf)
        }
     }
 
+#ifdef FEAT_MBYTE
+    if (font_name != lf.lfFaceName)
+       vim_free(font_name);
+#endif
     return res;
 }
 
index bf9acdbbf40fd0c657ec8f47feb285159c8f4aba..ec35029c3371447de7c2c0af02ff6b9ef88a4afa 100644 (file)
@@ -2867,12 +2867,27 @@ get_logfont(
 {
     char_u     *p;
     int                i;
+    int                ret = FAIL;
     static LOGFONT *lastlf = NULL;
+#ifdef FEAT_MBYTE
+    char_u     *acpname = NULL;
+#endif
 
     *lf = s_lfDefault;
     if (name == NULL)
        return OK;
 
+#ifdef FEAT_MBYTE
+    /* Convert 'name' from 'encoding' to the current codepage, because
+     * lf->lfFaceName uses the current codepage.
+     * TODO: Use Wide APIs instead of ANSI APIs. */
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+    {
+       int     len;
+       enc_to_acp(name, strlen(name), &acpname, &len);
+       name = acpname;
+    }
+#endif
     if (STRCMP(name, "*") == 0)
     {
 #if defined(FEAT_GUI_W32)
@@ -2887,10 +2902,9 @@ get_logfont(
        cf.lpLogFont = lf;
        cf.nFontType = 0 ; //REGULAR_FONTTYPE;
        if (ChooseFont(&cf))
-           goto theend;
-#else
-       return FAIL;
+           ret = OK;
 #endif
+       goto theend;
     }
 
     /*
@@ -2899,7 +2913,7 @@ get_logfont(
     for (p = name; *p && *p != ':'; p++)
     {
        if (p - name + 1 > LF_FACESIZE)
-           return FAIL;                        /* Name too long */
+           goto theend;                        /* Name too long */
        lf->lfFaceName[p - name] = *p;
     }
     if (p != name)
@@ -2927,7 +2941,7 @@ get_logfont(
                did_replace = TRUE;
            }
        if (!did_replace || init_logfont(lf) == FAIL)
-           return FAIL;
+           goto theend;
     }
 
     while (*p == ':')
@@ -2988,25 +3002,27 @@ get_logfont(
                            p[-1], name);
                    EMSG(IObuff);
                }
-               return FAIL;
+               goto theend;
        }
        while (*p == ':')
            p++;
     }
+    ret = OK;
 
-#if defined(FEAT_GUI_W32)
 theend:
-#endif
     /* ron: init lastlf */
-    if (printer_dc == NULL)
+    if (ret == OK && printer_dc == NULL)
     {
        vim_free(lastlf);
        lastlf = (LOGFONT *)alloc(sizeof(LOGFONT));
        if (lastlf != NULL)
            mch_memmove(lastlf, lf, sizeof(LOGFONT));
     }
+#ifdef FEAT_MBYTE
+    vim_free(acpname);
+#endif
 
-    return OK;
+    return ret;
 }
 
 #endif /* defined(FEAT_GUI) || defined(FEAT_PRINTER) */
index 996847e1ab77fe983f15cc31bf38b4ce09d7b6ec..5eee35d32e2f9b881402305ac440afe59506dd29 100644 (file)
@@ -11,4 +11,5 @@ void clip_mch_set_selection __ARGS((VimClipboard *cbd));
 short_u *enc_to_utf16 __ARGS((char_u *str, int *lenp));
 char_u *utf16_to_enc __ARGS((short_u *str, int *lenp));
 void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen));
+void enc_to_acp __ARGS((char_u *str, int str_size, char_u **out, int *outlen));
 /* vim: set ft=c : */
index 30d762b7851497a92fb64b814a3ac5990e3319a0..2b81f497078839d46e281877b31efbd68c4555e4 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    202,
 /**/
     201,
 /**/
index 0f110ffc52c8803eeb2319ea9cd28982109c586c..f34c7d97ffae285d3846cd74a1fcbcc7280c9a66 100644 (file)
@@ -797,4 +797,29 @@ acp_to_enc(str, str_size, out, outlen)
        vim_free(widestr);
     }
 }
+
+/*
+ * Convert from 'encoding' to the active codepage.
+ * Input is "str[str_size]".
+ * The result is in allocated memory: "out[outlen]".  With terminating NUL.
+ */
+    void
+enc_to_acp(str, str_size, out, outlen)
+    char_u     *str;
+    int                str_size;
+    char_u     **out;
+    int                *outlen;
+
+{
+    LPWSTR     widestr;
+    int                len = str_size;
+
+    widestr = (WCHAR *)enc_to_utf16(str, &len);
+    if (widestr != NULL)
+    {
+       WideCharToMultiByte_alloc(GetACP(), 0, widestr, len,
+                                               (LPSTR *)out, outlen, 0, 0);
+       vim_free(widestr);
+    }
+}
 #endif