1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 04:20:27 +01:00
Files
wmaker/WPrefs.app/Font.c
dan 049a69a9bf - Added a test in configure for the version of libPropList that is installed
on the system. Further compilation will be aborted if the version of
  libPropList that is found is older than expected. Hopefully this will make
  go away some annoying messages from people unable to read the release
  notes.
- Implemented periodic synchronization of user defaults in WINGs and
  notification when user defaults gets changed.
- Fixed the color panel to compile (someone in charge with it check if its
  ok, I only changed where the compiler complained, didn't go through the
  code).
- Misc fixes, related to latest changes in wrlib.
2000-01-15 02:00:24 +00:00

490 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, font;
char buffer[512];
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;
}