202
check_fontname(const char *name)
204
Boolean result = True;
207
TRACE(("fontname missing\n"));
209
} else if (strlen(name) >= MAX_FONTNAME - 1) {
210
TRACE(("fontname too large: %s\n", name));
202
217
* Gets the font properties from a given font structure. We use the FONT name
203
218
* to find them out, since that seems easier.
493
505
same_font_name(char *pattern, char *match)
495
while (*pattern && *match) {
496
if (*pattern == *match) {
499
} else if (*pattern == '*' || *match == '*') {
500
if (same_font_name(pattern + 1, match)) {
502
} else if (same_font_name(pattern, match + 1)) {
509
if (pattern && match) {
510
while (*pattern && *match) {
511
if (*pattern == *match) {
514
} else if (*pattern == '*' || *match == '*') {
515
if (same_font_name(pattern + 1, match)) {
517
} else if (same_font_name(pattern, match + 1)) {
523
int p = x_toupper(*pattern++);
524
int m = x_toupper(*match++);
508
int p = x_toupper(*pattern++);
509
int m = x_toupper(*match++);
529
result = (*pattern == *match); /* both should be NUL */
514
return (*pattern == *match); /* both should be NUL */
697
718
result->fn = x_strdup(name);
699
720
} else if (strcmp(name, DEFFONT)) {
721
if (warn <= xw->misc.fontWarnings
700
722
#if OPT_RENDERFONT
701
if (!UsingRenderFont(xw))
723
&& !UsingRenderFont(xw)
726
TRACE(("OOPS: cannot load font %s\n", name));
703
727
fprintf(stderr, "%s: cannot load font %s\n", ProgramName, name);
704
code = xtermOpenFont(xw, DEFFONT, result);
729
TRACE(("xtermOpenFont: cannot load font %s\n", name));
732
code = xtermOpenFont(xw, DEFFONT, result, fwAlways, True);
711
* Close the font and Free the font info
740
* Close the font and free the font info.
714
743
xtermCloseFont(XtermWidget xw, XTermFonts * fnt)
789
818
char *tmpname = NULL;
790
819
char normal[MAX_FONTNAME];
791
820
Boolean proportional = False;
821
fontWarningTypes warn[fMAX];
793
824
memset(&myfonts, 0, sizeof(myfonts));
794
825
memset(fnts, 0, sizeof(fnts));
797
828
myfonts = *fonts;
798
if (myfonts.f_n == 0)
829
if (!check_fontname(myfonts.f_n))
833
* Check the font names against the resource values, to see which were
834
* derived in a previous call. If so, we'll only warn about those if
835
* the warning level is set to "always".
837
for (j = 0; j < fMAX; ++j) {
840
#define CmpResource(field, index) \
841
if (same_font_name(screen->menu_font_names[fontnum][index], myfonts.field)) \
842
warn[index] = fwResource
844
CmpResource(f_n, fNorm);
845
if (fontnum == fontMenu_default) {
846
CmpResource(f_b, fBold);
848
CmpResource(f_b, fWide);
849
CmpResource(f_b, fWBold);
801
853
if (fontnum == fontMenu_fontescape
802
854
&& myfonts.f_n != screen->MenuFontName(fontnum)) {
803
855
if ((tmpname = x_strdup(myfonts.f_n)) == 0)
807
859
TRACE(("Begin Cgs - xtermLoadFont(%s)\n", myfonts.f_n));
808
860
releaseWindowGCs(xw, win);
810
TRACE(("xtermLoadFont #%d normal %s\n", fontnum, NonNull(myfonts.f_n)));
811
TRACE(("xtermLoadFont #%d bold %s\n", fontnum, NonNull(myfonts.f_b)));
862
#define DbgResource(name, field, index) \
863
TRACE(("xtermLoadFont #%d "name" %s%s\n", \
865
(warn[index] == fwResource) ? "*" : " ", \
866
NonNull(myfonts.field)));
867
DbgResource("normal", f_n, fNorm);
868
DbgResource("bold ", f_b, fBold);
812
869
#if OPT_WIDE_CHARS
813
TRACE(("xtermLoadFont #%d wide %s\n", fontnum, NonNull(myfonts.f_w)));
814
TRACE(("xtermLoadFont #%d w/bold %s\n", fontnum, NonNull(myfonts.f_wb)));
870
DbgResource("wide ", f_w, fWide);
871
DbgResource("w/bold", f_wb, fWBold);
817
if (!xtermOpenFont(xw, myfonts.f_n, &fnts[fNorm]))
874
if (!xtermOpenFont(xw, myfonts.f_n, &fnts[fNorm], warn[fNorm], True))
820
877
strcpy(normal, myfonts.f_n);
821
if (myfonts.f_b == 0) {
878
if (!check_fontname(myfonts.f_b)) {
879
warn[fBold] = fwAlways;
822
880
fp = get_font_name_props(screen->display, fnts[fNorm].fs, normal);
824
882
myfonts.f_b = bold_font_name(fp, fp->average_width);
825
if (!xtermOpenFont(xw, myfonts.f_b, &fnts[fBold])) {
883
if (!xtermOpenFont(xw, myfonts.f_b, &fnts[fBold], fwAlways, False)) {
826
884
myfonts.f_b = bold_font_name(fp, -1);
827
(void) xtermOpenFont(xw, myfonts.f_b, &fnts[fBold]);
885
xtermOpenFont(xw, myfonts.f_b, &fnts[fBold], fwAlways, False);
829
887
TRACE(("...derived bold %s\n", NonNull(myfonts.f_b)));
840
898
fnts[fBold] = fnts[fNorm];
841
899
TRACE(("...did not get a matching bold font\n"));
843
} else if (!xtermOpenFont(xw, myfonts.f_b, &fnts[fBold])) {
901
} else if (!xtermOpenFont(xw, myfonts.f_b, &fnts[fBold], warn[fBold], False)) {
844
902
xtermCopyFontInfo(&fnts[fBold], &fnts[fNorm]);
903
warn[fBold] = fwAlways;
845
904
TRACE(("...cannot load bold font %s\n", NonNull(myfonts.f_b)));
847
906
cache_menu_font_name(screen, fontnum, fBold, myfonts.f_b);
857
916
char bold[MAX_FONTNAME];
859
if (myfonts.f_w != 0) {
918
if (check_fontname(myfonts.f_w)) {
860
919
cache_menu_font_name(screen, fontnum, fWide, myfonts.f_w);
861
920
} else if (!is_double_width_font(fnts[fNorm].fs)) {
862
921
fp = get_font_name_props(screen->display, fnts[fNorm].fs, normal);
864
923
myfonts.f_w = wide_font_name(fp);
924
warn[fWide] = fwAlways;
865
925
TRACE(("...derived wide %s\n", NonNull(myfonts.f_w)));
866
926
cache_menu_font_name(screen, fontnum, fWide, myfonts.f_w);
871
(void) xtermOpenFont(xw, myfonts.f_w, &fnts[fWide]);
930
if (check_fontname(myfonts.f_w)) {
931
(void) xtermOpenFont(xw, myfonts.f_w, &fnts[fWide], warn[fWide], False);
873
933
xtermCopyFontInfo(&fnts[fWide], &fnts[fNorm]);
934
warn[fWide] = fwAlways;
877
if (myfonts.f_wb == 0) {
938
if (!check_fontname(myfonts.f_wb)) {
878
939
fp = get_font_name_props(screen->display, fnts[fBold].fs, bold);
880
941
myfonts.f_wb = widebold_font_name(fp);
942
warn[fWBold] = fwAlways;
947
if (check_fontname(myfonts.f_wb)) {
887
(void) xtermOpenFont(xw, myfonts.f_wb, &fnts[fWBold]);
949
xtermOpenFont(xw, myfonts.f_wb, &fnts[fWBold], warn[fWBold], False);
890
952
&& !compatibleWideCounts(fnts[fWide].fs, fnts[fWBold].fs)) {
903
966
} else if (is_double_width_font(fnts[fBold].fs)) {
904
967
xtermCopyFontInfo(&fnts[fWBold], &fnts[fBold]);
968
warn[fWBold] = fwAlways;
905
969
TRACE(("...bold font is double-width, use it %s\n", NonNull(myfonts.f_b)));
907
971
xtermCopyFontInfo(&fnts[fWBold], &fnts[fWide]);
972
warn[fWBold] = fwAlways;
908
973
TRACE(("...cannot load wide bold font, use wide %s\n", NonNull(myfonts.f_w)));
1372
1437
#if OPT_RENDERFONT
1373
1438
static XftFont *
1374
xtermOpenXft(Display * dpy, XftPattern * pat, const char *tag GCC_UNUSED)
1439
xtermOpenXft(XtermWidget xw, const char *name, XftPattern * pat, const char *tag)
1441
TScreen *screen = TScreenOf(xw);
1442
Display *dpy = screen->display;
1376
1443
XftPattern *match;
1377
1444
XftResult status;
1378
1445
XftFont *result = 0;
1387
1454
TRACE(("...could did not open %s font\n", tag));
1388
1455
XftPatternDestroy(match);
1456
if (xw->misc.fontWarnings >= fwAlways) {
1457
TRACE(("OOPS cannot open %s font \"%s\"\n", tag, name));
1458
fprintf(stderr, "%s: cannot open %s font \"%s\"\n",
1459
ProgramName, tag, name);
1391
1463
TRACE(("...did not match %s font\n", tag));
1464
if (xw->misc.fontWarnings >= fwResource) {
1465
TRACE(("OOPS: cannot match %s font \"%s\"\n", tag, name));
1466
fprintf(stderr, "%s: cannot match %s font \"%s\"\n",
1467
ProgramName, tag, name);
1588
1664
XFT_CHAR_WIDTH, XftTypeInteger, norm->max_advance_width
1590
1666
if ((pat = XftNameParse(xw->misc.face_name)) != 0) {
1667
#define OPEN_XFT(tag) xtermOpenXft(xw, xw->misc.face_name, pat, tag)
1591
1668
XftPatternBuild(pat,
1592
1669
NormXftPattern,
1594
norm = xtermOpenXft(dpy, pat, "normal");
1671
norm = OPEN_XFT("normal");
1596
1673
if (norm != 0) {
1597
1674
XftPatternBuild(pat,
1598
1675
BoldXftPattern(norm),
1600
bold = xtermOpenXft(dpy, pat, "bold");
1677
bold = OPEN_XFT("bold");
1602
1679
#if OPT_ISO_COLORS
1603
1680
if (screen->italicULMode
1648
1726
XFT_SPACING, XftTypeInteger, XFT_MONO
1650
1728
if ((pat = XftNameParse(face_name)) != 0) {
1729
#define OPEN_XFT(tag) xtermOpenXft(xw, face_name, pat, tag)
1651
1730
XftPatternBuild(pat,
1652
1731
WideXftPattern,
1653
1732
XFT_CHAR_WIDTH, XftTypeInteger, char_width,
1655
wnorm = xtermOpenXft(dpy, pat, "wide");
1734
wnorm = OPEN_XFT("wide");
1657
1736
if (wnorm != 0) {
1658
1737
XftPatternBuild(pat,
1659
1738
WideXftPattern,
1660
1739
BoldXftPattern(wnorm),
1662
wbold = xtermOpenXft(dpy, pat, "wide-bold");
1741
wbold = OPEN_XFT("wide-bold");
1664
1743
#if OPT_ISO_COLORS
1665
1744
if (screen->italicULMode
2322
2402
memset(&fnt, 0, sizeof(fnt));
2323
2403
screen->menu_font_sizes[fontnum] = -1;
2324
if (xtermOpenFont(xw, screen->MenuFontName(fontnum), &fnt)) {
2404
if (xtermOpenFont(xw, screen->MenuFontName(fontnum), &fnt, fwAlways, True)) {
2325
2405
screen->menu_font_sizes[fontnum] = FontSize(fnt.fs);
2326
2406
TRACE(("menu_font_sizes[%d] = %ld\n", fontnum,
2327
2407
screen->menu_font_sizes[fontnum]));