1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-18 12:00:31 +01:00
Files
wmaker/WPrefs.app/FontSimple.c
Doug Torrance 54a24ab6f7 Remove trailing whitespace.
Also, the script is a one-liner, stolen from [1]:

ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'

[1]
https://stackoverflow.com/questions/149057/how-to-remove-trailing-whitespace-of-all-files-recursively
2020-04-09 14:28:09 +01:00

751 lines
20 KiB
C

/* FontSimple.c- simplified font configuration panel
*
* WPrefs - Window Maker Preferences Program
*
* Copyright (c) 1998-2004 Alfredo K. Kojima
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "WPrefs.h"
#include <unistd.h>
#include <fontconfig/fontconfig.h>
/* workaround for older fontconfig, that doesn't define these constants */
#ifndef FC_WEIGHT_NORMAL
/* Weights */
# define FC_WEIGHT_THIN 10
# define FC_WEIGHT_EXTRALIGHT 40
# define FC_WEIGHT_ULTRALIGHT FC_WEIGHT_EXTRALIGHT
# define FC_WEIGHT_REGULAR 80
# define FC_WEIGHT_NORMAL FC_WEIGHT_REGULAR
# define FC_WEIGHT_SEMIBOLD FC_WEIGHT_DEMIBOLD
# define FC_WEIGHT_EXTRABOLD 205
# define FC_WEIGHT_ULTRABOLD FC_WEIGHT_EXTRABOLD
# define FC_WEIGHT_HEAVY FC_WEIGHT_BLACK
/* Widths */
# define FC_WIDTH "width"
# define FC_WIDTH_ULTRACONDENSED 50
# define FC_WIDTH_EXTRACONDENSED 63
# define FC_WIDTH_CONDENSED 75
# define FC_WIDTH_SEMICONDENSED 87
# define FC_WIDTH_NORMAL 100
# define FC_WIDTH_SEMIEXPANDED 113
# define FC_WIDTH_EXPANDED 125
# define FC_WIDTH_EXTRAEXPANDED 150
# define FC_WIDTH_ULTRAEXPANDED 200
#endif
#define SAMPLE_TEXT "The Lazy Fox Jumped Ipsum Foobar 1234 - 56789"
typedef struct {
int weight;
int width;
int slant;
} FontStyle;
typedef struct {
char *name;
int stylen;
FontStyle *styles;
} FontFamily;
typedef struct {
int familyn;
FontFamily *families;
} FontList;
typedef struct _Panel {
WMBox *box;
char *sectionName;
char *description;
CallbackRec callbacks;
WMWidget *parent;
WMPopUpButton *optionP;
WMList *familyL;
WMList *styleL;
WMList *sizeL;
WMTextField *sampleT;
FontList *fonts;
} _Panel;
#define ICON_FILE "fonts"
static const struct {
const char *option;
const char *label;
} fontOptions[] = {
{ "WindowTitleFont", N_("Window Title") },
{ "MenuTitleFont", N_("Menu Title") },
{ "MenuTextFont", N_("Menu Text") },
{ "IconTitleFont", N_("Icon Title") },
{ "ClipTitleFont", N_("Clip Title") },
{ "LargeDisplayFont", N_("Desktop Caption") },
{ "SystemFont", N_("System Font") },
{ "BoldSystemFont", N_("Bold System Font")}
};
static const char *standardSizes[] = {
"6",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"18",
"20",
"22",
"24",
"28",
"32",
"36",
"48",
"64",
"72",
NULL
};
static const struct {
int weight;
const char *name;
} fontWeights[] = {
{ FC_WEIGHT_THIN, "Thin" },
{ FC_WEIGHT_EXTRALIGHT, "ExtraLight" },
{ FC_WEIGHT_LIGHT, "Light" },
{ FC_WEIGHT_NORMAL, "Normal" },
{ FC_WEIGHT_MEDIUM, "" },
{ FC_WEIGHT_DEMIBOLD, "DemiBold" },
{ FC_WEIGHT_BOLD, "Bold" },
{ FC_WEIGHT_EXTRABOLD, "ExtraBold" },
{ FC_WEIGHT_BLACK, "Black" }
};
static const struct {
int slant;
const char *name;
} fontSlants[] = {
{ FC_SLANT_ROMAN, "" },
{ FC_SLANT_ITALIC, "Italic" },
{ FC_SLANT_OBLIQUE, "Oblique" }
};
static const struct {
int width;
const char *name;
} fontWidths[] = {
{ FC_WIDTH_ULTRACONDENSED, "UltraCondensed" },
{ FC_WIDTH_EXTRACONDENSED, "ExtraCondensed" },
{ FC_WIDTH_CONDENSED, "Condensed" },
{ FC_WIDTH_SEMICONDENSED, "SemiCondensed" },
{ FC_WIDTH_NORMAL, "" },
{ FC_WIDTH_SEMIEXPANDED, "SemiExpanded" },
{ FC_WIDTH_EXPANDED, "Expanded" },
{ FC_WIDTH_EXTRAEXPANDED, "ExtraExpanded" },
{ FC_WIDTH_ULTRAEXPANDED, "UltraExpanded" },
};
static int compare_family(const void *a, const void *b)
{
FontFamily *fa = (FontFamily *) a;
FontFamily *fb = (FontFamily *) b;
return strcmp(fa->name, fb->name);
}
static int compare_styles(const void *a, const void *b)
{
FontStyle *sa = (FontStyle *) a;
FontStyle *sb = (FontStyle *) b;
int compare;
compare = sa->weight - sb->weight;
if (compare != 0)
return compare;
compare = sa->slant - sb->slant;
if (compare != 0)
return compare;
return (sa->width - sb->width);
}
static void lookup_available_fonts(_Panel * panel)
{
FcPattern *pat = FcPatternCreate();
FcObjectSet *os;
FcFontSet *fonts;
FontFamily *family;
os = FcObjectSetBuild(FC_FAMILY, FC_WEIGHT, FC_WIDTH, FC_SLANT, NULL);
fonts = FcFontList(0, pat, os);
if (fonts) {
int i;
panel->fonts = wmalloc(sizeof(FontList));
panel->fonts->familyn = 0;
panel->fonts->families = wmalloc(sizeof(FontFamily) * fonts->nfont);
for (i = 0; i < fonts->nfont; i++) {
char *name;
int weight, slant, width;
int j, found;
if (FcPatternGetString(fonts->fonts[i], FC_FAMILY, 0, (FcChar8 **) & name) !=
FcResultMatch)
continue;
if (FcPatternGetInteger(fonts->fonts[i], FC_WEIGHT, 0, &weight) != FcResultMatch)
weight = FC_WEIGHT_MEDIUM;
if (FcPatternGetInteger(fonts->fonts[i], FC_WIDTH, 0, &width) != FcResultMatch)
width = FC_WIDTH_NORMAL;
if (FcPatternGetInteger(fonts->fonts[i], FC_SLANT, 0, &slant) != FcResultMatch)
slant = FC_SLANT_ROMAN;
found = -1;
for (j = 0; j < panel->fonts->familyn && found < 0; j++)
if (strcasecmp(panel->fonts->families[j].name, name) == 0)
found = j;
if (found < 0) {
panel->fonts->families[panel->fonts->familyn++].name = wstrdup(name);
family = panel->fonts->families + panel->fonts->familyn - 1;
family->stylen = 0;
family->styles = NULL;
} else
family = panel->fonts->families + found;
family->stylen++;
family->styles = wrealloc(family->styles, sizeof(FontStyle) * family->stylen);
family->styles[family->stylen - 1].weight = weight;
family->styles[family->stylen - 1].slant = slant;
family->styles[family->stylen - 1].width = width;
}
qsort(panel->fonts->families, panel->fonts->familyn, sizeof(FontFamily), compare_family);
for (i = 0; i < panel->fonts->familyn; i++) {
qsort(panel->fonts->families[i].styles, panel->fonts->families[i].stylen,
sizeof(FontStyle), compare_styles);
}
FcFontSetDestroy(fonts);
}
if (os)
FcObjectSetDestroy(os);
if (pat)
FcPatternDestroy(pat);
panel->fonts->families[panel->fonts->familyn++].name = wstrdup("sans serif");
family = panel->fonts->families + panel->fonts->familyn - 1;
family->styles = wmalloc(sizeof(FontStyle) * 2);
family->stylen = 2;
family->styles[0].weight = FC_WEIGHT_MEDIUM;
family->styles[0].slant = FC_SLANT_ROMAN;
family->styles[0].width = FC_WIDTH_NORMAL;
family->styles[1].weight = FC_WEIGHT_BOLD;
family->styles[1].slant = FC_SLANT_ROMAN;
family->styles[1].width = FC_WIDTH_NORMAL;
panel->fonts->families[panel->fonts->familyn++].name = wstrdup("serif");
family = panel->fonts->families + panel->fonts->familyn - 1;
family->styles = wmalloc(sizeof(FontStyle) * 2);
family->stylen = 2;
family->styles[0].weight = FC_WEIGHT_MEDIUM;
family->styles[0].slant = FC_SLANT_ROMAN;
family->styles[0].width = FC_WIDTH_NORMAL;
family->styles[1].weight = FC_WEIGHT_BOLD;
family->styles[1].slant = FC_SLANT_ROMAN;
family->styles[1].width = FC_WIDTH_NORMAL;
}
static char *getSelectedFont(_Panel * panel, FcChar8 * curfont)
{
WMListItem *item;
FcPattern *pat;
char *name;
if (curfont)
pat = FcNameParse(curfont);
else
pat = FcPatternCreate();
item = WMGetListSelectedItem(panel->familyL);
if (item) {
FcPatternDel(pat, FC_FAMILY);
FcPatternAddString(pat, FC_FAMILY, (FcChar8 *) item->text);
}
item = WMGetListSelectedItem(panel->styleL);
if (item) {
FontStyle *style = (FontStyle *) item->clientData;
FcPatternDel(pat, FC_WEIGHT);
FcPatternAddInteger(pat, FC_WEIGHT, style->weight);
FcPatternDel(pat, FC_WIDTH);
FcPatternAddInteger(pat, FC_WIDTH, style->width);
FcPatternDel(pat, FC_SLANT);
FcPatternAddInteger(pat, FC_SLANT, style->slant);
}
item = WMGetListSelectedItem(panel->sizeL);
if (item) {
FcPatternDel(pat, FC_PIXEL_SIZE);
FcPatternAddDouble(pat, FC_PIXEL_SIZE, atoi(item->text));
}
name = (char *)FcNameUnparse(pat);
FcPatternDestroy(pat);
return name;
}
static void updateSampleFont(_Panel * panel)
{
WMMenuItem *item = WMGetPopUpButtonMenuItem(panel->optionP,
WMGetPopUpButtonSelectedItem(panel->optionP));
char *fn = WMGetMenuItemRepresentedObject(item);
if (fn) {
WMFont *font = WMCreateFont(WMWidgetScreen(panel->box), fn);
if (font) {
WMSetTextFieldFont(panel->sampleT, font);
WMReleaseFont(font);
}
}
}
static void selectedFamily(WMWidget * w, void *data)
{
_Panel *panel = (_Panel *) data;
WMListItem *item;
FontStyle *oldStyle = NULL;
char buffer[1024];
/* Parameter not used, but tell the compiler that it is ok */
(void) w;
item = WMGetListSelectedItem(panel->styleL);
if (item)
oldStyle = (FontStyle *) item->clientData;
item = WMGetListSelectedItem(panel->familyL);
if (item) {
FontFamily *family = (FontFamily *) item->clientData;
int i, oldi = 0, oldscore = 0;
WMClearList(panel->styleL);
for (i = 0; i < family->stylen; i++) {
int j;
const char *weight = "", *slant = "", *width = "";
WMListItem *item;
for (j = 0; j < wlengthof(fontWeights); j++)
if (fontWeights[j].weight == family->styles[i].weight) {
weight = fontWeights[j].name;
break;
}
for (j = 0; j < wlengthof(fontWidths); j++)
if (fontWidths[j].width == family->styles[i].width) {
width = fontWidths[j].name;
break;
}
for (j = 0; j < wlengthof(fontSlants); j++)
if (fontSlants[j].slant == family->styles[i].slant) {
slant = fontSlants[j].name;
break;
}
sprintf(buffer, "%s%s%s%s%s",
weight, *weight ? " " : "", slant, (*slant || *weight) ? " " : "", width);
if (!buffer[0])
strcpy(buffer, "Roman");
item = WMAddListItem(panel->styleL, buffer);
item->clientData = family->styles + i;
if (oldStyle) {
int score = 0;
if (oldStyle->width == family->styles[i].width)
score |= 1;
if (oldStyle->weight == family->styles[i].weight)
score |= 2;
if (oldStyle->slant == family->styles[i].slant)
score |= 4;
if (score > oldscore) {
oldi = i;
oldscore = score;
}
}
}
WMSelectListItem(panel->styleL, oldi);
{
int index = WMGetPopUpButtonSelectedItem(panel->optionP);
WMMenuItem *item = WMGetPopUpButtonMenuItem(panel->optionP, index);
FcChar8 *ofont;
char *nfont;
ofont = (FcChar8 *) WMGetMenuItemRepresentedObject(item);
nfont = getSelectedFont(panel, ofont);
if (ofont)
wfree(ofont);
WMSetMenuItemRepresentedObject(item, nfont);
}
updateSampleFont(panel);
}
}
static void selected(WMWidget * w, void *data)
{
_Panel *panel = (_Panel *) data;
int index = WMGetPopUpButtonSelectedItem(panel->optionP);
WMMenuItem *item = WMGetPopUpButtonMenuItem(panel->optionP, index);
FcChar8 *ofont;
char *nfont;
/* Parameter not used, but tell the compiler that it is ok */
(void) w;
ofont = (FcChar8 *) WMGetMenuItemRepresentedObject(item);
nfont = getSelectedFont(panel, ofont);
if (ofont)
wfree(ofont);
WMSetMenuItemRepresentedObject(item, nfont);
updateSampleFont(panel);
}
static void selectedOption(WMWidget * w, void *data)
{
_Panel *panel = (_Panel *) data;
int index = WMGetPopUpButtonSelectedItem(panel->optionP);
WMMenuItem *item = WMGetPopUpButtonMenuItem(panel->optionP, index);
char *font;
/* Parameter not used, but tell the compiler that it is ok */
(void) w;
font = (char *)WMGetMenuItemRepresentedObject(item);
if (font) {
FcPattern *pat;
pat = FcNameParse((FcChar8 *) font);
if (pat) {
char *name;
int weight, slant, width;
double size;
int distance, closest, found;
int i;
FcDefaultSubstitute(pat);
if (FcPatternGetString(pat, FC_FAMILY, 0, (FcChar8 **) & name) != FcResultMatch)
name = "sans serif";
found = 0;
/* select family */
for (i = 0; i < WMGetListNumberOfRows(panel->familyL); i++) {
WMListItem *item = WMGetListItem(panel->familyL, i);
FontFamily *family = (FontFamily *) item->clientData;
if (strcasecmp(family->name, name) == 0) {
found = 1;
WMSelectListItem(panel->familyL, i);
WMSetListPosition(panel->familyL, i);
break;
}
}
if (!found)
WMSelectListItem(panel->familyL, -1);
selectedFamily(panel->familyL, panel);
/* select style */
if (FcPatternGetInteger(pat, FC_WEIGHT, 0, &weight) != FcResultMatch)
weight = FC_WEIGHT_NORMAL;
if (FcPatternGetInteger(pat, FC_WIDTH, 0, &width) != FcResultMatch)
width = FC_WIDTH_NORMAL;
if (FcPatternGetInteger(pat, FC_SLANT, 0, &slant) != FcResultMatch)
slant = FC_SLANT_ROMAN;
if (FcPatternGetDouble(pat, FC_PIXEL_SIZE, 0, &size) != FcResultMatch)
size = 10.0;
for (i = 0, found = 0, closest = 0; i < WMGetListNumberOfRows(panel->styleL); i++) {
WMListItem *item = WMGetListItem(panel->styleL, i);
FontStyle *style = (FontStyle *) item->clientData;
distance = ((abs(style->weight - weight) << 16) +
(abs(style->slant - slant) << 8) + (abs(style->width - width)));
if (i == 0 || distance < closest) {
closest = distance;
found = i;
if (distance == 0) {
break; /* perfect match */
}
}
}
WMSelectListItem(panel->styleL, found);
WMSetListPosition(panel->styleL, found);
for (i = 0, found = 0, closest = 0; i < WMGetListNumberOfRows(panel->sizeL); i++) {
WMListItem *item = WMGetListItem(panel->sizeL, i);
int distance;
distance = abs(size - atoi(item->text));
if (i == 0 || distance < closest) {
closest = distance;
found = i;
if (distance == 0) {
break; /* perfect match */
}
}
}
WMSelectListItem(panel->sizeL, found);
WMSetListPosition(panel->sizeL, found);
selected(NULL, panel);
} else
wwarning("Can't parse font '%s'", font);
}
updateSampleFont(panel);
}
static WMLabel *createListLabel(WMScreen * scr, WMWidget * parent, const char *text)
{
WMLabel *label;
WMColor *color;
WMFont *boldFont = WMBoldSystemFontOfSize(scr, 12);
label = WMCreateLabel(parent);
WMSetLabelFont(label, boldFont);
WMSetLabelText(label, text);
WMSetLabelRelief(label, WRSunken);
WMSetLabelTextAlignment(label, WACenter);
color = WMDarkGrayColor(scr);
WMSetWidgetBackgroundColor(label, color);
WMReleaseColor(color);
color = WMWhiteColor(scr);
WMSetLabelTextColor(label, color);
WMReleaseColor(color);
WMReleaseFont(boldFont);
return label;
}
static void showData(_Panel * panel)
{
int i;
WMMenuItem *item;
WMScreen *scr;
scr = WMWidgetScreen(panel->parent);
for (i = 0; i < WMGetPopUpButtonNumberOfItems(panel->optionP); i++) {
char *ofont, *font;
item = WMGetPopUpButtonMenuItem(panel->optionP, i);
ofont = WMGetMenuItemRepresentedObject(item);
if (ofont)
wfree(ofont);
if (strcmp(fontOptions[i].option, "SystemFont") == 0)
font = WMGetFontName(WMDefaultSystemFont(scr));
else if (strcmp(fontOptions[i].option, "BoldSystemFont") == 0)
font = WMGetFontName(WMDefaultBoldSystemFont(scr));
else
font = GetStringForKey(fontOptions[i].option);
if (font)
font = wstrdup(font);
WMSetMenuItemRepresentedObject(item, font);
}
WMSetPopUpButtonSelectedItem(panel->optionP, 0);
selectedOption(panel->optionP, panel);
}
static void storeData(_Panel * panel)
{
int i;
WMMenuItem *item;
for (i = 0; i < WMGetPopUpButtonNumberOfItems(panel->optionP); i++) {
char *font;
item = WMGetPopUpButtonMenuItem(panel->optionP, i);
font = WMGetMenuItemRepresentedObject(item);
if (font && *font) {
if (strcmp(fontOptions[i].option, "SystemFont") == 0 ||
strcmp(fontOptions[i].option, "BoldSystemFont") == 0) {
char *path;
WMUserDefaults *defaults;
path = wdefaultspathfordomain("WMGLOBAL");
defaults = WMGetDefaultsFromPath(path);
wfree(path);
WMSetUDStringForKey(defaults,
font,
fontOptions[i].option);
WMSaveUserDefaults(defaults);
} else {
SetStringForKey(font, fontOptions[i].option);
}
}
}
}
static void createPanel(Panel * p)
{
_Panel *panel = (_Panel *) p;
WMScreen *scr = WMWidgetScreen(panel->parent);
WMLabel *label;
WMBox *hbox, *vbox;
int i;
lookup_available_fonts(panel);
panel->box = WMCreateBox(panel->parent);
WMSetViewExpandsToParent(WMWidgetView(panel->box), 5, 2, 5, 5);
WMSetBoxHorizontal(panel->box, False);
WMSetBoxBorderWidth(panel->box, 8);
WMMapWidget(panel->box);
hbox = WMCreateBox(panel->box);
WMSetBoxHorizontal(hbox, True);
WMAddBoxSubview(panel->box, WMWidgetView(hbox), False, True, 40, 22, 8);
vbox = WMCreateBox(hbox);
WMAddBoxSubview(hbox, WMWidgetView(vbox), False, True, 130, 0, 10);
WMSetBoxHorizontal(vbox, False);
panel->optionP = WMCreatePopUpButton(vbox);
WMAddBoxSubviewAtEnd(vbox, WMWidgetView(panel->optionP), False, True, 20, 0, 8);
for (i = 0; i < wlengthof(fontOptions); i++)
WMAddPopUpButtonItem(panel->optionP, _(fontOptions[i].label));
WMSetPopUpButtonAction(panel->optionP, selectedOption, panel);
label = WMCreateLabel(hbox);
WMSetLabelText(label, _("Sample Text"));
WMSetLabelTextAlignment(label, WARight);
WMAddBoxSubview(hbox, WMWidgetView(label), False, True, 80, 0, 2);
panel->sampleT = WMCreateTextField(hbox);
WMSetViewExpandsToParent(WMWidgetView(panel->sampleT), 10, 18, 10, 10);
WMSetTextFieldText(panel->sampleT, SAMPLE_TEXT);
WMAddBoxSubview(hbox, WMWidgetView(panel->sampleT), True, True, 60, 0, 0);
hbox = WMCreateBox(panel->box);
WMSetBoxHorizontal(hbox, True);
WMAddBoxSubview(panel->box, WMWidgetView(hbox), True, True, 100, 0, 2);
vbox = WMCreateBox(hbox);
WMSetBoxHorizontal(vbox, False);
WMAddBoxSubview(hbox, WMWidgetView(vbox), False, True, 240, 20, 4);
label = createListLabel(scr, vbox, _("Family"));
WMAddBoxSubview(vbox, WMWidgetView(label), False, True, 20, 0, 2);
/* family */
panel->familyL = WMCreateList(vbox);
WMAddBoxSubview(vbox, WMWidgetView(panel->familyL), True, True, 0, 0, 0);
if (panel->fonts) {
WMListItem *item;
for (i = 0; i < panel->fonts->familyn; i++) {
item = WMAddListItem(panel->familyL, panel->fonts->families[i].name);
item->clientData = panel->fonts->families + i;
}
} else
WMAddListItem(panel->familyL, "sans serif");
WMSetListAction(panel->familyL, selectedFamily, panel);
vbox = WMCreateBox(hbox);
WMSetBoxHorizontal(vbox, False);
WMAddBoxSubview(hbox, WMWidgetView(vbox), True, True, 10, 0, 0);
{
WMBox *box = WMCreateBox(vbox);
WMSetBoxHorizontal(box, True);
WMAddBoxSubview(vbox, WMWidgetView(box), False, True, 20, 0, 2);
label = createListLabel(scr, box, _("Style"));
WMAddBoxSubview(box, WMWidgetView(label), True, True, 20, 0, 4);
label = createListLabel(scr, box, _("Size"));
WMAddBoxSubview(box, WMWidgetView(label), False, True, 60, 0, 0);
box = WMCreateBox(vbox);
WMSetBoxHorizontal(box, True);
WMAddBoxSubview(vbox, WMWidgetView(box), True, True, 20, 0, 0);
panel->styleL = WMCreateList(box);
WMAddBoxSubview(box, WMWidgetView(panel->styleL), True, True, 0, 0, 4);
WMSetListAction(panel->styleL, selected, panel);
panel->sizeL = WMCreateList(box);
WMAddBoxSubview(box, WMWidgetView(panel->sizeL), False, True, 60, 0, 0);
for (i = 0; standardSizes[i]; i++) {
WMAddListItem(panel->sizeL, standardSizes[i]);
}
WMSetListAction(panel->sizeL, selected, panel);
}
WMMapSubwidgets(panel->box);
WMMapWidget(panel->box);
WMRealizeWidget(panel->box);
showData(panel);
}
Panel *InitFontSimple(WMWidget *parent)
{
_Panel *panel;
panel = wmalloc(sizeof(_Panel));
panel->sectionName = _("Font Configuration");
panel->description = _("Configure fonts for Window Maker titlebars, menus etc.");
panel->parent = parent;
panel->callbacks.createWidgets = createPanel;
panel->callbacks.updateDomain = storeData;
AddSection(panel, ICON_FILE);
return panel;
}