X-Git-Url: https://repo.or.cz/w/wmaker-crm.git/blobdiff_plain/59fc927dc9f183802621138534fa6eaafe5593ba..688a56e8ab67b56550e2874d9d7423f0d435bfd9:/WPrefs.app/Font.c diff --git a/WPrefs.app/Font.c b/WPrefs.app/Font.c dissimilarity index 94% index 329c3bf5..36b31a37 100644 --- a/WPrefs.app/Font.c +++ b/WPrefs.app/Font.c @@ -1,2100 +1,1981 @@ -/* 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 -#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) { - // fix this -Dan font = WMCreateFontWithFlags(scr, fname, WFAntialiased); - font = WMCreateFont(scr, fname); - } 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: - case 2: - return WMBoldSystemFontOfSize(scr, 12); - case 1: - return WMBoldSystemFontOfSize(scr, 24); - case 4: - case 5: - return WMSystemFontOfSize(scr, 8); - case 3: - default: - return WMSystemFontOfSize(scr, 12); - } -} - -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 = WMGetFontName(WMGetFontPanelFont(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 = WMGetFontName(WMGetFontPanelFont(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; -} - +/* 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 +#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 << WINTITLE)) { + renderPreview(panel, gc, WINTITLE, RBEV_RAISED2); + XDrawRectangle(dpy, panel->preview, WMColorGC(black), + previewPositions[WINTITLE].pos.x - 1, + previewPositions[WINTITLE].pos.y - 1, + previewPositions[WINTITLE].size.width, previewPositions[WINTITLE].size.height); + } + if (elements & (1 << DISTITLE)) { + XDrawRectangle(dpy, panel->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 << PMTITLE)) { + renderPreview(panel, gc, PMTITLE, RBEV_RAISED2); + XDrawRectangle(dpy, panel->preview, WMColorGC(black), + previewPositions[PMTITLE].pos.x - 1, + previewPositions[PMTITLE].pos.y - 1, + previewPositions[PMTITLE].size.width, previewPositions[PMTITLE].size.height); + } + if (elements & (1 << PMITEM)) { + WMPropList *prop; + + prop = GetObjectForKey(textureOptions[PMITEM]); + mitem = renderMenu(panel, prop, + previewPositions[PMITEM].size.width, previewPositions[PMITEM].size.height / 4); + + XCopyArea(dpy, mitem, panel->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 << PMITEM | 1 << PMTITLE)) { + XDrawLine(dpy, panel->preview, gc, 29, 125, 29, 125 + 20 * 4 + 25); + XDrawLine(dpy, panel->preview, gc, 119, 125, 119, 125 + 20 * 4 + 25); + } + if (elements & (1 << PCLIP)) { + renderClip(panel, gc, PCLIP, RBEV_RAISED3); + XDrawRectangle(dpy, panel->preview, WMColorGC(black), + previewPositions[PCLIP].pos.x - 1, + previewPositions[PCLIP].pos.y - 1, + previewPositions[PCLIP].size.width, previewPositions[PCLIP].size.height); + } + if (elements & (1 << PICON)) { + renderPreview(panel, gc, PICON, RBEV_RAISED3); + XDrawRectangle(dpy, panel->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; i < WMGetPropListItemCount(array); i++) { + if (buf) + buf = wstrconcat(buf, ","); + buf = wstrconcat(buf, WMGetFromPLString(WMGetFromPLArray(array, i))); + } + WMReleasePropList(array); + return wstrdup(buf); + } +} + +static void changeLanguageAction(WMWidget * w, void *data) +{ + Panel *panel = (Panel *) data; + //WMScreen *scr = WMWidgetScreen(panel->box); + 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) { + // fix this -Dan font = WMCreateFontWithFlags(scr, fname, WFAntialiased); + font = WMCreateFont(scr, fname); + } 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: + case 2: + return WMBoldSystemFontOfSize(scr, 12); + case 1: + return WMBoldSystemFontOfSize(scr, 24); + case 4: + case 5: + return WMSystemFontOfSize(scr, 8); + case 3: + default: + return WMSystemFontOfSize(scr, 12); + } +} + +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 = WMGetFontName(WMGetFontPanelFont(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 = WMGetFontName(WMGetFontPanelFont(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; +}