/* Font.c- text/font settings * * WPrefs - Window Maker Preferences Program * * Copyright (c) 1999-2003 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 typedef struct _Panel { WMBox *box; char *sectionName; char *description; CallbackRec callbacks; WMWidget *parent; WMLabel *prevL; WMFontPanel *fontPanel; WMPopUpButton *fontSel; WMFrame *multiF; WMButton *togMulti; WMFrame *langF; WMPopUpButton *langP; WMFrame *aaF; WMButton *togAA; /* single byte */ WMTextField *fontT; WMButton *changeB; /* multibyte */ WMLabel *fsetL; WMList *fsetLs; WMButton *addB; WMButton *editB; WMButton *remB; WMButton *upB; WMButton *downB; WMColor *white; WMColor *black; WMColor *light; WMColor *dark; WMColor *back; WMColor *colors[9]; Pixmap preview; WMPixmap *previewPix; WMPixmap *hand; WMPixmap *up_arrow; WMPixmap *down_arrow; WMPixmap *alt_up_arrow; WMPixmap *alt_down_arrow; int oldsection; char menuStyle; char titleAlignment; Bool MultiByteText; Bool AntialiasedText; } _Panel; #define ICON_FILE "fonts" static WMRect previewPositions[] = { #define WINTITLE 0 {{30, 10},{190, 20}}, #define DISTITLE 1 {{30, 35},{90, 64}}, #define PMTITLE 2 {{30, 105},{90, 20}}, #define PMITEM 3 {{30, 125},{90, 20*4}}, #define PCLIP 4 {{156, 35},{64, 64}}, #define PICON 5 {{156, 105},{64, 64}} }; #define EVERYTHING 0xff static char *colorOptions[] = { #define FTITLE (1<<0) "FTitleColor", "white", #define DISCOL (1<<1) /* Display uses white always */ #define MTITLE (1<<2) "MenuTitleColor", "white", #define MITEM (1<<3) "MenuTextColor", "black", #define CLIP (1<<4) "ClipTitleColor", "black", #define CCLIP (1<<4) "ClipTitleColor", "#454045", #define ICONT (1<<5) "IconTitleColor", "white", #define ICONB (1<<5) "IconTitleBack", "black" }; #define MSTYLE_NORMAL 0 #define MSTYLE_SINGLE 1 #define MSTYLE_FLAT 2 #define RESIZEBAR_BEVEL -1 #define MENU_BEVEL -2 #define CLIP_BUTTON_SIZE 23 #define ICON_SIZE 64 static char *textureOptions[] = { "FTitleBack", NULL, "MenuTitleBack", "MenuTextBack", "IconBack", "IconBack" }; /* XPM */ static char * hand_xpm[] = { "22 21 19 1", " c None", ". c #030305", "+ c #7F7F7E", "@ c #B5B5B6", "# c #C5C5C6", "$ c #969697", "% c #FDFDFB", "& c #F2F2F4", "* c #E5E5E4", "= c #ECECEC", "- c #DCDCDC", "; c #D2D2D0", "> c #101010", ", c #767674", "' c #676767", ") c #535355", "! c #323234", "~ c #3E3C56", "{ c #333147", " ", " ..... ", " ..+@##$. ", " .%%%&@.......... ", " .%*%%&#%%%%%%%%%$. ", " .*#%%%%%%%%%&&&&==. ", " .-%%%%%%%%%=*-;;;#$. ", " .-%%%%%%%%&..>..... ", " >-%%%%%%%%%*#+. ", " >-%%%%%%%%%*@,. ", " >#%%%%%%%%%*@'. ", " >$&&%%%%%%=... ", " .+@@;=&%%&;$,> ", " .',$@####$+). ", " .!',+$++,'. ", " ..>>>>>. ", " ", " ~~{{{~~ ", " {{{{{{{{{{{ ", " ~~{{{~~ ", " "}; static char *up_arrow_xpm[] = { "9 9 3 1", ". c #acaaac", "% c #525552", "# c #000000", "....%....", "....#....", "...%#%...", "...###...", "..%###%..", "..#####..", ".%#####%.", ".#######.", "%#######%" }; static char *down_arrow_xpm[] = { "9 9 3 1", ". c #acaaac", "% c #525552", "# c #000000", "%#######%", ".#######.", ".%#####%.", "..#####..", "..%###%..", "...###...", "...%#%...", "....#....", "....%...." }; static char *alt_up_arrow_xpm[] = { "9 9 2 1", ". c #ffffff", "% c #525552", "....%....", "....%....", "...%%%...", "...%%%...", "..%%%%%..", "..%%%%%..", ".%%%%%%%.", ".%%%%%%%.", "%%%%%%%%%" }; static char *alt_down_arrow_xpm[] = { "9 9 2 1", ". c #ffffff", "% c #525552", "%%%%%%%%%", ".%%%%%%%.", ".%%%%%%%.", "..%%%%%..", "..%%%%%..", "...%%%...", "...%%%...", "....%....", "....%...." }; /* XPM */ static WMPropList *CurrentFontArray = NULL; //static WMPropList *CurrentMenuTitleFont = NULL; //static WMPropList *CurrentMenuTextFont = NULL; //static WMPropList *CurrentIconTitleFont = NULL; //static WMPropList *CurrentClipTitleFont = NULL; //static WMPropList *CurrentLargeDisplayFont = NULL; static WMPropList *DefaultWindowTitleFont = NULL; static WMPropList *DefaultMenuTitleFont = NULL; static WMPropList *DefaultMenuTextFont = NULL; static WMPropList *DefaultIconTitleFont = NULL; static WMPropList *DefaultClipTitleFont = NULL; static WMPropList *DefaultLargeDisplayFont = NULL; static void changePage(WMWidget *w, void *data); static void setLanguageType(void *data, Bool multiByte); static void refillFontSetList(void *data); static void readFontEncodings(void *data); static void changeLanguageAction(WMWidget *w, void *data); static void checkListForArrows(void *data); static char* getFontEncoding(void *data); static char* getFontSampleString(void *data); /* note single element */ static WMFont* getFontForPreview(void *data, int element); static WMFont* getDefaultSystemFont(void *data, int element); static WMPropList* getDefaultFontProp(void *data, char *encoding, int section); static WMPropList* getCurrentFontProp(void *data, int section); static Bool isEncodingMultiByte(void *data); static void str2rcolor(RContext *rc, char *name, RColor *color) { XColor xcolor; XParseColor(rc->dpy, rc->cmap, name, &xcolor); color->alpha = 255; color->red = xcolor.red >> 8; color->green = xcolor.green >> 8; color->blue = xcolor.blue >> 8; } static void drawMenuBevel(RImage *img) { RColor light, dark, mid; int i; int iheight = img->height / 4; light.alpha = 0; light.red = light.green = light.blue = 80; dark.alpha = 255; dark.red = dark.green = dark.blue = 0; mid.alpha = 0; mid.red = mid.green = mid.blue = 40; for (i = 1; i < 4; i++) { ROperateLine(img, RSubtractOperation, 0, i*iheight-2, img->width-1, i*iheight-2, &mid); RDrawLine(img, 0, i*iheight-1, img->width-1, i*iheight-1, &dark); ROperateLine(img, RAddOperation, 1, i*iheight, img->width-2, i*iheight, &light); } } static void paintTitle(WMScreen *scr, Drawable d, WMColor *color, WMFont *font, int part, WMAlignment align, char *text) { int l = strlen(text); int x = previewPositions[part].pos.x; int y = previewPositions[part].pos.y; int w = previewPositions[part].size.width; int h = previewPositions[part].size.height; switch (align) { case WALeft: x += 5; break; case WARight: x += w - 5 - WMWidthOfString(font, text, l); break; default: case WACenter: x += (w - WMWidthOfString(font, text, l))/2; break; } WMDrawString(scr, d, color, font, x, y + (h - WMFontHeight(font))/2, text, l); } static void paintItems(WMScreen *scr, Drawable d, WMColor *color, WMFont *font, int part, char *text) { int l = strlen(text); int x = previewPositions[part].pos.x; int y = previewPositions[part].pos.y; int w = previewPositions[part].size.width; int h = previewPositions[part].size.height/4; int i; for( i = 0; i < 4 ; i++) { WMDrawString(scr, d, color, font, x+5, y+(20*i)+(h - WMFontHeight(font))/2, text, l); } } static void paintIcon(WMScreen *scr,Drawable d, WMColor *color, WMColor *Iback, WMFont *font, int part, char *text) { Display *dpy = WMScreenDisplay(scr); int l = strlen(text); int x = previewPositions[part].pos.x+1; int y = previewPositions[part].pos.y+1; int w = previewPositions[part].size.width-2; int h = WMFontHeight(font)+2; XFillRectangle(dpy, d, WMColorGC(Iback), x, y, w, h); x += (w - WMWidthOfString(font, text, l))/2; WMDrawString(scr, d, color, font, x, y + (h - WMFontHeight(font))/2, text, l); } static void drawFonts(_Panel *panel, int elements) { WMScreen *scr = WMWidgetScreen(panel->box); WMPixmap *pixmap; Pixmap d; pixmap = WMGetLabelImage(panel->prevL); d = WMGetPixmapXID(pixmap); if(elements & FTITLE) { paintTitle(scr, d, panel->colors[0], getFontForPreview(panel, WINTITLE), WINTITLE, panel->titleAlignment, _("Window Title Font")); } if(elements & DISCOL) { paintTitle(scr, d, panel->white, getFontForPreview(panel, DISTITLE), DISTITLE, WACenter, _("Display")); } if(elements & MTITLE) { paintTitle(scr, d, panel->colors[1], getFontForPreview(panel, PMTITLE), PMTITLE, WALeft, _("Menu Title")); } if(elements & MITEM) { paintItems(scr, d, panel->colors[2], getFontForPreview(panel, PMITEM), PMITEM, _("Menu Item")); } if(elements & CLIP) { WMDrawString(scr, d, panel->colors[4], getFontForPreview(panel, PCLIP), 169,37, "1",1); WMDrawString(scr, d, panel->colors[3], getFontForPreview(panel, PCLIP),179, 84, _("Clip title"), 10); } if(elements & ICONT) { paintIcon(scr, d, panel->colors[5], panel->colors[6], getFontForPreview(panel, PICON), PICON, _("Icon Title")); } } static void dumpRImage(char *path, RImage *image) { FILE *f; int channels = (image->format == RRGBAFormat ? 4 : 3); f = fopen(path, "w"); if (!f) { wsyserror(path); return; } fprintf(f, "%02x%02x%1x", image->width, image->height, channels); fwrite(image->data, 1, image->width * image->height * channels, f); if (fclose(f) < 0) { wsyserror(path); } } static int isPixmap(WMPropList *prop) { WMPropList *p; char *s; p = WMGetFromPLArray(prop, 0); s = WMGetFromPLString(p); if (strcasecmp(&s[1], "pixmap")==0) return 1; else return 0; } static Pixmap renderTexture(WMScreen *scr, WMPropList *texture, int width, int height, char *path, int border) { char *type; RImage *image = NULL; Pixmap pixmap; RContext *rc = WMScreenRContext(scr); char *str; RColor rcolor; type = WMGetFromPLString(WMGetFromPLArray(texture, 0)); if (strcasecmp(type, "solid")==0) { str = WMGetFromPLString(WMGetFromPLArray(texture, 1)); str2rcolor(rc, str, &rcolor); image = RCreateImage(width, height, False); RClearImage(image, &rcolor); } else if (strcasecmp(type, "igradient")==0) { int t1, t2; RColor c1[2], c2[2]; str = WMGetFromPLString(WMGetFromPLArray(texture, 1)); str2rcolor(rc, str, &c1[0]); str = WMGetFromPLString(WMGetFromPLArray(texture, 2)); str2rcolor(rc, str, &c1[1]); str = WMGetFromPLString(WMGetFromPLArray(texture, 3)); t1 = atoi(str); str = WMGetFromPLString(WMGetFromPLArray(texture, 4)); str2rcolor(rc, str, &c2[0]); str = WMGetFromPLString(WMGetFromPLArray(texture, 5)); str2rcolor(rc, str, &c2[1]); str = WMGetFromPLString(WMGetFromPLArray(texture, 6)); t2 = atoi(str); image = RRenderInterwovenGradient(width, height, c1, t1, c2, t2); } else if (strcasecmp(&type[1], "gradient")==0) { int style; RColor rcolor2; switch (toupper(type[0])) { case 'V': style = RVerticalGradient; break; case 'H': style = RHorizontalGradient; break; default: case 'D': style = RDiagonalGradient; break; } str = WMGetFromPLString(WMGetFromPLArray(texture, 1)); str2rcolor(rc, str, &rcolor); str = WMGetFromPLString(WMGetFromPLArray(texture, 2)); str2rcolor(rc, str, &rcolor2); image = RRenderGradient(width, height, &rcolor, &rcolor2, style); } else if (strcasecmp(&type[2], "gradient")==0 && toupper(type[0])=='T') { int style; RColor rcolor2; int i; RImage *grad, *timage; char *path; switch (toupper(type[1])) { case 'V': style = RVerticalGradient; break; case 'H': style = RHorizontalGradient; break; default: case 'D': style = RDiagonalGradient; break; } str = WMGetFromPLString(WMGetFromPLArray(texture, 3)); str2rcolor(rc, str, &rcolor); str = WMGetFromPLString(WMGetFromPLArray(texture, 4)); str2rcolor(rc, str, &rcolor2); str = WMGetFromPLString(WMGetFromPLArray(texture, 1)); if ((path=wfindfileinarray(GetObjectForKey("PixmapPath"), str))!=NULL) timage = RLoadImage(rc, path, 0); if (!path || !timage) { wwarning("could not load file '%s': %s", path, RMessageForError(RErrorCode)); } else { grad = RRenderGradient(width, height, &rcolor, &rcolor2, style); image = RMakeTiledImage(timage, width, height); RReleaseImage(timage); i = atoi(WMGetFromPLString(WMGetFromPLArray(texture, 2))); RCombineImagesWithOpaqueness(image, grad, i); RReleaseImage(grad); } } else if (strcasecmp(&type[2], "gradient")==0 && toupper(type[0])=='M') { int style; RColor **colors; int i, j; switch (toupper(type[1])) { case 'V': style = RVerticalGradient; break; case 'H': style = RHorizontalGradient; break; default: case 'D': style = RDiagonalGradient; break; } j = WMGetPropListItemCount(texture); if (j > 0) { colors = wmalloc(j * sizeof(RColor*)); for (i = 2; i < j; i++) { str = WMGetFromPLString(WMGetFromPLArray(texture, i)); colors[i-2] = wmalloc(sizeof(RColor)); str2rcolor(rc, str, colors[i-2]); } colors[i-2] = NULL; image = RRenderMultiGradient(width, height, colors, style); for (i = 0; colors[i]!=NULL; i++) wfree(colors[i]); wfree(colors); } } else if (strcasecmp(&type[1], "pixmap")==0) { RImage *timage = NULL; char *path; RColor color; str = WMGetFromPLString(WMGetFromPLArray(texture, 1)); if ((path=wfindfileinarray(GetObjectForKey("PixmapPath"), str))!=NULL) timage = RLoadImage(rc, path, 0); if (!path || !timage) { wwarning("could not load file '%s': %s", path ? path : str, RMessageForError(RErrorCode)); } else { str = WMGetFromPLString(WMGetFromPLArray(texture, 2)); str2rcolor(rc, str, &color); switch (toupper(type[0])) { case 'T': image = RMakeTiledImage(timage, width, height); RReleaseImage(timage); timage = image; break; case 'C': image = RMakeCenteredImage(timage, width, height, &color); RReleaseImage(timage); timage = image; break; case 'S': case 'M': image = RScaleImage(timage, width, height); RReleaseImage(timage); timage = image; break; } } wfree(path); } if (!image) return None; if (path) { dumpRImage(path, image); } if (border < 0) { if (border == MENU_BEVEL) { drawMenuBevel(image); RBevelImage(image, RBEV_RAISED2); } } else if (border) { RBevelImage(image, border); } RConvertImage(rc, image, &pixmap); RReleaseImage(image); return pixmap; } static Pixmap renderMenu(_Panel *panel, WMPropList *texture, int width, int iheight) { WMScreen *scr = WMWidgetScreen(panel->parent); Display *dpy = WMScreenDisplay(scr); Pixmap pix, tmp; RContext *rc = WMScreenRContext(scr); GC gc = XCreateGC(dpy, WMWidgetXID(panel->parent), 0, NULL); int i; switch (panel->menuStyle) { case MSTYLE_NORMAL: tmp = renderTexture(scr, texture, width, iheight, NULL, RBEV_RAISED2); pix = XCreatePixmap(dpy, tmp, width, iheight*4, WMScreenDepth(scr)); for (i = 0; i < 4; i++) { XCopyArea(dpy, tmp, pix, gc, 0, 0, width, iheight, 0, iheight*i); } XFreePixmap(dpy, tmp); break; case MSTYLE_SINGLE: pix = renderTexture(scr, texture, width, iheight*4, NULL, MENU_BEVEL); break; case MSTYLE_FLAT: pix = renderTexture(scr, texture, width, iheight*4, NULL, RBEV_RAISED2); break; } XFreeGC(dpy, gc); return pix; } static void renderClip(_Panel *panel, GC gc, int part, int relief) { WMScreen *scr = WMWidgetScreen(panel->box); Display *dpy = WMScreenDisplay(scr); RContext *rc = WMScreenRContext(scr); WMPropList *prop; Pixmap pix; XImage *original; XPoint p[4]; RImage *tile; RColor black; RColor dark; RColor light; int pt, tp; int as; prop = GetObjectForKey(textureOptions[part]); pix = renderTexture(scr, prop, previewPositions[part].size.width, previewPositions[part].size.height, NULL, relief); original = XGetImage(dpy, pix, 0, 0, 64, 64, AllPlanes, ZPixmap); if (!original){ wwarning(_("error capturing \"original\" tile image"), RMessageForError(RErrorCode)); } tile = RCreateImageFromXImage(rc, original, NULL); XDestroyImage(original); XFreePixmap(WMScreenDisplay(scr), pix); pt = CLIP_BUTTON_SIZE*ICON_SIZE/64; tp = ICON_SIZE-1 - pt; as = pt - 15; black.alpha = 255; black.red = black.green = black.blue = 0; dark.alpha = 0; dark.red = dark.green = dark.blue = 60; light.alpha = 0; light.red = light.green = light.blue = 80; /* top right */ ROperateLine(tile, RSubtractOperation, tp, 0, ICON_SIZE-2, pt-1, &dark); RDrawLine(tile, tp-1, 0, ICON_SIZE-1, pt+1, &black); ROperateLine(tile, RAddOperation, tp, 2, ICON_SIZE-3, pt, &light); /* arrow bevel */ ROperateLine(tile, RSubtractOperation, ICON_SIZE - 7 - as, 4, ICON_SIZE - 5, 4, &dark); ROperateLine(tile, RSubtractOperation, ICON_SIZE - 6 - as, 5, ICON_SIZE - 5, 6 + as, &dark); ROperateLine(tile, RAddOperation, ICON_SIZE - 5, 4, ICON_SIZE - 5, 6 + as, &light); /* bottom left */ ROperateLine(tile, RAddOperation, 2, tp+2, pt-2, ICON_SIZE-3, &dark); RDrawLine(tile, 0, tp-1, pt+1, ICON_SIZE-1, &black); ROperateLine(tile, RSubtractOperation, 0, tp-2, pt+1, ICON_SIZE-2, &light); /* arrow bevel */ ROperateLine(tile, RSubtractOperation, 4, ICON_SIZE - 7 - as, 4, ICON_SIZE - 5, &dark); ROperateLine(tile, RSubtractOperation, 5, ICON_SIZE - 6 - as, 6 + as, ICON_SIZE - 5, &dark); ROperateLine(tile, RAddOperation, 4, ICON_SIZE - 5, 6 + as, ICON_SIZE - 5, &light); RConvertImage(rc, tile, &pix); /* top right arrow */ p[0].x = p[3].x = ICON_SIZE-5-as; p[0].y = p[3].y = 5; p[1].x = ICON_SIZE-6; p[1].y = 5; p[2].x = ICON_SIZE-6; p[2].y = 4+as; XFillPolygon(dpy, pix, WMColorGC(panel->colors[4]), p, 3, Convex, CoordModeOrigin); XDrawLines(dpy, pix, WMColorGC(panel->colors[4]), p, 4, CoordModeOrigin); /* bottom left arrow */ p[0].x = p[3].x = 5; p[0].y = p[3].y = ICON_SIZE-5-as; p[1].x = 5; p[1].y = ICON_SIZE-6; p[2].x = 4+as; p[2].y = ICON_SIZE-6; XFillPolygon(dpy, pix, WMColorGC(panel->colors[4]), p, 3, Convex, CoordModeOrigin); XDrawLines(dpy, pix, WMColorGC(panel->colors[4]), p, 4, CoordModeOrigin); XCopyArea(dpy, pix, panel->preview, gc, 0, 0, previewPositions[part].size.width, previewPositions[part].size.height, previewPositions[part].pos.x, previewPositions[part].pos.y); RReleaseImage(tile); XFreePixmap(WMScreenDisplay(scr), pix); } static void renderPreview(_Panel *panel, GC gc, int part, int relief) { WMPropList *prop; Pixmap pix; WMScreen *scr = WMWidgetScreen(panel->box); prop = GetObjectForKey(textureOptions[part]); pix = renderTexture(scr, prop, previewPositions[part].size.width, previewPositions[part].size.height, NULL, relief); XCopyArea(WMScreenDisplay(scr), pix, panel->preview, gc, 0, 0, previewPositions[part].size.width, previewPositions[part].size.height, previewPositions[part].pos.x, previewPositions[part].pos.y); XFreePixmap(WMScreenDisplay(scr), pix); } static void paintPreviewBox(Panel *panel, int elements) { WMScreen *scr = WMWidgetScreen(panel->parent); Display *dpy = WMScreenDisplay(scr); int refresh = 0; GC gc; WMColor *black = WMBlackColor(scr); Pixmap mitem; gc = XCreateGC(dpy, WMWidgetXID(panel->parent), 0, NULL); if (panel->preview == None) { WMPixmap *pix; panel->preview = XCreatePixmap(dpy, WMWidgetXID(panel->parent), 240-4, 190-4, WMScreenDepth(scr)); pix = WMCreatePixmapFromXPixmaps(scr, panel->preview, None, 240-4, 190-4, WMScreenDepth(scr)); WMSetLabelImage(panel->prevL, pix); WMReleasePixmap(pix); } XFillRectangle(dpy, panel->preview, WMColorGC(panel->back), 0, 0, 240-4, 190-4); if (elements & (1<preview, WMColorGC(black), previewPositions[WINTITLE].pos.x-1, previewPositions[WINTITLE].pos.y-1, previewPositions[WINTITLE].size.width, previewPositions[WINTITLE].size.height); } if (elements & (1<preview, WMColorGC(panel->back), previewPositions[DISTITLE].pos.x-1, previewPositions[DISTITLE].pos.y-1, previewPositions[DISTITLE].size.width, previewPositions[DISTITLE].size.height); } if (elements & (1<preview, WMColorGC(black), previewPositions[PMTITLE].pos.x-1, previewPositions[PMTITLE].pos.y-1, previewPositions[PMTITLE].size.width, previewPositions[PMTITLE].size.height); } if (elements & (1<preview, gc, 0, 0, previewPositions[PMITEM].size.width, previewPositions[PMITEM].size.height, previewPositions[PMITEM].pos.x, previewPositions[PMITEM].pos.y); XFreePixmap(dpy, mitem); } if (elements & (1<preview, gc, 29, 125, 29, 125+20*4+25); XDrawLine(dpy, panel->preview, gc, 119, 125, 119, 125+20*4+25); } if (elements & (1<preview, WMColorGC(black), previewPositions[PCLIP].pos.x-1, previewPositions[PCLIP].pos.y-1, previewPositions[PCLIP].size.width, previewPositions[PCLIP].size.height); } if (elements & (1<preview, WMColorGC(black), previewPositions[PICON].pos.x-1, previewPositions[PICON].pos.y-1, previewPositions[PICON].size.width, previewPositions[PICON].size.height); } drawFonts(panel, elements); WMRedisplayWidget(panel->prevL); XFreeGC(dpy, gc); WMReleaseColor(black); } static void paintTextField(void *data, int section) { _Panel *panel = (_Panel*)data; char *sample = NULL; int encoding; encoding = WMGetPopUpButtonSelectedItem(panel->langP); WMSetTextFieldFont(panel->fontT, getFontForPreview(panel, section)); switch(encoding) { case 0: /* Current Font in theme */ WMSetTextFieldText(panel->fontT, "ABCDEFGHIKLMNOPQRSTUVXYWZabcdefghiklmnopqrstuvxywz0123456789\x00e0\x00e6\x00e7\x00eb\x00ee\x00f0\x00f1\x00f3\x00f9\x00fd\x00c0\x00c6\x00c7\x00cb\x00ce\x00d0\x00d1\x00d3\x00d9\x00dd"); break; case 1: /* default */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "ABCDEFGHIKLMNOPQRSTUVXYWZabcdefghiklmnopqrstuvxywz0123456789\x00e0\x00e6\x00e7\x00eb\x00ee\x00f0\x00f1\x00f3\x00f9\x00fd\x00c0\x00c6\x00c7\x00cb\x00ce\x00d0\x00d1\x00d3\x00d9\x00dd"); break; case 2: /* latin1 iso8859-1 */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "ABCDEFGHIKLMNOPQRSTUVXYWZabcdefghiklmnopqrstuvxywz0123456789\x00e0\x00e6\x00e7\x00eb\x00ee\x00f0\x00f1\x00f3\x00f9\x00fd\x00c0\x00c6\x00c7\x00cb\x00ce\x00d0\x00d1\x00d3\x00d9\x00dd"); break; case 3: /* latin2 iso8859-2 */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "ABCDEFGHIKLMNOPQRSTUVXYWZabcdefghiklmnopqrstuvxywz0123456789\x00e0\x00e6\x00e7\x00eb\x00ee\x00f0\x00f1\x00f3\x00f9\x00fd\x00c0\x00c6\x00c7\x00cb\x00ce\x00d0\x00d1\x00d3\x00d9\x00dd"); break; case 4: /* Greek iso8859-7 */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "ABCDEFGHIKLMNOPQRSTUVXYWZabcdefghiklmnopqrstuvxywz0123456789\x00e0\x00e6\x00e7\x00eb\x00ee\x00f0\x00f1\x00f3\x00f9\x00fd\x00c0\x00c6\x00c7\x00cb\x00ce\x00d0\x00d1\x00d3\x00d9\x00dd"); break; /* luckily all these happen to have the MultiByte chars in the same places */ case 5: /* Japanese jisx0208.1983 */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "Window Maker ÀßÄê¥æ¡¼¥Æ¥£¥ê¥Æ¥£"); break; case 6: /* Korean ksc5601.1987 */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "À©µµ¿ì ¸ÞÀÌÄ¿ ¼³Á¤"); break; case 7: /* korean2 daewoo */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "À©µµ¿ì ¸ÞÀÌÄ¿ ¼³Á¤"); break; case 8: /* Russian koi8-r */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "ó×ÏÊÓÔ×Á Window Maker"); break; case 9: /* Ukranian koi8-u */ WMSetTextFieldText(panel->fontT, getFontSampleString(panel)); // "ABCDEFGHIKLMNOPQRSTUVXYWZabcdefghiklmnopqrstuvxywz0123456789\x00e0\x00e6\x00e7\x00eb\x00ee\x00f0\x00f1\x00f3\x00f9\x00fd\x00c0\x00c6\x00c7\x00cb\x00ce\x00d0\x00d1\x00d3\x00d9\x00dd"); break; } } static void previewClick(XEvent *event, void *clientData) { _Panel *panel = (_Panel*)clientData; int i; for (i = 0; i < sizeof(previewPositions)/sizeof(WMRect); i++) { if (event->xbutton.x >= previewPositions[i].pos.x && event->xbutton.y >= previewPositions[i].pos.y && event->xbutton.x < previewPositions[i].pos.x + previewPositions[i].size.width && event->xbutton.y < previewPositions[i].pos.y + previewPositions[i].size.height) { WMSetPopUpButtonSelectedItem(panel->fontSel, i); changePage(panel->fontSel, panel); return; } } } static void changePage(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; int section; WMScreen *scr = WMWidgetScreen(panel->box); RContext *rc = WMScreenRContext(scr); static WMPoint positions[] = { {5, 15}, {5, 62}, {5, 110}, {5, 140}, {130, 62}, {130, 132} }; if (w) { section = WMGetPopUpButtonSelectedItem(panel->fontSel); } { WMColor *color; color = WMCreateRGBColor(scr, 0x5100, 0x5100, 0x7100, True); XFillRectangle(rc->dpy, panel->preview, WMColorGC(color), positions[panel->oldsection].x, positions[panel->oldsection].y, 22, 22); WMReleaseColor(color); } if (w) { panel->oldsection = section; WMDrawPixmap(panel->hand, panel->preview, positions[section].x, positions[section].y); } WMRedisplayWidget(panel->prevL); paintTextField(panel, section); refillFontSetList(panel); } static void setLanguageType(void *data, Bool multiByte) { _Panel *p = (_Panel*)data; if (multiByte) { WMMapWidget(p->fsetL); WMMapWidget(p->fsetLs); WMMapWidget(p->addB); WMMapWidget(p->editB); WMMapWidget(p->remB); WMMapWidget(p->upB); WMMapWidget(p->downB); WMUnmapWidget(p->fontT); WMUnmapWidget(p->changeB); } else { WMUnmapWidget(p->fsetL); WMUnmapWidget(p->fsetLs); WMUnmapWidget(p->addB); WMUnmapWidget(p->editB); WMUnmapWidget(p->remB); WMUnmapWidget(p->upB); WMUnmapWidget(p->downB); WMMapWidget(p->fontT); WMMapWidget(p->changeB); } } static void refillFontSetList(void *data) { _Panel *panel = (_Panel*)data; WMPropList *array; char *encoding = getFontEncoding(panel); int section = WMGetPopUpButtonSelectedItem(panel->fontSel); int i; int pos; WMClearList(panel->fsetLs); if(!encoding) { array = getCurrentFontProp(panel, section); } else { array = getDefaultFontProp(panel, encoding, section); } if(!array){ wwarning("error not Font prop given"); } else { for (i = 0; i < WMGetPropListItemCount(array); i++) { WMGetFromPLArray(array, i); WMAddListItem( panel->fsetLs, WMGetFromPLString( WMGetFromPLArray(array, i))); } WMReleasePropList(array); WMSelectListItem(panel->fsetLs, 0); } checkListForArrows(panel); } static void insertCurrentFont(char *data, char *type) { WMPropList *key; WMPropList *array; char *tmp, *str; key = WMCreatePLString(type); array = WMCreatePLArray(NULL); str = wstrdup(data); tmp = strtok(str, ","); while(tmp) { WMAddToPLArray(array, WMCreatePLString(tmp)); tmp = strtok(NULL, ","); } wfree(str); WMPutInPLDictionary(CurrentFontArray, key, array); } static void readFontEncodings(void *data) { _Panel *panel = (_Panel*)data; WMPropList *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 = WMReadPropListFromFile(path); if (!pl) { msg = _("Could not read font information file WPrefs.app/font.data"); goto error; } else { int i; WMPropList *key = WMCreatePLString("Encodings"); WMPropList *array; WMMenuItem *mi; array = WMGetFromPLDictionary(pl, key); WMReleasePropList(key); if (!array || !WMIsPLArray(array)) { msg = _("Invalid data in font information file WPrefs.app/font.data.\n" "Encodings data not found."); goto error; } WMAddPopUpButtonItem(panel->langP, _("Current")); for (i = 0; i < WMGetPropListItemCount(array); i++) { WMPropList *item, *str; item = WMGetFromPLArray(array, i); str = WMGetFromPLArray(item, 0); mi = WMAddPopUpButtonItem(panel->langP, WMGetFromPLString(str)); WMSetMenuItemRepresentedObject(mi, WMRetainPropList(item)); } WMSetPopUpButtonSelectedItem(panel->langP, 0); key = WMCreatePLString("WindowTitleFont"); DefaultWindowTitleFont = WMRetainPropList(WMGetFromPLDictionary(pl, key)); WMReleasePropList(key); key = WMCreatePLString("MenuTitleFont"); DefaultMenuTitleFont = WMRetainPropList(WMGetFromPLDictionary(pl, key)); WMReleasePropList(key); key = WMCreatePLString("MenuTextFont"); DefaultMenuTextFont = WMRetainPropList(WMGetFromPLDictionary(pl, key)); WMReleasePropList(key); key = WMCreatePLString("IconTitleFont"); DefaultIconTitleFont = WMRetainPropList(WMGetFromPLDictionary(pl, key)); WMReleasePropList(key); key = WMCreatePLString("ClipTitleFont"); DefaultClipTitleFont = WMRetainPropList(WMGetFromPLDictionary(pl, key)); WMReleasePropList(key); key = WMCreatePLString("LargeDisplayFont"); DefaultLargeDisplayFont = WMRetainPropList(WMGetFromPLDictionary(pl, key)); WMReleasePropList(key); } WMReleasePropList(pl); return; error: if (pl) WMReleasePropList(pl); WMRunAlertPanel(WMWidgetScreen(panel->parent), panel->parent, _("Error"), msg, _("OK"), NULL, NULL); } static void checkListForArrows(void *data) { _Panel *panel = (_Panel*)data; int list; list = WMGetListNumberOfRows(panel->fsetLs); if(list > 1) { if(WMGetListSelectedItemRow(panel->fsetLs) == 0) { WMSetButtonEnabled(panel->upB, False); WMSetButtonEnabled(panel->downB, True); } else if(WMGetListSelectedItemRow(panel->fsetLs) == list-1) { WMSetButtonEnabled(panel->downB, False); WMSetButtonEnabled(panel->upB, True); } else { WMSetButtonEnabled(panel->upB, True); WMSetButtonEnabled(panel->downB, True); } } else { WMSetButtonEnabled(panel->upB, False); WMSetButtonEnabled(panel->downB, False); } /* added to control the Remove button */ if(list > 1) WMSetButtonEnabled(panel->remB, True); else WMSetButtonEnabled(panel->remB, False); } static char* fontOfLang(void *data, char *encoding, int section) { _Panel *panel = (_Panel*)data; WMPropList *array; char *buf = NULL; int i; if(!encoding) array = getCurrentFontProp(panel, section); else array = getDefaultFontProp(panel, encoding, section); if(!array) { wwarning("error no font prop given"); return NULL; } else { for(i=0; ibox); int section; section = WMGetPopUpButtonSelectedItem(w); if(isEncodingMultiByte(panel)) { setLanguageType(panel, True); } else { if(panel->MultiByteText) setLanguageType(panel, True); else setLanguageType(panel, False); } paintPreviewBox(panel, EVERYTHING); changePage(panel->fontSel, panel); } static WMFont* getFontForPreview(void *data, int element) { _Panel *panel = (_Panel*)data; WMFont *font; char *fname; WMScreen *scr = WMWidgetScreen(panel->box); char *encoding = getFontEncoding(panel); fname = fontOfLang(panel, encoding, element); if (WMHasAntialiasingSupport(scr)) { if(panel->AntialiasedText) { font = WMCreateFontWithFlags(scr, fname, WFAntialiased); } else { font = WMCreateFont(scr, fname); } } else { font = WMCreateFont(scr, fname); } if(!font) { char *msg; int length; length = strlen("\"")+ strlen(fname)+strlen("\" was not loaded correctly. Make sure the font is available for that encoding.\nLoadind default system font."); msg = wmalloc(length +1); snprintf(msg, length + 1, "\"%s\" was not loaded correctly. Make sure the font is available for that encoding.\nLoading default system font.", fname); WMRunAlertPanel(WMWidgetScreen(panel->parent),panel->parent, _("Warning"), msg, _("OK"), NULL, NULL); font = getDefaultSystemFont(panel, element); } return font; } static char* getFontSampleString(void *data) { _Panel *panel = (_Panel*)data; WMScreen *scr = WMWidgetScreen(panel->box); WMMenuItem *mi; WMPropList *pl; int section; section = WMGetPopUpButtonSelectedItem(panel->langP); mi = WMGetPopUpButtonMenuItem(panel->langP, section); pl = WMGetMenuItemRepresentedObject(mi); if (!pl) { return NULL; } else { char *sample; sample = WMGetFromPLString(WMGetFromPLArray(pl,3)); return sample; } } static char* getFontEncoding(void *data) { _Panel *panel = (_Panel*)data; WMScreen *scr = WMWidgetScreen(panel->box); WMMenuItem *mi; WMPropList *pl; int section; section = WMGetPopUpButtonSelectedItem(panel->langP); mi = WMGetPopUpButtonMenuItem(panel->langP, section); pl = WMGetMenuItemRepresentedObject(mi); if (!pl) { return NULL; } else { char *encoding; encoding = WMGetFromPLString(WMGetFromPLArray(pl,2)); return encoding; } } static Bool isEncodingMultiByte(void *data) { _Panel *panel = (_Panel*)data; WMScreen *scr = WMWidgetScreen(panel->box); WMMenuItem *mi; WMPropList *pl; int section; section = WMGetPopUpButtonSelectedItem(panel->langP); mi = WMGetPopUpButtonMenuItem(panel->langP, section); pl = WMGetMenuItemRepresentedObject(mi); if (!pl) { return False; } else { char *multiByte; int res; multiByte = WMGetFromPLString(WMGetFromPLArray(pl,1)); res = atoi(multiByte); if(res) return True; else return False; } } static WMPropList* getCurrentFontProp(void *data, int section) { WMPropList *array; switch (section) { case 0: array = WMRetainPropList( WMGetFromPLDictionary(CurrentFontArray, WMCreatePLString("WindowTitleFont"))); break; case 1: array = WMRetainPropList( WMGetFromPLDictionary(CurrentFontArray, WMCreatePLString("LargeDisplayFont"))); break; case 2: array = WMRetainPropList( WMGetFromPLDictionary(CurrentFontArray, WMCreatePLString("MenuTitleFont"))); break; case 3: array = WMRetainPropList( WMGetFromPLDictionary(CurrentFontArray, WMCreatePLString("MenuTextFont"))); break; case 4: array = WMRetainPropList( WMGetFromPLDictionary(CurrentFontArray, WMCreatePLString("ClipTitleFont"))); break; case 5: array = WMRetainPropList( WMGetFromPLDictionary(CurrentFontArray, WMCreatePLString("IconTitleFont"))); break; } if(!WMIsPLArray(array)) { return NULL; } else { return array; } } static WMPropList* getDefaultFontProp(void *data, char *encoding, int section) { WMPropList *array; WMPropList *key = WMCreatePLString(encoding); switch (section) { case 0: array = WMRetainPropList( WMGetFromPLDictionary(DefaultWindowTitleFont, key)); WMReleasePropList(key); break; case 1: array = WMRetainPropList( WMGetFromPLDictionary(DefaultLargeDisplayFont, key)); WMReleasePropList(key); break; case 2: array = WMRetainPropList( WMGetFromPLDictionary(DefaultMenuTitleFont, key)); WMReleasePropList(key); break; case 3: array = WMRetainPropList( WMGetFromPLDictionary(DefaultMenuTextFont, key)); WMReleasePropList(key); break; case 4: array = WMRetainPropList( WMGetFromPLDictionary(DefaultClipTitleFont, key)); WMReleasePropList(key); break; case 5: array = WMRetainPropList( WMGetFromPLDictionary(DefaultIconTitleFont, key)); WMReleasePropList(key); break; } if(!WMIsPLArray(array)) { return NULL; } else { return array; } } static WMFont* getDefaultSystemFont(void *data, int element) { _Panel *panel = (_Panel*)data; WMScreen *scr = WMWidgetScreen(panel->box); switch(element) { case 0: return WMBoldSystemFontOfSize(scr, 12); break; case 1: return WMBoldSystemFontOfSize(scr, 24); break; case 2: return WMBoldSystemFontOfSize(scr, 12); break; case 3: return WMSystemFontOfSize(scr, 12); break; case 4: return WMSystemFontOfSize(scr, 8); break; case 5: return WMSystemFontOfSize(scr, 8); break; } } static void multiClick(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; if(!panel->MultiByteText) { WMSetButtonText(panel->togMulti, _("Yes")); setLanguageType(panel, True); panel->MultiByteText = True; } else { WMSetButtonText(panel->togMulti, _("Auto")); if(isEncodingMultiByte(panel)) setLanguageType(panel, True); else setLanguageType(panel, False); panel->MultiByteText = False; } } static void toggleAA(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; int section; if(panel->AntialiasedText) panel->AntialiasedText = False; else panel->AntialiasedText = True; /* hmm now i gotta redraw all the fonts in the preview section * and the text field */ paintPreviewBox(panel, EVERYTHING); changePage(panel->fontSel, panel); if(isEncodingMultiByte(panel)) setLanguageType(panel, True); } static void listClick(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; checkListForArrows(panel); } static void moveUpListItem(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; WMListItem *tmp; int pos; char *listtext; WMPropList *array; WMPropList *string; char *encoding = getFontEncoding(panel); int section = WMGetPopUpButtonSelectedItem(panel->fontSel); if(!encoding) array = getCurrentFontProp(panel, section); else array = getDefaultFontProp(panel, encoding, section); pos = WMGetListSelectedItemRow(panel->fsetLs); tmp = WMGetListItem(panel->fsetLs, pos); listtext = wstrdup(tmp->text); string = WMCreatePLString(listtext); WMRemoveListItem(panel->fsetLs, pos); WMDeleteFromPLArray(array, pos); WMInsertListItem(panel->fsetLs, pos-1, listtext); WMInsertInPLArray(array, pos-1, string); paintPreviewBox(panel, EVERYTHING); changePage(panel->fontSel, panel); WMSelectListItem(panel->fsetLs, pos-1); checkListForArrows(panel); } static void moveDownListItem(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; WMListItem *tmp; int pos; char *listtext; WMPropList *array; WMPropList *string; char *encoding = getFontEncoding(panel); int section = WMGetPopUpButtonSelectedItem(panel->fontSel); if(!encoding) array = getCurrentFontProp(panel, section); else array = getDefaultFontProp(panel, encoding, section); pos = WMGetListSelectedItemRow(panel->fsetLs); tmp = WMGetListItem(panel->fsetLs, pos); listtext = wstrdup(tmp->text); string = WMCreatePLString(listtext); WMRemoveListItem(panel->fsetLs, pos); WMDeleteFromPLArray(array, pos); WMInsertListItem(panel->fsetLs, pos+1, listtext); WMInsertInPLArray(array, pos+1, string); paintPreviewBox(panel, EVERYTHING); changePage(panel->fontSel, panel); WMSelectListItem(panel->fsetLs, pos+1); checkListForArrows(panel); } static void addButtonAction(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; char *chosenFont; int pos; WMPropList *array; WMPropList *string; char *encoding = getFontEncoding(panel); int section = WMGetPopUpButtonSelectedItem(panel->fontSel); if(!encoding) array = getCurrentFontProp(panel, section); else array = getDefaultFontProp(panel, encoding, section); WMHideFontPanel(panel->fontPanel); chosenFont = WMGetFontPanelFontName(panel->fontPanel); string = WMCreatePLString(chosenFont); pos = WMGetListSelectedItemRow(panel->fsetLs); WMInsertListItem(panel->fsetLs, pos+1, chosenFont); WMInsertInPLArray(array, pos+1, string); WMSelectListItem(panel->fsetLs, pos+1); paintPreviewBox(panel, EVERYTHING); changePage(panel->fontSel, panel); } static void changeButtonAction(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; char *chosenFont; int pos; WMPropList *array; WMPropList *string; char *encoding = getFontEncoding(panel); int section = WMGetPopUpButtonSelectedItem(panel->fontSel); if(!encoding) array = getCurrentFontProp(panel, section); else array = getDefaultFontProp(panel, encoding, section); WMHideFontPanel(panel->fontPanel); chosenFont = WMGetFontPanelFontName(panel->fontPanel); string = WMCreatePLString(chosenFont); pos = WMGetListSelectedItemRow(panel->fsetLs); WMRemoveListItem(panel->fsetLs, pos); WMDeleteFromPLArray(array, pos); WMInsertListItem(panel->fsetLs, pos, chosenFont); WMInsertInPLArray(array, pos, string); WMSelectListItem(panel->fsetLs, pos); paintPreviewBox(panel, EVERYTHING); changePage(panel->fontSel, panel); } static void changeButtonClick(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; WMSetFontPanelAction(panel->fontPanel, changeButtonAction, panel); WMShowFontPanel(panel->fontPanel); } static void addButtonClick(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; WMSetFontPanelAction(panel->fontPanel, addButtonAction, panel); WMShowFontPanel(panel->fontPanel); } static void removeButtonClick(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; int pos; int list; WMPropList *array; char *encoding = getFontEncoding(panel); int section = WMGetPopUpButtonSelectedItem(panel->fontSel); if(!encoding) array = getCurrentFontProp(panel, section); else array = getDefaultFontProp(panel, encoding, section); pos = WMGetListSelectedItemRow(panel->fsetLs); WMRemoveListItem(panel->fsetLs, pos); WMDeleteFromPLArray(array, pos); list = WMGetListNumberOfRows(panel->fsetLs); if(list != 0) { if(list > pos) WMSelectListItem(panel->fsetLs, pos); else if(list == pos) WMSelectListItem(panel->fsetLs, list-1); else WMSelectListItem(panel->fsetLs, 0); } checkListForArrows(panel); paintPreviewBox(panel, EVERYTHING); changePage(panel->fontSel, panel); } static void showData(_Panel *panel) { WMScreen *scr = WMWidgetScreen(panel->parent); char *str; int i; CurrentFontArray = WMCreatePLDictionary(NULL, NULL); str = GetStringForKey("WindowTitleFont"); insertCurrentFont(wstrdup(str), "WindowTitleFont"); str = GetStringForKey("LargeDisplayFont"); insertCurrentFont(wstrdup(str), "LargeDisplayFont"); str = GetStringForKey("MenuTitleFont"); insertCurrentFont(wstrdup(str), "MenuTitleFont"); str = GetStringForKey("MenuTextFont"); insertCurrentFont(wstrdup(str), "MenuTextFont"); str = GetStringForKey("ClipTitleFont"); insertCurrentFont(wstrdup(str), "ClipTitleFont"); str = GetStringForKey("IconTitleFont"); insertCurrentFont(wstrdup(str), "IconTitleFont"); /* i put this here cause it needs to be known before we paint */ readFontEncodings(panel); str = GetStringForKey("MenuStyle"); if (str && strcasecmp(str, "flat")==0) { panel->menuStyle = MSTYLE_FLAT; } else if (str && strcasecmp(str, "singletexture")==0) { panel->menuStyle = MSTYLE_SINGLE; } else { panel->menuStyle = MSTYLE_NORMAL; } str = GetStringForKey("TitleJustify"); if (str && strcasecmp(str, "left")==0) { panel->titleAlignment = WALeft; } else if (str && strcasecmp(str, "right")==0) { panel->titleAlignment = WARight; } else { panel->titleAlignment = WACenter; } for (i = 0; i < sizeof(colorOptions)/(2*sizeof(char*)); i++) { WMColor *color; str = GetStringForKey(colorOptions[i*2]); if (!str) str = colorOptions[i*2+1]; if (!(color = WMCreateNamedColor(WMWidgetScreen(panel->box), str, False))) { color = WMCreateNamedColor(WMWidgetScreen(panel->box), "#000000", False); } panel->colors[i] = color; } str = GetStringForKey("MultiByteText"); if (str) { if (strcasecmp(str, "YES")==0) { setLanguageType(panel, True); WMSetButtonText(panel->togMulti, "Yes"); printf("yes multi\n"); panel->MultiByteText = True; } else if (strcasecmp(str, "AUTO") == 0) { char *locale; locale = setlocale(LC_CTYPE, NULL); if(locale != NULL && (strncmp(locale, "ja", 2) == 0 || strncmp(locale, "zh", 2) == 0 || strncmp(locale, "ko", 2) == 0)) { setLanguageType(panel, True); WMSetButtonText(panel->togMulti, "Auto"); printf("auto multi\n"); panel->MultiByteText = True; } else { setLanguageType(panel, False); WMSetButtonText(panel->togMulti, "Auto"); panel->MultiByteText = False; } } } else { char *locale; locale = setlocale(LC_CTYPE, NULL); if(locale != NULL && (strncmp(locale, "ja", 2) == 0 || strncmp(locale, "zh", 2) == 0 || strncmp(locale, "ko", 2) == 0)) { setLanguageType(panel, True); WMSetButtonText(panel->togMulti, "Auto"); printf("auto multi\n"); panel->MultiByteText = True; } else { setLanguageType(panel, False); WMSetButtonText(panel->togMulti, "Auto"); panel->MultiByteText = False; } } /* gotta check for Antialiasing AFTER MultiByte incase the use has both * to maintain behavior in Current Fonts set or i could add another if * statement to setLanguageType =) */ if (WMHasAntialiasingSupport(scr)) { WMMapWidget(panel->togAA); if(GetBoolForKey("AntialiasedText")){ WMSetButtonSelected(panel->togAA, True); panel->AntialiasedText = True; } else { WMSetButtonSelected(panel->togAA, False); panel->AntialiasedText = False; } } else { WMUnmapWidget(panel->togAA); } paintPreviewBox(panel, EVERYTHING); } static void createPanel(Panel *p) { _Panel *panel = (_Panel*)p; WMScreen *scr = WMWidgetScreen(panel->parent); panel->box = WMCreateBox(panel->parent); WMSetViewExpandsToParent(WMWidgetView(panel->box), 2, 2, 2, 2); panel->hand = WMCreatePixmapFromXPMData(scr, hand_xpm); panel->up_arrow = WMCreatePixmapFromXPMData(scr, up_arrow_xpm); panel->down_arrow = WMCreatePixmapFromXPMData(scr, down_arrow_xpm); panel->alt_up_arrow = WMCreatePixmapFromXPMData(scr, alt_up_arrow_xpm); panel->alt_down_arrow = WMCreatePixmapFromXPMData(scr, alt_down_arrow_xpm); panel->prevL = WMCreateLabel(panel->box); WMResizeWidget(panel->prevL, 240, FRAME_HEIGHT - 45); WMMoveWidget(panel->prevL, 15, 35); WMSetLabelRelief(panel->prevL, WRSunken); WMSetLabelImagePosition(panel->prevL, WIPImageOnly); WMCreateEventHandler(WMWidgetView(panel->prevL), ButtonPressMask, previewClick, panel); /* Widget Selection */ panel->fontSel = WMCreatePopUpButton(panel->box); WMResizeWidget(panel->fontSel, 135, 20); WMMoveWidget(panel->fontSel, 15, 10); WMAddPopUpButtonItem(panel->fontSel, _("Window Title Font")); WMAddPopUpButtonItem(panel->fontSel, _("Large Display Font")); WMAddPopUpButtonItem(panel->fontSel, _("Menu Title Font")); WMAddPopUpButtonItem(panel->fontSel, _("Menu Item Font" )); WMAddPopUpButtonItem(panel->fontSel, _("Clip Title Font")); WMAddPopUpButtonItem(panel->fontSel, _("Icon Title Font")); WMSetPopUpButtonSelectedItem(panel->fontSel, 0); WMSetPopUpButtonAction(panel->fontSel, changePage, panel); /* MultiByteText toggle */ panel->multiF = WMCreateFrame(panel->box); WMResizeWidget(panel->multiF, 70, 50); WMMoveWidget(panel->multiF, 440, 10); WMSetFrameTitle(panel->multiF, _("MultiByte")); panel->togMulti = WMCreateCommandButton(panel->multiF); WMResizeWidget(panel->togMulti, 40, 20); WMMoveWidget(panel->togMulti, 15, 20); WMSetButtonAction(panel->togMulti, multiClick, panel); WMMapSubwidgets(panel->multiF); /* language selection */ panel->langF = WMCreateFrame(panel->box); WMResizeWidget(panel->langF, 165, 50); WMMoveWidget(panel->langF, 265, 10); WMSetFrameTitle(panel->langF, _("Default Font Encodings")); panel->langP = WMCreatePopUpButton(panel->langF); WMResizeWidget(panel->langP, 135, 20); WMMoveWidget(panel->langP, 15, 20); WMSetPopUpButtonAction(panel->langP, changeLanguageAction, panel); WMMapSubwidgets(panel->langF); /* Antialiasing */ if (WMHasAntialiasingSupport(scr)) { panel->togAA = WMCreateSwitchButton(panel->box); WMResizeWidget(panel->togAA, 110, 20); WMMoveWidget(panel->togAA, 155, 10); WMSetButtonText(panel->togAA, _("Smooth Fonts")); WMSetBalloonTextForView(_("Smooth Font edges for the eye candy\n" "requires a restart after saving"), WMWidgetView(panel->togAA)); WMSetButtonAction(panel->togAA, toggleAA, panel); } /* multibyte */ panel->fsetL = WMCreateLabel(panel->box); WMResizeWidget(panel->fsetL, 245, 20); WMMoveWidget(panel->fsetL, 265, 70); 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->box); WMResizeWidget(panel->fsetLs, 245, 86); WMMoveWidget(panel->fsetLs, 265, 92); WMSetListAction(panel->fsetLs, listClick, panel); WMSetListDoubleAction(panel->fsetLs, changeButtonClick, panel); panel->addB = WMCreateCommandButton(panel->box); WMResizeWidget(panel->addB, 78, 24); WMMoveWidget(panel->addB, 265, 201); WMSetButtonText(panel->addB, _("Add...")); WMSetButtonAction(panel->addB, addButtonClick, panel); panel->editB = WMCreateCommandButton(panel->box); WMResizeWidget(panel->editB, 78, 24); WMMoveWidget(panel->editB, 348, 201); WMSetButtonText(panel->editB, _("Change...")); WMSetButtonAction(panel->editB, changeButtonClick, panel); panel->remB = WMCreateCommandButton(panel->box); WMResizeWidget(panel->remB, 78, 24); WMMoveWidget(panel->remB, 431, 201); WMSetButtonText(panel->remB, _("Remove")); WMSetButtonAction(panel->remB, removeButtonClick, panel); /* happy Up/Down buttons */ panel->upB = WMCreateCommandButton(panel->box); WMResizeWidget(panel->upB, 16, 16); WMMoveWidget(panel->upB, 265, 182); WMSetButtonImage(panel->upB, panel->up_arrow); WMSetButtonAltImage(panel->upB, panel->alt_up_arrow); WMSetButtonImagePosition(panel->upB, WIPImageOnly); WMSetButtonImageDimsWhenDisabled(panel->upB, True); WMSetButtonAction(panel->upB, moveUpListItem, panel); panel->downB = WMCreateCommandButton(panel->box); WMResizeWidget(panel->downB, 16, 16); WMMoveWidget(panel->downB, 286, 182); WMSetButtonImage(panel->downB, panel->down_arrow); WMSetButtonAltImage(panel->downB, panel->alt_down_arrow); WMSetButtonImagePosition(panel->downB, WIPImageOnly); WMSetButtonImageDimsWhenDisabled(panel->downB, True); WMSetButtonAction(panel->downB, moveDownListItem, panel); /* single byte */ panel->fontT = WMCreateTextField(panel->box); WMResizeWidget(panel->fontT, 245, 30); WMMoveWidget(panel->fontT, 265, 120); panel->changeB = WMCreateCommandButton(panel->box); WMResizeWidget(panel->changeB, 104, 24); WMMoveWidget(panel->changeB, 335, 160); WMSetButtonText(panel->changeB, _("Change...")); WMSetButtonAction(panel->changeB, changeButtonClick, panel); panel->black = WMBlackColor(scr); panel->white = WMWhiteColor(scr); panel->light = WMGrayColor(scr); panel->dark = WMDarkGrayColor(scr); panel->back = WMCreateRGBColor(scr, 0x5100, 0x5100, 0x7100, True); /* Font Panel !!!!! */ panel->fontPanel = WMGetFontPanel(scr); #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->box); WMMapSubwidgets(panel->box); showData(panel); changePage(panel->fontSel, panel); } static void storeData(Panel *p) { _Panel *panel = (_Panel*)p; int i; char *encoding = getFontEncoding(panel); for(i=0;i < 6; i++) { switch(i) { case 0: SetStringForKey(fontOfLang(panel, encoding, i), "WindowTitleFont"); break; case 1: SetStringForKey(fontOfLang(panel, encoding, i), "LargeDisplayFont"); break; case 2: SetStringForKey(fontOfLang(panel, encoding, i), "MenuTitleFont"); break; case 3: SetStringForKey(fontOfLang(panel, encoding, i), "MenuTextFont"); break; case 4: SetStringForKey(fontOfLang(panel, encoding, i), "ClipTitleFont"); break; case 5: SetStringForKey(fontOfLang(panel, encoding, i), "IconTitleFont"); break; } } if (WMHasAntialiasingSupport(WMWidgetScreen(panel->box))) SetBoolForKey(WMGetButtonSelected(panel->togAA), "AntialiasedText"); if(panel->MultiByteText) SetStringForKey("YES", "MultiByteText"); else { if(isEncodingMultiByte(panel)) SetStringForKey("YES", "MultiByteText"); else SetStringForKey("AUTO", "MultiByteText"); } } static void prepClosure(Panel *p) { _Panel *panel = (_Panel*)p; WMFreeFontPanel(panel->fontPanel); WMReleasePropList(CurrentFontArray); /* and what ever else i've forgotten or overlooked * maybe someone will add them */ } Panel* InitFont(WMScreen *scr, WMWidget *parent) { _Panel *panel; panel = wmalloc(sizeof(_Panel)); memset(panel, 0, sizeof(_Panel)); panel->sectionName = _("Font Preferences"); panel->description = _("Font Configurations for Windows, Menus etc"); panel->parent = parent; panel->callbacks.createWidgets = createPanel; panel->callbacks.updateDomain = storeData; panel->callbacks.prepareForClose = prepClosure; AddSection(panel, ICON_FILE); return panel; }