mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-22 14:08:06 +01:00
- Fixed bug in icon chooser dialog that could cause a segmentation fault in some cases (Pascal Hofstee <caelian@gmail.com>) - Fixed crash in asm code in wrlib, with new versions of gcc. - Fixed bug in the x86_PseudoColor_32_to_8() function which incorrectly used the r, g, b fields in the conversion. - Fixed x86 ASM code in wrlib to work on 64 bit architectures. - Fixed the focus flicker seen with some apps (notably gtk2) (Alexey Spiridonov <snarkmaster@gmail.com>) - Fixed all crashing bugs that were generated by wmaker starting with the WMState file missing. - Added NetWM support (a modified version of the patch originaly written by Peter Zijlstra <a.p.zijlstra@chello.nl>) - Applied patch to enhance the Virtual Desktop behaviour, and to integrate it with the NetWM code (Peter Zijlstra <a.p.zijlstra@chello.nl>) - Applied a few xinerama and placement fixes (Peter Zijlstra <a.p.zijlstra@chello.nl>) - Fixed memory leak in dock code. - Fixed and enhanced the text wrapping in WINGs. - Fixed the layout of some elements in WPrefs.app - Added workaround for aplications that don't set the required hints on the client leader window, but they set them on normal windows (observer with KDE 3.3.0 mainly). This will allow these apps to get an appicon again. (they should be fixed still) - Added workaround for applications that do not set a command with XSetCommand(), but instead they set the _NET_WM_PID property. This works with operating systems that offer a /proc interface similar to what linux has. (This also is to fix problems with KDE 3.3.0 apps, but not only them). - Fixed bug with autostart and exit scripts not being executed if user GNUstep path was different from ~/GNUstep (when setting GNUSTEP_USER_ROOT) - Added utf8 support in WINGs (removed old X core font code) - Added utility to convert old font names to new font names in style files
2101 lines
54 KiB
C
2101 lines
54 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;
|
||
}
|
||
|