From: Piotr Caban piotr@codeweavers.com
Otherwise, on systems with only Wine provided fonts, we end up selecting first non-vertical font ignoring other properties. --- programs/conhost/window.c | 98 ++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 59 deletions(-)
diff --git a/programs/conhost/window.c b/programs/conhost/window.c index 6925ec9c351..592a5141b89 100644 --- a/programs/conhost/window.c +++ b/programs/conhost/window.c @@ -799,72 +799,56 @@ static BOOL set_console_font( struct console *console, const LOGFONTW *logfont ) struct font_chooser { struct console *console; - int pass; - unsigned int font_height; - unsigned int font_width; - BOOL done; + unsigned int weight; + LOGFONTW lf; };
/* check if the font family described in lf and tm is usable as a font for the renderer */ static BOOL validate_font( struct console *console, const LOGFONTW *lf, - const TEXTMETRICW *tm, DWORD type, int pass ) + const TEXTMETRICW *tm, DWORD type, int *weight ) { - switch (pass) /* we get increasingly lenient in later passes */ + int w = 0x1; + + if (!tm) w |= 0x6; + else if (!(type & RASTER_FONTTYPE)) { - case 0: - if (type & RASTER_FONTTYPE) return FALSE; - /* fall through */ - case 1: - if (tm && (type & RASTER_FONTTYPE)) - { - if (tm->tmMaxCharWidth * (console->active->win.right - console->active->win.left + 1) - >= GetSystemMetrics(SM_CXSCREEN)) - return FALSE; - if (tm->tmHeight * (console->active->win.bottom - console->active->win.top + 1) - >= GetSystemMetrics(SM_CYSCREEN)) - return FALSE; - } - /* fall through */ - case 2: - if (lf->lfCharSet != DEFAULT_CHARSET && lf->lfCharSet != console->window->ui_charset) - return FALSE; - if (tm && tm->tmCharSet != DEFAULT_CHARSET && tm->tmCharSet != console->window->ui_charset) - return FALSE; - /* fall through */ - case 3: - if ((lf->lfPitchAndFamily & 3) != FIXED_PITCH) return FALSE; - if (tm && (tm->tmItalic || tm->tmUnderlined || tm->tmStruckOut)) return FALSE; - /* fall through */ - case 4: - if (lf->lfFaceName[0] == '@') return FALSE; - break; + w |= 0x2; + if (tm->tmMaxCharWidth * (console->active->win.right - console->active->win.left + 1) + < GetSystemMetrics(SM_CXSCREEN) + && tm->tmHeight * (console->active->win.bottom - console->active->win.top + 1) + < GetSystemMetrics(SM_CYSCREEN)) + w |= 0x4; } - return TRUE; + if ((lf->lfCharSet == DEFAULT_CHARSET || lf->lfCharSet == console->window->ui_charset) + && (!tm || tm->tmCharSet == DEFAULT_CHARSET || tm->tmCharSet == console->window->ui_charset)) + w |= 0x8; + if ((lf->lfPitchAndFamily & 3) == FIXED_PITCH + && (!tm || (!tm->tmItalic && !tm->tmUnderlined && !tm->tmStruckOut))) + w |= 0x10; + if (lf->lfFaceName[0] != '@') + w |= 0x20; + + if (weight) *weight = w; + return w == 0x3f; }
static int CALLBACK enum_first_font_proc( const LOGFONTW *lf, const TEXTMETRICW *tm, DWORD font_type, LPARAM lparam ) { struct font_chooser *fc = (struct font_chooser *)lparam; - LOGFONTW mlf; + int weight; + BOOL ret;
TRACE( "%s\n", debugstr_logfont( lf, font_type )); TRACE( "%s\n", debugstr_textmetric( tm, font_type ));
- if (!validate_font( fc->console, lf, tm, font_type, fc->pass )) - return 1; - - /* set default font size */ - mlf = *lf; - mlf.lfHeight = fc->font_height; - mlf.lfWidth = fc->font_width; - - if (!set_console_font( fc->console, &mlf )) - return 1; - - fc->done = TRUE; - - return 0; + ret = validate_font( fc->console, lf, tm, font_type, &weight ); + if (weight > fc->weight) + { + fc->weight = weight; + fc->lf = *lf; + } + return !ret; }
static void set_first_font( struct console *console, struct console_config *config ) @@ -878,18 +862,14 @@ static void set_first_font( struct console *console, struct console_config *conf lf.lfCharSet = DEFAULT_CHARSET; lf.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
+ memset( &fc, 0, sizeof(fc) ); fc.console = console; - fc.font_height = config->cell_height; - fc.font_width = config->cell_width; - fc.done = FALSE;
- for (fc.pass = 0; fc.pass <= 5; fc.pass++) - { - EnumFontFamiliesExW( console->window->mem_dc, &lf, enum_first_font_proc, (LPARAM)&fc, 0); - if (fc.done) break; - } + EnumFontFamiliesExW( console->window->mem_dc, &lf, enum_first_font_proc, (LPARAM)&fc, 0);
- if (fc.pass > 5) + fc.lf.lfHeight = config->cell_height; + fc.lf.lfWidth = config->cell_width; + if (!fc.weight || !set_console_font( console, &fc.lf )) ERR("Unable to find a valid console font\n");
/* Update active configuration */ @@ -1583,7 +1563,7 @@ static int CALLBACK enum_list_font_proc( const LOGFONTW *lf, const TEXTMETRICW *
TRACE( "%s\n", debugstr_logfont( lf, font_type ));
- if (validate_font( di->console, lf, NULL, 0, 0 )) + if (validate_font( di->console, lf, NULL, 0, NULL )) SendDlgItemMessageW( di->dialog, IDC_FNT_LIST_FONT, LB_ADDSTRING, 0, (LPARAM)lf->lfFaceName );
return 1;