dnd changes
[wmaker-crm.git] / WPrefs.app / Font.c
blob1842273c27adf45e02b5e705f91fe6134a61eb5d
1 /* Font.c- text/font settings
2 *
3 * WPrefs - Window Maker Preferences Program
4 *
5 * Copyright (c) 1999 Alfredo K. Kojima
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20 * USA.
24 #include "WPrefs.h"
26 #include <proplist.h>
28 typedef struct _Panel {
29 WMFrame *frame;
30 char *sectionName;
32 char *description;
34 CallbackRec callbacks;
36 WMWindow *win;
39 WMLabel *prevL;
41 WMFrame *langF;
42 WMPopUpButton *langP;
44 /* single byte */
45 WMTextField *fontT;
46 WMButton *changeB;
48 /* multibyte */
49 WMLabel *fsetL;
50 WMList *fsetLs;
52 WMButton *addB;
53 WMButton *editB;
54 WMButton *remB;
57 WMFont *windowTitleFont;
58 WMFont *menuTitleFont;
59 WMFont *menuItemFont;
62 WMColor *white;
63 WMColor *black;
64 WMColor *light;
65 WMColor *dark;
67 WMColor *back;
69 Pixmap preview;
70 WMPixmap *previewPix;
71 } _Panel;
75 #define ICON_FILE "fonts"
79 static proplist_t DefaultWindowTitleFont = NULL;
80 static proplist_t DefaultMenuTitleFont = NULL;
81 static proplist_t DefaultMenuTextFont = NULL;
82 static proplist_t DefaultIconTitleFont = NULL;
83 static proplist_t DefaultClipTitleFont = NULL;
84 static proplist_t DefaultDisplayFont = NULL;
88 static void
89 drawMenuItem(WMScreen *scr, Display *dpy, Drawable d,
90 int x, int y, int w, int h,
91 GC light, GC dark, GC black, GC white,
92 WMFont *font, int fh, char *text)
94 XFillRectangle(dpy, d, light, x, y, w, h);
96 XDrawLine(dpy, d, black, x, y, x, y+h);
97 XDrawLine(dpy, d, black, x+w, y, x+w, y+h);
99 XDrawLine(dpy, d, white, x+1, y, x+1, y+h-1);
100 XDrawLine(dpy, d, white, x+1, y, x+w-1, y);
102 XDrawLine(dpy, d, dark, x+w-1, y+1, x+w-1, y+h-3);
103 XDrawLine(dpy, d, dark, x+1, y+h-2, x+w-1, y+h-2);
105 XDrawLine(dpy, d, black, x, y+h-1, x+w, y+h-1);
107 WMDrawString(scr, d, black, font, x + 5, y+(h-fh)/2,
108 text, strlen(text));
113 static void
114 paintPreviewBox(Panel *panel)
116 WMScreen *scr = WMWidgetScreen(panel->win);
117 Display *dpy = WMScreenDisplay(scr);
118 GC black = WMColorGC(panel->black);
119 GC white = WMColorGC(panel->white);
120 GC dark = WMColorGC(panel->dark);
121 GC light = WMColorGC(panel->light);
124 if (panel->preview == None) {
125 WMPixmap *pix;
127 panel->preview = XCreatePixmap(dpy, WMWidgetXID(panel->win),
128 240-4, 215-4, WMScreenDepth(scr));
130 pix = WMCreatePixmapFromXPixmaps(scr, panel->preview, None,
131 240-4, 215-4, WMScreenDepth(scr));
133 WMSetLabelImage(panel->prevL, pix);
134 WMReleasePixmap(pix);
137 XFillRectangle(dpy, panel->preview, WMColorGC(panel->back),
138 0, 0, 240-4, 215-4);
140 /* window title */
142 int h, fh;
144 fh = WMFontHeight(panel->windowTitleFont);
145 h = fh+6;
147 XFillRectangle(dpy, panel->preview, black,
148 19, 19, 203, h+3);
150 XDrawLine(dpy, panel->preview, light,
151 20, 20, 220, 20);
152 XDrawLine(dpy, panel->preview, light,
153 20, 20, 20, 20+h);
155 XDrawLine(dpy, panel->preview, dark,
156 20, 20+h, 220, 20+h);
157 XDrawLine(dpy, panel->preview, dark,
158 220, 20, 220, 20+h);
160 WMDrawString(scr, panel->preview, white, panel->windowTitleFont,
161 20+(200-WMWidthOfString(panel->windowTitleFont, "Window Titlebar", 15))/2,
162 20+(h-fh)/2, "Window Titlebar", 15);
165 /* menu title */
167 int h, h2, fh, fh2;
168 int i;
169 const int mx = 20;
170 const int my = 120;
171 const int mw = 100;
174 fh = WMFontHeight(panel->menuTitleFont);
175 h = fh+6;
177 XFillRectangle(dpy, panel->preview, black,
178 mx-1, my-1, mw+3, h+3);
180 XDrawLine(dpy, panel->preview, light,
181 mx, my, mx+mw, my);
182 XDrawLine(dpy, panel->preview, light,
183 mx, my, mx, my+h);
185 XDrawLine(dpy, panel->preview, dark,
186 mx, my+h, mx+mw, my+h);
187 XDrawLine(dpy, panel->preview, dark,
188 mx+mw, my, mx+mw, my+h);
190 WMDrawString(scr, panel->preview, white, panel->menuTitleFont,
191 mx+5, my+(h-fh)/2, "Menu Title", 10);
193 fh2 = WMFontHeight(panel->menuItemFont);
194 h2 = fh2+6;
196 /* menu items */
197 for (i = 0; i < 4; i++) {
198 drawMenuItem(scr, dpy, panel->preview,
199 mx-1, my+2+h+i*h2, mw+2, h2,
200 light, dark, black, white,
201 panel->menuItemFont, fh2,
202 "Menu Item");
207 WMRedisplayWidget(panel->prevL);
212 static void
213 showData(_Panel *panel)
215 WMScreen *scr = WMWidgetScreen(panel->win);
216 char *str;
218 str = GetStringForKey("WindowTitleFont");
220 panel->windowTitleFont = WMCreateFont(scr, str);
223 str = GetStringForKey("MenuTitleFont");
225 panel->menuTitleFont = WMCreateFont(scr, str);
228 str = GetStringForKey("MenuTextFont");
230 panel->menuItemFont = WMCreateFont(scr, str);
235 paintPreviewBox(panel);
239 static void
240 setLanguageType(Panel *p, Bool multiByte)
242 if (multiByte) {
243 WMMapWidget(p->fsetL);
244 WMMapWidget(p->fsetLs);
245 WMMapWidget(p->addB);
246 WMMapWidget(p->editB);
247 WMMapWidget(p->remB);
249 WMUnmapWidget(p->fontT);
250 WMUnmapWidget(p->changeB);
251 } else {
252 WMUnmapWidget(p->fsetL);
253 WMUnmapWidget(p->fsetLs);
254 WMUnmapWidget(p->addB);
255 WMUnmapWidget(p->editB);
256 WMUnmapWidget(p->remB);
258 WMMapWidget(p->fontT);
259 WMMapWidget(p->changeB);
268 static void
269 readFontEncodings(Panel *panel)
271 proplist_t pl = NULL;
272 char *path;
273 char *msg;
275 path = WMPathForResourceOfType("font.data", NULL);
276 if (!path) {
277 msg = _("Could not locate font information file WPrefs.app/font.data");
278 goto error;
281 pl = PLGetProplistWithPath(path);
282 if (!pl) {
283 msg = _("Could not read font information file WPrefs.app/font.data");
284 goto error;
285 } else {
286 int i;
287 proplist_t key = PLMakeString("Encodings");
288 proplist_t array;
289 WMMenuItem *mi;
291 array = PLGetDictionaryEntry(pl, key);
292 PLRelease(key);
293 if (!array || !PLIsArray(array)) {
294 msg = _("Invalid data in font information file WPrefs.app/font.data.\n"
295 "Encodings data not found.");
296 goto error;
299 WMAddPopUpButtonItem(panel->langP, _("- Custom -"));
301 for (i = 0; i < PLGetNumberOfElements(array); i++) {
302 proplist_t item, str;
304 item = PLGetArrayElement(array, i);
305 str = PLGetArrayElement(item, 0);
306 mi = WMAddPopUpButtonItem(panel->langP, PLGetString(str));
307 WMSetMenuItemRepresentedObject(mi, PLRetain(item));
310 key = PLMakeString("WindowTitleFont");
311 DefaultWindowTitleFont = PLGetDictionaryEntry(pl, key);
312 PLRelease(key);
314 key = PLMakeString("MenuTitleFont");
315 DefaultMenuTitleFont = PLGetDictionaryEntry(pl, key);
316 PLRelease(key);
318 key = PLMakeString("MenuTextFont");
319 DefaultMenuTextFont = PLGetDictionaryEntry(pl, key);
320 PLRelease(key);
323 PLRelease(pl);
324 return;
325 error:
326 if (pl)
327 PLRelease(pl);
329 WMRunAlertPanel(WMWidgetScreen(panel->win), panel->win,
330 _("Error"), msg, _("OK"), NULL, NULL);
335 static void
336 changeLanguageAction(WMWidget *w, void *data)
338 Panel *panel = (Panel*)data;
339 WMMenuItem *mi;
340 proplist_t pl, font;
341 char buffer[512];
343 mi = WMGetPopUpButtonMenuItem(w, WMGetPopUpButtonSelectedItem(w));
344 pl = WMGetMenuItemRepresentedObject(mi);
346 if (!pl) {
347 /* custom */
348 } else {
354 static void
355 createPanel(Panel *p)
357 _Panel *panel = (_Panel*)p;
358 WMScreen *scr = WMWidgetScreen(panel->win);
360 panel->frame = WMCreateFrame(panel->win);
361 WMResizeWidget(panel->frame, FRAME_WIDTH, FRAME_HEIGHT);
362 WMMoveWidget(panel->frame, FRAME_LEFT, FRAME_TOP);
365 panel->prevL = WMCreateLabel(panel->frame);
366 WMResizeWidget(panel->prevL, 240, FRAME_HEIGHT-20);
367 WMMoveWidget(panel->prevL, 15, 10);
368 WMSetLabelRelief(panel->prevL, WRSunken);
369 WMSetLabelImagePosition(panel->prevL, WIPImageOnly);
372 /* language selection */
374 panel->langF = WMCreateFrame(panel->frame);
375 WMResizeWidget(panel->langF, 245, 50);
376 WMMoveWidget(panel->langF, 265, 10);
377 WMSetFrameTitle(panel->langF, _("Default Font Sets"));
379 panel->langP = WMCreatePopUpButton(panel->langF);
380 WMResizeWidget(panel->langP, 215, 20);
381 WMMoveWidget(panel->langP, 15, 20);
383 WMMapSubwidgets(panel->langF);
386 /* multibyte */
387 panel->fsetL = WMCreateLabel(panel->frame);
388 WMResizeWidget(panel->fsetL, 205, 20);
389 WMMoveWidget(panel->fsetL, 215, 127);
390 WMSetLabelText(panel->fsetL, _("Font Set"));
391 WMSetLabelRelief(panel->fsetL, WRSunken);
392 WMSetLabelTextAlignment(panel->fsetL, WACenter);
394 WMFont *font;
395 WMColor *color;
397 color = WMDarkGrayColor(scr);
398 font = WMBoldSystemFontOfSize(scr, 12);
400 WMSetWidgetBackgroundColor(panel->fsetL, color);
401 WMSetLabelFont(panel->fsetL, font);
403 WMReleaseFont(font);
404 WMReleaseColor(color);
406 color = WMWhiteColor(scr);
407 WMSetLabelTextColor(panel->fsetL, color);
408 WMReleaseColor(color);
411 panel->fsetLs = WMCreateList(panel->frame);
412 WMResizeWidget(panel->fsetLs, 205, 71);
413 WMMoveWidget(panel->fsetLs, 215, 149);
416 panel->addB = WMCreateCommandButton(panel->frame);
417 WMResizeWidget(panel->addB, 80, 24);
418 WMMoveWidget(panel->addB, 430, 127);
419 WMSetButtonText(panel->addB, _("Add..."));
421 panel->editB = WMCreateCommandButton(panel->frame);
422 WMResizeWidget(panel->editB, 80, 24);
423 WMMoveWidget(panel->editB, 430, 161);
424 WMSetButtonText(panel->editB, _("Change..."));
426 panel->remB = WMCreateCommandButton(panel->frame);
427 WMResizeWidget(panel->remB, 80, 24);
428 WMMoveWidget(panel->remB, 430, 195);
429 WMSetButtonText(panel->remB, _("Remove"));
431 /* single byte */
432 panel->fontT = WMCreateTextField(panel->frame);
433 WMResizeWidget(panel->fontT, 240, 20);
434 WMMoveWidget(panel->fontT, 265, 130);
436 panel->changeB = WMCreateCommandButton(panel->frame);
437 WMResizeWidget(panel->changeB, 104, 24);
438 WMMoveWidget(panel->changeB, 335, 160);
439 WMSetButtonText(panel->changeB, _("Change..."));
442 panel->black = WMBlackColor(scr);
443 panel->white = WMWhiteColor(scr);
444 panel->light = WMGrayColor(scr);
445 panel->dark = WMDarkGrayColor(scr);
446 panel->back = WMCreateRGBColor(scr, 0x5100, 0x5100, 0x7100, True);
448 #if 0
449 for (i = 0; Languages[i].language != NULL; i++) {
450 WMAddPopUpButtonItem(panel->langP, Languages[i].language);
453 for (i = 0; Options[i].description != NULL; i++) {
454 WMAddListItem(panel->settingLs, Options[i].description);
456 #endif
457 WMRealizeWidget(panel->frame);
458 WMMapSubwidgets(panel->frame);
460 setLanguageType(panel, False);
462 showData(panel);
464 readFontEncodings(panel);
470 Panel*
471 InitFont(WMScreen *scr, WMWindow *win)
473 _Panel *panel;
475 panel = wmalloc(sizeof(_Panel));
476 memset(panel, 0, sizeof(_Panel));
478 panel->sectionName = _("Font Preferences");
479 panel->description = _("Font Configurations for Windows, Menus etc");
481 panel->win = win;
483 panel->callbacks.createWidgets = createPanel;
485 AddSection(panel, ICON_FILE);
487 return panel;