]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.1.1224: MS-Windows: cannot specify font weight v8.1.1224
authorBram Moolenaar <Bram@vim.org>
Sun, 28 Apr 2019 12:02:47 +0000 (14:02 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 28 Apr 2019 12:02:47 +0000 (14:02 +0200)
Problem:    MS-Windows: cannot specify font weight.
Solution:   Add the "W" option to 'guifont'. (closes #4309)  Move GUI font
            explanation out of options.txt.

runtime/doc/gui.txt
runtime/doc/mbyte.txt
runtime/doc/options.txt
src/gui_w32.c
src/os_mswin.c
src/version.c

index 5df8f533b6da4ebbb526aebd6f97a9c982afe5f7..2a8a70d44381d40f4043945ee045fc6a313231e5 100644 (file)
@@ -1,4 +1,4 @@
-*gui.txt*       For Vim version 8.1.  Last change: 2019 Jan 06
+*gui.txt*       For Vim version 8.1.  Last change: 2019 Apr 28
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -11,8 +11,9 @@ Vim's Graphical User Interface                                *gui* *GUI*
 3. Mouse Control               |gui-mouse|
 4. Making GUI Selections       |gui-selections|
 5. Menus                       |menus|
-6. Extras                      |gui-extras|
-7. Shell Commands              |gui-shell|
+6. Font                                |gui-font|
+7. Extras                      |gui-extras|
+8. Shell Commands              |gui-shell|
 
 Other GUI documentation:
 |gui_x11.txt|  For specific items of the X11 GUI.
@@ -1037,7 +1038,139 @@ make a selection.
 Note that a menu that starts with ']' will not be displayed.
 
 ==============================================================================
-6. Extras                                              *gui-extras*
+6. Font
+
+This section describes font related options.
+
+GUIFONT                                                        *gui-font*
+
+'guifont' is the option that tells Vim what font to use.  In its simplest form
+the value is just one font name.  It can also be a list of font names
+separated with commas.  The first valid font is used.  When no valid font can
+be found you will get an error message. 
+
+On systems where 'guifontset' is supported (X11) and 'guifontset' is not
+empty, then 'guifont' is not used.  See |xfontset|.
+
+Note: As to the GTK GUIs, no error is given against any invalid names, and the
+first element of the list is always picked up and made use of.  This is
+because, instead of identifying a given name with a font, the GTK GUIs use it
+to construct a pattern and try to look up a font which best matches the
+pattern among available fonts, and this way, the matching never fails.  An
+invalid name doesn't matter because a number of font properties other than
+name will do to get the matching done.
+
+Spaces after a comma are ignored.  To include a comma in a font name precede
+it with a backslash.  Setting an option requires an extra backslash before a
+space and a backslash.  See also |option-backslash|.  For example: >
+    :set guifont=Screen15,\ 7x13,font\\,with\\,commas
+will make Vim try to use the font "Screen15" first, and if it fails it will
+try to use "7x13" and then "font,with,commas" instead.
+
+If none of the fonts can be loaded, Vim will keep the current setting.  If an
+empty font list is given, Vim will try using other resource settings (for X,
+it will use the Vim.font resource), and finally it will try some builtin
+default which should always be there ("7x13" in the case of X).  The font
+names given should be "normal" fonts.  Vim will try to find the related bold
+and italic fonts.
+
+For Win32, GTK, Motif, Mac OS and Photon: >
+    :set guifont=*
+will bring up a font requester, where you can pick the font you want.
+
+The font name depends on the GUI used.  See |setting-guifont| for a way to set
+'guifont' for various systems.
+
+For the GTK+ 2 and 3 GUIs, the font name looks like this: >
+    :set guifont=Andale\ Mono\ 11
+That's all.  XLFDs are not used.  For Chinese this is reported to work well: >
+    if has("gui_gtk2")
+      set guifont=Bitstream\ Vera\ Sans\ Mono\ 12,Fixed\ 12
+      set guifontwide=Microsoft\ Yahei\ 12,WenQuanYi\ Zen\ Hei\ 12
+    endif
+<
+(Replace gui_gtk2 with gui_gtk3 for the GTK+ 3 GUI)
+
+For Mac OSX you can use something like this: >
+    :set guifont=Monaco:h10
+Also see 'macatsui', it can help fix display problems.
+                                                       *E236*
+Note that the fonts must be mono-spaced (all characters have the same width).
+An exception is GTK: all fonts are accepted, but mono-spaced fonts look best.
+
+To preview a font on X11, you might be able to use the "xfontsel" program.
+The "xlsfonts" program gives a list of all available fonts.
+
+For the Win32 GUI                                      *E244* *E245*
+- Takes these options in the font name (use a ':' to separate the options):
+       hXX - height is XX (points, can be floating-point)
+       wXX - width is XX (points, can be floating-point)
+       WXX - weight is XX (see Note on Weights below)
+       b   - bold. This is equivalent to setting the weight to 700.
+       i   - italic
+       u   - underline
+       s   - strikeout
+       cXX - character set XX.  Valid charsets are: ANSI, ARABIC, BALTIC,
+             CHINESEBIG5, DEFAULT, EASTEUROPE, GB2312, GREEK, HANGEUL,
+             HEBREW, JOHAB, MAC, OEM, RUSSIAN, SHIFTJIS, SYMBOL, THAI,
+             TURKISH, VIETNAMESE ANSI and BALTIC.  Normally you would use
+             "cDEFAULT".
+       qXX - quality XX.  Valid quality names are: PROOF, DRAFT, ANTIALIASED,
+             NONANTIALIASED, CLEARTYPE, DEFAULT.  Normally you would use
+             "qDEFAULT".
+             Some quality values are not supported in legacy OSs.
+- A '_' can be used in the place of a space, so you don't need to use
+  backslashes to escape the spaces.
+Examples: >
+    :set guifont=courier_new:h12:w5:b:cRUSSIAN
+    :set guifont=Andale_Mono:h7.5:w4.5
+
+See also |font-sizes|.
+
+Note on Weights: Fonts often come with a variety of weights. "Normal" weights
+in Windows have a value of 400 and, left unspecified, this is the value that
+will be used when attempting to find fonts. Windows will often match fonts
+based on their weight with higher priority than the font name which means a
+Book or Medium variant of a font might be used despite specifying a Light or
+ExtraLight variant. If you are experiencing heavier weight substitution, then
+explicitly setting a lower weight value may mitigate against this unwanted
+substitution.
+
+
+GUIFONTWIDE                                            *gui-fontwide*
+
+When not empty, 'guifontwide' specifies a comma-separated list of fonts to be
+used for double-width characters.  The first font that can be loaded is
+used.
+
+Note: The size of these fonts must be exactly twice as wide as the one
+specified with 'guifont' and the same height.  If there is a mismatch then
+the text will not be drawn correctly.
+
+All GUI versions but GTK+:
+
+'guifontwide' is only used when 'encoding' is set to "utf-8" and
+'guifontset' is empty or invalid.
+When 'guifont' is set and a valid font is found in it and
+'guifontwide' is empty Vim will attempt to find a matching
+double-width font and set 'guifontwide' to it.
+
+GTK+ GUI only:                         *guifontwide_gtk*
+
+If set and valid, 'guifontwide' is always used for double width
+characters, even if 'encoding' is not set to "utf-8".
+Vim does not attempt to find an appropriate value for 'guifontwide'
+automatically.  If 'guifontwide' is empty Pango/Xft will choose the
+font for characters not available in 'guifont'.  Thus you do not need
+to set 'guifontwide' at all unless you want to override the choice
+made by Pango/Xft.
+
+Windows +multibyte only:               *guifontwide_win_mbyte*
+
+If set and valid, 'guifontwide' is used for IME instead of 'guifont'.
+
+==============================================================================
+7. Extras                                              *gui-extras*
 
 This section describes other features which are related to the GUI.
 
@@ -1081,7 +1214,7 @@ A recommended Japanese font is MS Mincho.  You can find info here:
 http://www.lexikan.com/mincho.htm
 
 ==============================================================================
-7. Shell Commands                                      *gui-shell*
+8. Shell Commands                                      *gui-shell*
 
 For the X11 GUI the external commands are executed inside the gvim window.
 See |gui-pty|.
index a645cab1241b03ba4806af5467244775ac29cab4..15198f6b67f8d65e90ab7768d49a6e40a3499386 100644 (file)
@@ -620,6 +620,21 @@ windows maintains a table of which groups of characters are required for a
 locale.  You have to specify all the fonts that a locale requires in the
 'guifontset' option.
 
+Setting the 'guifontset' option also means that all font names will be handled
+as a fontset name.  Also the ones used for the "font" argument of the
+|:highlight| command.
+
+Note the difference between 'guifont' and 'guifontset': In 'guifont'
+the comma-separated names are alternative names, one of which will be
+used.  In 'guifontset' the whole string is one fontset name,
+including the commas.  It is not possible to specify alternative
+fontset names.
+This example works on many X11 systems: >
+       :set guifontset=-*-*-medium-r-normal--16-*-*-*-c-*-*-*
+<
+The fonts must match with the current locale.  If fonts for the character sets
+that the current locale uses are not included, setting 'guifontset' will fail.
+
 NOTE: The fontset always uses the current locale, even though 'encoding' may
 be set to use a different charset.  In that situation you might want to use
 'guifont' and 'guifontwide' instead of 'guifontset'.
index 1502fc7e44ebd17ff0f941773ab5e15988f06e5f..4e0bedda14f56ee5da3288525a1c47e5cd7264d6 100644 (file)
@@ -3727,91 +3727,8 @@ A jump table for the options with a short description can be found at |Q_op|.
                        {not in Vi}
                        {only available when compiled with GUI enabled}
        This is a list of fonts which will be used for the GUI version of Vim.
-       In its simplest form the value is just one font name.  When
-       the font cannot be found you will get an error message.  To try other
-       font names a list can be specified, font names separated with commas.
-       The first valid font is used.
-
-       On systems where 'guifontset' is supported (X11) and 'guifontset' is
-       not empty, then 'guifont' is not used.
-
-       Note: As to the GTK GUIs, no error is given against any invalid names,
-       and the first element of the list is always picked up and made use of.
-       This is because, instead of identifying a given name with a font, the
-       GTK GUIs use it to construct a pattern and try to look up a font which
-       best matches the pattern among available fonts, and this way, the
-       matching never fails.  An invalid name doesn't matter because a number
-       of font properties other than name will do to get the matching done.
-
-       Spaces after a comma are ignored.  To include a comma in a font name
-       precede it with a backslash.  Setting an option requires an extra
-       backslash before a space and a backslash.  See also
-       |option-backslash|.  For example: >
-           :set guifont=Screen15,\ 7x13,font\\,with\\,commas
-<      will make Vim try to use the font "Screen15" first, and if it fails it
-       will try to use "7x13" and then "font,with,commas" instead.
-
-       If none of the fonts can be loaded, Vim will keep the current setting.
-       If an empty font list is given, Vim will try using other resource
-       settings (for X, it will use the Vim.font resource), and finally it
-       will try some builtin default which should always be there ("7x13" in
-       the case of X).  The font names given should be "normal" fonts.  Vim
-       will try to find the related bold and italic fonts.
-
-       For Win32, GTK, Motif, Mac OS and Photon: >
-           :set guifont=*
-<      will bring up a font requester, where you can pick the font you want.
-
-       The font name depends on the GUI used.  See |setting-guifont| for a
-       way to set 'guifont' for various systems.
-
-       For the GTK+ 2 and 3 GUIs, the font name looks like this: >
-           :set guifont=Andale\ Mono\ 11
-<      That's all.  XLFDs are not used.  For Chinese this is reported to work
-       well: >
-           if has("gui_gtk2")
-             set guifont=Bitstream\ Vera\ Sans\ Mono\ 12,Fixed\ 12
-             set guifontwide=Microsoft\ Yahei\ 12,WenQuanYi\ Zen\ Hei\ 12
-           endif
-<
-        (Replace gui_gtk2 with gui_gtk3 for the GTK+ 3 GUI)
-
-       For Mac OSX you can use something like this: >
-           :set guifont=Monaco:h10
-<      Also see 'macatsui', it can help fix display problems.
-                                                               *E236*
-       Note that the fonts must be mono-spaced (all characters have the same
-       width).  An exception is GTK: all fonts are accepted, but mono-spaced
-       fonts look best.
-
-       To preview a font on X11, you might be able to use the "xfontsel"
-       program.  The "xlsfonts" program gives a list of all available fonts.
-
-       For the Win32 GUI                                       *E244* *E245*
-       - takes these options in the font name:
-               hXX - height is XX (points, can be floating-point)
-               wXX - width is XX (points, can be floating-point)
-               b   - bold
-               i   - italic
-               u   - underline
-               s   - strikeout
-               cXX - character set XX.  Valid charsets are: ANSI, ARABIC,
-                     BALTIC, CHINESEBIG5, DEFAULT, EASTEUROPE, GB2312, GREEK,
-                     HANGEUL, HEBREW, JOHAB, MAC, OEM, RUSSIAN, SHIFTJIS,
-                     SYMBOL, THAI, TURKISH, VIETNAMESE ANSI and BALTIC.
-                     Normally you would use "cDEFAULT".
-               qXX - quality XX.  Valid quality names are: PROOF, DRAFT,
-                     ANTIALIASED, NONANTIALIASED, CLEARTYPE, DEFAULT.
-                     Normally you would use "qDEFAULT".
-                     Some quality values are not supported in legacy OSs.
-
-         Use a ':' to separate the options.
-       - A '_' can be used in the place of a space, so you don't need to use
-         backslashes to escape the spaces.
-       - Examples: >
-           :set guifont=courier_new:h12:w5:b:cRUSSIAN
-           :set guifont=Andale_Mono:h7.5:w4.5
-<      See also |font-sizes|.
+       In its simplest form the value is just one font name.
+       See |gui-font| for the details.
 
                                        *'guifontset'* *'gfs'*
                                        *E250* *E252* *E234* *E597* *E598*
@@ -3824,20 +3741,7 @@ A jump table for the options with a short description can be found at |Q_op|.
        When not empty, specifies two (or more) fonts to be used.  The first
        one for normal English, the second one for your special language.  See
        |xfontset|.
-       Setting this option also means that all font names will be handled as
-       a fontset name.  Also the ones used for the "font" argument of the
-       |:highlight| command.
-       The fonts must match with the current locale.  If fonts for the
-       character sets that the current locale uses are not included, setting
-       'guifontset' will fail.
-       Note the difference between 'guifont' and 'guifontset': In 'guifont'
-       the comma-separated names are alternative names, one of which will be
-       used.  In 'guifontset' the whole string is one fontset name,
-       including the commas.  It is not possible to specify alternative
-       fontset names.
-       This example works on many X11 systems: >
-               :set guifontset=-*-*-medium-r-normal--16-*-*-*-c-*-*-*
-<
+
                                *'guifontwide'* *'gfw'* *E231* *E533* *E534*
 'guifontwide' 'gfw'    string  (default "")
                        global
@@ -3845,31 +3749,7 @@ A jump table for the options with a short description can be found at |Q_op|.
                        {only available when compiled with GUI enabled}
        When not empty, specifies a comma-separated list of fonts to be used
        for double-width characters.  The first font that can be loaded is
-       used.
-       Note: The size of these fonts must be exactly twice as wide as the one
-       specified with 'guifont' and the same height.
-
-       All GUI versions but GTK+:
-
-       'guifontwide' is only used when 'encoding' is set to "utf-8" and
-       'guifontset' is empty or invalid.
-       When 'guifont' is set and a valid font is found in it and
-       'guifontwide' is empty Vim will attempt to find a matching
-       double-width font and set 'guifontwide' to it.
-
-       GTK+ GUI only:                          *guifontwide_gtk*
-
-       If set and valid, 'guifontwide' is always used for double width
-       characters, even if 'encoding' is not set to "utf-8".
-       Vim does not attempt to find an appropriate value for 'guifontwide'
-       automatically.  If 'guifontwide' is empty Pango/Xft will choose the
-       font for characters not available in 'guifont'.  Thus you do not need
-       to set 'guifontwide' at all unless you want to override the choice
-       made by Pango/Xft.
-
-       Windows +multibyte only:                *guifontwide_win_mbyte*
-
-       If set and valid, 'guifontwide' is used for IME instead of 'guifont'.
+       used.  See |gui-fontwide|.
 
                                                *'guiheadroom'* *'ghr'*
 'guiheadroom' 'ghr'    number  (default 50)
index dbc8d95a43cfdb411328f3de6424bbf02ad1bbb4..aac1398b3264f345cc9d02ffb51767cd8d7cdbb7 100644 (file)
@@ -3119,6 +3119,7 @@ logfont2name(LOGFONTW lf)
     char       *charset_name;
     char       *quality_name;
     char       *font_name;
+    int                points;
 
     font_name = (char *)utf16_to_enc(lf.lfFaceName, NULL);
     if (font_name == NULL)
@@ -3126,15 +3127,19 @@ logfont2name(LOGFONTW lf)
     charset_name = charset_id2name((int)lf.lfCharSet);
     quality_name = quality_id2name((int)lf.lfQuality);
 
-    res = (char *)alloc((unsigned)(strlen(font_name) + 20
+    res = (char *)alloc((unsigned)(strlen(font_name) + 30
                    + (charset_name == NULL ? 0 : strlen(charset_name) + 2)
                    + (quality_name == NULL ? 0 : strlen(quality_name) + 2)));
     if (res != NULL)
     {
        p = res;
-       /* make a normal font string out of the lf thing:*/
-       sprintf((char *)p, "%s:h%d", font_name, pixels_to_points(
-                        lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight, TRUE));
+       // make a normal font string out of the lf thing:
+       points = pixels_to_points(
+                        lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight, TRUE);
+       if (lf.lfWeight == FW_NORMAL || lf.lfWeight == FW_BOLD)
+           sprintf((char *)p, "%s:h%d", font_name, points);
+       else
+           sprintf((char *)p, "%s:h%d:W%d", font_name, points, lf.lfWeight);
        while (*p)
        {
            if (*p == ' ')
@@ -3143,7 +3148,7 @@ logfont2name(LOGFONTW lf)
        }
        if (lf.lfItalic)
            STRCAT(p, ":i");
-       if (lf.lfWeight >= FW_BOLD)
+       if (lf.lfWeight == FW_BOLD)
            STRCAT(p, ":b");
        if (lf.lfUnderline)
            STRCAT(p, ":u");
index 48be0de52cae08768900cf51e7b388c86581e25c..503d3d7d7bb9bf8fe0d9e40f17369394f4ef230e 100644 (file)
@@ -2992,6 +2992,9 @@ get_logfont(
            case L'w':
                lf->lfWidth = points_to_pixels(p, &p, FALSE, (long_i)printer_dc);
                break;
+           case L'W':
+               lf->lfWeight = wcstol(p, &p, 10);
+               break;
            case L'b':
                lf->lfWeight = FW_BOLD;
                break;
index fdbb9a63bc585e14820ddbd52308cdca18dbdf2a..ae93dc3a4c3488e8163cfef6414f4ef7bdf16388 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1224,
 /**/
     1223,
 /**/