1 /* Font.c- text/font settings
3 * WPrefs - Window Maker Preferences Program
5 * Copyright (c) 1999-2002 Alfredo K. Kojima
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,
27 typedef struct _Panel
{
33 CallbackRec callbacks
;
56 WMFont
*windowTitleFont
;
57 WMFont
*menuTitleFont
;
74 #define ICON_FILE "fonts"
78 static WMPropList
*DefaultWindowTitleFont
= NULL
;
79 static WMPropList
*DefaultMenuTitleFont
= NULL
;
80 static WMPropList
*DefaultMenuTextFont
= NULL
;
81 static WMPropList
*DefaultIconTitleFont
= NULL
;
82 static WMPropList
*DefaultClipTitleFont
= NULL
;
83 static WMPropList
*DefaultDisplayFont
= NULL
;
88 drawMenuItem(WMScreen
*scr
, Display
*dpy
, Drawable d
,
89 int x
, int y
, int w
, int h
,
90 GC light
, GC dark
, GC black
, GC white
,
91 WMFont
*font
, int fh
, char *text
)
93 XFillRectangle(dpy
, d
, light
, x
, y
, w
, h
);
95 XDrawLine(dpy
, d
, black
, x
, y
, x
, y
+h
);
96 XDrawLine(dpy
, d
, black
, x
+w
, y
, x
+w
, y
+h
);
98 XDrawLine(dpy
, d
, white
, x
+1, y
, x
+1, y
+h
-1);
99 XDrawLine(dpy
, d
, white
, x
+1, y
, x
+w
-1, y
);
101 XDrawLine(dpy
, d
, dark
, x
+w
-1, y
+1, x
+w
-1, y
+h
-3);
102 XDrawLine(dpy
, d
, dark
, x
+1, y
+h
-2, x
+w
-1, y
+h
-2);
104 XDrawLine(dpy
, d
, black
, x
, y
+h
-1, x
+w
, y
+h
-1);
106 WMDrawString(scr
, d
, black
, font
, x
+ 5, y
+(h
-fh
)/2,
113 paintPreviewBox(Panel
*panel
)
115 WMScreen
*scr
= WMWidgetScreen(panel
->parent
);
116 Display
*dpy
= WMScreenDisplay(scr
);
117 GC black
= WMColorGC(panel
->black
);
118 GC white
= WMColorGC(panel
->white
);
119 GC dark
= WMColorGC(panel
->dark
);
120 GC light
= WMColorGC(panel
->light
);
123 if (panel
->preview
== None
) {
126 panel
->preview
= XCreatePixmap(dpy
, WMWidgetXID(panel
->parent
),
127 240-4, 215-4, WMScreenDepth(scr
));
129 pix
= WMCreatePixmapFromXPixmaps(scr
, panel
->preview
, None
,
130 240-4, 215-4, WMScreenDepth(scr
));
132 WMSetLabelImage(panel
->prevL
, pix
);
133 WMReleasePixmap(pix
);
136 XFillRectangle(dpy
, panel
->preview
, WMColorGC(panel
->back
),
143 fh
= WMFontHeight(panel
->windowTitleFont
);
146 XFillRectangle(dpy
, panel
->preview
, black
,
149 XDrawLine(dpy
, panel
->preview
, light
,
151 XDrawLine(dpy
, panel
->preview
, light
,
154 XDrawLine(dpy
, panel
->preview
, dark
,
155 20, 20+h
, 220, 20+h
);
156 XDrawLine(dpy
, panel
->preview
, dark
,
159 WMDrawString(scr
, panel
->preview
, white
, panel
->windowTitleFont
,
160 20+(200-WMWidthOfString(panel
->windowTitleFont
, "Window Titlebar", 15))/2,
161 20+(h
-fh
)/2, "Window Titlebar", 15);
173 fh
= WMFontHeight(panel
->menuTitleFont
);
176 XFillRectangle(dpy
, panel
->preview
, black
,
177 mx
-1, my
-1, mw
+3, h
+3);
179 XDrawLine(dpy
, panel
->preview
, light
,
181 XDrawLine(dpy
, panel
->preview
, light
,
184 XDrawLine(dpy
, panel
->preview
, dark
,
185 mx
, my
+h
, mx
+mw
, my
+h
);
186 XDrawLine(dpy
, panel
->preview
, dark
,
187 mx
+mw
, my
, mx
+mw
, my
+h
);
189 WMDrawString(scr
, panel
->preview
, white
, panel
->menuTitleFont
,
190 mx
+5, my
+(h
-fh
)/2, "Menu Title", 10);
192 fh2
= WMFontHeight(panel
->menuItemFont
);
196 for (i
= 0; i
< 4; i
++) {
197 drawMenuItem(scr
, dpy
, panel
->preview
,
198 mx
-1, my
+2+h
+i
*h2
, mw
+2, h2
,
199 light
, dark
, black
, white
,
200 panel
->menuItemFont
, fh2
,
206 WMRedisplayWidget(panel
->prevL
);
212 showData(_Panel
*panel
)
214 WMScreen
*scr
= WMWidgetScreen(panel
->parent
);
217 str
= GetStringForKey("WindowTitleFont");
219 panel
->windowTitleFont
= WMCreateFont(scr
, str
);
222 str
= GetStringForKey("MenuTitleFont");
224 panel
->menuTitleFont
= WMCreateFont(scr
, str
);
227 str
= GetStringForKey("MenuTextFont");
229 panel
->menuItemFont
= WMCreateFont(scr
, str
);
234 paintPreviewBox(panel
);
239 setLanguageType(Panel
*p
, Bool multiByte
)
242 WMMapWidget(p
->fsetL
);
243 WMMapWidget(p
->fsetLs
);
244 WMMapWidget(p
->addB
);
245 WMMapWidget(p
->editB
);
246 WMMapWidget(p
->remB
);
248 WMUnmapWidget(p
->fontT
);
249 WMUnmapWidget(p
->changeB
);
251 WMUnmapWidget(p
->fsetL
);
252 WMUnmapWidget(p
->fsetLs
);
253 WMUnmapWidget(p
->addB
);
254 WMUnmapWidget(p
->editB
);
255 WMUnmapWidget(p
->remB
);
257 WMMapWidget(p
->fontT
);
258 WMMapWidget(p
->changeB
);
268 readFontEncodings(Panel
*panel
)
270 WMPropList
*pl
= NULL
;
274 path
= WMPathForResourceOfType("font.data", NULL
);
276 msg
= _("Could not locate font information file WPrefs.app/font.data");
280 pl
= WMReadPropListFromFile(path
);
282 msg
= _("Could not read font information file WPrefs.app/font.data");
286 WMPropList
*key
= WMCreatePLString("Encodings");
290 array
= WMGetFromPLDictionary(pl
, key
);
291 WMReleasePropList(key
);
292 if (!array
|| !WMIsPLArray(array
)) {
293 msg
= _("Invalid data in font information file WPrefs.app/font.data.\n"
294 "Encodings data not found.");
298 WMAddPopUpButtonItem(panel
->langP
, _("- Custom -"));
300 for (i
= 0; i
< WMGetPropListItemCount(array
); i
++) {
301 WMPropList
*item
, *str
;
303 item
= WMGetFromPLArray(array
, i
);
304 str
= WMGetFromPLArray(item
, 0);
305 mi
= WMAddPopUpButtonItem(panel
->langP
, WMGetFromPLString(str
));
306 WMSetMenuItemRepresentedObject(mi
, WMRetainPropList(item
));
309 key
= WMCreatePLString("WindowTitleFont");
310 DefaultWindowTitleFont
= WMGetFromPLDictionary(pl
, key
);
311 WMReleasePropList(key
);
313 key
= WMCreatePLString("MenuTitleFont");
314 DefaultMenuTitleFont
= WMGetFromPLDictionary(pl
, key
);
315 WMReleasePropList(key
);
317 key
= WMCreatePLString("MenuTextFont");
318 DefaultMenuTextFont
= WMGetFromPLDictionary(pl
, key
);
319 WMReleasePropList(key
);
322 WMReleasePropList(pl
);
326 WMReleasePropList(pl
);
328 WMRunAlertPanel(WMWidgetScreen(panel
->parent
), panel
->parent
,
329 _("Error"), msg
, _("OK"), NULL
, NULL
);
335 changeLanguageAction(WMWidget
*w
, void *data
)
337 /*Panel *panel = (Panel*)data;*/
341 mi
= WMGetPopUpButtonMenuItem(w
, WMGetPopUpButtonSelectedItem(w
));
342 pl
= WMGetMenuItemRepresentedObject(mi
);
354 createPanel(Panel
*p
)
356 _Panel
*panel
= (_Panel
*)p
;
357 WMScreen
*scr
= WMWidgetScreen(panel
->parent
);
360 panel
->box
= WMCreateBox(panel
->parent
);
361 WMSetViewExpandsToParent(WMWidgetView(panel
->box
), 2, 2, 2, 2);
364 panel
->prevL
= WMCreateLabel(panel
->box
);
365 WMResizeWidget(panel
->prevL
, 240, FRAME_HEIGHT
-20);
366 WMMoveWidget(panel
->prevL
, 15, 10);
367 WMSetLabelRelief(panel
->prevL
, WRSunken
);
368 WMSetLabelImagePosition(panel
->prevL
, WIPImageOnly
);
371 /* language selection */
373 panel
->langF
= WMCreateFrame(panel
->box
);
374 WMResizeWidget(panel
->langF
, 245, 50);
375 WMMoveWidget(panel
->langF
, 265, 10);
376 WMSetFrameTitle(panel
->langF
, _("Default Font Sets"));
378 panel
->langP
= WMCreatePopUpButton(panel
->langF
);
379 WMResizeWidget(panel
->langP
, 215, 20);
380 WMMoveWidget(panel
->langP
, 15, 20);
382 WMMapSubwidgets(panel
->langF
);
386 panel
->fsetL
= WMCreateLabel(panel
->box
);
387 WMResizeWidget(panel
->fsetL
, 205, 20);
388 WMMoveWidget(panel
->fsetL
, 215, 127);
389 WMSetLabelText(panel
->fsetL
, _("Font Set"));
390 WMSetLabelRelief(panel
->fsetL
, WRSunken
);
391 WMSetLabelTextAlignment(panel
->fsetL
, WACenter
);
396 color
= WMDarkGrayColor(scr
);
397 font
= WMBoldSystemFontOfSize(scr
, 12);
399 WMSetWidgetBackgroundColor(panel
->fsetL
, color
);
400 WMSetLabelFont(panel
->fsetL
, font
);
403 WMReleaseColor(color
);
405 color
= WMWhiteColor(scr
);
406 WMSetLabelTextColor(panel
->fsetL
, color
);
407 WMReleaseColor(color
);
410 panel
->fsetLs
= WMCreateList(panel
->box
);
411 WMResizeWidget(panel
->fsetLs
, 205, 71);
412 WMMoveWidget(panel
->fsetLs
, 215, 149);
415 panel
->addB
= WMCreateCommandButton(panel
->box
);
416 WMResizeWidget(panel
->addB
, 80, 24);
417 WMMoveWidget(panel
->addB
, 430, 127);
418 WMSetButtonText(panel
->addB
, _("Add..."));
420 panel
->editB
= WMCreateCommandButton(panel
->box
);
421 WMResizeWidget(panel
->editB
, 80, 24);
422 WMMoveWidget(panel
->editB
, 430, 161);
423 WMSetButtonText(panel
->editB
, _("Change..."));
425 panel
->remB
= WMCreateCommandButton(panel
->box
);
426 WMResizeWidget(panel
->remB
, 80, 24);
427 WMMoveWidget(panel
->remB
, 430, 195);
428 WMSetButtonText(panel
->remB
, _("Remove"));
431 panel
->fontT
= WMCreateTextField(panel
->box
);
432 WMResizeWidget(panel
->fontT
, 240, 20);
433 WMMoveWidget(panel
->fontT
, 265, 130);
435 panel
->changeB
= WMCreateCommandButton(panel
->box
);
436 WMResizeWidget(panel
->changeB
, 104, 24);
437 WMMoveWidget(panel
->changeB
, 335, 160);
438 WMSetButtonText(panel
->changeB
, _("Change..."));
441 panel
->black
= WMBlackColor(scr
);
442 panel
->white
= WMWhiteColor(scr
);
443 panel
->light
= WMGrayColor(scr
);
444 panel
->dark
= WMDarkGrayColor(scr
);
445 panel
->back
= WMCreateRGBColor(scr
, 0x5100, 0x5100, 0x7100, True
);
448 for (i
= 0; Languages
[i
].language
!= NULL
; i
++) {
449 WMAddPopUpButtonItem(panel
->langP
, Languages
[i
].language
);
452 for (i
= 0; Options
[i
].description
!= NULL
; i
++) {
453 WMAddListItem(panel
->settingLs
, Options
[i
].description
);
456 WMRealizeWidget(panel
->box
);
457 WMMapSubwidgets(panel
->box
);
459 setLanguageType(panel
, False
);
463 readFontEncodings(panel
);
470 InitFont(WMScreen
*scr
, WMWidget
*parent
)
474 panel
= wmalloc(sizeof(_Panel
));
475 memset(panel
, 0, sizeof(_Panel
));
477 panel
->sectionName
= _("Font Preferences");
478 panel
->description
= _("Font Configurations for Windows, Menus etc");
480 panel
->parent
= parent
;
482 panel
->callbacks
.createWidgets
= createPanel
;
484 AddSection(panel
, ICON_FILE
);