mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 20:38:08 +01:00
489 lines
11 KiB
C
489 lines
11 KiB
C
/* Font.c- text/font settings
|
|
*
|
|
* WPrefs - Window Maker Preferences Program
|
|
*
|
|
* Copyright (c) 1999 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
* USA.
|
|
*/
|
|
|
|
|
|
#include "WPrefs.h"
|
|
|
|
#include <proplist.h>
|
|
|
|
typedef struct _Panel {
|
|
WMFrame *frame;
|
|
char *sectionName;
|
|
|
|
char *description;
|
|
|
|
CallbackRec callbacks;
|
|
|
|
WMWindow *win;
|
|
|
|
|
|
WMLabel *prevL;
|
|
|
|
WMFrame *langF;
|
|
WMPopUpButton *langP;
|
|
|
|
/* single byte */
|
|
WMTextField *fontT;
|
|
WMButton *changeB;
|
|
|
|
/* multibyte */
|
|
WMLabel *fsetL;
|
|
WMList *fsetLs;
|
|
|
|
WMButton *addB;
|
|
WMButton *editB;
|
|
WMButton *remB;
|
|
|
|
|
|
WMFont *windowTitleFont;
|
|
WMFont *menuTitleFont;
|
|
WMFont *menuItemFont;
|
|
|
|
|
|
WMColor *white;
|
|
WMColor *black;
|
|
WMColor *light;
|
|
WMColor *dark;
|
|
|
|
WMColor *back;
|
|
|
|
Pixmap preview;
|
|
WMPixmap *previewPix;
|
|
} _Panel;
|
|
|
|
|
|
|
|
#define ICON_FILE "fonts"
|
|
|
|
|
|
|
|
static proplist_t DefaultWindowTitleFont = NULL;
|
|
static proplist_t DefaultMenuTitleFont = NULL;
|
|
static proplist_t DefaultMenuTextFont = NULL;
|
|
static proplist_t DefaultIconTitleFont = NULL;
|
|
static proplist_t DefaultClipTitleFont = NULL;
|
|
static proplist_t DefaultDisplayFont = NULL;
|
|
|
|
|
|
|
|
static void
|
|
drawMenuItem(WMScreen *scr, Display *dpy, Drawable d,
|
|
int x, int y, int w, int h,
|
|
GC light, GC dark, GC black, GC white,
|
|
WMFont *font, int fh, char *text)
|
|
{
|
|
XFillRectangle(dpy, d, light, x, y, w, h);
|
|
|
|
XDrawLine(dpy, d, black, x, y, x, y+h);
|
|
XDrawLine(dpy, d, black, x+w, y, x+w, y+h);
|
|
|
|
XDrawLine(dpy, d, white, x+1, y, x+1, y+h-1);
|
|
XDrawLine(dpy, d, white, x+1, y, x+w-1, y);
|
|
|
|
XDrawLine(dpy, d, dark, x+w-1, y+1, x+w-1, y+h-3);
|
|
XDrawLine(dpy, d, dark, x+1, y+h-2, x+w-1, y+h-2);
|
|
|
|
XDrawLine(dpy, d, black, x, y+h-1, x+w, y+h-1);
|
|
|
|
WMDrawString(scr, d, black, font, x + 5, y+(h-fh)/2,
|
|
text, strlen(text));
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
paintPreviewBox(Panel *panel)
|
|
{
|
|
WMScreen *scr = WMWidgetScreen(panel->win);
|
|
Display *dpy = WMScreenDisplay(scr);
|
|
GC black = WMColorGC(panel->black);
|
|
GC white = WMColorGC(panel->white);
|
|
GC dark = WMColorGC(panel->dark);
|
|
GC light = WMColorGC(panel->light);
|
|
|
|
|
|
if (panel->preview == None) {
|
|
WMPixmap *pix;
|
|
|
|
panel->preview = XCreatePixmap(dpy, WMWidgetXID(panel->win),
|
|
240-4, 215-4, WMScreenDepth(scr));
|
|
|
|
pix = WMCreatePixmapFromXPixmaps(scr, panel->preview, None,
|
|
240-4, 215-4, WMScreenDepth(scr));
|
|
|
|
WMSetLabelImage(panel->prevL, pix);
|
|
WMReleasePixmap(pix);
|
|
}
|
|
|
|
XFillRectangle(dpy, panel->preview, WMColorGC(panel->back),
|
|
0, 0, 240-4, 215-4);
|
|
|
|
/* window title */
|
|
{
|
|
int h, fh;
|
|
|
|
fh = WMFontHeight(panel->windowTitleFont);
|
|
h = fh+6;
|
|
|
|
XFillRectangle(dpy, panel->preview, black,
|
|
19, 19, 203, h+3);
|
|
|
|
XDrawLine(dpy, panel->preview, light,
|
|
20, 20, 220, 20);
|
|
XDrawLine(dpy, panel->preview, light,
|
|
20, 20, 20, 20+h);
|
|
|
|
XDrawLine(dpy, panel->preview, dark,
|
|
20, 20+h, 220, 20+h);
|
|
XDrawLine(dpy, panel->preview, dark,
|
|
220, 20, 220, 20+h);
|
|
|
|
WMDrawString(scr, panel->preview, white, panel->windowTitleFont,
|
|
20+(200-WMWidthOfString(panel->windowTitleFont, "Window Titlebar", 15))/2,
|
|
20+(h-fh)/2, "Window Titlebar", 15);
|
|
}
|
|
|
|
/* menu title */
|
|
{
|
|
int h, h2, fh, fh2;
|
|
int i;
|
|
const int mx = 20;
|
|
const int my = 120;
|
|
const int mw = 100;
|
|
|
|
|
|
fh = WMFontHeight(panel->menuTitleFont);
|
|
h = fh+6;
|
|
|
|
XFillRectangle(dpy, panel->preview, black,
|
|
mx-1, my-1, mw+3, h+3);
|
|
|
|
XDrawLine(dpy, panel->preview, light,
|
|
mx, my, mx+mw, my);
|
|
XDrawLine(dpy, panel->preview, light,
|
|
mx, my, mx, my+h);
|
|
|
|
XDrawLine(dpy, panel->preview, dark,
|
|
mx, my+h, mx+mw, my+h);
|
|
XDrawLine(dpy, panel->preview, dark,
|
|
mx+mw, my, mx+mw, my+h);
|
|
|
|
WMDrawString(scr, panel->preview, white, panel->menuTitleFont,
|
|
mx+5, my+(h-fh)/2, "Menu Title", 10);
|
|
|
|
fh2 = WMFontHeight(panel->menuItemFont);
|
|
h2 = fh2+6;
|
|
|
|
/* menu items */
|
|
for (i = 0; i < 4; i++) {
|
|
drawMenuItem(scr, dpy, panel->preview,
|
|
mx-1, my+2+h+i*h2, mw+2, h2,
|
|
light, dark, black, white,
|
|
panel->menuItemFont, fh2,
|
|
"Menu Item");
|
|
}
|
|
}
|
|
|
|
|
|
WMRedisplayWidget(panel->prevL);
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
showData(_Panel *panel)
|
|
{
|
|
WMScreen *scr = WMWidgetScreen(panel->win);
|
|
char *str;
|
|
|
|
str = GetStringForKey("WindowTitleFont");
|
|
|
|
panel->windowTitleFont = WMCreateFont(scr, str);
|
|
|
|
|
|
str = GetStringForKey("MenuTitleFont");
|
|
|
|
panel->menuTitleFont = WMCreateFont(scr, str);
|
|
|
|
|
|
str = GetStringForKey("MenuTextFont");
|
|
|
|
panel->menuItemFont = WMCreateFont(scr, str);
|
|
|
|
|
|
|
|
|
|
paintPreviewBox(panel);
|
|
}
|
|
|
|
|
|
static void
|
|
setLanguageType(Panel *p, Bool multiByte)
|
|
{
|
|
if (multiByte) {
|
|
WMMapWidget(p->fsetL);
|
|
WMMapWidget(p->fsetLs);
|
|
WMMapWidget(p->addB);
|
|
WMMapWidget(p->editB);
|
|
WMMapWidget(p->remB);
|
|
|
|
WMUnmapWidget(p->fontT);
|
|
WMUnmapWidget(p->changeB);
|
|
} else {
|
|
WMUnmapWidget(p->fsetL);
|
|
WMUnmapWidget(p->fsetLs);
|
|
WMUnmapWidget(p->addB);
|
|
WMUnmapWidget(p->editB);
|
|
WMUnmapWidget(p->remB);
|
|
|
|
WMMapWidget(p->fontT);
|
|
WMMapWidget(p->changeB);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
readFontEncodings(Panel *panel)
|
|
{
|
|
proplist_t pl = NULL;
|
|
char *path;
|
|
char *msg;
|
|
|
|
path = WMPathForResourceOfType("font.data", NULL);
|
|
if (!path) {
|
|
msg = _("Could not locate font information file WPrefs.app/font.data");
|
|
goto error;
|
|
}
|
|
|
|
pl = PLGetProplistWithPath(path);
|
|
if (!pl) {
|
|
msg = _("Could not read font information file WPrefs.app/font.data");
|
|
goto error;
|
|
} else {
|
|
int i;
|
|
proplist_t key = PLMakeString("Encodings");
|
|
proplist_t array;
|
|
WMMenuItem *mi;
|
|
|
|
array = PLGetDictionaryEntry(pl, key);
|
|
PLRelease(key);
|
|
if (!array || !PLIsArray(array)) {
|
|
msg = _("Invalid data in font information file WPrefs.app/font.data.\n"
|
|
"Encodings data not found.");
|
|
goto error;
|
|
}
|
|
|
|
WMAddPopUpButtonItem(panel->langP, _("- Custom -"));
|
|
|
|
for (i = 0; i < PLGetNumberOfElements(array); i++) {
|
|
proplist_t item, str;
|
|
|
|
item = PLGetArrayElement(array, i);
|
|
str = PLGetArrayElement(item, 0);
|
|
mi = WMAddPopUpButtonItem(panel->langP, PLGetString(str));
|
|
WMSetMenuItemRepresentedObject(mi, PLRetain(item));
|
|
}
|
|
|
|
key = PLMakeString("WindowTitleFont");
|
|
DefaultWindowTitleFont = PLGetDictionaryEntry(pl, key);
|
|
PLRelease(key);
|
|
|
|
key = PLMakeString("MenuTitleFont");
|
|
DefaultMenuTitleFont = PLGetDictionaryEntry(pl, key);
|
|
PLRelease(key);
|
|
|
|
key = PLMakeString("MenuTextFont");
|
|
DefaultMenuTextFont = PLGetDictionaryEntry(pl, key);
|
|
PLRelease(key);
|
|
}
|
|
|
|
PLRelease(pl);
|
|
return;
|
|
error:
|
|
if (pl)
|
|
PLRelease(pl);
|
|
|
|
WMRunAlertPanel(WMWidgetScreen(panel->win), panel->win,
|
|
_("Error"), msg, _("OK"), NULL, NULL);
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
changeLanguageAction(WMWidget *w, void *data)
|
|
{
|
|
/*Panel *panel = (Panel*)data;*/
|
|
WMMenuItem *mi;
|
|
proplist_t pl;
|
|
|
|
mi = WMGetPopUpButtonMenuItem(w, WMGetPopUpButtonSelectedItem(w));
|
|
pl = WMGetMenuItemRepresentedObject(mi);
|
|
|
|
if (!pl) {
|
|
/* custom */
|
|
} else {
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
createPanel(Panel *p)
|
|
{
|
|
_Panel *panel = (_Panel*)p;
|
|
WMScreen *scr = WMWidgetScreen(panel->win);
|
|
|
|
panel->frame = WMCreateFrame(panel->win);
|
|
WMResizeWidget(panel->frame, FRAME_WIDTH, FRAME_HEIGHT);
|
|
WMMoveWidget(panel->frame, FRAME_LEFT, FRAME_TOP);
|
|
|
|
|
|
panel->prevL = WMCreateLabel(panel->frame);
|
|
WMResizeWidget(panel->prevL, 240, FRAME_HEIGHT-20);
|
|
WMMoveWidget(panel->prevL, 15, 10);
|
|
WMSetLabelRelief(panel->prevL, WRSunken);
|
|
WMSetLabelImagePosition(panel->prevL, WIPImageOnly);
|
|
|
|
|
|
/* language selection */
|
|
|
|
panel->langF = WMCreateFrame(panel->frame);
|
|
WMResizeWidget(panel->langF, 245, 50);
|
|
WMMoveWidget(panel->langF, 265, 10);
|
|
WMSetFrameTitle(panel->langF, _("Default Font Sets"));
|
|
|
|
panel->langP = WMCreatePopUpButton(panel->langF);
|
|
WMResizeWidget(panel->langP, 215, 20);
|
|
WMMoveWidget(panel->langP, 15, 20);
|
|
|
|
WMMapSubwidgets(panel->langF);
|
|
|
|
|
|
/* multibyte */
|
|
panel->fsetL = WMCreateLabel(panel->frame);
|
|
WMResizeWidget(panel->fsetL, 205, 20);
|
|
WMMoveWidget(panel->fsetL, 215, 127);
|
|
WMSetLabelText(panel->fsetL, _("Font Set"));
|
|
WMSetLabelRelief(panel->fsetL, WRSunken);
|
|
WMSetLabelTextAlignment(panel->fsetL, WACenter);
|
|
{
|
|
WMFont *font;
|
|
WMColor *color;
|
|
|
|
color = WMDarkGrayColor(scr);
|
|
font = WMBoldSystemFontOfSize(scr, 12);
|
|
|
|
WMSetWidgetBackgroundColor(panel->fsetL, color);
|
|
WMSetLabelFont(panel->fsetL, font);
|
|
|
|
WMReleaseFont(font);
|
|
WMReleaseColor(color);
|
|
|
|
color = WMWhiteColor(scr);
|
|
WMSetLabelTextColor(panel->fsetL, color);
|
|
WMReleaseColor(color);
|
|
}
|
|
|
|
panel->fsetLs = WMCreateList(panel->frame);
|
|
WMResizeWidget(panel->fsetLs, 205, 71);
|
|
WMMoveWidget(panel->fsetLs, 215, 149);
|
|
|
|
|
|
panel->addB = WMCreateCommandButton(panel->frame);
|
|
WMResizeWidget(panel->addB, 80, 24);
|
|
WMMoveWidget(panel->addB, 430, 127);
|
|
WMSetButtonText(panel->addB, _("Add..."));
|
|
|
|
panel->editB = WMCreateCommandButton(panel->frame);
|
|
WMResizeWidget(panel->editB, 80, 24);
|
|
WMMoveWidget(panel->editB, 430, 161);
|
|
WMSetButtonText(panel->editB, _("Change..."));
|
|
|
|
panel->remB = WMCreateCommandButton(panel->frame);
|
|
WMResizeWidget(panel->remB, 80, 24);
|
|
WMMoveWidget(panel->remB, 430, 195);
|
|
WMSetButtonText(panel->remB, _("Remove"));
|
|
|
|
/* single byte */
|
|
panel->fontT = WMCreateTextField(panel->frame);
|
|
WMResizeWidget(panel->fontT, 240, 20);
|
|
WMMoveWidget(panel->fontT, 265, 130);
|
|
|
|
panel->changeB = WMCreateCommandButton(panel->frame);
|
|
WMResizeWidget(panel->changeB, 104, 24);
|
|
WMMoveWidget(panel->changeB, 335, 160);
|
|
WMSetButtonText(panel->changeB, _("Change..."));
|
|
|
|
|
|
panel->black = WMBlackColor(scr);
|
|
panel->white = WMWhiteColor(scr);
|
|
panel->light = WMGrayColor(scr);
|
|
panel->dark = WMDarkGrayColor(scr);
|
|
panel->back = WMCreateRGBColor(scr, 0x5100, 0x5100, 0x7100, True);
|
|
|
|
#if 0
|
|
for (i = 0; Languages[i].language != NULL; i++) {
|
|
WMAddPopUpButtonItem(panel->langP, Languages[i].language);
|
|
}
|
|
|
|
for (i = 0; Options[i].description != NULL; i++) {
|
|
WMAddListItem(panel->settingLs, Options[i].description);
|
|
}
|
|
#endif
|
|
WMRealizeWidget(panel->frame);
|
|
WMMapSubwidgets(panel->frame);
|
|
|
|
setLanguageType(panel, False);
|
|
|
|
showData(panel);
|
|
|
|
readFontEncodings(panel);
|
|
}
|
|
|
|
|
|
|
|
|
|
Panel*
|
|
InitFont(WMScreen *scr, WMWindow *win)
|
|
{
|
|
_Panel *panel;
|
|
|
|
panel = wmalloc(sizeof(_Panel));
|
|
memset(panel, 0, sizeof(_Panel));
|
|
|
|
panel->sectionName = _("Font Preferences");
|
|
panel->description = _("Font Configurations for Windows, Menus etc");
|
|
|
|
panel->win = win;
|
|
|
|
panel->callbacks.createWidgets = createPanel;
|
|
|
|
AddSection(panel, ICON_FILE);
|
|
|
|
return panel;
|
|
}
|
|
|