- some small fixes to make it compile on werider systems.
[wmaker-crm.git] / WINGs / wfontpanel.c
bloba2741bf3bd4e8df7b41edefe86aa5e0fdca47e08
5 #include "WINGsP.h"
6 #include "WUtil.h"
8 #include <ctype.h>
9 #include <string.h>
12 typedef struct W_FontPanel {
13 WMWindow *win;
15 WMFrame *upperF;
16 WMTextField *sampleT;
18 WMSplitView *split;
20 WMFrame *lowerF;
21 WMLabel *famL;
22 WMList *famLs;
23 WMLabel *typL;
24 WMList *typLs;
25 WMLabel *sizL;
26 WMTextField *sizT;
27 WMList *sizLs;
29 WMButton *revertB;
30 WMButton *setB;
32 proplist_t fdb;
33 } FontPanel;
36 #define MIN_UPPER_HEIGHT 20
37 #define MIN_LOWER_HEIGHT 140
40 #define MAX_FONTS_TO_RETRIEVE 2000
42 #define BUTTON_SPACE_HEIGHT 40
44 #define MIN_WIDTH 250
45 #define MIN_HEIGHT (MIN_UPPER_HEIGHT+MIN_LOWER_HEIGHT+BUTTON_SPACE_HEIGHT)
47 #define DEF_UPPER_HEIGHT 60
48 #define DEF_LOWER_HEIGHT 310
50 #define DEF_WIDTH 320
51 #define DEF_HEIGHT (DEF_UPPER_HEIGHT+DEF_LOWER_HEIGHT)
56 static int scalableFontSizes[] = {
57 8,
58 10,
59 11,
60 12,
61 14,
62 16,
63 18,
64 20,
65 24,
66 36,
67 48,
73 static void getSelectedFont(FontPanel *panel, char buffer[]);
76 static void arrangeLowerFrame(FontPanel *panel);
78 static void familyClick(WMWidget *, void *);
79 static void typefaceClick(WMWidget *, void *);
80 static void sizeClick(WMWidget *, void *);
83 static void listFamilies(WMScreen *scr, WMFontPanel *panel);
86 static void
87 splitViewConstrainCallback(WMSplitView *sPtr, int indView, int *min, int *max)
89 if (indView == 0)
90 *min = MIN_UPPER_HEIGHT;
91 else
92 *min = MIN_LOWER_HEIGHT;
95 static void
96 notificationObserver(void *self, WMNotification *notif)
98 WMFontPanel *panel = (WMFontPanel*)self;
99 void *object = WMGetNotificationObject(notif);
101 if (WMGetNotificationName(notif) == WMViewSizeDidChangeNotification) {
102 if (object == WMWidgetView(panel->win)) {
103 int h = WMWidgetHeight(panel->win);
104 int w = WMWidgetWidth(panel->win);
106 WMResizeWidget(panel->split, w, h-BUTTON_SPACE_HEIGHT);
108 WMMoveWidget(panel->setB, w-80, h-(BUTTON_SPACE_HEIGHT-5));
110 WMMoveWidget(panel->revertB, w-240, h-(BUTTON_SPACE_HEIGHT-5));
112 } else if (object == WMWidgetView(panel->upperF)) {
114 if (WMWidgetHeight(panel->upperF) < MIN_UPPER_HEIGHT) {
115 WMResizeWidget(panel->upperF, WMWidgetWidth(panel->upperF),
116 MIN_UPPER_HEIGHT);
117 } else {
118 WMResizeWidget(panel->sampleT, WMWidgetWidth(panel->upperF)-20,
119 WMWidgetHeight(panel->upperF)-10);
122 } else if (object == WMWidgetView(panel->lowerF)) {
124 if (WMWidgetHeight(panel->lowerF) < MIN_LOWER_HEIGHT) {
125 WMResizeWidget(panel->upperF, WMWidgetWidth(panel->upperF),
126 MIN_UPPER_HEIGHT);
128 WMMoveWidget(panel->lowerF, 0, WMWidgetHeight(panel->upperF)
129 + WMGetSplitViewDividerThickness(panel->split));
131 WMResizeWidget(panel->lowerF, WMWidgetWidth(panel->lowerF),
132 WMWidgetWidth(panel->split) - MIN_UPPER_HEIGHT
133 - WMGetSplitViewDividerThickness(panel->split));
134 } else {
135 arrangeLowerFrame(panel);
142 static void
143 closeWindow(WMWidget *w, void *data)
145 FontPanel *panel = (FontPanel*)data;
147 WMHideFontPanel(panel);
152 WMFontPanel*
153 WMGetFontPanel(WMScreen *scr)
155 FontPanel *panel;
156 WMColor *dark, *white;
157 WMFont *font;
158 int divThickness;
160 if (scr->sharedFontPanel)
161 return scr->sharedFontPanel;
164 panel = wmalloc(sizeof(FontPanel));
165 memset(panel, 0, sizeof(FontPanel));
167 panel->win = WMCreateWindow(scr, "fontPanel");
168 /* WMSetWidgetBackgroundColor(panel->win, WMWhiteColor(scr));*/
169 WMResizeWidget(panel->win, DEF_WIDTH, DEF_HEIGHT);
170 WMSetWindowMinSize(panel->win, MIN_WIDTH, MIN_HEIGHT);
171 WMSetViewNotifySizeChanges(WMWidgetView(panel->win), True);
173 WMSetWindowCloseAction(panel->win, closeWindow, panel);
175 panel->split = WMCreateSplitView(panel->win);
176 WMResizeWidget(panel->split, DEF_WIDTH, DEF_HEIGHT - BUTTON_SPACE_HEIGHT);
177 WMSetSplitViewConstrainProc(panel->split, splitViewConstrainCallback);
179 divThickness = WMGetSplitViewDividerThickness(panel->split);
181 panel->upperF = WMCreateFrame(panel->win);
182 WMSetFrameRelief(panel->upperF, WRFlat);
183 WMSetViewNotifySizeChanges(WMWidgetView(panel->upperF), True);
184 panel->lowerF = WMCreateFrame(panel->win);
185 /* WMSetWidgetBackgroundColor(panel->lowerF, WMBlackColor(scr));*/
186 WMSetFrameRelief(panel->lowerF, WRFlat);
187 WMSetViewNotifySizeChanges(WMWidgetView(panel->lowerF), True);
189 WMAddSplitViewSubview(panel->split, W_VIEW(panel->upperF));
190 WMAddSplitViewSubview(panel->split, W_VIEW(panel->lowerF));
192 WMResizeWidget(panel->upperF, DEF_WIDTH, DEF_UPPER_HEIGHT);
194 WMResizeWidget(panel->lowerF, DEF_WIDTH, DEF_LOWER_HEIGHT);
196 WMMoveWidget(panel->lowerF, 0, 60+divThickness);
198 white = WMWhiteColor(scr);
199 dark = WMDarkGrayColor(scr);
201 panel->sampleT = WMCreateTextField(panel->upperF);
202 WMResizeWidget(panel->sampleT, DEF_WIDTH - 20, 50);
203 WMMoveWidget(panel->sampleT, 10, 10);
204 WMSetTextFieldText(panel->sampleT, "Test!!!");
206 font = WMBoldSystemFontOfSize(scr, 12);
208 panel->famL = WMCreateLabel(panel->lowerF);
209 WMSetWidgetBackgroundColor(panel->famL, dark);
210 WMSetLabelText(panel->famL, "Family");
211 WMSetLabelFont(panel->famL, font);
212 WMSetLabelTextColor(panel->famL, white);
213 WMSetLabelRelief(panel->famL, WRSunken);
214 WMSetLabelTextAlignment(panel->famL, WACenter);
216 panel->famLs = WMCreateList(panel->lowerF);
217 WMSetListAction(panel->famLs, familyClick, panel);
219 panel->typL = WMCreateLabel(panel->lowerF);
220 WMSetWidgetBackgroundColor(panel->typL, dark);
221 WMSetLabelText(panel->typL, "Typeface");
222 WMSetLabelFont(panel->typL, font);
223 WMSetLabelTextColor(panel->typL, white);
224 WMSetLabelRelief(panel->typL, WRSunken);
225 WMSetLabelTextAlignment(panel->typL, WACenter);
227 panel->typLs = WMCreateList(panel->lowerF);
228 WMSetListAction(panel->typLs, typefaceClick, panel);
230 panel->sizL = WMCreateLabel(panel->lowerF);
231 WMSetWidgetBackgroundColor(panel->sizL, dark);
232 WMSetLabelText(panel->sizL, "Size");
233 WMSetLabelFont(panel->sizL, font);
234 WMSetLabelTextColor(panel->sizL, white);
235 WMSetLabelRelief(panel->sizL, WRSunken);
236 WMSetLabelTextAlignment(panel->sizL, WACenter);
238 panel->sizT = WMCreateTextField(panel->lowerF);
239 /* WMSetTextFieldAlignment(panel->sizT, WARight);*/
241 panel->sizLs = WMCreateList(panel->lowerF);
242 WMSetListAction(panel->sizLs, sizeClick, panel);
244 WMReleaseFont(font);
245 WMReleaseColor(white);
246 WMReleaseColor(dark);
248 panel->setB = WMCreateCommandButton(panel->win);
249 WMResizeWidget(panel->setB, 70, 24);
250 WMMoveWidget(panel->setB, 240, DEF_HEIGHT - (BUTTON_SPACE_HEIGHT-5));
251 WMSetButtonText(panel->setB, "Set");
253 panel->revertB = WMCreateCommandButton(panel->win);
254 WMResizeWidget(panel->revertB, 70, 24);
255 WMMoveWidget(panel->revertB, 80, DEF_HEIGHT - (BUTTON_SPACE_HEIGHT-5));
256 WMSetButtonText(panel->revertB, "Revert");
258 WMRealizeWidget(panel->win);
260 WMMapSubwidgets(panel->upperF);
261 WMMapSubwidgets(panel->lowerF);
262 WMMapSubwidgets(panel->split);
263 WMMapSubwidgets(panel->win);
265 WMUnmapWidget(panel->revertB);
267 arrangeLowerFrame(panel);
269 scr->sharedFontPanel = panel;
272 /* register notification observers */
273 WMAddNotificationObserver(notificationObserver, panel,
274 WMViewSizeDidChangeNotification,
275 WMWidgetView(panel->win));
276 WMAddNotificationObserver(notificationObserver, panel,
277 WMViewSizeDidChangeNotification,
278 WMWidgetView(panel->upperF));
279 WMAddNotificationObserver(notificationObserver, panel,
280 WMViewSizeDidChangeNotification,
281 WMWidgetView(panel->lowerF));
284 listFamilies(scr, panel);
287 return panel;
291 void
292 WMFreeFontPanel(WMFontPanel *panel)
294 if (panel == WMWidgetScreen(panel->win)->sharedFontPanel) {
295 WMWidgetScreen(panel->win)->sharedFontPanel = NULL;
297 WMRemoveNotificationObserver(panel);
298 WMUnmapWidget(panel->win);
299 WMDestroyWidget(panel->win);
300 wfree(panel);
304 void
305 WMShowFontPanel(WMFontPanel *panel)
307 WMMapWidget(panel->win);
311 void
312 WMHideFontPanel(WMFontPanel *panel)
314 WMUnmapWidget(panel->win);
318 void
319 WMSetFontPanelFont(WMFontPanel *panel, WMFont *font)
325 Bool
326 WMSetFontPanelFontName(WMFontPanel *panel, char *fontName)
329 return True;
333 WMFont*
334 WMGetFontPanelFont(WMFontPanel *panel)
336 return WMGetTextFieldFont(panel->sampleT);
340 char*
341 WMGetFontPanelFontName(WMFontPanel *panel)
343 char name[256];
345 getSelectedFont(panel, name);
347 return wstrdup(name);
352 static void
353 arrangeLowerFrame(FontPanel *panel)
355 int width = WMWidgetWidth(panel->lowerF) - 55 - 30;
356 int height = WMWidgetHeight(panel->split) - WMWidgetHeight(panel->upperF);
357 int fw, tw, sw;
359 #define LABEL_HEIGHT 20
361 height -= WMGetSplitViewDividerThickness(panel->split);
364 height -= LABEL_HEIGHT + 8;
366 fw = (125*width) / 235;
367 tw = (110*width) / 235;
368 sw = 55;
370 WMMoveWidget(panel->famL, 10, 0);
371 WMResizeWidget(panel->famL, fw, LABEL_HEIGHT);
373 WMMoveWidget(panel->famLs, 10, 23);
374 WMResizeWidget(panel->famLs, fw, height);
376 WMMoveWidget(panel->typL, 10+fw+3, 0);
377 WMResizeWidget(panel->typL, tw, LABEL_HEIGHT);
379 WMMoveWidget(panel->typLs, 10+fw+3, 23);
380 WMResizeWidget(panel->typLs, tw, height);
382 WMMoveWidget(panel->sizL, 10+fw+3+tw+3, 0);
383 WMResizeWidget(panel->sizL, sw+4, LABEL_HEIGHT);
385 WMMoveWidget(panel->sizT, 10+fw+3+tw+3, 23);
386 WMResizeWidget(panel->sizT, sw+4, 20);
388 WMMoveWidget(panel->sizLs, 10+fw+3+tw+3, 46);
389 WMResizeWidget(panel->sizLs, sw+4, height-23);
395 #define ALL_FONTS_MASK "-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
397 #define FOUNDRY 0
398 #define FAMILY 1
399 #define WEIGHT 2
400 #define SLANT 3
401 #define SETWIDTH 4
402 #define ADD_STYLE 5
403 #define PIXEL_SIZE 6
404 #define POINT_SIZE 7
405 #define RES_X 8
406 #define RES_Y 9
407 #define SPACING 10
408 #define AV_WIDTH 11
409 #define REGISTRY 12
410 #define ENCODING 13
412 #define NUM_FIELDS 14
416 static Bool
417 parseFont(char *font, char values[NUM_FIELDS][256])
419 char *ptr;
420 int part;
421 char buffer[256], *bptr;
423 part = FOUNDRY;
424 ptr = font;
425 ptr++; /* skip first - */
426 bptr = buffer;
427 while (*ptr) {
428 if (*ptr == '-') {
429 *bptr = 0;
430 strcpy(values[part], buffer);
431 bptr = buffer;
432 part++;
433 } else {
434 *bptr++ = *ptr;
436 ptr++;
438 *bptr = 0;
439 strcpy(values[part], buffer);
441 return True;
446 static int
447 isXLFD(char *font, int *length_ret)
449 int c = 0;
451 *length_ret = 0;
452 while (*font) {
453 (*length_ret)++;
454 if (*font++ == '-')
455 c++;
458 return c==NUM_FIELDS;
464 typedef struct {
465 char *weight;
466 char *slant;
468 char *setWidth;
469 char *addStyle;
471 char showSetWidth; /* when duplicated */
472 char showAddStyle; /* when duplicated */
474 WMBag *sizes;
475 } Typeface;
478 typedef struct {
479 char *name;
481 char *foundry;
482 char *registry, *encoding;
484 char showFoundry; /* when duplicated */
485 char showRegistry; /* when duplicated */
487 WMBag *typefaces;
488 } Family;
493 static int
494 compare_int(const void *a, const void *b)
496 int i1 = *(int*)a;
497 int i2 = *(int*)b;
499 if (i1 < i2)
500 return -1;
501 else if (i1 > i2)
502 return 1;
503 else
504 return 0;
509 static void
510 addSizeToTypeface(Typeface *face, int size)
512 if (size == 0) {
513 int j;
515 for (j = 0; j < sizeof(scalableFontSizes)/sizeof(int); j++) {
516 size = scalableFontSizes[j];
518 if (!WMCountInBag(face->sizes, (void*)size)) {
519 WMPutInBag(face->sizes, (void*)size);
522 WMSortBag(face->sizes, compare_int);
523 } else {
524 if (!WMCountInBag(face->sizes, (void*)size)) {
525 WMPutInBag(face->sizes, (void*)size);
526 WMSortBag(face->sizes, compare_int);
533 static void
534 addTypefaceToFamily(Family *family, char fontFields[NUM_FIELDS][256])
536 Typeface *face;
537 WMBagIterator i;
539 if (family->typefaces) {
540 for (face = WMBagFirst(family->typefaces, &i);
541 face != NULL;
542 face = WMBagNext(family->typefaces, &i)) {
543 int size;
545 if (strcmp(face->weight, fontFields[WEIGHT]) != 0) {
546 continue;
548 if (strcmp(face->slant, fontFields[SLANT]) != 0) {
549 continue;
552 size = atoi(fontFields[PIXEL_SIZE]);
554 addSizeToTypeface(face, size);
556 return;
558 } else {
559 family->typefaces = WMCreateBag(4);
562 face = wmalloc(sizeof(Typeface));
563 memset(face, 0, sizeof(Typeface));
565 face->weight = wstrdup(fontFields[WEIGHT]);
566 face->slant = wstrdup(fontFields[SLANT]);
567 face->setWidth = wstrdup(fontFields[SETWIDTH]);
568 face->addStyle = wstrdup(fontFields[ADD_STYLE]);
570 face->sizes = WMCreateBag(4);
571 addSizeToTypeface(face, atoi(fontFields[PIXEL_SIZE]));
573 WMPutInBag(family->typefaces, face);
579 * families (same family name) (Hashtable of family -> bag)
580 * registries (same family but different registries)
584 static void
585 addFontToFamily(WMHashTable *families, char fontFields[NUM_FIELDS][256])
587 WMBagIterator i;
588 Family *fam;
589 WMBag *family;
592 family = WMHashGet(families, fontFields[FAMILY]);
594 if (family) {
595 /* look for same encoding/registry and foundry */
596 for (fam = WMBagFirst(family, &i);
597 fam != NULL;
598 fam = WMBagNext(family, &i)) {
599 int enc, reg, found;
601 enc = (strcmp(fam->encoding, fontFields[ENCODING]) == 0);
602 reg = (strcmp(fam->registry, fontFields[REGISTRY]) == 0);
603 found = (strcmp(fam->foundry, fontFields[FOUNDRY]) == 0);
605 if (enc && reg && found) {
606 addTypefaceToFamily(fam, fontFields);
607 return;
610 /* look for same encoding/registry */
611 for (fam = WMBagFirst(family, &i);
612 fam != NULL;
613 fam = WMBagNext(family, &i)) {
614 int enc, reg;
616 enc = (strcmp(fam->encoding, fontFields[ENCODING]) == 0);
617 reg = (strcmp(fam->registry, fontFields[REGISTRY]) == 0);
619 if (enc && reg) {
620 /* has the same encoding, but the foundry is different */
621 fam->showFoundry = 1;
623 fam = wmalloc(sizeof(Family));
624 memset(fam, 0, sizeof(Family));
626 fam->name = wstrdup(fontFields[FAMILY]);
627 fam->foundry = wstrdup(fontFields[FOUNDRY]);
628 fam->registry = wstrdup(fontFields[REGISTRY]);
629 fam->encoding = wstrdup(fontFields[ENCODING]);
630 fam->showFoundry = 1;
632 addTypefaceToFamily(fam, fontFields);
634 WMPutInBag(family, fam);
635 return;
638 /* look for same foundry */
639 for (fam = WMBagFirst(family, &i);
640 fam != NULL;
641 fam = WMBagNext(family, &i)) {
642 int found;
644 found = (strcmp(fam->foundry, fontFields[FOUNDRY]) == 0);
646 if (found) {
647 /* has the same foundry, but encoding is different */
648 fam->showRegistry = 1;
650 fam = wmalloc(sizeof(Family));
651 memset(fam, 0, sizeof(Family));
653 fam->name = wstrdup(fontFields[FAMILY]);
654 fam->foundry = wstrdup(fontFields[FOUNDRY]);
655 fam->registry = wstrdup(fontFields[REGISTRY]);
656 fam->encoding = wstrdup(fontFields[ENCODING]);
657 fam->showRegistry = 1;
659 addTypefaceToFamily(fam, fontFields);
661 WMPutInBag(family, fam);
662 return;
665 /* foundry and encoding do not match anything known */
666 fam = wmalloc(sizeof(Family));
667 memset(fam, 0, sizeof(Family));
669 fam->name = wstrdup(fontFields[FAMILY]);
670 fam->foundry = wstrdup(fontFields[FOUNDRY]);
671 fam->registry = wstrdup(fontFields[REGISTRY]);
672 fam->encoding = wstrdup(fontFields[ENCODING]);
673 fam->showFoundry = 1;
674 fam->showRegistry = 1;
676 addTypefaceToFamily(fam, fontFields);
678 WMPutInBag(family, fam);
679 return;
682 family = WMCreateBag(8);
684 fam = wmalloc(sizeof(Family));
685 memset(fam, 0, sizeof(Family));
687 fam->name = wstrdup(fontFields[FAMILY]);
688 fam->foundry = wstrdup(fontFields[FOUNDRY]);
689 fam->registry = wstrdup(fontFields[REGISTRY]);
690 fam->encoding = wstrdup(fontFields[ENCODING]);
692 addTypefaceToFamily(fam, fontFields);
694 WMPutInBag(family, fam);
696 WMHashInsert(families, fam->name, family);
701 static void
702 listFamilies(WMScreen *scr, WMFontPanel *panel)
704 char **fontList;
705 int count;
706 int i;
707 WMHashTable *families = WMCreateHashTable(WMStringPointerHashCallbacks);
708 char fields[NUM_FIELDS][256];
709 WMHashEnumerator enumer;
710 WMBag *bag;
712 fontList = XListFonts(scr->display, ALL_FONTS_MASK, MAX_FONTS_TO_RETRIEVE,
713 &count);
714 if (!fontList) {
715 WMRunAlertPanel(scr, panel->win, "Error",
716 "Could not retrieve font list", "OK", NULL, NULL);
717 return;
720 for (i = 0; i < count; i++) {
721 int fname_len;
723 if (!isXLFD(fontList[i], &fname_len)) {
724 *fontList[i] = '\0';
725 continue;
727 if (fname_len > 255) {
728 wwarning("font name %s is longer than 256, which is invalid.",
729 fontList[i]);
730 *fontList[i] = '\0';
731 continue;
733 if (!parseFont(fontList[i], fields)) {
734 *fontList[i] = '\0';
735 continue;
737 addFontToFamily(families, fields);
740 enumer = WMEnumerateHashTable(families);
742 while ((bag = WMNextHashEnumeratorItem(&enumer))) {
743 WMBagIterator i;
744 Family *fam;
745 char buffer[256];
746 WMListItem *item;
748 for (fam = WMBagFirst(bag, &i);
749 fam != NULL;
750 fam = WMBagNext(bag, &i)) {
752 strcpy(buffer, fam->name);
754 if (fam->showFoundry) {
755 strcat(buffer, " ");
756 strcat(buffer, fam->foundry);
757 strcat(buffer, " ");
759 if (fam->showRegistry) {
760 strcat(buffer, " (");
761 strcat(buffer, fam->registry);
762 strcat(buffer, "-");
763 strcat(buffer, fam->encoding);
764 strcat(buffer, ")");
766 item = WMAddListItem(panel->famLs, buffer);
768 item->clientData = fam;
770 WMFreeBag(bag);
772 WMSortListItems(panel->famLs);
774 WMFreeHashTable(families);
778 static void
779 getSelectedFont(FontPanel *panel, char buffer[])
781 WMListItem *item;
782 Family *family;
783 Typeface *face;
784 char *size;
787 item = WMGetListSelectedItem(panel->famLs);
788 if (!item)
789 return;
790 family = (Family*)item->clientData;
792 item = WMGetListSelectedItem(panel->typLs);
793 if (!item)
794 return;
795 face = (Typeface*)item->clientData;
797 size = WMGetTextFieldText(panel->sizT);
799 sprintf(buffer, "-%s-%s-%s-%s-%s-%s-%s-*-*-*-*-*-%s-%s",
800 family->foundry,
801 family->name,
802 face->weight,
803 face->slant,
804 face->setWidth,
805 face->addStyle,
806 size,
807 family->registry,
808 family->encoding);
813 static void
814 preview(FontPanel *panel)
816 char buffer[256];
817 WMFont *font;
819 getSelectedFont(panel, buffer);
821 font = WMCreateFont(WMWidgetScreen(panel->win), buffer);
822 if (font) {
823 WMSetTextFieldFont(panel->sampleT, font);
824 WMReleaseFont(font);
830 static void
831 familyClick(WMWidget *w, void *data)
833 WMList *lPtr = (WMList*)w;
834 WMListItem *item;
835 Family *family;
836 FontPanel *panel = (FontPanel*)data;
837 Typeface *face;
838 WMBagIterator i;
839 /* current typeface and size */
840 char *oface = NULL;
841 char *osize = NULL;
842 int facei = -1;
843 int sizei = -1;
845 /* must try to keep the same typeface and size for the new family */
846 item = WMGetListSelectedItem(panel->typLs);
847 if (item)
848 oface = wstrdup(item->text);
850 osize = WMGetTextFieldText(panel->sizT);
853 item = WMGetListSelectedItem(lPtr);
854 family = (Family*)item->clientData;
856 WMClearList(panel->typLs);
859 for (face = WMBagFirst(family->typefaces, &i);
860 face != NULL;
861 face = WMBagNext(family->typefaces, &i)) {
862 char buffer[256];
863 int top=0;
864 WMListItem *fitem;
866 if (strcmp(face->weight, "medium") == 0) {
867 buffer[0] = 0;
868 } else {
869 if (*face->weight) {
870 strcpy(buffer, face->weight);
871 buffer[0] = toupper(buffer[0]);
872 strcat(buffer, " ");
873 } else {
874 buffer[0] = 0;
878 if (strcmp(face->slant, "r") == 0) {
879 strcat(buffer, "Roman");
880 top = 1;
881 } else if (strcmp(face->slant, "i") == 0) {
882 strcat(buffer, "Italic");
883 } else if (strcmp(face->slant, "o") == 0) {
884 strcat(buffer, "Oblique");
885 } else if (strcmp(face->slant, "ri") == 0) {
886 strcat(buffer, "Rev Italic");
887 } else if (strcmp(face->slant, "ro") == 0) {
888 strcat(buffer, "Rev Oblique");
889 } else {
890 strcat(buffer, face->slant);
893 if (buffer[0] == 0) {
894 strcpy(buffer, "Normal");
897 if (top)
898 fitem = WMInsertListItem(panel->typLs, 0, buffer);
899 else
900 fitem = WMAddListItem(panel->typLs, buffer);
901 fitem->clientData = face;
904 if (oface) {
905 facei = WMFindRowOfListItemWithTitle(panel->typLs, oface);
906 wfree(oface);
908 if (facei < 0) {
909 facei = 0;
911 WMSelectListItem(panel->typLs, facei);
912 typefaceClick(panel->typLs, panel);
914 if (osize) {
915 sizei = WMFindRowOfListItemWithTitle(panel->sizLs, osize);
917 if (sizei >= 0) {
918 WMSelectListItem(panel->sizLs, sizei);
919 sizeClick(panel->sizLs, panel);
922 if (osize)
923 wfree(osize);
926 preview(panel);
930 static void
931 typefaceClick(WMWidget *w, void *data)
933 FontPanel *panel = (FontPanel*)data;
934 WMListItem *item;
935 Typeface *face;
936 WMBagIterator i;
937 char buffer[32];
939 char *osize = NULL;
940 int sizei = -1;
941 int size;
943 osize = WMGetTextFieldText(panel->sizT);
946 item = WMGetListSelectedItem(panel->typLs);
947 face = (Typeface*)item->clientData;
949 WMClearList(panel->sizLs);
951 for (size = (int)WMBagFirst(face->sizes, &i);
952 i != NULL;
953 size = (int)WMBagNext(face->sizes, &i)) {
955 if (size != 0) {
956 sprintf(buffer, "%i", size);
958 WMAddListItem(panel->sizLs, buffer);
962 if (osize) {
963 sizei = WMFindRowOfListItemWithTitle(panel->sizLs, osize);
965 if (sizei < 0) {
966 sizei = WMFindRowOfListItemWithTitle(panel->sizLs, "12");
968 if (sizei < 0) {
969 sizei = 0;
971 WMSelectListItem(panel->sizLs, sizei);
972 WMSetListPosition(panel->sizLs, sizei);
973 sizeClick(panel->sizLs, panel);
975 if (osize)
976 wfree(osize);
978 preview(panel);
982 static void
983 sizeClick(WMWidget *w, void *data)
985 FontPanel *panel = (FontPanel*)data;
986 WMListItem *item;
988 item = WMGetListSelectedItem(panel->sizLs);
990 WMSetTextFieldText(panel->sizT, item->text);
992 WMSelectTextFieldRange(panel->sizT, wmkrange(0, strlen(item->text)));
994 preview(panel);