mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 12:28:22 +01:00
2101 lines
61 KiB
C
2101 lines
61 KiB
C
/* 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 <X11/Xlocale.h>
|
||
#include <ctype.h>
|
||
|
||
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 <20><><EFBFBD><EFBFBD><EFBFBD>桼<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>ƥ<EFBFBD>");
|
||
break;
|
||
case 6: /* Korean ksc5601.1987 */
|
||
WMSetTextFieldText(panel->fontT, getFontSampleString(panel));
|
||
// "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ä¿ <20><><EFBFBD><EFBFBD>");
|
||
break;
|
||
case 7: /* korean2 daewoo */
|
||
WMSetTextFieldText(panel->fontT, getFontSampleString(panel));
|
||
// "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ä¿ <20><><EFBFBD><EFBFBD>");
|
||
break;
|
||
case 8: /* Russian koi8-r */
|
||
WMSetTextFieldText(panel->fontT, getFontSampleString(panel));
|
||
// "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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;
|
||
}
|
||
|