1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 12:28:22 +01:00

fontset name guess when using multibyte

This commit is contained in:
kojima
2000-06-17 19:07:57 +00:00
parent 4b2b2bcac3
commit e410e1862b

View File

@@ -4,10 +4,97 @@
#include <wraster.h> #include <wraster.h>
#include <assert.h> #include <assert.h>
#include <X11/Xlocale.h>
static char *makeFontSetOfSize(char *fontset, int size); static char *makeFontSetOfSize(char *fontset, int size);
/* XLFD pattern matching */
static char*
xlfd_get_element (const char *xlfd, int index)
{
const char *p = xlfd;
while (*p != 0) {
if (*p == '-' && --index == 0) {
const char *end = strchr(p + 1, '-');
char *buf;
size_t len;
if (end == 0) end = p + strlen(p);
len = end - (p + 1);
buf = wmalloc(len);
memcpy(buf, p + 1, len);
buf[len] = 0;
return buf;
}
p++;
}
return strdup("*");
}
/* XLFD pattern matching */
static char*
generalize_xlfd (const char *xlfd)
{
char *buf;
int len;
char *weight = xlfd_get_element(xlfd, 3);
char *slant = xlfd_get_element(xlfd, 4);
char *pxlsz = xlfd_get_element(xlfd, 7);
len = snprintf(NULL, 0, "%s,-*-*-%s-%s-*-*-%s-*-*-*-*-*-*-*,"
"-*-*-*-*-*-*-%s-*-*-*-*-*-*-*,*",
xlfd, weight, slant, pxlsz, pxlsz);
buf = wmalloc(len + 1);
snprintf(buf, len + 1, "%s,-*-*-%s-%s-*-*-%s-*-*-*-*-*-*-*,"
"-*-*-*-*-*-*-%s-*-*-*-*-*-*-*,*",
xlfd, weight, slant, pxlsz, pxlsz);
free(pxlsz);
free(slant);
free(weight);
return buf;
}
/* XLFD pattern matching */
static XFontSet
W_CreateFontSetWithGuess(Display *dpy, char *xlfd, char ***missing,
int *nmissing, char **def_string)
{
XFontSet fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string);
if (fs != NULL && *nmissing == 0) return fs;
/* for non-iso8859-1 language and iso8859-1 specification
(this fontset is only for pattern analysis) */
if (fs == NULL) {
char *old_locale = setlocale(LC_CTYPE, NULL);
if (*nmissing != 0) XFreeStringList(*missing);
setlocale(LC_CTYPE, "C");
fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string);
setlocale(LC_CTYPE, old_locale);
}
/* make XLFD font name for pattern analysis */
if (fs != NULL) {
XFontStruct **fontstructs;
char **fontnames;
if (XFontsOfFontSet(fs, &fontstructs, &fontnames) > 0)
xlfd = fontnames[0];
}
xlfd = generalize_xlfd (xlfd);
if (*nmissing != 0) XFreeStringList(*missing);
if (fs != 0) XFreeFontSet(dpy, fs);
fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string);
free(xlfd);
return fs;
}
WMFont* WMFont*
WMCreateFontSet(WMScreen *scrPtr, char *fontName) WMCreateFontSet(WMScreen *scrPtr, char *fontName)
{ {
@@ -33,8 +120,8 @@ WMCreateFontSet(WMScreen *scrPtr, char *fontName)
font->screen = scrPtr; font->screen = scrPtr;
font->font.set = XCreateFontSet(display, fontName, &missing, &nmissing, font->font.set = W_CreateFontSetWithGuess(display, fontName, &missing,
&defaultString); &nmissing, &defaultString);
if (nmissing > 0 && font->font.set) { if (nmissing > 0 && font->font.set) {
int i; int i;