From 109bb540ecd2e34b3b9655a3b2725de10c498f01 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 16 Jul 2004 18:18:36 +0000 Subject: [PATCH] another test for cvs notifications --- ChangeLog | 3 + WINGs/Extras/Makefile.am | 1 + WINGs/Makefile.am | 4 +- WINGs/Tests/wtest.c | 9 +- WINGs/WINGs/WINGs.h | 7 +- WINGs/WINGs/WINGsP.h | 11 +- WINGs/configuration.c | 5 +- WINGs/dragcommon.c | 13 +- WINGs/dragdestination.c | 5 +- WINGs/dragsource.c | 6 +- WINGs/python/WINGs.py | 14 +- WINGs/wevent.c | 4 +- WINGs/wfont.c | 2258 ++++++++++++---------------------------------- WINGs/wfont_noxft.c | 769 ++++++++++++++++ WINGs/wfontpanel.c | 999 ++++++++++++-------- WINGs/widgets.c | 17 +- WINGs/winputmethod.c | 19 +- WINGs/wmisc.c | 1 + WINGs/wscroller.c | 7 +- WPrefs.app/Expert.c | 2 +- WPrefs.app/Font.c | 66 +- WPrefs.app/Makefile.am | 4 +- acinclude.m4 | 36 + configure.ac | 71 +- src/Makefile.am | 4 +- src/appicon.c | 2 +- src/cycling.c | 28 +- src/dialog.c | 13 +- src/event.c | 24 +- src/main.c | 19 +- src/placement.c | 2 +- src/text.c | 19 +- src/xdnd.c | 2 +- src/xutil.c | 1 + test/wtest.c | 1 + util/Makefile.am | 7 +- util/convertfonts.c | 317 +++++++ util/getstyle.c | 6 +- util/wmagnify.c | 1 + util/wmsetbg.c | 2 +- wmlib/app.c | 1 + wrlib/convert.c | 3 +- 42 files changed, 2584 insertions(+), 2199 deletions(-) rewrite WINGs/wfont.c (74%) create mode 100644 WINGs/wfont_noxft.c create mode 100644 util/convertfonts.c diff --git a/ChangeLog b/ChangeLog index 8ed04745..89ab61b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -123,6 +123,9 @@ Changes since version 0.80.2: appicon when a KDE3 application opens a config panel. - Updated slovak translation (Jan Tomka ) - Added xdnd v3 support in WINGs (Sylvain Reynal ) +- Check whether libXft is at least version 2.1.2 else refuse to compile. +- Fixed bug in icon chooser dialog that could cause a segmentation fault + in some cases (Pascal Hofstee ) Changes since version 0.80.1: diff --git a/WINGs/Extras/Makefile.am b/WINGs/Extras/Makefile.am index c3a693f8..63119aec 100644 --- a/WINGs/Extras/Makefile.am +++ b/WINGs/Extras/Makefile.am @@ -22,6 +22,7 @@ libExtraWINGs_a_SOURCES = \ wtableview.h \ wtabledelegates.h +AM_CFLAGS = -fno-strict-aliasing INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/WINGs \ -DRESOURCE_PATH=\"$(datadir)/WINGs\" @HEADER_SEARCH_PATH@ -DDEBUG diff --git a/WINGs/Makefile.am b/WINGs/Makefile.am index 9df6a54d..3ff80d6e 100644 --- a/WINGs/Makefile.am +++ b/WINGs/Makefile.am @@ -108,7 +108,9 @@ libWUtil_a_SOURCES = \ wutil.c -AM_CPPFLAGS = @CPPFLAGS@ -DLOCALEDIR=\"$(NLSDIR)\" +AM_CPPFLAGS = -DLOCALEDIR=\"$(NLSDIR)\" + +AM_CFLAGS = -fno-strict-aliasing INCLUDES = -I$(top_srcdir)/WINGs/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \ -DRESOURCE_PATH=\"$(datadir)/WINGs\" @XFTFLAGS@ @HEADER_SEARCH_PATH@ -DDEBUG diff --git a/WINGs/Tests/wtest.c b/WINGs/Tests/wtest.c index d180a6a9..88aa52a9 100644 --- a/WINGs/Tests/wtest.c +++ b/WINGs/Tests/wtest.c @@ -116,14 +116,14 @@ testFrame(WMScreen *scr) } -static void +/*static void resizedWindow(void *self, WMNotification *notif) { WMView *view = (WMView*)WMGetNotificationObject(notif); WMSize size = WMGetViewSize(view); WMResizeWidget((WMWidget*)self, size.width, size.height); -} +}*/ void testBox(WMScreen *scr) @@ -609,7 +609,8 @@ testText(WMScreen *scr) WMFont *font, *ifont; font = WMDefaultSystemFont(scr); - ifont = WMCopyFontWithStyle(scr, font, WFSEmphasized); + //ifont = WMCopyFontWithStyle(scr, font, WFSEmphasized); + ifont = WMCreateFont(scr, "verdana,sans:pixelsize=12:italic"); if (ifont) { WMSetTextDefaultFont(text, ifont); WMReleaseFont(ifont); @@ -619,7 +620,7 @@ testText(WMScreen *scr) WMReleaseFont(font); } - if(file) { + if (file) { char buf[1024]; WMFreezeText(text); diff --git a/WINGs/WINGs/WINGs.h b/WINGs/WINGs/WINGs.h index f3805b04..d08936b9 100644 --- a/WINGs/WINGs/WINGs.h +++ b/WINGs/WINGs/WINGs.h @@ -1834,12 +1834,11 @@ void WMShowFontPanel(WMFontPanel *panel); void WMHideFontPanel(WMFontPanel *panel); -void WMSetFontPanelAction(WMFontPanel *panel, WMAction2 *action, void *data); +void WMFreeFontPanel(WMFontPanel *panel); -void WMSetFontPanelFont(WMFontPanel *panel, WMFont *font); +void WMSetFontPanelAction(WMFontPanel *panel, WMAction2 *action, void *data); -/* you can free the returned string */ -char* WMGetFontPanelFontName(WMFontPanel *panel); +void WMSetFontPanelFont(WMFontPanel *panel, char *fontName); WMFont* WMGetFontPanelFont(WMFontPanel *panel); diff --git a/WINGs/WINGs/WINGsP.h b/WINGs/WINGs/WINGsP.h index 7f42ed60..673e9c54 100644 --- a/WINGs/WINGs/WINGsP.h +++ b/WINGs/WINGs/WINGsP.h @@ -22,19 +22,14 @@ extern "C" { #endif /* __cplusplus */ -#define DOUBLE_BUFFER - +#define DOUBLE_BUFFER 1 #define WC_UserWidget 128 +#define SCROLLER_WIDTH 20 - -#define SCROLLER_WIDTH 20 - - - -#define XDND_VERSION 4 +#define XDND_VERSION 4 typedef struct W_Application { diff --git a/WINGs/configuration.c b/WINGs/configuration.c index 0baf60bf..7d8d0c15 100644 --- a/WINGs/configuration.c +++ b/WINGs/configuration.c @@ -14,10 +14,6 @@ _WINGsConfiguration WINGsConfiguration; #define BOLD_SYSTEM_FONT "-*-helvetica-bold-r-normal-*-%d-*-*-*-*-*-*-*,-*-*-bold-r-*-*-%d-*-*-*-*-*-*-*" -#define XFTSYSTEM_FONT "-*-arial-medium-r-normal-*-%d-*-*-*-*-*-*-*" - -#define XFTBOLD_SYSTEM_FONT "-*-arial-bold-r-normal-*-%d-*-*-*-*-*-*-*" - #define FLOPPY_PATH "/floppy" @@ -45,6 +41,7 @@ getButtonWithName(const char *name, unsigned defaultButton) } +// fix this static Bool missingOrInvalidXLFD(char *xlfd) { diff --git a/WINGs/dragcommon.c b/WINGs/dragcommon.c index 77053783..c877d2a4 100644 --- a/WINGs/dragcommon.c +++ b/WINGs/dragcommon.c @@ -193,14 +193,15 @@ W_HandleDNDClientMessage(WMView *toplevel, XClientMessageEvent *event) WMDraggingInfo *info = &scr->dragInfo; Atom messageType = event->message_type; - char* msgTypeName = XGetAtomName(scr->display, messageType); - #ifdef XDND_DEBUG + { + char* msgTypeName = XGetAtomName(scr->display, messageType); - if (msgTypeName != NULL) - printf("event type = %s\n", msgTypeName); - else - printf("pb with event type !\n"); + if (msgTypeName != NULL) + printf("event type = %s\n", msgTypeName); + else + printf("pb with event type !\n"); + } #endif diff --git a/WINGs/dragdestination.c b/WINGs/dragdestination.c index e982dacf..03dcd9bd 100644 --- a/WINGs/dragdestination.c +++ b/WINGs/dragdestination.c @@ -79,7 +79,7 @@ createDropDataArray(WMArray *requiredTypes) static WMArray* getTypesFromTypeList(WMScreen *scr, Window sourceWin) { - WMDraggingInfo *info = &scr->dragInfo; + /* // WMDraggingInfo *info = &scr->dragInfo;*/ Atom dataType; Atom* typeAtomList; WMArray* typeList; @@ -365,7 +365,6 @@ W_DragDestinationStoreEnterMsgInfo(WMDraggingInfo *info, WMView *toplevel, XClientMessageEvent *event) { WMScreen *scr = W_VIEW_SCREEN(toplevel); - int i,j, typesCount; if (XDND_DEST_INFO(info) == NULL) initDestinationDragInfo(info); @@ -609,7 +608,7 @@ static void sendAllowedAction(WMView *destView, Atom action) { WMScreen *scr = W_VIEW_SCREEN(destView); - WMPoint destPos = WMGetViewScreenPosition(destView); + /* // WMPoint destPos = WMGetViewScreenPosition(destView); */ WMSize destSize = WMGetViewSize(destView); int destX, destY; Window foo; diff --git a/WINGs/dragsource.c b/WINGs/dragsource.c index b08ee783..3b26499c 100644 --- a/WINGs/dragsource.c +++ b/WINGs/dragsource.c @@ -425,6 +425,8 @@ sendEnterMessage(WMDraggingInfo *info) } +// this functon doesn't return something in all cases. +// control reaches end of non-void function. fix this -Dan static Bool sendPositionMessage(WMDraggingInfo *info, WMPoint *mousePos) { @@ -740,7 +742,6 @@ isXdndAware(WMScreen *scr, Window win) int format; unsigned long count, remain; unsigned char *winXdndVersion; - unsigned char *proxy; if (win == None) return False; @@ -876,7 +877,7 @@ initMotionProcess(WMView *view, WMDraggingInfo *info, static void processMotion(WMDraggingInfo *info, Window windowUnderDrag, WMPoint *mousePos) { - WMScreen *scr = sourceScreen(info); + /* // WMScreen *scr = sourceScreen(info); */ Window newDestination = findDestination(info, mousePos); W_DragSourceStopTimer(); @@ -1058,6 +1059,7 @@ traceStatusMsg(Display *dpy, XClientMessageEvent *statusEvent) #endif +static void storeDropAction(WMDraggingInfo *info, Atom destAction) { WMView* sourceView = XDND_SOURCE_VIEW(info); diff --git a/WINGs/python/WINGs.py b/WINGs/python/WINGs.py index 3d008316..dbdccde2 100644 --- a/WINGs/python/WINGs.py +++ b/WINGs/python/WINGs.py @@ -26,10 +26,11 @@ class WMTimer: self._o = wings.pyWMAddPersistentTimerHandler(milliseconds, (callback, cdata)) else: self._o = wings.pyWMAddTimerHandler(milliseconds, (callback, cdata)) + self.__WMDeleteTimerHandler = wings.pyWMDeleteTimerHandler def __del__(self): - wings.pyWMDeleteTimerHandler(self._o) - #delete = __del__ + self.__WMDeleteTimerHandler(self._o) + class WMPersistentTimer(WMTimer): def __init__(self, milliseconds, callback, cdata=None): @@ -87,14 +88,15 @@ class WMView: class WMWidget(WMView): def __init__(self): - self._o = None if self.__class__ == WMWidget: raise Error, "a WMWidget can't be instantiated directly" + self._o = None + self.__WMDestroyWidget = wings.WMDestroyWidget def __del__(self): - if (self._o != None): - wings.WMDestroyWidget(self._o) - + if self._o is not None: + self.__WMDestroyWidget(self._o) + def resize(self, width, height): wings.WMResizeWidget(self._o, width, height) diff --git a/WINGs/wevent.c b/WINGs/wevent.c index 28cd4e0e..f1a62a38 100644 --- a/WINGs/wevent.c +++ b/WINGs/wevent.c @@ -66,8 +66,8 @@ static WMEventHook *extraEventHandler=NULL; * */ void - WMCreateEventHandler(WMView *view, unsigned long mask, WMEventProc *eventProc, - void *clientData) +WMCreateEventHandler(WMView *view, unsigned long mask, WMEventProc *eventProc, + void *clientData) { W_EventHandler *hPtr; WMArrayIterator iter; diff --git a/WINGs/wfont.c b/WINGs/wfont.c dissimilarity index 74% index 6acc278d..3e866901 100644 --- a/WINGs/wfont.c +++ b/WINGs/wfont.c @@ -1,1661 +1,597 @@ - -#include "wconfig.h" - -#ifdef XFT -# include -# ifdef HAVE_WCHAR_H -# include -# endif -# include -#endif - -#include "WINGsP.h" - -#include -#include -#include - - -#ifdef XFT - -#if defined(HAVE_MBSNRTOWCS) - -static size_t -wmbsnrtowcs(wchar_t *dest, const char **src, size_t nbytes, size_t len) -{ - mbstate_t ps; - size_t n; - - memset(&ps, 0, sizeof(mbstate_t)); - n = mbsnrtowcs(dest, src, nbytes, len, &ps); - if (n!=(size_t)-1 && *src) { - *src -= ps.__count; - } - - return n; -} - -#elif defined(HAVE_MBRTOWC) - -// This is 8 times slower than the version above. -static size_t -wmbsnrtowcs(wchar_t *dest, const char **src, size_t nbytes, size_t len) -{ - mbstate_t ps; - const char *ptr; - size_t n; - int nb; - - if (nbytes==0) - return 0; - - memset(&ps, 0, sizeof(mbstate_t)); - - if (dest == NULL) { - for (ptr=*src, n=0; nbytes>0; n++) { - nb = mbrtowc(NULL, ptr, nbytes, &ps); - if (nb == -1) { - return ((size_t)-1); - } else if (nb==0 || nb==-2) { - return n; - } - ptr += nb; - nbytes -= nb; - } - } - - for (ptr=*src, n=0; n0; n++, dest++) { - nb = mbrtowc(dest, ptr, nbytes, &ps); - if (nb == -2) { - *src = ptr; - return n; - } else if (nb == -1) { - *src = ptr; - return ((size_t)-1); - } else if (nb == 0) { - *src = NULL; - return n; - } - ptr += nb; - nbytes -= nb; - } - - *src = ptr; - return n; -} - -#else - -// Not only 8 times slower than the version based on mbsnrtowcs -// but also this version is not thread safe nor reentrant - -static size_t -wmbsnrtowcs(wchar_t *dest, const char **src, size_t nbytes, size_t len) -{ - const char *ptr; - size_t n; - int nb; - - if (nbytes==0) - return 0; - - mbtowc(NULL, NULL, 0); /* reset shift state */ - - if (dest == NULL) { - for (ptr=*src, n=0; nbytes>0; n++) { - nb = mbtowc(NULL, ptr, nbytes); - if (nb == -1) { - mbtowc(NULL, NULL, 0); - nb = mbtowc(NULL, ptr, strlen(ptr)); - return (nb == -1 ? (size_t)-1 : n); - } else if (nb==0) { - return n; - } - ptr += nb; - nbytes -= nb; - } - } - - for (ptr=*src, n=0; n0; n++, dest++) { - nb = mbtowc(dest, ptr, nbytes); - if (nb == -1) { - mbtowc(NULL, NULL, 0); - nb = mbtowc(NULL, ptr, strlen(ptr)); - *src = ptr; - return (nb == -1 ? (size_t)-1 : n); - } else if (nb == 0) { - *src = NULL; - return n; - } - ptr += nb; - nbytes -= nb; - } - - *src = ptr; - return n; -} - -#endif - - -static Bool -alreadyHasStringValue(XftPattern *pattern, const char *object, char *value) -{ - XftResult r; - char *s; - int id; - - if (!value || value[0]==0) - return True; - - id = 0; - while ((r=XftPatternGetString(pattern, object, id, &s))==XftResultMatch) { - if (strcasecmp(value, s) == 0) { - return True; - } - id++; - } - - return False; -} - - -// check if to add a fallback size too. -Dan -// also handle an xlfd with %d for size? -static char* -makeFontOfSize(char *font, int size, char *fallback) -{ - FcPattern *pattern; - char *result; - - pattern = XftNameParse(font); - XftPatternDel(pattern, "pixelsize"); - XftPatternAddDouble(pattern, "pixelsize", (double)size); - - if (fallback) { - if (!alreadyHasStringValue(pattern, "family", fallback)) { - XftPatternAddString(pattern, "family", fallback); - } - } - - result = FcNameUnparse(pattern); - FcPatternDestroy(pattern); - - return result; -} - - -WMFont* -WMCreateFont(WMScreen *scrPtr, char *fontName) -{ - WMFont *font; - Display *display = scrPtr->display; - char *fname, *ptr; - - /* This is for back-compat (to allow reading of old xlfd descriptions) */ - if (fontName[0]=='-' && (ptr = strchr(fontName, ','))) { - // warn for deprecation - fname = wmalloc(ptr - fontName + 1); - strncpy(fname, fontName, ptr - fontName); - fname[ptr - fontName] = 0; - } else { - fname = wstrdup(fontName); - } - - font = WMHashGet(scrPtr->fontCache, fname); - if (font) { - WMRetainFont(font); - wfree(fname); - return font; - } - - font = wmalloc(sizeof(WMFont)); - memset(font, 0, sizeof(WMFont)); - - font->screen = scrPtr; - - // remove - printf("WMCreateFont: %s\n", fname); - - if (fname[0] == '-') { - // Backward compat thing. Remove in a later version - font->font = XftFontOpenXlfd(display, scrPtr->screen, fname); - } else { - font->font = XftFontOpenName(display, scrPtr->screen, fname); - } - if (!font->font) { - wfree(font); - wfree(fname); - return NULL; - } - font->height = font->font->ascent+font->font->descent; - font->y = font->font->ascent; - - font->refCount = 1; - - font->name = fname; - - assert(WMHashInsert(scrPtr->fontCache, font->name, font)==NULL); - - return font; -} - - -WMFont* -WMRetainFont(WMFont *font) -{ - wassertrv(font!=NULL, NULL); - - font->refCount++; - - return font; -} - - -void -WMReleaseFont(WMFont *font) -{ - wassertr(font!=NULL); - - font->refCount--; - if (font->refCount < 1) { - XftFontClose(font->screen->display, font->font); - if (font->name) { - WMHashRemove(font->screen->fontCache, font->name); - wfree(font->name); - } - wfree(font); - } -} - - -Bool -WMIsAntialiasingEnabled(WMScreen *scrPtr) -{ - return scrPtr->antialiasedText; -} - - -unsigned int -WMFontHeight(WMFont *font) -{ - wassertrv(font!=NULL, 0); - - return font->height; -} - - -char* -WMGetFontName(WMFont *font) -{ - wassertrv(font!=NULL, NULL); - - return font->name; -} - - -WMFont* -WMDefaultSystemFont(WMScreen *scrPtr) -{ - return WMRetainFont(scrPtr->normalFont); -} - - -WMFont* -WMDefaultBoldSystemFont(WMScreen *scrPtr) -{ - return WMRetainFont(scrPtr->boldFont); -} - - -WMFont* -WMSystemFontOfSize(WMScreen *scrPtr, int size) -{ - WMFont *font; - char *fontSpec; - - fontSpec = makeFontOfSize(WINGsConfiguration.systemFont, size, "sans"); - - font = WMCreateFont(scrPtr, fontSpec); - - if (!font) { - wwarning(_("could not load font %s."), fontSpec); - } - - wfree(fontSpec); - - return font; -} - - -WMFont* -WMBoldSystemFontOfSize(WMScreen *scrPtr, int size) -{ - WMFont *font; - char *fontSpec; - - fontSpec = makeFontOfSize(WINGsConfiguration.boldSystemFont, size, "sans"); - - font = WMCreateFont(scrPtr, fontSpec); - - if (!font) { - wwarning(_("could not load font %s."), fontSpec); - } - - wfree(fontSpec); - - return font; -} - - -int -WMWidthOfString(WMFont *font, char *text, int length) -{ - XGlyphInfo extents; - - wassertrv(font!=NULL, 0); - wassertrv(text!=NULL, 0); - - if (font->screen->useWideChar) { - wchar_t *wtext; - const char *mtext; - int len; - - wtext = (wchar_t *)wmalloc(sizeof(wchar_t)*(length+1)); - mtext = text; - len = wmbsnrtowcs(wtext, &mtext, length, length); - if (len>0) { - wtext[len] = L'\0'; /* not really necessary here */ - XftTextExtents32(font->screen->display, font->font, - (XftChar32 *)wtext, len, &extents); - } else { - if (len==-1) { - wwarning(_("Conversion to widechar failed (possible " - "invalid multibyte sequence): '%s':(pos %d)\n"), - text, mtext-text+1); - } - extents.xOff = 0; - } - wfree(wtext); - } else { - XftTextExtents8(font->screen->display, font->font, - (XftChar8 *)text, length, &extents); - } - - return extents.xOff; /* don't ask :P */ -} - - - -void -WMDrawString(WMScreen *scr, Drawable d, WMColor *color, WMFont *font, - int x, int y, char *text, int length) -{ - XftColor xftcolor; - - wassertr(font!=NULL); - - xftcolor.color.red = color->color.red; - xftcolor.color.green = color->color.green; - xftcolor.color.blue = color->color.blue; - xftcolor.color.alpha = color->alpha;; - xftcolor.pixel = W_PIXEL(color); - - XftDrawChange(scr->xftdraw, d); - - if (font->screen->useWideChar) { - wchar_t *wtext; - const char *mtext; - int len; - - wtext = (wchar_t *)wmalloc(sizeof(wchar_t)*(length+1)); - mtext = text; - len = wmbsnrtowcs(wtext, &mtext, length, length); - if (len>0) { - XftDrawString32(scr->xftdraw, &xftcolor, font->font, - x, y + font->y, (XftChar32*)wtext, len); - } else if (len==-1) { - wwarning(_("Conversion to widechar failed (possible invalid " - "multibyte sequence): '%s':(pos %d)\n"), - text, mtext-text+1); - /* we can draw normal text, or we can draw as much widechar - * text as was already converted until the error. go figure */ - /*XftDrawString8(scr->xftdraw, &xftcolor, font->font, - x, y + font->y, (XftChar8*)text, length);*/ - } - wfree(wtext); - } else { - XftDrawString8(scr->xftdraw, &xftcolor, font->font, - x, y + font->y, (XftChar8*)text, length); - } -} - - -void -WMDrawImageString(WMScreen *scr, Drawable d, WMColor *color, WMColor *background, - WMFont *font, int x, int y, char *text, int length) -{ - XftColor textColor; - XftColor bgColor; - - wassertr(font!=NULL); - - textColor.color.red = color->color.red; - textColor.color.green = color->color.green; - textColor.color.blue = color->color.blue; - textColor.color.alpha = color->alpha;; - textColor.pixel = W_PIXEL(color); - - bgColor.color.red = background->color.red; - bgColor.color.green = background->color.green; - bgColor.color.blue = background->color.blue; - bgColor.color.alpha = background->alpha;; - bgColor.pixel = W_PIXEL(background); - - XftDrawChange(scr->xftdraw, d); - - XftDrawRect(scr->xftdraw, &bgColor, x, y, - WMWidthOfString(font, text, length), - font->height); - - if (font->screen->useWideChar) { - wchar_t *wtext; - const char *mtext; - int len; - - mtext = text; - wtext = (wchar_t *)wmalloc(sizeof(wchar_t)*(length+1)); - len = wmbsnrtowcs(wtext, &mtext, length, length); - if (len>0) { - XftDrawString32(scr->xftdraw, &textColor, font->font, - x, y + font->y, (XftChar32*)wtext, len); - } else if (len==-1) { - wwarning(_("Conversion to widechar failed (possible invalid " - "multibyte sequence): '%s':(pos %d)\n"), - text, mtext-text+1); - /* we can draw normal text, or we can draw as much widechar - * text as was already converted until the error. go figure */ - /*XftDrawString8(scr->xftdraw, &textColor, font->font, - x, y + font->y, (XftChar8*)text, length);*/ - } - wfree(wtext); - } else { - XftDrawString8(scr->xftdraw, &textColor, font->font, - x, y + font->y, (XftChar8*)text, length); - } -} - - -WMFont* -WMCopyFontWithStyle(WMScreen *scrPtr, WMFont *font, WMFontStyle style) -{ - FcPattern *pattern; - WMFont *copy; - char *name; - - if (!font) - return NULL; - - pattern = XftNameParse(WMGetFontName(font)); - switch (style) { - case WFSNormal: - XftPatternDel(pattern, "weight"); - XftPatternDel(pattern, "slant"); - XftPatternAddString(pattern, "weight", "medium"); - XftPatternAddString(pattern, "slant", "roman"); - break; - case WFSBold: - XftPatternDel(pattern, "weight"); - XftPatternAddString(pattern, "weight", "bold"); - break; - case WFSEmphasized: - XftPatternDel(pattern, "slant"); - XftPatternAddString(pattern, "slant", "italic"); - XftPatternAddString(pattern, "slant", "oblique"); - break; - case WFSBoldEmphasized: - XftPatternDel(pattern, "weight"); - XftPatternDel(pattern, "slant"); - XftPatternAddString(pattern, "weight", "bold"); - XftPatternAddString(pattern, "slant", "italic"); - XftPatternAddString(pattern, "slant", "oblique"); - break; - } - - name = FcNameUnparse(pattern); - copy = WMCreateFont(scrPtr, name); - FcPatternDestroy(pattern); - wfree(name); - - return copy; -} - - -#else /* No XFT support */ - - -static char *makeFontSetOfSize(char *fontset, int size); - - - -/* XLFD pattern matching */ -static char* -getElementFromXLFD(const char *xlfd, int index) -{ - const char *p = xlfd; - while (*p != 0) { - if (*p == '-' && --index == 0) { - const char *end = strchr(p + 1, '-'); - char *buf; - size_t len; - if (end == 0) end = p + strlen(p); - len = end - (p + 1); - buf = wmalloc(len); - memcpy(buf, p + 1, len); - buf[len] = 0; - return buf; - } - p++; - } - return strdup("*"); -} - - -/* XLFD pattern matching */ -static char* -generalizeXLFD(const char *xlfd) -{ - char *buf; - int len; - char *weight = getElementFromXLFD(xlfd, 3); - char *slant = getElementFromXLFD(xlfd, 4); - char *pxlsz = getElementFromXLFD(xlfd, 7); - -#define Xstrlen(A) ((A)?strlen(A):0) - len = Xstrlen(xlfd)+Xstrlen(weight)+Xstrlen(slant)+Xstrlen(pxlsz)*2+60; -#undef Xstrlen - - buf = wmalloc(len + 1); - snprintf(buf, len + 1, "%s,-*-*-%s-%s-*-*-%s-*-*-*-*-*-*-*," - "-*-*-*-*-*-*-%s-*-*-*-*-*-*-*,*", - xlfd, weight, slant, pxlsz, pxlsz); - - wfree(pxlsz); - wfree(slant); - wfree(weight); - - return buf; -} - -/* XLFD pattern matching */ -static XFontSet -W_CreateFontSetWithGuess(Display *dpy, char *xlfd, char ***missing, - int *nmissing, char **def_string) -{ - XFontSet fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string); - - if (fs != NULL && *nmissing == 0) return fs; - - /* for non-iso8859-1 language and iso8859-1 specification - (this fontset is only for pattern analysis) */ - if (fs == NULL) { - if (*nmissing != 0) XFreeStringList(*missing); - setlocale(LC_CTYPE, "C"); - fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string); - setlocale(LC_CTYPE, ""); - } - - /* make XLFD font name for pattern analysis */ - if (fs != NULL) { - XFontStruct **fontstructs; - char **fontnames; - if (XFontsOfFontSet(fs, &fontstructs, &fontnames) > 0) - xlfd = fontnames[0]; - } - - xlfd = generalizeXLFD(xlfd); - - if (*nmissing != 0) XFreeStringList(*missing); - if (fs != NULL) XFreeFontSet(dpy, fs); - - fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string); - - wfree(xlfd); - return fs; -} - - -static char* -xlfdFromFontName(char *fontName, Bool antialiased) -{ - char *systemFont, *boldSystemFont; - char *font; - int size; - - if (antialiased) { - systemFont = WINGsConfiguration.antialiasedSystemFont; - boldSystemFont = WINGsConfiguration.antialiasedBoldSystemFont; - } else { - systemFont = WINGsConfiguration.systemFont; - boldSystemFont = WINGsConfiguration.boldSystemFont; - } - - size = WINGsConfiguration.defaultFontSize; - - if (strcmp(fontName, "SystemFont")==0) { - font = systemFont; - size = WINGsConfiguration.defaultFontSize; - } else if (strncmp(fontName, "SystemFont-", 11)==0) { - font = systemFont; - if (sscanf(&fontName[11], "%i", &size)!=1) { - size = WINGsConfiguration.defaultFontSize; - wwarning(_("Invalid size specification '%s' in %s. " - "Using default %d\n"), &fontName[11], fontName, size); - } - } else if (strcmp(fontName, "BoldSystemFont")==0) { - font = boldSystemFont; - size = WINGsConfiguration.defaultFontSize; - } else if (strncmp(fontName, "BoldSystemFont-", 15)==0) { - font = boldSystemFont; - if (sscanf(&fontName[15], "%i", &size)!=1) { - size = WINGsConfiguration.defaultFontSize; - wwarning(_("Invalid size specification '%s' in %s. " - "Using default %d\n"), &fontName[15], fontName, size); - } - } else { - font = NULL; - } - - return (font!=NULL ? makeFontSetOfSize(font, size) : wstrdup(fontName)); -} - - -WMFont* -WMCreateFontSet(WMScreen *scrPtr, char *fontName) -{ - WMFont *font; - Display *display = scrPtr->display; - char **missing; - int nmissing = 0; - char *defaultString; - char *fname; - XFontSetExtents *extents; - - fname = xlfdFromFontName(fontName, False); - - font = WMHashGet(scrPtr->fontSetCache, fname); - if (font) { - WMRetainFont(font); - wfree(fname); - return font; - } - - font = wmalloc(sizeof(WMFont)); - memset(font, 0, sizeof(WMFont)); - - font->notFontSet = 0; - font->antialiased = 0; - - font->screen = scrPtr; - - font->font.set = W_CreateFontSetWithGuess(display, fname, &missing, - &nmissing, &defaultString); - if (nmissing > 0 && font->font.set) { - int i; - - wwarning(_("the following character sets are missing in %s:"), fname); - for (i = 0; i < nmissing; i++) { - wwarning(missing[i]); - } - XFreeStringList(missing); - if (defaultString) - wwarning(_("the string \"%s\" will be used in place of any characters from those sets."), - defaultString); - } - if (!font->font.set) { - wfree(font); - wfree(fname); - return NULL; - } - - extents = XExtentsOfFontSet(font->font.set); - - font->height = extents->max_logical_extent.height; - font->y = font->height - (font->height + extents->max_logical_extent.y); - - font->refCount = 1; - - font->name = fname; - - assert(WMHashInsert(scrPtr->fontSetCache, font->name, font)==NULL); - - return font; -} - - - -WMFont* -WMCreateNormalFont(WMScreen *scrPtr, char *fontName) -{ - WMFont *font; - Display *display = scrPtr->display; - char *fname, *ptr; - - fontName = xlfdFromFontName(fontName, False); - - if ((ptr = strchr(fontName, ','))) { - fname = wmalloc(ptr - fontName + 1); - strncpy(fname, fontName, ptr - fontName); - fname[ptr - fontName] = 0; - } else { - fname = wstrdup(fontName); - } - - wfree(fontName); - - font = WMHashGet(scrPtr->fontCache, fname); - if (font) { - WMRetainFont(font); - wfree(fname); - return font; - } - - font = wmalloc(sizeof(WMFont)); - memset(font, 0, sizeof(WMFont)); - - font->notFontSet = 1; - font->antialiased = 0; - - font->screen = scrPtr; - - font->font.normal = XLoadQueryFont(display, fname); - if (!font->font.normal) { - wfree(font); - wfree(fname); - return NULL; - } - font->height = font->font.normal->ascent+font->font.normal->descent; - font->y = font->font.normal->ascent; - - font->refCount = 1; - - font->name = fname; - - assert(WMHashInsert(scrPtr->fontCache, font->name, font)==NULL); - - return font; -} - - -WMFont* -WMCreateAntialiasedFont(WMScreen *scrPtr, char *fontName) -{ -#ifdef XFT - WMFont *font; - Display *display = scrPtr->display; - char *fname, *ptr; - - fontName = xlfdFromFontName(fontName, True); - - if ((ptr = strchr(fontName, ','))) { - fname = wmalloc(ptr - fontName + 1); - strncpy(fname, fontName, ptr - fontName); - fname[ptr - fontName] = 0; - } else { - fname = wstrdup(fontName); - } - - wfree(fontName); - - font = WMHashGet(scrPtr->xftFontCache, fname); - if (font) { - WMRetainFont(font); - wfree(fname); - return font; - } - - font = wmalloc(sizeof(WMFont)); - memset(font, 0, sizeof(WMFont)); - - font->notFontSet = 1; - font->antialiased = 1; - - font->screen = scrPtr; - - /* Xft sux. Loading a font with an invalid XLFD will give strange results - * sometimes without returning any warning or error. - * However Xft's idea of what font is invalid is quite strange: - * 1. If the XLFD doesn't have all its fields present will fail and - * return NULL. - * 2. If all fields are present, but hold invalid values then it will: - * a. If family is invalid, will load a default font without warning. - * b. If the font size is invalid (non-numerical) it will fail and - * return NULL. - * c. If other fields are invalid, will load the font specified by - * the valid family name, ignoring any invalid fields. It will - * use a default medium weight and a default roman slant if they - * are invalid. - */ - printf("%s\n", fname); - if (fname[0] == '-') { - font->font.xft = XftFontOpenXlfd(display, scrPtr->screen, fname); - } else { - font->font.xft = XftFontOpenName(display, scrPtr->screen, fname); - } - if (!font->font.xft) { - wfree(font); - wfree(fname); - return NULL; - } - font->height = font->font.xft->ascent+font->font.xft->descent; - font->y = font->font.xft->ascent; - - font->refCount = 1; - - font->name = fname; - - assert(WMHashInsert(scrPtr->xftFontCache, font->name, font)==NULL); - - return font; -#else - return NULL; -#endif -} - - -WMFont* -WMCreateAntialiasedFontSet(WMScreen *scrPtr, char *fontName) -{ -#ifdef XFT - WMFont *font; - Display *display = scrPtr->display; - char *fname, *ptr; - - fontName = xlfdFromFontName(fontName, True); - - if ((ptr = strchr(fontName, ','))) { - fname = wmalloc(ptr - fontName + 1); - strncpy(fname, fontName, ptr - fontName); - fname[ptr - fontName] = 0; - } else { - fname = wstrdup(fontName); - } - - wfree(fontName); - - font = WMHashGet(scrPtr->xftFontSetCache, fname); - if (font) { - WMRetainFont(font); - wfree(fname); - return font; - } - - font = wmalloc(sizeof(WMFont)); - memset(font, 0, sizeof(WMFont)); - - font->notFontSet = 0; - font->antialiased = 1; - - font->screen = scrPtr; - - /* Xft sux. Loading a font with an invalid XLFD will give strange results - * sometimes without returning any warning or error. - * However Xft's idea of what font is invalid is quite strange: - * 1. If the XLFD doesn't have all its fields present will fail and - * return NULL. - * 2. If all fields are present, but hold invalid values then it will: - * a. If family is invalid, will load a default font without warning. - * b. If the font size is invalid (non-numerical) it will fail and - * return NULL. - * c. If other fields are invalid, will load the font specified by - * the valid family name, ignoring any invalid fields. It will - * use a default medium weight and a default roman slant if they - * are invalid. - */ - if (fname[0] == '-') { - font->font.xft = XftFontOpenXlfd(display, scrPtr->screen, fname); - } else { - font->font.xft = XftFontOpenName(display, scrPtr->screen, fname); - } - if (!font->font.xft) { - wfree(font); - wfree(fname); - return NULL; - } - font->height = font->font.xft->ascent+font->font.xft->descent; - font->y = font->font.xft->ascent; - - font->refCount = 1; - - font->name = fname; - - assert(WMHashInsert(scrPtr->xftFontSetCache, font->name, font)==NULL); - - return font; -#else - return NULL; -#endif -} - - -WMFont* -WMCreateFont(WMScreen *scrPtr, char *fontName) -{ - return WMCreateFontWithFlags(scrPtr, fontName, WFDefaultFont); -} - - -WMFont* -WMCreateFontWithFlags(WMScreen *scrPtr, char *fontName, WMFontFlags flags) -{ - Bool multiByte = scrPtr->useMultiByte; - Bool antialiased = scrPtr->antialiasedText; - WMFont *font; - - if (flags & WFFontSet) { - multiByte = True; - } else if (flags & WFNormalFont) { - multiByte = False; - } - if (flags & WFAntialiased) { - antialiased = True; - } else if (flags & WFNotAntialiased) { - antialiased = False; - } - - if (antialiased && multiByte) { - font = WMCreateAntialiasedFontSet(scrPtr, fontName); - /* If we cannot create an antialiased font set and antialiasing is - * not explicitly requested in flags, fallback to standard font sets */ - if (!font && (flags & WFAntialiased)==0) { - font = WMCreateFontSet(scrPtr, fontName); - } - } else if (antialiased) { - font = WMCreateAntialiasedFont(scrPtr, fontName); - /* If we cannot create an antialiased font and antialiasing is - * not explicitly requested in flags, fallback to normal font */ - if (!font && (flags & WFAntialiased)==0) { - font = WMCreateNormalFont(scrPtr, fontName); - } - } else if (multiByte) { - font = WMCreateFontSet(scrPtr, fontName); - } else { - font = WMCreateNormalFont(scrPtr, fontName); - } - - return font; -} - - -WMFont* -WMRetainFont(WMFont *font) -{ - wassertrv(font!=NULL, NULL); - - font->refCount++; - - return font; -} - - -void -WMReleaseFont(WMFont *font) -{ - wassertr(font!=NULL); - - font->refCount--; - if (font->refCount < 1) { - if (font->antialiased) { -#ifdef XFT - XftFontClose(font->screen->display, font->font.xft); -#else - assert(False); -#endif - } else if (font->notFontSet) { - XFreeFont(font->screen->display, font->font.normal); - } else { - XFreeFontSet(font->screen->display, font->font.set); - } - - if (font->name) { - if (font->antialiased && !font->notFontSet) { - WMHashRemove(font->screen->xftFontSetCache, font->name); - } else if (font->antialiased) { - WMHashRemove(font->screen->xftFontCache, font->name); - } else if (font->notFontSet) { - WMHashRemove(font->screen->fontCache, font->name); - } else { - WMHashRemove(font->screen->fontSetCache, font->name); - } - wfree(font->name); - } - wfree(font); - } -} - - -Bool -WMIsAntialiasingEnabled(WMScreen *scrPtr) -{ - return scrPtr->antialiasedText; -} - - -Bool -WMIsAntialiasedFont(WMFont *font) -{ - wassertrv(font!=NULL, False); - - return font->antialiased; -} - - -unsigned int -WMFontHeight(WMFont *font) -{ - wassertrv(font!=NULL, 0); - - return font->height; -} - - -char* -WMGetFontName(WMFont *font) -{ - wassertrv(font!=NULL, NULL); - - return font->name; -} - - -WMFont* -WMDefaultSystemFont(WMScreen *scrPtr) -{ - return WMRetainFont(scrPtr->normalFont); -} - - -WMFont* -WMDefaultBoldSystemFont(WMScreen *scrPtr) -{ - return WMRetainFont(scrPtr->boldFont); -} - - -static WMFont* -makeSystemFontOfSize(WMScreen *scrPtr, int size, Bool bold) -{ - WMFont *font; - char *fontSpec, *xftFontSpec; - -#define WConf WINGsConfiguration - if (bold) { - fontSpec = makeFontSetOfSize(WConf.boldSystemFont, size); - xftFontSpec = makeFontSetOfSize(WConf.antialiasedBoldSystemFont, size); - } else { - fontSpec = makeFontSetOfSize(WConf.systemFont, size); - xftFontSpec = makeFontSetOfSize(WConf.antialiasedSystemFont, size); - } -#undef WConf - - if (scrPtr->antialiasedText && scrPtr->useMultiByte) { - font = WMCreateAntialiasedFontSet(scrPtr, xftFontSpec); - } else if (scrPtr->antialiasedText) { - font = WMCreateAntialiasedFont(scrPtr, xftFontSpec); - } else if (scrPtr->useMultiByte) { - font = WMCreateFontSet(scrPtr, fontSpec); - } else { - font = WMCreateNormalFont(scrPtr, fontSpec); - } - - if (!font) { - if (scrPtr->antialiasedText && scrPtr->useMultiByte) { - // is arial a good fallback for multibyte? - wwarning(_("could not load font %s. Trying arial."), xftFontSpec); - if (bold) { - font = WMCreateAntialiasedFontSet(scrPtr, "-*-arial-bold-r-normal-*-12-*-*-*-*-*-*-*"); - } else { - font = WMCreateAntialiasedFontSet(scrPtr, "-*-arial-medium-r-normal-*-12-*-*-*-*-*-*-*"); - } - if (!font) { - wwarning(_("could not load antialiased font set. Reverting to standard font sets.")); - font = WMCreateFontSet(scrPtr, fontSpec); - if (!font) { - wwarning(_("could not load FontSet %s. Trying fixed."), fontSpec); - font = WMCreateFontSet(scrPtr, "fixed"); - } - } - } else if (scrPtr->antialiasedText) { - wwarning(_("could not load font %s. Trying arial."), xftFontSpec); - if (bold) { - font = WMCreateAntialiasedFont(scrPtr, "-*-arial-bold-r-normal-*-12-*-*-*-*-*-*-*"); - } else { - font = WMCreateAntialiasedFont(scrPtr, "-*-arial-medium-r-normal-*-12-*-*-*-*-*-*-*"); - } - if (!font) { - wwarning(_("could not load antialiased fonts. Reverting to normal fonts.")); - font = WMCreateNormalFont(scrPtr, fontSpec); - if (!font) { - wwarning(_("could not load font %s. Trying fixed."), fontSpec); - font = WMCreateNormalFont(scrPtr, "fixed"); - } - } - } else if (scrPtr->useMultiByte) { - wwarning(_("could not load font set %s. Trying fixed."), fontSpec); - font = WMCreateFontSet(scrPtr, "fixed"); - if (!font) { - font = WMCreateFontSet(scrPtr, "-*-fixed-medium-r-normal-*-14-*-*-*-*-*-*-*"); - } - } else { - wwarning(_("could not load font %s. Trying fixed."), fontSpec); - font = WMCreateNormalFont(scrPtr, "fixed"); - } - if (!font) { - wwarning(_("could not load fixed font!")); - wfree(fontSpec); - wfree(xftFontSpec); - return NULL; - } - } - wfree(fontSpec); - wfree(xftFontSpec); - - return font; -} - - -WMFont* -WMSystemFontOfSize(WMScreen *scrPtr, int size) -{ - return makeSystemFontOfSize(scrPtr, size, False); -} - - -WMFont* -WMBoldSystemFontOfSize(WMScreen *scrPtr, int size) -{ - return makeSystemFontOfSize(scrPtr, size, True); -} - - -XFontSet -WMGetFontFontSet(WMFont *font) -{ - wassertrv(font!=NULL, NULL); - - if (!font->notFontSet && !font->antialiased) - return font->font.set; - - return NULL; -} - - -int -WMWidthOfString(WMFont *font, char *text, int length) -{ - wassertrv(font!=NULL, 0); - wassertrv(text!=NULL, 0); - - if (font->antialiased) { -#ifdef XFT - XGlyphInfo extents; - - if (!font->notFontSet) { - wchar_t *wtext; - char *mtext; - int len; - - /* Use mtext instead of text, because mbstrtowcs() alters it */ - mtext = text; - wtext = (wchar_t *)wmalloc(4*length+4); - /* pass a real ps instead of NULL below? for multithread safety - * as from manual page */ - len = mbsrtowcs(wtext, (const char **) &mtext, length, NULL); - if (len>0) { - XftTextExtents32(font->screen->display, font->font.xft, - (XftChar32 *)wtext, len, &extents); - } else { - if (len==-1) { - wwarning(_("Conversion to widechar failed (possible " - "invalid multibyte sequence): '%s':(pos %d)\n"), - text, mtext-text+1); - } - extents.xOff = 0; - } - wfree(wtext); - } else { - XftTextExtents8(font->screen->display, font->font.xft, - (XftChar8 *)text, length, &extents); - } - - return extents.xOff; /* don't ask :P */ -#else - wassertrv(False, 0); -#endif - } else if (font->notFontSet) { - return XTextWidth(font->font.normal, text, length); - } else { - XRectangle rect; - XRectangle AIXsucks; - - XmbTextExtents(font->font.set, text, length, &AIXsucks, &rect); - - return rect.width; - } -} - - - -void -WMDrawString(WMScreen *scr, Drawable d, WMColor *color, WMFont *font, - int x, int y, char *text, int length) -{ - wassertr(font!=NULL); - - if (font->antialiased) { -#ifdef XFT - XftColor xftcolor; - - xftcolor.color.red = color->color.red; - xftcolor.color.green = color->color.green; - xftcolor.color.blue = color->color.blue; - xftcolor.color.alpha = color->alpha;; - xftcolor.pixel = W_PIXEL(color); - - XftDrawChange(scr->xftdraw, d); - - if (!font->notFontSet) { - wchar_t *wtext; - char *mtext; - int len; - - /* Use mtext instead of text, because mbstrtowcs() alters it */ - mtext = text; - wtext = (wchar_t *)wmalloc(4*length+4); - len = mbsrtowcs(wtext, (const char **) &mtext, length, NULL); - if (len>0) { - XftDrawString32(scr->xftdraw, &xftcolor, font->font.xft, - x, y + font->y, (XftChar32*)wtext, len); - } else if (len==-1) { - wwarning(_("Conversion to widechar failed (possible invalid " - "multibyte sequence): '%s':(pos %d)\n"), - text, mtext-text+1); - /* we can draw normal text, or we can draw as much widechar - * text as was already converted until the error. go figure */ - /*XftDrawString8(scr->xftdraw, &xftcolor, font->font.xft, - x, y + font->y, (XftChar8*)text, length);*/ - } - wfree(wtext); - } else { - XftDrawString8(scr->xftdraw, &xftcolor, font->font.xft, - x, y + font->y, (XftChar8*)text, length); - } -#else - wassertr(False); -#endif - } else if (font->notFontSet) { - XSetFont(scr->display, scr->drawStringGC, font->font.normal->fid); - XSetForeground(scr->display, scr->drawStringGC, W_PIXEL(color)); - XDrawString(scr->display, d, scr->drawStringGC, x, y + font->y, - text, length); - } else { - XSetForeground(scr->display, scr->drawStringGC, W_PIXEL(color)); - XmbDrawString(scr->display, d, font->font.set, scr->drawStringGC, - x, y + font->y, text, length); - } -} - - -void -WMDrawImageString(WMScreen *scr, Drawable d, WMColor *color, WMColor *background, - WMFont *font, int x, int y, char *text, int length) -{ - wassertr(font!=NULL); - - if (font->antialiased) { -#ifdef XFT - XftColor textColor; - XftColor bgColor; - - textColor.color.red = color->color.red; - textColor.color.green = color->color.green; - textColor.color.blue = color->color.blue; - textColor.color.alpha = color->alpha;; - textColor.pixel = W_PIXEL(color); - - bgColor.color.red = background->color.red; - bgColor.color.green = background->color.green; - bgColor.color.blue = background->color.blue; - bgColor.color.alpha = background->alpha;; - bgColor.pixel = W_PIXEL(background); - - - XftDrawChange(scr->xftdraw, d); - - XftDrawRect(scr->xftdraw, &bgColor, x, y, - WMWidthOfString(font, text, length), font->height); - - if (!font->notFontSet) { - wchar_t *wtext; - char *mtext; - int len; - - /* Use mtext instead of text, because mbstrtowcs() alters it */ - mtext = text; - wtext = (wchar_t *)wmalloc(4*length+4); - len = mbsrtowcs(wtext, (const char **) &mtext, length, NULL); - if (len>0) { - XftDrawString32(scr->xftdraw, &textColor, font->font.xft, - x, y + font->y, (XftChar32*)wtext, len); - } else if (len==-1) { - wwarning(_("Conversion to widechar failed (possible invalid " - "multibyte sequence): '%s':(pos %d)\n"), - text, mtext-text+1); - /* we can draw normal text, or we can draw as much widechar - * text as was already converted until the error. go figure */ - /*XftDrawString8(scr->xftdraw, &textColor, font->font.xft, - x, y + font->y, (XftChar8*)text, length);*/ - } - wfree(wtext); - } else { - XftDrawString8(scr->xftdraw, &textColor, font->font.xft, - x, y + font->y, (XftChar8*)text, length); - } -#else - wassertr(False); -#endif - } else if (font->notFontSet) { - XSetForeground(scr->display, scr->drawImStringGC, W_PIXEL(color)); - XSetBackground(scr->display, scr->drawImStringGC, W_PIXEL(background)); - XSetFont(scr->display, scr->drawImStringGC, font->font.normal->fid); - XDrawImageString(scr->display, d, scr->drawImStringGC, - x, y + font->y, text, length); - } else { - XSetForeground(scr->display, scr->drawImStringGC, W_PIXEL(color)); - XSetBackground(scr->display, scr->drawImStringGC, W_PIXEL(background)); - XmbDrawImageString(scr->display, d, font->font.set, scr->drawImStringGC, - x, y + font->y, text, length); - } -} - - - - -static char* -makeFontSetOfSize(char *fontset, int size) -{ - char font[300], *f; - char *newfs = NULL; - char *ptr; - - do { - char *tmp; - int end; - - - f = fontset; - ptr = strchr(fontset, ','); - if (ptr) { - int count = ptr-fontset; - - if (count > 255) { - wwarning(_("font description %s is too large."), fontset); - } else { - memcpy(font, fontset, count); - font[count] = 0; - f = (char*)font; - } - } - - if (newfs) - end = strlen(newfs); - else - end = 0; - - tmp = wmalloc(end + strlen(f) + 8); - if (end != 0) { - sprintf(tmp, "%s,", newfs); - sprintf(tmp + end + 1, f, size); - } else { - sprintf(tmp + end, f, size); - } - - if (newfs) - wfree(newfs); - newfs = tmp; - - fontset = ptr+1; - } while (ptr!=NULL); - - return newfs; -} - - -#define FONT_PROPS 14 - -typedef struct { - char *props[FONT_PROPS]; -} W_FontAttributes; - - -static void -changeFontProp(char *buf, char *newprop, int position) -{ - char buf2[512]; - char *ptr, *pptr, *rptr; - int count; - - if (buf[0]!='-') { - /* // remove warning later. or maybe not */ - wwarning(_("Invalid font specification: '%s'\n"), buf); - return; - } - - ptr = pptr = rptr = buf; - count = 0; - while (*ptr && *ptr!=',') { - if (*ptr == '-') { - count++; - if (count-1==position+1) { - rptr = ptr; - break; - } - if (count-1==position) { - pptr = ptr+1; - } - } - ptr++; - } - if (position==FONT_PROPS-1) { - rptr = ptr; - } - - *pptr = 0; - snprintf(buf2, 512, "%s%s%s", buf, newprop, rptr); - strcpy(buf, buf2); -} - - -static WMArray* -getOptions(char *options) -{ - char *ptr, *ptr2, *str; - WMArray *result; - int count; - - result = WMCreateArrayWithDestructor(2, (WMFreeDataProc*)wfree); - - ptr = options; - while (1) { - ptr2 = strchr(ptr, ','); - if (!ptr2) { - WMAddToArray(result, wstrdup(ptr)); - break; - } else { - count = ptr2 - ptr; - str = wmalloc(count+1); - memcpy(str, ptr, count); - str[count] = 0; - WMAddToArray(result, str); - ptr = ptr2 + 1; - } - } - - return result; -} - - -#define WFAUnchanged (NULL) -/* Struct for font change operations */ -typedef struct WMFontAttributes { - char *foundry; - char *family; - char *weight; - char *slant; - char *setWidth; - char *addStyle; - char *pixelSize; - char *pointSize; - char *resolutionX; - char *resolutionY; - char *spacing; - char *averageWidth; - char *registry; - char *encoding; -} WMFontAttributes; - -WMFont* -WMCopyFontWithChanges(WMScreen *scrPtr, WMFont *font, - const WMFontAttributes *changes) -{ - int index[FONT_PROPS], count[FONT_PROPS]; - int totalProps, i, j, carry; - char fname[512]; - WMFontFlags fFlags; - WMBag *props; - WMArray *options; - WMFont *result; - char *prop; - - snprintf(fname, 512, "%s", font->name); - - fFlags = (font->antialiased ? WFAntialiased : WFNotAntialiased); - fFlags |= (font->notFontSet ? WFNormalFont : WFFontSet); - - props = WMCreateBagWithDestructor(1, (WMFreeDataProc*)WMFreeArray); - - totalProps = 0; - for (i=0; iprops[i]; - count[i] = index[i] = 0; - if (!prop) { - /* No change for this property */ - continue; - } else if (strchr(prop, ',')==NULL) { - /* Simple option */ - changeFontProp(fname, prop, i); - } else { - /* Option with fallback alternatives */ - if ((changes==WFAEmphasized || changes==WFABoldEmphasized) && - font->antialiased && strcmp(prop, "o,i")==0) { - options = getOptions("i,o"); - } else { - options = getOptions(prop); - } - WMInsertInBag(props, i, options); - count[i] = WMGetArrayItemCount(options); - if (totalProps==0) - totalProps = 1; - totalProps = totalProps * count[i]; - } - } - - if (totalProps == 0) { - /* No options with fallback alternatives at all */ - WMFreeBag(props); - return WMCreateFontWithFlags(scrPtr, fname, fFlags); - } - - for (i=0; i=0; j--) { - if (count[j]!=0) { - index[j] += carry; - carry = (index[j]==count[j]); - index[j] %= count[j]; - } - } - } - - WMFreeBag(props); - - return NULL; -} - -// should WFANormal also set "normal" or leave it alone? -static const WMFontAttributes W_FANormal = { - WFAUnchanged, WFAUnchanged, "medium,normal,regular", "r", "normal", - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged -}; - - -static const WMFontAttributes W_FABold = { - WFAUnchanged, WFAUnchanged, "bold", WFAUnchanged, - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged -}; - - -static const WMFontAttributes W_FANotBold = { - WFAUnchanged, WFAUnchanged, "medium,normal,regular", WFAUnchanged, - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged -}; - - -static const WMFontAttributes W_FAEmphasized = { - WFAUnchanged, WFAUnchanged, WFAUnchanged, "o,i", - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged -}; - - -static const WMFontAttributes W_FANotEmphasized = { - WFAUnchanged, WFAUnchanged, WFAUnchanged, "r", - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged -}; - - -static const WMFontAttributes W_FABoldEmphasized = { - WFAUnchanged, WFAUnchanged, "bold", "o,i", - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, - WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged -}; - - -const WMFontAttributes *WFANormal = &W_FANormal; -const WMFontAttributes *WFABold = &W_FABold; -const WMFontAttributes *WFANotBold = &W_FANotBold; -const WMFontAttributes *WFAEmphasized = &W_FAEmphasized; -const WMFontAttributes *WFANotEmphasized = &W_FANotEmphasized; -const WMFontAttributes *WFABoldEmphasized = &W_FABoldEmphasized; - - -#endif - - + +#include "wconfig.h" + +#ifdef XFT + +#include +#include + +#if defined(HAVE_MBSNRTOWCS) +# define __USE_GNU +#endif + +#ifdef HAVE_WCHAR_H +# include +#endif + +#include + +#include "WINGsP.h" + +#include +#include +#include + + + +#if defined(HAVE_MBSNRTOWCS) + +static size_t +wmbsnrtowcs(wchar_t *dest, const char **src, size_t nbytes, size_t len) +{ + mbstate_t ps; + size_t n; + + memset(&ps, 0, sizeof(mbstate_t)); + n = mbsnrtowcs(dest, src, nbytes, len, &ps); + if (n!=(size_t)-1 && *src) { + *src -= ps.__count; + } + + return n; +} + +#elif defined(HAVE_MBRTOWC) + +// This is 8 times slower than the version above. +static size_t +wmbsnrtowcs(wchar_t *dest, const char **src, size_t nbytes, size_t len) +{ + mbstate_t ps; + const char *ptr; + size_t n; + int nb; + + if (nbytes==0) + return 0; + + memset(&ps, 0, sizeof(mbstate_t)); + + if (dest == NULL) { + for (ptr=*src, n=0; nbytes>0; n++) { + nb = mbrtowc(NULL, ptr, nbytes, &ps); + if (nb == -1) { + return ((size_t)-1); + } else if (nb==0 || nb==-2) { + return n; + } + ptr += nb; + nbytes -= nb; + } + } + + for (ptr=*src, n=0; n0; n++, dest++) { + nb = mbrtowc(dest, ptr, nbytes, &ps); + if (nb == -2) { + *src = ptr; + return n; + } else if (nb == -1) { + *src = ptr; + return ((size_t)-1); + } else if (nb == 0) { + *src = NULL; + return n; + } + ptr += nb; + nbytes -= nb; + } + + *src = ptr; + return n; +} + +#else + +// Not only 8 times slower than the version based on mbsnrtowcs +// but also this version is not thread safe nor reentrant + +static size_t +wmbsnrtowcs(wchar_t *dest, const char **src, size_t nbytes, size_t len) +{ + const char *ptr; + size_t n; + int nb; + + if (nbytes==0) + return 0; + + mbtowc(NULL, NULL, 0); /* reset shift state */ + + if (dest == NULL) { + for (ptr=*src, n=0; nbytes>0; n++) { + nb = mbtowc(NULL, ptr, nbytes); + if (nb == -1) { + mbtowc(NULL, NULL, 0); + nb = mbtowc(NULL, ptr, strlen(ptr)); + return (nb == -1 ? (size_t)-1 : n); + } else if (nb==0) { + return n; + } + ptr += nb; + nbytes -= nb; + } + } + + for (ptr=*src, n=0; n0; n++, dest++) { + nb = mbtowc(dest, ptr, nbytes); + if (nb == -1) { + mbtowc(NULL, NULL, 0); + nb = mbtowc(NULL, ptr, strlen(ptr)); + *src = ptr; + return (nb == -1 ? (size_t)-1 : n); + } else if (nb == 0) { + *src = NULL; + return n; + } + ptr += nb; + nbytes -= nb; + } + + *src = ptr; + return n; +} + +#endif + + +#define DEFAULT_SIZE 12 + +static char* +fixXLFD(char *xlfd, int size) +{ + char *fname, *ptr; + + fname = wmalloc(strlen(xlfd) + 20); + if (strstr(xlfd, "%d")!=NULL) + sprintf(fname, xlfd, size ? size : DEFAULT_SIZE); + else + strcpy(fname, xlfd); + + if ((ptr = strchr(fname, ','))) { + *ptr = 0; + } + + return fname; +} + + +static Bool +hasProperty(FcPattern *pattern, const char *property) +{ + FcValue val; + + if (FcPatternGet(pattern, property, 0, &val)==FcResultMatch) { + return True; + } + + return False; +} + + +static Bool +hasPropertyWithStringValue(FcPattern *pattern, const char *object, char *value) +{ + FcChar8 *str; + int id; + + if (!value || value[0]==0) + return True; + + id = 0; + while (FcPatternGetString(pattern, object, id, &str)==FcResultMatch) { + if (strcasecmp(value, (char*)str) == 0) { + return True; + } + id++; + } + + return False; +} + + +// also handle an xlfd with %d for size? +static char* +makeFontOfSize(char *font, int size, char *fallback) +{ + FcPattern *pattern; + char *result; + + if (font[0]=='-') { + char *fname; + + fname = fixXLFD(font, size); + pattern = XftXlfdParse(fname, False, False); + wfree(fname); + } else { + pattern = FcNameParse(font); + } + + //FcPatternPrint(pattern); + if (size > 0) { + FcPatternDel(pattern, "pixelsize"); + FcPatternAddDouble(pattern, "pixelsize", (double)size); + } else if (size==0 && !hasProperty(pattern, "size") && + !hasProperty(pattern, "pixelsize")) { + FcPatternAddDouble(pattern, "pixelsize", (double)DEFAULT_SIZE); + } + + if (fallback && !hasPropertyWithStringValue(pattern, "family", fallback)) { + FcPatternAddString(pattern, "family", fallback); + } + + result = FcNameUnparse(pattern); + FcPatternDestroy(pattern); + + return result; +} + + +WMFont* +WMCreateFont(WMScreen *scrPtr, char *fontName) +{ + WMFont *font; + Display *display = scrPtr->display; + char *fname, *ptr; + + /* This is for back-compat (to allow reading of old xlfd descriptions) */ + if (fontName[0]=='-' && (ptr = strchr(fontName, ','))) { + // warn for deprecation + fname = wmalloc(ptr - fontName + 1); + strncpy(fname, fontName, ptr - fontName); + fname[ptr - fontName] = 0; + } else { + fname = wstrdup(fontName); + } + + font = WMHashGet(scrPtr->fontCache, fname); + if (font) { + WMRetainFont(font); + wfree(fname); + return font; + } + + font = wmalloc(sizeof(WMFont)); + memset(font, 0, sizeof(WMFont)); + + font->screen = scrPtr; + + // remove + printf("WMCreateFont: %s\n", fname); + + if (fname[0] == '-') { + // Backward compat thing. Remove in a later version + font->font = XftFontOpenXlfd(display, scrPtr->screen, fname); + } else { + font->font = XftFontOpenName(display, scrPtr->screen, fname); + } + if (!font->font) { + wfree(font); + wfree(fname); + return NULL; + } + font->height = font->font->ascent+font->font->descent; + font->y = font->font->ascent; + + font->refCount = 1; + + font->name = fname; + + assert(WMHashInsert(scrPtr->fontCache, font->name, font)==NULL); + + return font; +} + + +WMFont* +WMRetainFont(WMFont *font) +{ + wassertrv(font!=NULL, NULL); + + font->refCount++; + + return font; +} + + +void +WMReleaseFont(WMFont *font) +{ + wassertr(font!=NULL); + + font->refCount--; + if (font->refCount < 1) { + XftFontClose(font->screen->display, font->font); + if (font->name) { + WMHashRemove(font->screen->fontCache, font->name); + wfree(font->name); + } + wfree(font); + } +} + + +Bool +WMIsAntialiasingEnabled(WMScreen *scrPtr) +{ + return scrPtr->antialiasedText; +} + + +unsigned int +WMFontHeight(WMFont *font) +{ + wassertrv(font!=NULL, 0); + + return font->height; +} + + +char* +WMGetFontName(WMFont *font) +{ + wassertrv(font!=NULL, NULL); + + return font->name; +} + + +WMFont* +WMDefaultSystemFont(WMScreen *scrPtr) +{ + return WMRetainFont(scrPtr->normalFont); +} + + +WMFont* +WMDefaultBoldSystemFont(WMScreen *scrPtr) +{ + return WMRetainFont(scrPtr->boldFont); +} + + +WMFont* +WMSystemFontOfSize(WMScreen *scrPtr, int size) +{ + WMFont *font; + char *fontSpec; + + fontSpec = makeFontOfSize(WINGsConfiguration.systemFont, size, "sans"); + + font = WMCreateFont(scrPtr, fontSpec); + + if (!font) { + wwarning(_("could not load font %s."), fontSpec); + } + + wfree(fontSpec); + + return font; +} + + +WMFont* +WMBoldSystemFontOfSize(WMScreen *scrPtr, int size) +{ + WMFont *font; + char *fontSpec; + + fontSpec = makeFontOfSize(WINGsConfiguration.boldSystemFont, size, "sans"); + + font = WMCreateFont(scrPtr, fontSpec); + + if (!font) { + wwarning(_("could not load font %s."), fontSpec); + } + + wfree(fontSpec); + + return font; +} + + +int +WMWidthOfString(WMFont *font, char *text, int length) +{ + XGlyphInfo extents; + + wassertrv(font!=NULL, 0); + wassertrv(text!=NULL, 0); + + if (font->screen->useWideChar) { + wchar_t *wtext; + const char *mtext; + int len; + + wtext = (wchar_t *)wmalloc(sizeof(wchar_t)*(length+1)); + mtext = text; + len = wmbsnrtowcs(wtext, &mtext, length, length); + if (len>0) { + wtext[len] = L'\0'; /* not really necessary here */ + XftTextExtents32(font->screen->display, font->font, + (XftChar32 *)wtext, len, &extents); + } else { + if (len==-1) { + wwarning(_("Conversion to widechar failed (possible " + "invalid multibyte sequence): '%s':(pos %d)\n"), + text, mtext-text+1); + } + extents.xOff = 0; + } + wfree(wtext); + } else if (font->screen->useMultiByte) { + XftTextExtentsUtf8(font->screen->display, font->font, + (XftChar8 *)text, length, &extents); + } else { + XftTextExtents8(font->screen->display, font->font, + (XftChar8 *)text, length, &extents); + } + + return extents.xOff; /* don't ask :P */ +} + + + +void +WMDrawString(WMScreen *scr, Drawable d, WMColor *color, WMFont *font, + int x, int y, char *text, int length) +{ + XftColor xftcolor; + + wassertr(font!=NULL); + + xftcolor.color.red = color->color.red; + xftcolor.color.green = color->color.green; + xftcolor.color.blue = color->color.blue; + xftcolor.color.alpha = color->alpha;; + xftcolor.pixel = W_PIXEL(color); + + XftDrawChange(scr->xftdraw, d); + + if (font->screen->useWideChar) { + wchar_t *wtext; + const char *mtext; + int len; + + wtext = (wchar_t *)wmalloc(sizeof(wchar_t)*(length+1)); + mtext = text; + len = wmbsnrtowcs(wtext, &mtext, length, length); + if (len>0) { + XftDrawString32(scr->xftdraw, &xftcolor, font->font, + x, y + font->y, (XftChar32*)wtext, len); + } else if (len==-1) { + wwarning(_("Conversion to widechar failed (possible invalid " + "multibyte sequence): '%s':(pos %d)\n"), + text, mtext-text+1); + /* we can draw normal text, or we can draw as much widechar + * text as was already converted until the error. go figure */ + /*XftDrawString8(scr->xftdraw, &xftcolor, font->font, + x, y + font->y, (XftChar8*)text, length);*/ + } + wfree(wtext); + } else if (font->screen->useMultiByte) { + XftDrawStringUtf8(scr->xftdraw, &xftcolor, font->font, + x, y + font->y, (XftChar8*)text, length); + } else { + XftDrawString8(scr->xftdraw, &xftcolor, font->font, + x, y + font->y, (XftChar8*)text, length); + } +} + + +void +WMDrawImageString(WMScreen *scr, Drawable d, WMColor *color, WMColor *background, + WMFont *font, int x, int y, char *text, int length) +{ + XftColor textColor; + XftColor bgColor; + + wassertr(font!=NULL); + + textColor.color.red = color->color.red; + textColor.color.green = color->color.green; + textColor.color.blue = color->color.blue; + textColor.color.alpha = color->alpha;; + textColor.pixel = W_PIXEL(color); + + bgColor.color.red = background->color.red; + bgColor.color.green = background->color.green; + bgColor.color.blue = background->color.blue; + bgColor.color.alpha = background->alpha;; + bgColor.pixel = W_PIXEL(background); + + XftDrawChange(scr->xftdraw, d); + + XftDrawRect(scr->xftdraw, &bgColor, x, y, + WMWidthOfString(font, text, length), + font->height); + + if (font->screen->useWideChar) { + wchar_t *wtext; + const char *mtext; + int len; + + mtext = text; + wtext = (wchar_t *)wmalloc(sizeof(wchar_t)*(length+1)); + len = wmbsnrtowcs(wtext, &mtext, length, length); + if (len>0) { + XftDrawString32(scr->xftdraw, &textColor, font->font, + x, y + font->y, (XftChar32*)wtext, len); + } else if (len==-1) { + wwarning(_("Conversion to widechar failed (possible invalid " + "multibyte sequence): '%s':(pos %d)\n"), + text, mtext-text+1); + /* we can draw normal text, or we can draw as much widechar + * text as was already converted until the error. go figure */ + /*XftDrawString8(scr->xftdraw, &textColor, font->font, + x, y + font->y, (XftChar8*)text, length);*/ + } + wfree(wtext); + } else if (font->screen->useMultiByte) { + XftDrawStringUtf8(scr->xftdraw, &textColor, font->font, + x, y + font->y, (XftChar8*)text, length); + } else { + XftDrawString8(scr->xftdraw, &textColor, font->font, + x, y + font->y, (XftChar8*)text, length); + } +} + + +WMFont* +WMCopyFontWithStyle(WMScreen *scrPtr, WMFont *font, WMFontStyle style) +{ + FcPattern *pattern; + WMFont *copy; + char *name; + + if (!font) + return NULL; + + pattern = FcNameParse(WMGetFontName(font)); + switch (style) { + case WFSNormal: + FcPatternDel(pattern, "weight"); + FcPatternDel(pattern, "slant"); + FcPatternAddString(pattern, "weight", "regular"); + FcPatternAddString(pattern, "weight", "medium"); + FcPatternAddString(pattern, "slant", "roman"); + break; + case WFSBold: + FcPatternDel(pattern, "weight"); + FcPatternAddString(pattern, "weight", "bold"); + break; + case WFSEmphasized: + FcPatternDel(pattern, "slant"); + FcPatternAddString(pattern, "slant", "italic"); + FcPatternAddString(pattern, "slant", "oblique"); + break; + case WFSBoldEmphasized: + FcPatternDel(pattern, "weight"); + FcPatternDel(pattern, "slant"); + FcPatternAddString(pattern, "weight", "bold"); + FcPatternAddString(pattern, "slant", "italic"); + FcPatternAddString(pattern, "slant", "oblique"); + break; + } + + name = FcNameUnparse(pattern); + copy = WMCreateFont(scrPtr, name); + FcPatternDestroy(pattern); + wfree(name); + + return copy; +} + + +#endif /* XFT */ + + diff --git a/WINGs/wfont_noxft.c b/WINGs/wfont_noxft.c new file mode 100644 index 00000000..ffd817c7 --- /dev/null +++ b/WINGs/wfont_noxft.c @@ -0,0 +1,769 @@ + + +#include "wconfig.h" + +#ifndef XFT + +#include "WINGsP.h" + +#include +#include +#include + + +static char *makeFontSetOfSize(char *fontset, int size); + + +/* XLFD pattern matching */ +static char* +getElementFromXLFD(const char *xlfd, int index) +{ + const char *p = xlfd; + while (*p != 0) { + if (*p == '-' && --index == 0) { + const char *end = strchr(p + 1, '-'); + char *buf; + size_t len; + if (end == 0) end = p + strlen(p); + len = end - (p + 1); + buf = wmalloc(len); + memcpy(buf, p + 1, len); + buf[len] = 0; + return buf; + } + p++; + } + return strdup("*"); +} + + +/* XLFD pattern matching */ +static char* +generalizeXLFD(const char *xlfd) +{ + char *buf; + int len; + char *weight = getElementFromXLFD(xlfd, 3); + char *slant = getElementFromXLFD(xlfd, 4); + char *pxlsz = getElementFromXLFD(xlfd, 7); + +#define Xstrlen(A) ((A)?strlen(A):0) + len = Xstrlen(xlfd)+Xstrlen(weight)+Xstrlen(slant)+Xstrlen(pxlsz)*2+60; +#undef Xstrlen + + buf = wmalloc(len + 1); + snprintf(buf, len + 1, "%s,-*-*-%s-%s-*-*-%s-*-*-*-*-*-*-*," + "-*-*-*-*-*-*-%s-*-*-*-*-*-*-*,*", + xlfd, weight, slant, pxlsz, pxlsz); + + wfree(pxlsz); + wfree(slant); + wfree(weight); + + return buf; +} + +/* XLFD pattern matching */ +static XFontSet +W_CreateFontSetWithGuess(Display *dpy, char *xlfd, char ***missing, + int *nmissing, char **def_string) +{ + XFontSet fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string); + + if (fs != NULL && *nmissing == 0) return fs; + + /* for non-iso8859-1 language and iso8859-1 specification + (this fontset is only for pattern analysis) */ + if (fs == NULL) { + if (*nmissing != 0) XFreeStringList(*missing); + setlocale(LC_CTYPE, "C"); + fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string); + setlocale(LC_CTYPE, ""); + } + + /* make XLFD font name for pattern analysis */ + if (fs != NULL) { + XFontStruct **fontstructs; + char **fontnames; + if (XFontsOfFontSet(fs, &fontstructs, &fontnames) > 0) + xlfd = fontnames[0]; + } + + xlfd = generalizeXLFD(xlfd); + + if (*nmissing != 0) XFreeStringList(*missing); + if (fs != NULL) XFreeFontSet(dpy, fs); + + fs = XCreateFontSet(dpy, xlfd, missing, nmissing, def_string); + + wfree(xlfd); + return fs; +} + + +static char* +xlfdFromFontName(char *fontName) +{ + char *systemFont, *boldSystemFont; + char *font; + int size; + + systemFont = WINGsConfiguration.systemFont; + boldSystemFont = WINGsConfiguration.boldSystemFont; + + size = WINGsConfiguration.defaultFontSize; + + if (strcmp(fontName, "SystemFont")==0) { + font = systemFont; + } else if (strncmp(fontName, "SystemFont-", 11)==0) { + font = systemFont; + if (sscanf(&fontName[11], "%i", &size)!=1) { + size = WINGsConfiguration.defaultFontSize; + wwarning(_("Invalid size specification '%s' in %s. " + "Using default %d\n"), &fontName[11], fontName, size); + } + } else if (strcmp(fontName, "BoldSystemFont")==0) { + font = boldSystemFont; + } else if (strncmp(fontName, "BoldSystemFont-", 15)==0) { + font = boldSystemFont; + if (sscanf(&fontName[15], "%i", &size)!=1) { + size = WINGsConfiguration.defaultFontSize; + wwarning(_("Invalid size specification '%s' in %s. " + "Using default %d\n"), &fontName[15], fontName, size); + } + } else { + font = NULL; + } + + return (font!=NULL ? makeFontSetOfSize(font, size) : wstrdup(fontName)); +} + + +WMFont* +WMCreateFontSet(WMScreen *scrPtr, char *fontName) +{ + WMFont *font; + Display *display = scrPtr->display; + char **missing; + int nmissing = 0; + char *defaultString; + char *fname; + XFontSetExtents *extents; + + fname = xlfdFromFontName(fontName); + + font = WMHashGet(scrPtr->fontSetCache, fname); + if (font) { + WMRetainFont(font); + wfree(fname); + return font; + } + + font = wmalloc(sizeof(WMFont)); + memset(font, 0, sizeof(WMFont)); + + font->notFontSet = 0; + + font->screen = scrPtr; + + font->font.set = W_CreateFontSetWithGuess(display, fname, &missing, + &nmissing, &defaultString); + if (nmissing > 0 && font->font.set) { + int i; + + wwarning(_("the following character sets are missing in %s:"), fname); + for (i = 0; i < nmissing; i++) { + wwarning(missing[i]); + } + XFreeStringList(missing); + if (defaultString) + wwarning(_("the string \"%s\" will be used in place of any characters from those sets."), + defaultString); + } + if (!font->font.set) { + wfree(font); + wfree(fname); + return NULL; + } + + extents = XExtentsOfFontSet(font->font.set); + + font->height = extents->max_logical_extent.height; + font->y = font->height - (font->height + extents->max_logical_extent.y); + + font->refCount = 1; + + font->name = fname; + + assert(WMHashInsert(scrPtr->fontSetCache, font->name, font)==NULL); + + return font; +} + + + +WMFont* +WMCreateNormalFont(WMScreen *scrPtr, char *fontName) +{ + WMFont *font; + Display *display = scrPtr->display; + char *fname, *ptr; + + fontName = xlfdFromFontName(fontName); + + if ((ptr = strchr(fontName, ','))) { + fname = wmalloc(ptr - fontName + 1); + strncpy(fname, fontName, ptr - fontName); + fname[ptr - fontName] = 0; + } else { + fname = wstrdup(fontName); + } + + wfree(fontName); + + font = WMHashGet(scrPtr->fontCache, fname); + if (font) { + WMRetainFont(font); + wfree(fname); + return font; + } + + font = wmalloc(sizeof(WMFont)); + memset(font, 0, sizeof(WMFont)); + + font->notFontSet = 1; + + font->screen = scrPtr; + + font->font.normal = XLoadQueryFont(display, fname); + if (!font->font.normal) { + wfree(font); + wfree(fname); + return NULL; + } + font->height = font->font.normal->ascent+font->font.normal->descent; + font->y = font->font.normal->ascent; + + font->refCount = 1; + + font->name = fname; + + assert(WMHashInsert(scrPtr->fontCache, font->name, font)==NULL); + + return font; +} + + +WMFont* +WMCreateFont(WMScreen *scrPtr, char *fontName) +{ + return WMCreateFontWithFlags(scrPtr, fontName, WFDefaultFont); +} + + +WMFont* +WMCreateFontWithFlags(WMScreen *scrPtr, char *fontName, WMFontFlags flags) +{ + Bool multiByte = scrPtr->useMultiByte; + WMFont *font; + + if (flags & WFFontSet) { + multiByte = True; + } else if (flags & WFNormalFont) { + multiByte = False; + } + + } else if (multiByte) { + font = WMCreateFontSet(scrPtr, fontName); + } else { + font = WMCreateNormalFont(scrPtr, fontName); + } + + return font; +} + + +WMFont* +WMRetainFont(WMFont *font) +{ + wassertrv(font!=NULL, NULL); + + font->refCount++; + + return font; +} + + +void +WMReleaseFont(WMFont *font) +{ + wassertr(font!=NULL); + + font->refCount--; + if (font->refCount < 1) { + if (font->notFontSet) { + XFreeFont(font->screen->display, font->font.normal); + } else { + XFreeFontSet(font->screen->display, font->font.set); + } + + if (font->name) { + if (font->notFontSet) { + WMHashRemove(font->screen->fontCache, font->name); + } else { + WMHashRemove(font->screen->fontSetCache, font->name); + } + wfree(font->name); + } + wfree(font); + } +} + + +Bool +WMIsAntialiasingEnabled(WMScreen *scrPtr) +{ + return False; +} + + +unsigned int +WMFontHeight(WMFont *font) +{ + wassertrv(font!=NULL, 0); + + return font->height; +} + + +char* +WMGetFontName(WMFont *font) +{ + wassertrv(font!=NULL, NULL); + + return font->name; +} + + +WMFont* +WMDefaultSystemFont(WMScreen *scrPtr) +{ + return WMRetainFont(scrPtr->normalFont); +} + + +WMFont* +WMDefaultBoldSystemFont(WMScreen *scrPtr) +{ + return WMRetainFont(scrPtr->boldFont); +} + + +static WMFont* +makeSystemFontOfSize(WMScreen *scrPtr, int size, Bool bold) +{ + WMFont *font; + char *fontSpec; + +#define WConf WINGsConfiguration + if (bold) { + fontSpec = makeFontSetOfSize(WConf.boldSystemFont, size); + } else { + fontSpec = makeFontSetOfSize(WConf.systemFont, size); + } +#undef WConf + + if (scrPtr->useMultiByte) { + font = WMCreateFontSet(scrPtr, fontSpec); + } else { + font = WMCreateNormalFont(scrPtr, fontSpec); + } + + if (!font) { + if (scrPtr->useMultiByte) { + wwarning(_("could not load font set %s. Trying fixed."), fontSpec); + font = WMCreateFontSet(scrPtr, "fixed"); + if (!font) { + font = WMCreateFontSet(scrPtr, "-*-fixed-medium-r-normal-*-14-*-*-*-*-*-*-*"); + } + } else { + wwarning(_("could not load font %s. Trying fixed."), fontSpec); + font = WMCreateNormalFont(scrPtr, "fixed"); + } + if (!font) { + wwarning(_("could not load fixed font!")); + wfree(fontSpec); + return NULL; + } + } + wfree(fontSpec); + + return font; +} + + +WMFont* +WMSystemFontOfSize(WMScreen *scrPtr, int size) +{ + return makeSystemFontOfSize(scrPtr, size, False); +} + + +WMFont* +WMBoldSystemFontOfSize(WMScreen *scrPtr, int size) +{ + return makeSystemFontOfSize(scrPtr, size, True); +} + + +XFontSet +WMGetFontFontSet(WMFont *font) +{ + wassertrv(font!=NULL, NULL); + + if (!font->notFontSet && !font->antialiased) + return font->font.set; + + return NULL; +} + + +int +WMWidthOfString(WMFont *font, char *text, int length) +{ + wassertrv(font!=NULL, 0); + wassertrv(text!=NULL, 0); + + if (font->notFontSet) { + return XTextWidth(font->font.normal, text, length); + } else { + XRectangle rect; + XRectangle AIXsucks; + + XmbTextExtents(font->font.set, text, length, &AIXsucks, &rect); + + return rect.width; + } +} + + + +void +WMDrawString(WMScreen *scr, Drawable d, WMColor *color, WMFont *font, + int x, int y, char *text, int length) +{ + wassertr(font!=NULL); + + if (font->notFontSet) { + XSetFont(scr->display, scr->drawStringGC, font->font.normal->fid); + XSetForeground(scr->display, scr->drawStringGC, W_PIXEL(color)); + XDrawString(scr->display, d, scr->drawStringGC, x, y + font->y, + text, length); + } else { + XSetForeground(scr->display, scr->drawStringGC, W_PIXEL(color)); + XmbDrawString(scr->display, d, font->font.set, scr->drawStringGC, + x, y + font->y, text, length); + } +} + + +void +WMDrawImageString(WMScreen *scr, Drawable d, WMColor *color, WMColor *background, + WMFont *font, int x, int y, char *text, int length) +{ + wassertr(font!=NULL); + + if (font->notFontSet) { + XSetForeground(scr->display, scr->drawImStringGC, W_PIXEL(color)); + XSetBackground(scr->display, scr->drawImStringGC, W_PIXEL(background)); + XSetFont(scr->display, scr->drawImStringGC, font->font.normal->fid); + XDrawImageString(scr->display, d, scr->drawImStringGC, + x, y + font->y, text, length); + } else { + XSetForeground(scr->display, scr->drawImStringGC, W_PIXEL(color)); + XSetBackground(scr->display, scr->drawImStringGC, W_PIXEL(background)); + XmbDrawImageString(scr->display, d, font->font.set, scr->drawImStringGC, + x, y + font->y, text, length); + } +} + + + + +static char* +makeFontSetOfSize(char *fontset, int size) +{ + char font[300], *f; + char *newfs = NULL; + char *ptr; + + do { + char *tmp; + int end; + + + f = fontset; + ptr = strchr(fontset, ','); + if (ptr) { + int count = ptr-fontset; + + if (count > 255) { + wwarning(_("font description %s is too large."), fontset); + } else { + memcpy(font, fontset, count); + font[count] = 0; + f = (char*)font; + } + } + + if (newfs) + end = strlen(newfs); + else + end = 0; + + tmp = wmalloc(end + strlen(f) + 8); + if (end != 0) { + sprintf(tmp, "%s,", newfs); + sprintf(tmp + end + 1, f, size); + } else { + sprintf(tmp + end, f, size); + } + + if (newfs) + wfree(newfs); + newfs = tmp; + + fontset = ptr+1; + } while (ptr!=NULL); + + return newfs; +} + + +#define FONT_PROPS 14 + +typedef struct { + char *props[FONT_PROPS]; +} W_FontAttributes; + + +static void +changeFontProp(char *buf, char *newprop, int position) +{ + char buf2[512]; + char *ptr, *pptr, *rptr; + int count; + + if (buf[0]!='-') { + /* // remove warning later. or maybe not */ + wwarning(_("Invalid font specification: '%s'\n"), buf); + return; + } + + ptr = pptr = rptr = buf; + count = 0; + while (*ptr && *ptr!=',') { + if (*ptr == '-') { + count++; + if (count-1==position+1) { + rptr = ptr; + break; + } + if (count-1==position) { + pptr = ptr+1; + } + } + ptr++; + } + if (position==FONT_PROPS-1) { + rptr = ptr; + } + + *pptr = 0; + snprintf(buf2, 512, "%s%s%s", buf, newprop, rptr); + strcpy(buf, buf2); +} + + +static WMArray* +getOptions(char *options) +{ + char *ptr, *ptr2, *str; + WMArray *result; + int count; + + result = WMCreateArrayWithDestructor(2, (WMFreeDataProc*)wfree); + + ptr = options; + while (1) { + ptr2 = strchr(ptr, ','); + if (!ptr2) { + WMAddToArray(result, wstrdup(ptr)); + break; + } else { + count = ptr2 - ptr; + str = wmalloc(count+1); + memcpy(str, ptr, count); + str[count] = 0; + WMAddToArray(result, str); + ptr = ptr2 + 1; + } + } + + return result; +} + + +#define WFAUnchanged (NULL) +/* Struct for font change operations */ +typedef struct WMFontAttributes { + char *foundry; + char *family; + char *weight; + char *slant; + char *setWidth; + char *addStyle; + char *pixelSize; + char *pointSize; + char *resolutionX; + char *resolutionY; + char *spacing; + char *averageWidth; + char *registry; + char *encoding; +} WMFontAttributes; + +WMFont* +WMCopyFontWithChanges(WMScreen *scrPtr, WMFont *font, + const WMFontAttributes *changes) +{ + int index[FONT_PROPS], count[FONT_PROPS]; + int totalProps, i, j, carry; + char fname[512]; + WMFontFlags fFlags; + WMBag *props; + WMArray *options; + WMFont *result; + char *prop; + + snprintf(fname, 512, "%s", font->name); + + fFlags = (font->antialiased ? WFAntialiased : WFNotAntialiased); + fFlags |= (font->notFontSet ? WFNormalFont : WFFontSet); + + props = WMCreateBagWithDestructor(1, (WMFreeDataProc*)WMFreeArray); + + totalProps = 0; + for (i=0; iprops[i]; + count[i] = index[i] = 0; + if (!prop) { + /* No change for this property */ + continue; + } else if (strchr(prop, ',')==NULL) { + /* Simple option */ + changeFontProp(fname, prop, i); + } else { + /* Option with fallback alternatives */ + if ((changes==WFAEmphasized || changes==WFABoldEmphasized) && + font->antialiased && strcmp(prop, "o,i")==0) { + options = getOptions("i,o"); + } else { + options = getOptions(prop); + } + WMInsertInBag(props, i, options); + count[i] = WMGetArrayItemCount(options); + if (totalProps==0) + totalProps = 1; + totalProps = totalProps * count[i]; + } + } + + if (totalProps == 0) { + /* No options with fallback alternatives at all */ + WMFreeBag(props); + return WMCreateFontWithFlags(scrPtr, fname, fFlags); + } + + for (i=0; i=0; j--) { + if (count[j]!=0) { + index[j] += carry; + carry = (index[j]==count[j]); + index[j] %= count[j]; + } + } + } + + WMFreeBag(props); + + return NULL; +} + +// should WFANormal also set "normal" or leave it alone? +static const WMFontAttributes W_FANormal = { + WFAUnchanged, WFAUnchanged, "medium,normal,regular", "r", "normal", + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged +}; + + +static const WMFontAttributes W_FABold = { + WFAUnchanged, WFAUnchanged, "bold", WFAUnchanged, + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged +}; + + +static const WMFontAttributes W_FANotBold = { + WFAUnchanged, WFAUnchanged, "medium,normal,regular", WFAUnchanged, + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged +}; + + +static const WMFontAttributes W_FAEmphasized = { + WFAUnchanged, WFAUnchanged, WFAUnchanged, "o,i", + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged +}; + + +static const WMFontAttributes W_FANotEmphasized = { + WFAUnchanged, WFAUnchanged, WFAUnchanged, "r", + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged +}; + + +static const WMFontAttributes W_FABoldEmphasized = { + WFAUnchanged, WFAUnchanged, "bold", "o,i", + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, + WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged, WFAUnchanged +}; + + +const WMFontAttributes *WFANormal = &W_FANormal; +const WMFontAttributes *WFABold = &W_FABold; +const WMFontAttributes *WFANotBold = &W_FANotBold; +const WMFontAttributes *WFAEmphasized = &W_FAEmphasized; +const WMFontAttributes *WFANotEmphasized = &W_FANotEmphasized; +const WMFontAttributes *WFABoldEmphasized = &W_FABoldEmphasized; + + +#endif + diff --git a/WINGs/wfontpanel.c b/WINGs/wfontpanel.c index 5ee6bde8..48fe933f 100644 --- a/WINGs/wfontpanel.c +++ b/WINGs/wfontpanel.c @@ -9,6 +9,10 @@ #include #include +#ifdef XFT +#include +#include +#endif /* XXX TODO */ @@ -22,7 +26,7 @@ typedef struct W_FontPanel { WMFrame *upperF; WMTextField *sampleT; - + WMSplitView *split; WMFrame *lowerF; @@ -39,7 +43,7 @@ typedef struct W_FontPanel { WMButton *revertB; WMButton *setB; - + WMPropList *fdb; } FontPanel; @@ -65,24 +69,27 @@ typedef struct W_FontPanel { static int scalableFontSizes[] = { - 8, - 10, - 11, - 12, - 14, - 16, - 18, - 20, - 24, - 36, - 48, - 64 + 8, + 10, + 11, + 12, + 14, + 16, + 18, + 20, + 24, + 36, + 48, + 64 }; - -static void getSelectedFont(FontPanel *panel, char buffer[], int bufsize); +#ifdef XFT +static void setFontPanelFontName(FontPanel *panel, FcChar8 *family, FcChar8 *style, double size); +#endif + +static int isXLFD(char *font, int *length_ret); static void arrangeLowerFrame(FontPanel *panel); @@ -97,10 +104,10 @@ static void listFamilies(WMScreen *scr, WMFontPanel *panel); static void splitViewConstrainCallback(WMSplitView *sPtr, int indView, int *min, int *max) { - if (indView == 0) - *min = MIN_UPPER_HEIGHT; + if (indView == 0) + *min = MIN_UPPER_HEIGHT; else - *min = MIN_LOWER_HEIGHT; + *min = MIN_LOWER_HEIGHT; } static void @@ -110,42 +117,42 @@ notificationObserver(void *self, WMNotification *notif) void *object = WMGetNotificationObject(notif); if (WMGetNotificationName(notif) == WMViewSizeDidChangeNotification) { - if (object == WMWidgetView(panel->win)) { - int h = WMWidgetHeight(panel->win); - int w = WMWidgetWidth(panel->win); - - WMResizeWidget(panel->split, w, h-BUTTON_SPACE_HEIGHT); - - WMMoveWidget(panel->setB, w-80, h-(BUTTON_SPACE_HEIGHT-5)); - - WMMoveWidget(panel->revertB, w-240, h-(BUTTON_SPACE_HEIGHT-5)); - - } else if (object == WMWidgetView(panel->upperF)) { - - if (WMWidgetHeight(panel->upperF) < MIN_UPPER_HEIGHT) { - WMResizeWidget(panel->upperF, WMWidgetWidth(panel->upperF), - MIN_UPPER_HEIGHT); - } else { - WMResizeWidget(panel->sampleT, WMWidgetWidth(panel->upperF)-20, - WMWidgetHeight(panel->upperF)-10); - } - - } else if (object == WMWidgetView(panel->lowerF)) { - - if (WMWidgetHeight(panel->lowerF) < MIN_LOWER_HEIGHT) { - WMResizeWidget(panel->upperF, WMWidgetWidth(panel->upperF), - MIN_UPPER_HEIGHT); - - WMMoveWidget(panel->lowerF, 0, WMWidgetHeight(panel->upperF) - + WMGetSplitViewDividerThickness(panel->split)); - - WMResizeWidget(panel->lowerF, WMWidgetWidth(panel->lowerF), - WMWidgetWidth(panel->split) - MIN_UPPER_HEIGHT - - WMGetSplitViewDividerThickness(panel->split)); - } else { - arrangeLowerFrame(panel); - } - } + if (object == WMWidgetView(panel->win)) { + int h = WMWidgetHeight(panel->win); + int w = WMWidgetWidth(panel->win); + + WMResizeWidget(panel->split, w, h-BUTTON_SPACE_HEIGHT); + + WMMoveWidget(panel->setB, w-80, h-(BUTTON_SPACE_HEIGHT-5)); + + WMMoveWidget(panel->revertB, w-240, h-(BUTTON_SPACE_HEIGHT-5)); + + } else if (object == WMWidgetView(panel->upperF)) { + + if (WMWidgetHeight(panel->upperF) < MIN_UPPER_HEIGHT) { + WMResizeWidget(panel->upperF, WMWidgetWidth(panel->upperF), + MIN_UPPER_HEIGHT); + } else { + WMResizeWidget(panel->sampleT, WMWidgetWidth(panel->upperF)-20, + WMWidgetHeight(panel->upperF)-10); + } + + } else if (object == WMWidgetView(panel->lowerF)) { + + if (WMWidgetHeight(panel->lowerF) < MIN_LOWER_HEIGHT) { + WMResizeWidget(panel->upperF, WMWidgetWidth(panel->upperF), + MIN_UPPER_HEIGHT); + + WMMoveWidget(panel->lowerF, 0, WMWidgetHeight(panel->upperF) + + WMGetSplitViewDividerThickness(panel->split)); + + WMResizeWidget(panel->lowerF, WMWidgetWidth(panel->lowerF), + WMWidgetWidth(panel->split) - MIN_UPPER_HEIGHT + - WMGetSplitViewDividerThickness(panel->split)); + } else { + arrangeLowerFrame(panel); + } + } } } @@ -154,7 +161,7 @@ static void closeWindow(WMWidget *w, void *data) { FontPanel *panel = (FontPanel*)data; - + WMHideFontPanel(panel); } @@ -165,16 +172,16 @@ static void setClickedAction(WMWidget *w, void *data) { FontPanel *panel = (FontPanel*)data; - + if (panel->action) - (*panel->action)(panel, panel->data); + (*panel->action)(panel, panel->data); } static void revertClickedAction(WMWidget *w, void *data) { - FontPanel *panel = (FontPanel*)data; + /*FontPanel *panel = (FontPanel*)data;*/ /* XXX TODO */ } @@ -189,18 +196,19 @@ WMGetFontPanel(WMScreen *scr) int divThickness; if (scr->sharedFontPanel) - return scr->sharedFontPanel; + return scr->sharedFontPanel; panel = wmalloc(sizeof(FontPanel)); memset(panel, 0, sizeof(FontPanel)); - + panel->win = WMCreateWindow(scr, "fontPanel"); -/* WMSetWidgetBackgroundColor(panel->win, WMWhiteColor(scr));*/ + /* WMSetWidgetBackgroundColor(panel->win, WMWhiteColor(scr));*/ + WMSetWindowTitle(panel->win, _("Font Panel")); WMResizeWidget(panel->win, DEF_WIDTH, DEF_HEIGHT); WMSetWindowMinSize(panel->win, MIN_WIDTH, MIN_HEIGHT); WMSetViewNotifySizeChanges(WMWidgetView(panel->win), True); - + WMSetWindowCloseAction(panel->win, closeWindow, panel); panel->split = WMCreateSplitView(panel->win); @@ -213,7 +221,7 @@ WMGetFontPanel(WMScreen *scr) WMSetFrameRelief(panel->upperF, WRFlat); WMSetViewNotifySizeChanges(WMWidgetView(panel->upperF), True); panel->lowerF = WMCreateFrame(panel->win); -/* WMSetWidgetBackgroundColor(panel->lowerF, WMBlackColor(scr));*/ + /* WMSetWidgetBackgroundColor(panel->lowerF, WMBlackColor(scr));*/ WMSetFrameRelief(panel->lowerF, WRFlat); WMSetViewNotifySizeChanges(WMWidgetView(panel->lowerF), True); @@ -221,7 +229,7 @@ WMGetFontPanel(WMScreen *scr) WMAddSplitViewSubview(panel->split, W_VIEW(panel->lowerF)); WMResizeWidget(panel->upperF, DEF_WIDTH, DEF_UPPER_HEIGHT); - + WMResizeWidget(panel->lowerF, DEF_WIDTH, DEF_LOWER_HEIGHT); WMMoveWidget(panel->lowerF, 0, 60+divThickness); @@ -232,7 +240,7 @@ WMGetFontPanel(WMScreen *scr) panel->sampleT = WMCreateTextField(panel->upperF); WMResizeWidget(panel->sampleT, DEF_WIDTH - 20, 50); WMMoveWidget(panel->sampleT, 10, 10); - WMSetTextFieldText(panel->sampleT, _("Test!!!")); + WMSetTextFieldText(panel->sampleT, _("The quick brown fox jumps over the lazy dog")); font = WMBoldSystemFontOfSize(scr, 12); @@ -243,7 +251,7 @@ WMGetFontPanel(WMScreen *scr) WMSetLabelTextColor(panel->famL, white); WMSetLabelRelief(panel->famL, WRSunken); WMSetLabelTextAlignment(panel->famL, WACenter); - + panel->famLs = WMCreateList(panel->lowerF); WMSetListAction(panel->famLs, familyClick, panel); @@ -253,7 +261,7 @@ WMGetFontPanel(WMScreen *scr) WMSetLabelFont(panel->typL, font); WMSetLabelTextColor(panel->typL, white); WMSetLabelRelief(panel->typL, WRSunken); - WMSetLabelTextAlignment(panel->typL, WACenter); + WMSetLabelTextAlignment(panel->typL, WACenter); panel->typLs = WMCreateList(panel->lowerF); WMSetListAction(panel->typLs, typefaceClick, panel); @@ -267,7 +275,7 @@ WMGetFontPanel(WMScreen *scr) WMSetLabelTextAlignment(panel->sizL, WACenter); panel->sizT = WMCreateTextField(panel->lowerF); -/* WMSetTextFieldAlignment(panel->sizT, WARight);*/ + /* WMSetTextFieldAlignment(panel->sizT, WARight);*/ panel->sizLs = WMCreateList(panel->lowerF); WMSetListAction(panel->sizLs, sizeClick, panel); @@ -275,7 +283,7 @@ WMGetFontPanel(WMScreen *scr) WMReleaseFont(font); WMReleaseColor(white); WMReleaseColor(dark); - + panel->setB = WMCreateCommandButton(panel->win); WMResizeWidget(panel->setB, 70, 24); WMMoveWidget(panel->setB, 240, DEF_HEIGHT - (BUTTON_SPACE_HEIGHT-5)); @@ -304,20 +312,20 @@ WMGetFontPanel(WMScreen *scr) /* register notification observers */ - WMAddNotificationObserver(notificationObserver, panel, - WMViewSizeDidChangeNotification, - WMWidgetView(panel->win)); - WMAddNotificationObserver(notificationObserver, panel, - WMViewSizeDidChangeNotification, - WMWidgetView(panel->upperF)); - WMAddNotificationObserver(notificationObserver, panel, - WMViewSizeDidChangeNotification, - WMWidgetView(panel->lowerF)); + WMAddNotificationObserver(notificationObserver, panel, + WMViewSizeDidChangeNotification, + WMWidgetView(panel->win)); + WMAddNotificationObserver(notificationObserver, panel, + WMViewSizeDidChangeNotification, + WMWidgetView(panel->upperF)); + WMAddNotificationObserver(notificationObserver, panel, + WMViewSizeDidChangeNotification, + WMWidgetView(panel->lowerF)); listFamilies(scr, panel); - - + + return panel; } @@ -326,7 +334,7 @@ void WMFreeFontPanel(WMFontPanel *panel) { if (panel == WMWidgetScreen(panel->win)->sharedFontPanel) { - WMWidgetScreen(panel->win)->sharedFontPanel = NULL; + WMWidgetScreen(panel->win)->sharedFontPanel = NULL; } WMRemoveNotificationObserver(panel); WMUnmapWidget(panel->win); @@ -349,21 +357,6 @@ WMHideFontPanel(WMFontPanel *panel) } -void -WMSetFontPanelFont(WMFontPanel *panel, WMFont *font) -{ - -} - - -Bool -WMSetFontPanelFontName(WMFontPanel *panel, char *fontName) -{ - - return True; -} - - WMFont* WMGetFontPanelFont(WMFontPanel *panel) { @@ -371,19 +364,38 @@ WMGetFontPanelFont(WMFontPanel *panel) } -char* -WMGetFontPanelFontName(WMFontPanel *panel) +void +WMSetFontPanelFont(WMFontPanel *panel, char *fontName) { - char name[512]; +#ifdef XFT + int fname_len; + FcPattern *pattern; + FcChar8 *family, *style; + double size; + + if (!isXLFD(fontName, &fname_len)) { + /* maybe its proper fontconfig and we can parse it */ + pattern = FcNameParse(fontName); + } else { + /* maybe its proper xlfd and we can convert it to an FcPattern */ + pattern = XftXlfdParse(fontName, False, False); + //FcPatternPrint(pattern); + } - getSelectedFont(panel, name, sizeof(name)); + if (!pattern) + return; - return wstrdup(name); -} + if (FcPatternGetString(pattern, FC_FAMILY, 0, &family)==FcResultMatch) + if (FcPatternGetString(pattern, FC_STYLE, 0, &style)==FcResultMatch) + if (FcPatternGetDouble(pattern, "pixelsize", 0, &size)==FcResultMatch) + setFontPanelFontName(panel, family, style, size); + FcPatternDestroy(pattern); +#endif +} -void +void WMSetFontPanelAction(WMFontPanel *panel, WMAction2 *action, void *data) { panel->action = action; @@ -404,7 +416,7 @@ arrangeLowerFrame(FontPanel *panel) #define LABEL_HEIGHT 20 height -= WMGetSplitViewDividerThickness(panel->split); - + height -= LABEL_HEIGHT + 8; @@ -458,6 +470,22 @@ arrangeLowerFrame(FontPanel *panel) +static int +isXLFD(char *font, int *length_ret) +{ + int c = 0; + + *length_ret = 0; + while (*font) { + (*length_ret)++; + if (*font++ == '-') + c++; + } + + return c==NUM_FIELDS; +} + +#ifndef XFT static Bool parseFont(char *font, char values[NUM_FIELDS][256]) { @@ -470,40 +498,24 @@ parseFont(char *font, char values[NUM_FIELDS][256]) ptr++; /* skip first - */ bptr = buffer; while (*ptr) { - if (*ptr == '-') { - *bptr = 0; - strcpy(values[part], buffer); - bptr = buffer; - part++; - } else { - *bptr++ = *ptr; - } - ptr++; + if (*ptr == '-') { + *bptr = 0; + strcpy(values[part], buffer); + bptr = buffer; + part++; + } else { + *bptr++ = *ptr; + } + ptr++; } *bptr = 0; strcpy(values[part], buffer); - + return True; } -static int -isXLFD(char *font, int *length_ret) -{ - int c = 0; - - *length_ret = 0; - while (*font) { - (*length_ret)++; - if (*font++ == '-') - c++; - } - - return c==NUM_FIELDS; -} - - typedef struct { @@ -512,10 +524,10 @@ typedef struct { char *setWidth; char *addStyle; - + char showSetWidth; /* when duplicated */ char showAddStyle; /* when duplicated */ - + WMArray *sizes; } Typeface; @@ -531,6 +543,18 @@ typedef struct { WMArray *typefaces; } Family; +#endif +#ifdef XFT +typedef struct { + char *typeface; + WMArray *sizes; +} Xft_Typeface; + +typedef struct { + char *name; /* gotta love simplicity */ + WMArray *typefaces; +} Xft_Family; +#endif @@ -542,38 +566,69 @@ compare_int(const void *a, const void *b) int i2 = *(int*)b; if (i1 < i2) - return -1; + return -1; else if (i1 > i2) - return 1; + return 1; else - return 0; + return 0; } - static void +#ifdef XFT +addSizeToTypeface(Xft_Typeface *face, int size) +#else addSizeToTypeface(Typeface *face, int size) +#endif { if (size == 0) { - int j; - - for (j = 0; j < sizeof(scalableFontSizes)/sizeof(int); j++) { - size = scalableFontSizes[j]; - - if (!WMCountInArray(face->sizes, (void*)size)) { - WMAddToArray(face->sizes, (void*)size); - } - } - WMSortArray(face->sizes, compare_int); + int j; + + for (j = 0; j < sizeof(scalableFontSizes)/sizeof(int); j++) { + size = scalableFontSizes[j]; + + if (!WMCountInArray(face->sizes, (void*)size)) { + WMAddToArray(face->sizes, (void*)size); + } + } + WMSortArray(face->sizes, compare_int); } else { - if (!WMCountInArray(face->sizes, (void*)size)) { - WMAddToArray(face->sizes, (void*)size); - WMSortArray(face->sizes, compare_int); - } + if (!WMCountInArray(face->sizes, (void*)size)) { + WMAddToArray(face->sizes, (void*)size); + WMSortArray(face->sizes, compare_int); + } } } +#ifdef XFT +static void +addTypefaceToXftFamily(Xft_Family *fam, char *style) +{ + Xft_Typeface *face; + WMArrayIterator i; + + if(fam->typefaces) { + WM_ITERATE_ARRAY(fam->typefaces, face, i) { + if(strcmp(face->typeface, style) != 0) + continue; /* go to next interation */ + addSizeToTypeface(face, 0); + return; + } + } else { + fam->typefaces = WMCreateArray(4); + } + + face = wmalloc(sizeof(Xft_Typeface)); + memset(face, 0 , sizeof(Xft_Typeface)); + face->typeface = wstrdup(style); + face->sizes = WMCreateArray(4); + addSizeToTypeface(face, 0); + + WMAddToArray(fam->typefaces, face); +} + +#else /* XFT */ static void addTypefaceToFamily(Family *family, char fontFields[NUM_FIELDS][256]) @@ -583,23 +638,23 @@ addTypefaceToFamily(Family *family, char fontFields[NUM_FIELDS][256]) if (family->typefaces) { WM_ITERATE_ARRAY(family->typefaces, face, i) { - int size; + int size; - if (strcmp(face->weight, fontFields[WEIGHT]) != 0) { - continue; - } - if (strcmp(face->slant, fontFields[SLANT]) != 0) { - continue; - } + if (strcmp(face->weight, fontFields[WEIGHT]) != 0) { + continue; + } + if (strcmp(face->slant, fontFields[SLANT]) != 0) { + continue; + } - size = atoi(fontFields[PIXEL_SIZE]); + size = atoi(fontFields[PIXEL_SIZE]); - addSizeToTypeface(face, size); + addSizeToTypeface(face, size); - return; - } + return; + } } else { - family->typefaces = WMCreateArray(4); + family->typefaces = WMCreateArray(4); } face = wmalloc(sizeof(Typeface)); @@ -615,14 +670,47 @@ addTypefaceToFamily(Family *family, char fontFields[NUM_FIELDS][256]) WMAddToArray(family->typefaces, face); } - +#endif /* * families (same family name) (Hashtable of family -> array) * registries (same family but different registries) - * + * */ +#ifdef XFT +static void +addFontToXftFamily(WMHashTable *families, char *name, char *style) +{ + WMArrayIterator i; + WMArray *array; + Xft_Family *fam; + + array = WMHashGet(families, name); + if(array) { + WM_ITERATE_ARRAY(array, fam, i) { + if(strcmp(fam->name, name) == 0 ) + addTypefaceToXftFamily(fam, style); + return; + } + } + + array = WMCreateArray(8); + + fam = wmalloc(sizeof(Xft_Family)); + memset(fam, 0, sizeof(Xft_Family)); + + fam->name = wstrdup(name); + + addTypefaceToXftFamily(fam, style); + + WMAddToArray(array, fam); + + WMHashInsert(families, fam->name, array); +} + +#else /* XFT */ + static void addFontToFamily(WMHashTable *families, char fontFields[NUM_FIELDS][256]) { @@ -632,87 +720,87 @@ addFontToFamily(WMHashTable *families, char fontFields[NUM_FIELDS][256]) family = WMHashGet(families, fontFields[FAMILY]); - + if (family) { - /* look for same encoding/registry and foundry */ + /* look for same encoding/registry and foundry */ WM_ITERATE_ARRAY(family, fam, i) { - int enc, reg, found; - - enc = (strcmp(fam->encoding, fontFields[ENCODING]) == 0); - reg = (strcmp(fam->registry, fontFields[REGISTRY]) == 0); - found = (strcmp(fam->foundry, fontFields[FOUNDRY]) == 0); - - if (enc && reg && found) { - addTypefaceToFamily(fam, fontFields); - return; - } - } - /* look for same encoding/registry */ + int enc, reg, found; + + enc = (strcmp(fam->encoding, fontFields[ENCODING]) == 0); + reg = (strcmp(fam->registry, fontFields[REGISTRY]) == 0); + found = (strcmp(fam->foundry, fontFields[FOUNDRY]) == 0); + + if (enc && reg && found) { + addTypefaceToFamily(fam, fontFields); + return; + } + } + /* look for same encoding/registry */ WM_ITERATE_ARRAY(family, fam, i) { - int enc, reg; - - enc = (strcmp(fam->encoding, fontFields[ENCODING]) == 0); - reg = (strcmp(fam->registry, fontFields[REGISTRY]) == 0); - - if (enc && reg) { - /* has the same encoding, but the foundry is different */ - fam->showFoundry = 1; - - fam = wmalloc(sizeof(Family)); - memset(fam, 0, sizeof(Family)); - - fam->name = wstrdup(fontFields[FAMILY]); - fam->foundry = wstrdup(fontFields[FOUNDRY]); - fam->registry = wstrdup(fontFields[REGISTRY]); - fam->encoding = wstrdup(fontFields[ENCODING]); - fam->showFoundry = 1; - - addTypefaceToFamily(fam, fontFields); - - WMAddToArray(family, fam); - return; - } - } - /* look for same foundry */ + int enc, reg; + + enc = (strcmp(fam->encoding, fontFields[ENCODING]) == 0); + reg = (strcmp(fam->registry, fontFields[REGISTRY]) == 0); + + if (enc && reg) { + /* has the same encoding, but the foundry is different */ + fam->showFoundry = 1; + + fam = wmalloc(sizeof(Family)); + memset(fam, 0, sizeof(Family)); + + fam->name = wstrdup(fontFields[FAMILY]); + fam->foundry = wstrdup(fontFields[FOUNDRY]); + fam->registry = wstrdup(fontFields[REGISTRY]); + fam->encoding = wstrdup(fontFields[ENCODING]); + fam->showFoundry = 1; + + addTypefaceToFamily(fam, fontFields); + + WMAddToArray(family, fam); + return; + } + } + /* look for same foundry */ WM_ITERATE_ARRAY(family, fam, i) { - int found; - - found = (strcmp(fam->foundry, fontFields[FOUNDRY]) == 0); - - if (found) { - /* has the same foundry, but encoding is different */ - fam->showRegistry = 1; - - fam = wmalloc(sizeof(Family)); - memset(fam, 0, sizeof(Family)); - - fam->name = wstrdup(fontFields[FAMILY]); - fam->foundry = wstrdup(fontFields[FOUNDRY]); - fam->registry = wstrdup(fontFields[REGISTRY]); - fam->encoding = wstrdup(fontFields[ENCODING]); - fam->showRegistry = 1; - - addTypefaceToFamily(fam, fontFields); - - WMAddToArray(family, fam); - return; - } - } - /* foundry and encoding do not match anything known */ - fam = wmalloc(sizeof(Family)); - memset(fam, 0, sizeof(Family)); - - fam->name = wstrdup(fontFields[FAMILY]); - fam->foundry = wstrdup(fontFields[FOUNDRY]); - fam->registry = wstrdup(fontFields[REGISTRY]); - fam->encoding = wstrdup(fontFields[ENCODING]); - fam->showFoundry = 1; - fam->showRegistry = 1; - - addTypefaceToFamily(fam, fontFields); - - WMAddToArray(family, fam); - return; + int found; + + found = (strcmp(fam->foundry, fontFields[FOUNDRY]) == 0); + + if (found) { + /* has the same foundry, but encoding is different */ + fam->showRegistry = 1; + + fam = wmalloc(sizeof(Family)); + memset(fam, 0, sizeof(Family)); + + fam->name = wstrdup(fontFields[FAMILY]); + fam->foundry = wstrdup(fontFields[FOUNDRY]); + fam->registry = wstrdup(fontFields[REGISTRY]); + fam->encoding = wstrdup(fontFields[ENCODING]); + fam->showRegistry = 1; + + addTypefaceToFamily(fam, fontFields); + + WMAddToArray(family, fam); + return; + } + } + /* foundry and encoding do not match anything known */ + fam = wmalloc(sizeof(Family)); + memset(fam, 0, sizeof(Family)); + + fam->name = wstrdup(fontFields[FAMILY]); + fam->foundry = wstrdup(fontFields[FOUNDRY]); + fam->registry = wstrdup(fontFields[REGISTRY]); + fam->encoding = wstrdup(fontFields[ENCODING]); + fam->showFoundry = 1; + fam->showRegistry = 1; + + addTypefaceToFamily(fam, fontFields); + + WMAddToArray(family, fam); + return; } family = WMCreateArray(8); @@ -724,87 +812,140 @@ addFontToFamily(WMHashTable *families, char fontFields[NUM_FIELDS][256]) fam->foundry = wstrdup(fontFields[FOUNDRY]); fam->registry = wstrdup(fontFields[REGISTRY]); fam->encoding = wstrdup(fontFields[ENCODING]); - + addTypefaceToFamily(fam, fontFields); - + WMAddToArray(family, fam); WMHashInsert(families, fam->name, family); } +#endif /* XFT */ static void listFamilies(WMScreen *scr, WMFontPanel *panel) { +#ifdef XFT + FcObjectSet *os = 0; + FcFontSet *fs; + FcPattern *pat; +#else /* XFT */ char **fontList; - WMHashTable *families; char fields[NUM_FIELDS][256]; + int count; +#endif /* XFT */ + WMHashTable *families; WMHashEnumerator enumer; WMArray *array; - int i, count; - - fontList = XListFonts(scr->display, ALL_FONTS_MASK, MAX_FONTS_TO_RETRIEVE, + int i; + +#ifdef XFT + pat = FcPatternCreate(); + os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, 0); + fs = FcFontList(0, pat, os); + if (!fs) { + WMRunAlertPanel(scr, panel->win, _("Error"), + _("Could not init font config library\n"), _("OK"), NULL, NULL); + return; + } + if (pat) + FcPatternDestroy (pat); +#else /* XFT */ + fontList = XListFonts(scr->display, ALL_FONTS_MASK, MAX_FONTS_TO_RETRIEVE, &count); if (!fontList) { - WMRunAlertPanel(scr, panel->win, _("Error"), - _("Could not retrieve font list"), _("OK"), NULL, NULL); - return; + WMRunAlertPanel(scr, panel->win, _("Error"), + _("Could not retrieve font list"), _("OK"), NULL, NULL); + return; } +#endif /* XFT */ families = WMCreateHashTable(WMStringPointerHashCallbacks); +#ifdef XFT + if(fs) { + for (i = 0; i < fs->nfont; i++) { + FcChar8 *family; + FcChar8 *style; + + if (FcPatternGetString(fs->fonts[i],FC_FAMILY,0,&family)==FcResultMatch) + if (FcPatternGetString(fs->fonts[i],FC_STYLE,0,&style)==FcResultMatch) + addFontToXftFamily(families, family, style); + } + FcFontSetDestroy(fs); + } +#else /* XFT */ for (i = 0; i < count; i++) { - int fname_len; - - if (!isXLFD(fontList[i], &fname_len)) { - *fontList[i] = '\0'; - continue; - } - if (fname_len > 255) { - wwarning(_("font name %s is longer than 256, which is invalid."), - fontList[i]); - *fontList[i] = '\0'; - continue; - } - if (!parseFont(fontList[i], fields)) { - *fontList[i] = '\0'; - continue; - } - addFontToFamily(families, fields); + int fname_len; + + if (!isXLFD(fontList[i], &fname_len)) { + *fontList[i] = '\0'; + continue; + } + if (fname_len > 255) { + wwarning(_("font name %s is longer than 256, which is invalid."), + fontList[i]); + *fontList[i] = '\0'; + continue; + } + if (!parseFont(fontList[i], fields)) { + *fontList[i] = '\0'; + continue; + } + addFontToFamily(families, fields); } +#endif /* XFT */ enumer = WMEnumerateHashTable(families); - + +#ifdef XFT while ((array = WMNextHashEnumeratorItem(&enumer))) { - WMArrayIterator i; - Family *fam; - char buffer[256]; - WMListItem *item; + WMArrayIterator i; + Xft_Family *fam; + char buffer[256]; + WMListItem *item; WM_ITERATE_ARRAY(array, fam, i) { - strcpy(buffer, fam->name); - - if (fam->showFoundry) { - strcat(buffer, " "); - strcat(buffer, fam->foundry); - strcat(buffer, " "); - } - if (fam->showRegistry) { - strcat(buffer, " ("); - strcat(buffer, fam->registry); - strcat(buffer, "-"); - strcat(buffer, fam->encoding); - strcat(buffer, ")"); - } - item = WMAddListItem(panel->famLs, buffer); - - item->clientData = fam; - } + strcpy(buffer, fam->name); + item = WMAddListItem(panel->famLs, buffer); + + item->clientData = fam; + } + WMFreeArray(array); } +#else /* XFT */ + while ((array = WMNextHashEnumeratorItem(&enumer))) { + WMArrayIterator i; + Family *fam; + char buffer[256]; + WMListItem *item; + + WM_ITERATE_ARRAY(array, fam, i) { + strcpy(buffer, fam->name); + + if (fam->showFoundry) { + strcat(buffer, " "); + strcat(buffer, fam->foundry); + strcat(buffer, " "); + } + if (fam->showRegistry) { + strcat(buffer, " ("); + strcat(buffer, fam->registry); + strcat(buffer, "-"); + strcat(buffer, fam->encoding); + strcat(buffer, ")"); + } + item = WMAddListItem(panel->famLs, buffer); + + item->clientData = fam; + } + WMFreeArray(array); + } +#endif /* XFT */ WMSortListItems(panel->famLs); - + WMFreeHashTable(families); } @@ -813,23 +954,42 @@ static void getSelectedFont(FontPanel *panel, char buffer[], int bufsize) { WMListItem *item; +#ifdef XFT + Xft_Family *family; + Xft_Typeface *face; +#else Family *family; Typeface *face; +#endif char *size; - + item = WMGetListSelectedItem(panel->famLs); if (!item) - return; + return; +#ifdef XFT + family = (Xft_Family*)item->clientData; +#else family = (Family*)item->clientData; +#endif item = WMGetListSelectedItem(panel->typLs); if (!item) - return; + return; +#ifdef XFT + face = (Xft_Typeface*)item->clientData; +#else face = (Typeface*)item->clientData; +#endif size = WMGetTextFieldText(panel->sizT); +#ifdef XFT + snprintf(buffer, bufsize, "%s:style=%s:pixelsize=%s", + family->name, + face->typeface, + size); +#else snprintf(buffer, bufsize, "-%s-%s-%s-%s-%s-%s-%s-*-*-*-*-*-%s-%s", family->foundry, family->name, @@ -840,7 +1000,7 @@ getSelectedFont(FontPanel *panel, char buffer[], int bufsize) size, family->registry, family->encoding); - +#endif /* XFT */ wfree(size); } @@ -851,26 +1011,30 @@ preview(FontPanel *panel) { char buffer[512]; WMFont *font; - + getSelectedFont(panel, buffer, sizeof(buffer)); - font = WMCreateFont(WMWidgetScreen(panel->win), buffer); if (font) { - WMSetTextFieldFont(panel->sampleT, font); - WMReleaseFont(font); + WMSetTextFieldFont(panel->sampleT, font); + WMReleaseFont(font); } } -static void +static void familyClick(WMWidget *w, void *data) { WMList *lPtr = (WMList*)w; WMListItem *item; +#ifdef XFT + Xft_Family *family; + Xft_Typeface *face; +#else Family *family; - FontPanel *panel = (FontPanel*)data; Typeface *face; +#endif + FontPanel *panel = (FontPanel*)data; WMArrayIterator i; /* current typeface and size */ char *oface = NULL; @@ -881,92 +1045,107 @@ familyClick(WMWidget *w, void *data) /* must try to keep the same typeface and size for the new family */ item = WMGetListSelectedItem(panel->typLs); if (item) - oface = wstrdup(item->text); + oface = wstrdup(item->text); osize = WMGetTextFieldText(panel->sizT); item = WMGetListSelectedItem(lPtr); +#ifdef XFT + family = (Xft_Family*)item->clientData; +#else family = (Family*)item->clientData; +#endif WMClearList(panel->typLs); WM_ITERATE_ARRAY(family->typefaces, face, i) { - char buffer[256]; - int top=0; - WMListItem *fitem; - - if (strcmp(face->weight, "medium") == 0) { - buffer[0] = 0; - } else { - if (*face->weight) { - strcpy(buffer, face->weight); - buffer[0] = toupper(buffer[0]); - strcat(buffer, " "); - } else { - buffer[0] = 0; - } - } - - if (strcmp(face->slant, "r") == 0) { - strcat(buffer, _("Roman")); - top = 1; - } else if (strcmp(face->slant, "i") == 0) { - strcat(buffer, _("Italic")); - } else if (strcmp(face->slant, "o") == 0) { - strcat(buffer, _("Oblique")); - } else if (strcmp(face->slant, "ri") == 0) { - strcat(buffer, _("Rev Italic")); - } else if (strcmp(face->slant, "ro") == 0) { - strcat(buffer, _("Rev Oblique")); - } else { - strcat(buffer, face->slant); - } - - if (buffer[0] == 0) { - strcpy(buffer, _("Normal")); - } - - if (top) - fitem = WMInsertListItem(panel->typLs, 0, buffer); - else - fitem = WMAddListItem(panel->typLs, buffer); - fitem->clientData = face; + char buffer[256]; + int top=0; + WMListItem *fitem; + +#ifdef XFT + strcpy(buffer, face->typeface); + if(strcasecmp(face->typeface, "Roman") == 0) + top = 1; + if(strcasecmp(face->typeface, "Regular") == 0) + top = 1; +#else + if (strcmp(face->weight, "medium") == 0) { + buffer[0] = 0; + } else { + if (*face->weight) { + strcpy(buffer, face->weight); + buffer[0] = toupper(buffer[0]); + strcat(buffer, " "); + } else { + buffer[0] = 0; + } + } + + if (strcmp(face->slant, "r") == 0) { + strcat(buffer, _("Roman")); + top = 1; + } else if (strcmp(face->slant, "i") == 0) { + strcat(buffer, _("Italic")); + } else if (strcmp(face->slant, "o") == 0) { + strcat(buffer, _("Oblique")); + } else if (strcmp(face->slant, "ri") == 0) { + strcat(buffer, _("Rev Italic")); + } else if (strcmp(face->slant, "ro") == 0) { + strcat(buffer, _("Rev Oblique")); + } else { + strcat(buffer, face->slant); + } + + if (buffer[0] == 0) { + strcpy(buffer, _("Normal")); + } +#endif + if (top) + fitem = WMInsertListItem(panel->typLs, 0, buffer); + else + fitem = WMAddListItem(panel->typLs, buffer); + fitem->clientData = face; } if (oface) { - facei = WMFindRowOfListItemWithTitle(panel->typLs, oface); - wfree(oface); + facei = WMFindRowOfListItemWithTitle(panel->typLs, oface); + wfree(oface); } if (facei < 0) { - facei = 0; + facei = 0; } WMSelectListItem(panel->typLs, facei); typefaceClick(panel->typLs, panel); - + if (osize) { - sizei = WMFindRowOfListItemWithTitle(panel->sizLs, osize); + sizei = WMFindRowOfListItemWithTitle(panel->sizLs, osize); } if (sizei >= 0) { - WMSelectListItem(panel->sizLs, sizei); - sizeClick(panel->sizLs, panel); + WMSelectListItem(panel->sizLs, sizei); + sizeClick(panel->sizLs, panel); } if (osize) - wfree(osize); + wfree(osize); preview(panel); } -static void +static void typefaceClick(WMWidget *w, void *data) { FontPanel *panel = (FontPanel*)data; WMListItem *item; +#ifdef XFT + Xft_Typeface *face; +#else Typeface *face; +#endif WMArrayIterator i; char buffer[32]; @@ -978,50 +1157,138 @@ typefaceClick(WMWidget *w, void *data) item = WMGetListSelectedItem(panel->typLs); +#ifdef XFT + face = (Xft_Typeface*)item->clientData; +#else face = (Typeface*)item->clientData; - +#endif + WMClearList(panel->sizLs); WM_ITERATE_ARRAY(face->sizes, size, i) { - if ((int)size != 0) { - sprintf(buffer, "%i", (int)size); + if ((int)size != 0) { + sprintf(buffer, "%i", (int)size); - WMAddListItem(panel->sizLs, buffer); - } + WMAddListItem(panel->sizLs, buffer); + } } if (osize) { - sizei = WMFindRowOfListItemWithTitle(panel->sizLs, osize); + sizei = WMFindRowOfListItemWithTitle(panel->sizLs, osize); } if (sizei < 0) { - sizei = WMFindRowOfListItemWithTitle(panel->sizLs, "12"); + sizei = WMFindRowOfListItemWithTitle(panel->sizLs, "12"); } if (sizei < 0) { - sizei = 0; + sizei = 0; } WMSelectListItem(panel->sizLs, sizei); WMSetListPosition(panel->sizLs, sizei); sizeClick(panel->sizLs, panel); if (osize) - wfree(osize); + wfree(osize); preview(panel); } - -static void +static void sizeClick(WMWidget *w, void *data) { FontPanel *panel = (FontPanel*)data; WMListItem *item; - - item = WMGetListSelectedItem(panel->sizLs); + item = WMGetListSelectedItem(panel->sizLs); WMSetTextFieldText(panel->sizT, item->text); - + WMSelectTextFieldRange(panel->sizT, wmkrange(0, strlen(item->text))); preview(panel); } + +#ifdef XFT +static void +setFontPanelFontName(FontPanel *panel, FcChar8 *family, FcChar8 *style, double size) +{ + int famrow; + int stlrow; + int sz; + char asize[64]; + void *vsize; + WMListItem *item; + Xft_Family *fam; + Xft_Typeface *face; + WMArrayIterator i; + + famrow = WMFindRowOfListItemWithTitle(panel->famLs, family); + if (famrow < 0 ){ + famrow = 0; + return; + } + WMSelectListItem(panel->famLs, famrow); + WMSetListPosition(panel->famLs, famrow); + + WMClearList(panel->typLs); + + item = WMGetListSelectedItem(panel->famLs); + + fam = (Xft_Family*)item->clientData; + WM_ITERATE_ARRAY(fam->typefaces, face, i) { + char buffer[256]; + int top=0; + WMListItem *fitem; + + strcpy(buffer, face->typeface); + if(strcasecmp(face->typeface, "Roman") == 0) + top = 1; + if (top) + fitem = WMInsertListItem(panel->typLs, 0, buffer); + else + fitem = WMAddListItem(panel->typLs, buffer); + fitem->clientData = face; + } + + + stlrow = WMFindRowOfListItemWithTitle(panel->typLs, style); + + if (stlrow < 0) { + stlrow = 0; + return; + } + + WMSelectListItem(panel->typLs, stlrow); + + item = WMGetListSelectedItem(panel->typLs); + + face = (Xft_Typeface*)item->clientData; + + WMClearList(panel->sizLs); + + + WM_ITERATE_ARRAY(face->sizes, vsize, i) { + char buffer[32]; + if ((int)vsize != 0) { + sprintf(buffer, "%i", (int)vsize); + + WMAddListItem(panel->sizLs, buffer); + } + } + + snprintf(asize, sizeof(asize)-1, "%d",(int)(size+0.5)); + + sz = WMFindRowOfListItemWithTitle(panel->sizLs, asize); + + if (sz < 0) { + sz = 4; + return; + } + + WMSelectListItem(panel->sizLs, sz); + sizeClick(panel->sizLs, panel); + + return; +} + +#endif + diff --git a/WINGs/widgets.c b/WINGs/widgets.c index f06bdafd..1bc5b6e3 100644 --- a/WINGs/widgets.c +++ b/WINGs/widgets.c @@ -12,6 +12,8 @@ #include #include +#include + /********** data ************/ @@ -591,6 +593,7 @@ WMCreateScreenWithRContext(Display *display, int screen, RContext *context) "WM_STATE" }; Atom atoms[sizeof(atomNames)/sizeof(char*)]; + char *locale; int i; if (!initialized) { @@ -756,16 +759,20 @@ WMCreateScreenWithRContext(Display *display, int screen, RContext *context) scrPtr->stipple = stipple; scrPtr->useMultiByte = WINGsConfiguration.useMultiByte; + scrPtr->useMultiByte = 0; - scrPtr->useWideChar = 1; + locale = setlocale(LC_CTYPE, NULL); + //printf("LC_CTYPE=%s\n", locale); + if (!locale || strcmp(locale, "C")==0 || strcmp(locale, "POSIX")==0) + scrPtr->useWideChar = 0; + else + scrPtr->useWideChar = 1; scrPtr->antialiasedText = WINGsConfiguration.antialiasedText; - scrPtr->normalFont = WMSystemFontOfSize(scrPtr, - WINGsConfiguration.defaultFontSize); + scrPtr->normalFont = WMSystemFontOfSize(scrPtr, 0); - scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr, - WINGsConfiguration.defaultFontSize); + scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr, 0); if (!scrPtr->boldFont) scrPtr->boldFont = scrPtr->normalFont; diff --git a/WINGs/winputmethod.c b/WINGs/winputmethod.c index c0ed4ef8..eb91211d 100644 --- a/WINGs/winputmethod.c +++ b/WINGs/winputmethod.c @@ -22,7 +22,8 @@ typedef struct W_ICContext { -Bool W_InitIMStuff(WMScreen *scr) +Bool +W_InitIMStuff(WMScreen *scr) { WMIMContext *ctx; @@ -38,7 +39,8 @@ Bool W_InitIMStuff(WMScreen *scr) } -void W_CloseIMStuff(WMScreen *scr) +void +W_CloseIMStuff(WMScreen *scr) { if (!scr->imctx) return; @@ -51,7 +53,8 @@ void W_CloseIMStuff(WMScreen *scr) -WMICContext *W_CreateIC(WMView *view) +WMICContext* +W_CreateIC(WMView *view) { WMScreen *scr = W_VIEW_SCREEN(view); WMICContext *ctx; @@ -60,11 +63,12 @@ WMICContext *W_CreateIC(WMView *view) ctx->next = scr->imctx->icList; if (scr->imctx->icList) scr->imctx->icList->prev = ctx; - scr->imctx = ctx; + //scr->imctx = ctx; } -void W_DestroyIC(WMICContext *ctx) +void +W_DestroyIC(WMICContext *ctx) { XDestroyIC(ctx->xic); @@ -72,8 +76,9 @@ void W_DestroyIC(WMICContext *ctx) } -int W_LookupString(WMView *view, XKeyEvent *event, - char buffer, int bufsize, KeySym ksym) +int +W_LookupString(WMView *view, XKeyEvent *event, + char buffer, int bufsize, KeySym ksym) { } diff --git a/WINGs/wmisc.c b/WINGs/wmisc.c index f8bfdb47..e3b65ce3 100644 --- a/WINGs/wmisc.c +++ b/WINGs/wmisc.c @@ -120,6 +120,7 @@ fitText(char *text, WMFont *font, int width, int wrap) i = j; } } else { + //i = strcspn(text, "\n\r"); while (text[i]!='\n' && text[i]!=0) i++; } diff --git a/WINGs/wscroller.c b/WINGs/wscroller.c index 4ddbd38e..263848aa 100644 --- a/WINGs/wscroller.c +++ b/WINGs/wscroller.c @@ -306,10 +306,9 @@ paintArrow(WMScroller *sPtr, Drawable d, int part) gc = scr->whiteGC; #endif } - - + + if (sPtr->flags.horizontal) { - /* paint button */ #ifndef DOUBLE_BUFFER XFillRectangle(scr->display, d, gc, @@ -326,7 +325,7 @@ paintArrow(WMScroller *sPtr, Drawable d, int part) XSetClipOrigin(scr->display, scr->clipGC, ofs + (BUTTON_SIZE - arrow->width) / 2, 2 + (BUTTON_SIZE - arrow->height) / 2); - + XCopyArea(scr->display, arrow->pixmap, d, scr->clipGC, 0, 0, arrow->width, arrow->height, ofs + (BUTTON_SIZE - arrow->width) / 2, diff --git a/WPrefs.app/Expert.c b/WPrefs.app/Expert.c index ece04a7f..974e9fdb 100644 --- a/WPrefs.app/Expert.c +++ b/WPrefs.app/Expert.c @@ -84,7 +84,7 @@ createPanel(Panel *p) WMSetButtonText(panel->swi[7], _("Smooth font edges (needs restart).")); //if (!WMHasAntialiasingSupport(WMWidgetScreen(panel->box))) - WMSetButtonEnabled(panel->swi[7], False); + WMSetButtonEnabled(panel->swi[7], True); WMRealizeWidget(panel->box); WMMapSubwidgets(panel->box); diff --git a/WPrefs.app/Font.c b/WPrefs.app/Font.c index 4d5c8b28..a6d01074 100644 --- a/WPrefs.app/Font.c +++ b/WPrefs.app/Font.c @@ -23,7 +23,7 @@ #include "WPrefs.h" #include - +#include typedef struct _Panel { WMBox *box; @@ -358,7 +358,7 @@ paintItems(WMScreen *scr, Drawable d, WMColor *color, WMFont *font, int l = strlen(text); int x = previewPositions[part].pos.x; int y = previewPositions[part].pos.y; - int w = previewPositions[part].size.width; + //int w = previewPositions[part].size.width; int h = previewPositions[part].size.height/4; int i; for( i = 0; i < 4 ; i++) { @@ -443,7 +443,7 @@ dumpRImage(char *path, RImage *image) } } -static int +/*static int isPixmap(WMPropList *prop) { WMPropList *p; @@ -455,7 +455,7 @@ isPixmap(WMPropList *prop) return 1; else return 0; -} +}*/ static Pixmap renderTexture(WMScreen *scr, WMPropList *texture, int width, int height, @@ -669,7 +669,7 @@ 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); + //RContext *rc = WMScreenRContext(scr); GC gc = XCreateGC(dpy, WMWidgetXID(panel->parent), 0, NULL); int i; @@ -835,7 +835,7 @@ paintPreviewBox(Panel *panel, int elements) { WMScreen *scr = WMWidgetScreen(panel->parent); Display *dpy = WMScreenDisplay(scr); - int refresh = 0; + //int refresh = 0; GC gc; WMColor *black = WMBlackColor(scr); Pixmap mitem; @@ -926,7 +926,7 @@ static void paintTextField(void *data, int section) { _Panel *panel = (_Panel*)data; - char *sample = NULL; + //char *sample = NULL; int encoding; encoding = WMGetPopUpButtonSelectedItem(panel->langP); WMSetTextFieldFont(panel->fontT, getFontForPreview(panel, section)); @@ -1072,7 +1072,7 @@ refillFontSetList(void *data) char *encoding = getFontEncoding(panel); int section = WMGetPopUpButtonSelectedItem(panel->fontSel); int i; - int pos; + //int pos; WMClearList(panel->fsetLs); if(!encoding) { array = getCurrentFontProp(panel, section); @@ -1259,7 +1259,7 @@ static void changeLanguageAction(WMWidget *w, void *data) { Panel *panel = (Panel*)data; - WMScreen *scr = WMWidgetScreen(panel->box); + //WMScreen *scr = WMWidgetScreen(panel->box); int section; section = WMGetPopUpButtonSelectedItem(w); @@ -1314,7 +1314,7 @@ static char* getFontSampleString(void *data) { _Panel *panel = (_Panel*)data; - WMScreen *scr = WMWidgetScreen(panel->box); + //WMScreen *scr = WMWidgetScreen(panel->box); WMMenuItem *mi; WMPropList *pl; int section; @@ -1336,7 +1336,7 @@ static char* getFontEncoding(void *data) { _Panel *panel = (_Panel*)data; - WMScreen *scr = WMWidgetScreen(panel->box); + //WMScreen *scr = WMWidgetScreen(panel->box); WMMenuItem *mi; WMPropList *pl; int section; @@ -1358,7 +1358,7 @@ static Bool isEncodingMultiByte(void *data) { _Panel *panel = (_Panel*)data; - WMScreen *scr = WMWidgetScreen(panel->box); + //WMScreen *scr = WMWidgetScreen(panel->box); WMMenuItem *mi; WMPropList *pl; int section; @@ -1473,26 +1473,20 @@ getDefaultSystemFont(void *data, int element) { _Panel *panel = (_Panel*)data; WMScreen *scr = WMWidgetScreen(panel->box); - switch(element) { - case 0: - return WMBoldSystemFontOfSize(scr, 12); - break; - case 1: - return WMBoldSystemFontOfSize(scr, 24); - break; - case 2: - return WMBoldSystemFontOfSize(scr, 12); - break; - case 3: - return WMSystemFontOfSize(scr, 12); - break; - case 4: - return WMSystemFontOfSize(scr, 8); - break; - case 5: - return WMSystemFontOfSize(scr, 8); - break; - } + + 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 @@ -1515,7 +1509,7 @@ static void toggleAA(WMWidget *w, void *data) { _Panel *panel = (_Panel*)data; - int section; + //int section; if(panel->AntialiasedText) panel->AntialiasedText = False; else @@ -1622,7 +1616,7 @@ addButtonAction(WMWidget *w, void *data) array = getDefaultFontProp(panel, encoding, section); WMHideFontPanel(panel->fontPanel); - chosenFont = WMGetFontPanelFontName(panel->fontPanel); + chosenFont = WMGetFontName(WMGetFontPanelFont(panel->fontPanel)); string = WMCreatePLString(chosenFont); pos = WMGetListSelectedItemRow(panel->fsetLs); WMInsertListItem(panel->fsetLs, pos+1, chosenFont); @@ -1651,7 +1645,7 @@ changeButtonAction(WMWidget *w, void *data) WMHideFontPanel(panel->fontPanel); - chosenFont = WMGetFontPanelFontName(panel->fontPanel); + chosenFont = WMGetFontName(WMGetFontPanelFont(panel->fontPanel)); string = WMCreatePLString(chosenFont); pos = WMGetListSelectedItemRow(panel->fsetLs); @@ -1720,7 +1714,7 @@ removeButtonClick(WMWidget *w, void *data) static void showData(_Panel *panel) { - WMScreen *scr = WMWidgetScreen(panel->parent); + //WMScreen *scr = WMWidgetScreen(panel->parent); char *str; int i; diff --git a/WPrefs.app/Makefile.am b/WPrefs.app/Makefile.am index e2e65d77..917ee3fa 100644 --- a/WPrefs.app/Makefile.am +++ b/WPrefs.app/Makefile.am @@ -42,7 +42,9 @@ WPrefs_SOURCES = \ imagebrowser.h \ xmodifier.c -AM_CPPFLAGS = @CPPFLAGS@ -DLOCALEDIR=\"$(NLSDIR)\" +AM_CPPFLAGS = -DLOCALEDIR=\"$(NLSDIR)\" + +AM_CFLAGS = -fno-strict-aliasing INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/WINGs @HEADER_SEARCH_PATH@ diff --git a/acinclude.m4 b/acinclude.m4 index f0f906b1..ee22091b 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -25,6 +25,42 @@ CPPFLAGS="$CPPFLAGS_old" dnl +dnl WM_CHECK_XFT_VERSION(MIN_VERSION, [ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]) +dnl +dnl # $XFTFLAGS should be defined before calling this macro, +dnl # else it will not be able to find Xft.h +dnl +AC_DEFUN(WM_CHECK_XFT_VERSION, +[ +CPPFLAGS_old="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $XFTFLAGS $inc_search_path" +xft_major_version=`echo $1 | sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` +xft_minor_version=`echo $1 | sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` +xft_micro_version=`echo $1 | sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` +AC_MSG_CHECKING([whether libXft is at least version $1]) +AC_CACHE_VAL(ac_cv_lib_xft_version_ok, +[AC_TRY_LINK( +[/* Test version of libXft we have */ +#include + +#if !defined(XFT_VERSION) || XFT_VERSION < $xft_major_version*10000 + $xft_minor_version*100 + $xft_micro_version +#error libXft on this system is too old. Consider upgrading to at least $1 +#endif +], [], +eval "ac_cv_lib_xft_version_ok=yes", +eval "ac_cv_lib_xft_version_ok=no")]) +if eval "test \"`echo '$ac_cv_lib_xft_version_ok'`\" = yes"; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + ifelse([$3], , , [$3]) +fi +CPPFLAGS="$CPPFLAGS_old" +]) + + +dnl dnl WM_CHECK_REDCRAP_BUGS(prefix,bindir,libdir) dnl AC_DEFUN(WM_CHECK_REDCRAP_BUGS, diff --git a/configure.ac b/configure.ac index eabd927f..7f8ef85a 100644 --- a/configure.ac +++ b/configure.ac @@ -15,7 +15,7 @@ AC_INIT(src/WindowMaker.h) -AM_INIT_AUTOMAKE(WindowMaker, 0.90.0) +AM_INIT_AUTOMAKE(WindowMaker, 0.85.0) AC_PROG_LIBTOOL @@ -519,35 +519,54 @@ fi dnl Xft antialiased font support dnl ============================ + xft=yes XFTLIBS="" -AC_ARG_ENABLE(xft, -[ --disable-xft disable Xft antialiased font support], - xft=$enableval, xft=yes) - -if test "$xft" = yes; then - if test "x$PKGCONFIG" != x -a "`$PKGCONFIG xft; echo $?`" = 0; then - XFTCONFIG="$PKGCONFIG xft" - pkgconfig_xft=yes - else - AC_CHECK_PROG(XFTCONFIG, xft-config, xft-config) - fi - AC_MSG_CHECKING([for the Xft2 library]) - if test "x$XFTCONFIG" != x; then - XFTLIBS=`$XFTCONFIG --libs` - XFTFLAGS=`$XFTCONFIG --cflags` - AC_MSG_RESULT([found]) - else - xft=no - AC_MSG_RESULT([not found]) - fi - if test "$xft" = yes; then - AC_SUBST(XFTFLAGS) - AC_SUBST(XFTLIBS) - AC_DEFINE(XFT, 1, [define if you want support for antialiased fonts (set by configure)]) - fi + +if test "x$PKGCONFIG" != x -a "`$PKGCONFIG xft; echo $?`" = 0; then + XFTCONFIG="$PKGCONFIG xft" + pkgconfig_xft=yes +else + AC_CHECK_PROG(XFTCONFIG, xft-config, xft-config) fi +AC_MSG_CHECKING([for the Xft2 library]) + +if test "x$XFTCONFIG" != x; then + XFTLIBS=`$XFTCONFIG --libs` + XFTFLAGS=`$XFTCONFIG --cflags` + AC_MSG_RESULT([found]) +else + AC_MSG_RESULT([not found]) + echo + echo "ERROR!!! libXft2 is not installed or could not be found." + echo " Xft2 is a requirement for building Window Maker." + echo " Please install it (along with fontconfig) before continuing." + echo + exit 1 +fi + +minXFT="2.1.2" +goodxft="no" + +dnl +dnl The macro below will use $XFTFLAGS (defined above) to find Xft.h +dnl +WM_CHECK_XFT_VERSION($minXFT, goodxft=yes, goodxft=no) + +if test "$goodxft" = no; then + echo + echo "ERROR!!! libXft on this system is an old version." + echo " Please consider upgrading to at least version ${minXFT}." + echo + exit 1 +fi + +AC_SUBST(XFTFLAGS) +AC_SUBST(XFTLIBS) +AC_DEFINE(XFT, 1, [define if you want support for antialiased fonts (set by configure)]) + + dnl XINERAMA support dnl ================ xinerama=no diff --git a/src/Makefile.am b/src/Makefile.am index a89a5c02..0dba2879 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -104,7 +104,9 @@ wmaker_SOURCES = \ text.h -AM_CPPFLAGS = @CPPFLAGS@ $(DFLAGS) -DLOCALEDIR=\"$(NLSDIR)\" +AM_CPPFLAGS = $(DFLAGS) -DLOCALEDIR=\"$(NLSDIR)\" + +AM_CFLAGS = -fno-strict-aliasing INCLUDES = \ diff --git a/src/appicon.c b/src/appicon.c index 391dae7a..68a67527 100644 --- a/src/appicon.c +++ b/src/appicon.c @@ -407,7 +407,7 @@ setIconCallback(WMenu *menu, WMenuEntry *entry) result = wIconChooserDialog(scr, &file, icon->wm_instance, icon->wm_class); if (result && !icon->destroyed) { - if (file[0]==0) { + if (file && *file==0) { wfree(file); file = NULL; } diff --git a/src/cycling.c b/src/cycling.c index 8e0c98d2..e5ace829 100644 --- a/src/cycling.c +++ b/src/cycling.c @@ -198,7 +198,9 @@ StartWindozeCycle(WWindow *wwin, XEvent *event, Bool next) if (hasModifier) { keymap = XGetModifierMapping(dpy); - +#ifdef DEBUG + printf("Grabbing keyboard\n"); +#endif XGrabKeyboard(dpy, scr->root_win, False, GrabModeAsync, GrabModeAsync, CurrentTime); } @@ -223,11 +225,6 @@ StartWindozeCycle(WWindow *wwin, XEvent *event, Bool next) wWindowFocus(newFocused, scr->focused_window); oldFocused = newFocused; - if (hasModifier) - done = False; - else - done = True; - #if 0 if (wPreferences.popup_switchmenu && (!scr->switch_menu || !scr->switch_menu->flags.mapped)) { @@ -236,8 +233,9 @@ StartWindozeCycle(WWindow *wwin, XEvent *event, Bool next) openedSwitchMenu = True; } #endif - while (!done) { - WMMaskEvent(dpy,KeyPressMask|KeyReleaseMask|ExposureMask, &ev); + + while (hasModifier && !done) { + WMMaskEvent(dpy, KeyPressMask|KeyReleaseMask|ExposureMask, &ev); if (ev.type != KeyRelease && ev.type != KeyPress) { WMHandleEvent(&ev); @@ -247,7 +245,10 @@ StartWindozeCycle(WWindow *wwin, XEvent *event, Bool next) modifiers = ev.xkey.state & ValidModMask; if (ev.type == KeyPress) { - if (wKeyBindings[WKBD_FOCUSNEXT].keycode == ev.xkey.keycode +#ifdef DEBUG + printf("Got key press\n"); +#endif + if (wKeyBindings[WKBD_FOCUSNEXT].keycode == ev.xkey.keycode && wKeyBindings[WKBD_FOCUSNEXT].modifier == modifiers) { newFocused = nextToFocusAfter(newFocused); @@ -274,12 +275,18 @@ StartWindozeCycle(WWindow *wwin, XEvent *event, Bool next) } } else { +#ifdef DEBUG + printf("Got something else\n"); +#endif somethingElse = True; done = True; } } else if (ev.type == KeyRelease) { int i; +#ifdef DEBUG + printf("Got key release\n"); +#endif for (i = 0; i < 8 * keymap->max_keypermod; i++) { if (keymap->modifiermap[i] == ev.xkey.keycode && wKeyBindings[WKBD_FOCUSNEXT].modifier @@ -294,6 +301,9 @@ StartWindozeCycle(WWindow *wwin, XEvent *event, Bool next) XFreeModifiermap(keymap); if (hasModifier) { +#ifdef DEBUG + printf("Ungrabbing keyboard\n"); +#endif XUngrabKeyboard(dpy, CurrentTime); } wSetFocusTo(scr, newFocused); diff --git a/src/dialog.c b/src/dialog.c index 804ec381..ef531a24 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -636,6 +636,7 @@ wIconChooserDialog(WScreen *scr, char **file, char *instance, char *class) IconPanel *panel; WMColor *color; WMFont *boldFont; + Bool result; panel = wmalloc(sizeof(IconPanel)); memset(panel, 0, sizeof(IconPanel)); @@ -784,7 +785,7 @@ wIconChooserDialog(WScreen *scr, char **file, char *instance, char *class) /* check if the file the user selected is not the one that * would be loaded by default with the current search path */ *file = WMGetListSelectedItem(panel->iconList)->text; - if ((*file)[0]==0) { + if (**file==0) { wfree(*file); *file = NULL; } else { @@ -803,6 +804,8 @@ wIconChooserDialog(WScreen *scr, char **file, char *instance, char *class) *file = NULL; } + result = panel->result; + WMReleaseFont(panel->normalfont); WMUnmapWidget(panel->win); @@ -815,7 +818,7 @@ wIconChooserDialog(WScreen *scr, char **file, char *instance, char *class) XDestroyWindow(dpy, parent); - return panel->result; + return result; } @@ -862,6 +865,10 @@ typedef struct { "Copyright \xa9 1997-2003 Alfredo K. Kojima \n"\ "Copyright \xa9 1998-2003 Dan Pascu " +#define COPYRIGHT_TEXT_UTF8 \ + "Copyright \xc2\xa9 1997-2003 Alfredo K. Kojima \n"\ + "Copyright \xc2\xa9 1998-2003 Dan Pascu " + static InfoPanel *thePanel = NULL; @@ -1310,7 +1317,7 @@ wShowInfoPanel(WScreen *scr) WMResizeWidget(panel->copyrL, 360, 40); WMMoveWidget(panel->copyrL, 15, 185); WMSetLabelTextAlignment(panel->copyrL, WALeft); - WMSetLabelText(panel->copyrL, COPYRIGHT_TEXT); + WMSetLabelText(panel->copyrL, COPYRIGHT_TEXT_UTF8); /* we want the (c) character in the font, so don't use a FontSet here */ // fix this -Dan font = WMCreateFontWithFlags(scr->wmscreen, "SystemFont-11", WFNormalFont); font = WMSystemFontOfSize(scr->wmscreen, 11); diff --git a/src/event.c b/src/event.c index 484de816..a19e812d 100644 --- a/src/event.c +++ b/src/event.c @@ -478,7 +478,7 @@ handleMapRequest(XEvent *ev) Window window = ev->xmaprequest.window; #ifdef DEBUG - L("got map request for %x\n", (unsigned)window); + printf("got map request for %x\n", (unsigned)window); #endif if ((wwin = wWindowFor(window))) { if (wwin->flags.shaded) { @@ -553,7 +553,7 @@ handleDestroyNotify(XEvent *event) int index; #ifdef DEBUG - L("got destroy notify"); + printf("got destroy notify\n"); #endif wwin = wWindowFor(window); if (wwin) { @@ -607,7 +607,7 @@ handleExpose(XEvent *event) XEvent ev; #ifdef DEBUG - L("got expose"); + printf("got expose\n"); #endif while (XCheckTypedWindowEvent(dpy, event->xexpose.window, Expose, &ev)); @@ -662,7 +662,7 @@ handleButtonPress(XEvent *event) WScreen *scr; #ifdef DEBUG - L("got button press"); + printf("got button press\n"); #endif scr = wScreenForRootWindow(event->xbutton.root); @@ -749,7 +749,7 @@ handleMapNotify(XEvent *event) { WWindow *wwin; #ifdef DEBUG - L("got map"); + printf("got map\n"); #endif wwin = wWindowFor(event->xmap.event); if (wwin && wwin->client_win == event->xmap.event) { @@ -772,7 +772,7 @@ handleUnmapNotify(XEvent *event) XEvent ev; Bool withdraw = False; #ifdef DEBUG - L("got unmap"); + printf("got unmap\n"); #endif /* only process windows with StructureNotify selected * (ignore SubstructureNotify) */ @@ -824,7 +824,7 @@ handleConfigureRequest(XEvent *event) { WWindow *wwin; #ifdef DEBUG - L("got configure request"); + printf("got configure request\n"); #endif if (!(wwin=wWindowFor(event->xconfigurerequest.window))) { /* @@ -847,7 +847,7 @@ handlePropertyNotify(XEvent *event) unsigned int ju; WScreen *scr; #ifdef DEBUG - L("got property notify"); + printf("got property notify\n"); #endif if ((wwin=wWindowFor(event->xproperty.window))) { if (!XGetGeometry(dpy, wwin->client_win, &jr, &ji, &ji, @@ -876,7 +876,7 @@ handleClientMessage(XEvent *event) WWindow *wwin; WObjDescriptor *desc; #ifdef DEBUG - L("got client message"); + printf("got client message\n"); #endif /* handle transition from Normal to Iconic state */ if (event->xclient.message_type == _XA_WM_CHANGE_STATE @@ -1038,7 +1038,7 @@ handleEnterNotify(XEvent *event) XEvent ev; WScreen *scr = wScreenForRootWindow(event->xcrossing.root); #ifdef DEBUG - L("got enter notify"); + printf("got enter notify\n"); #endif #ifdef VIRTUAL_DESKTOP @@ -1178,7 +1178,7 @@ handleShapeNotify(XEvent *event) WWindow *wwin; XEvent ev; #ifdef DEBUG - L("got shape notify"); + printf("got shape notify\n"); #endif while (XCheckTypedWindowEvent(dpy, shev->window, event->type, &ev)) { XShapeEvent *sev = (XShapeEvent*)&ev; @@ -1739,7 +1739,7 @@ handleMotionNotify(XEvent *event) p.y >= (rect.pos.y + rect.size.height - 2)) { WMenu *menu; #ifdef DEBUG - L("pointer at screen edge"); + printf("pointer at screen edge\n"); #endif menu = wMenuUnderPointer(scr); if (menu!=NULL) diff --git a/src/main.c b/src/main.c index 8f2103db..eac30aed 100644 --- a/src/main.c +++ b/src/main.c @@ -717,22 +717,25 @@ main(int argc, char **argv) } - if (!Locale) { - Locale = getenv("LC_ALL"); - } - if (!Locale) { - Locale = getenv("LANG"); + if (Locale) { + /* return of wstrconcat should not be free-ed! read putenv man page */ + putenv(wstrconcat("LANG=", Locale)); + } else { + Locale = getenv("LC_ALL"); + if (!Locale) { + Locale = getenv("LANG"); + } } setlocale(LC_ALL, ""); if (!Locale || strcmp(Locale, "C")==0 || strcmp(Locale, "POSIX")==0) - Locale = NULL; + Locale = NULL; #ifdef I18N if (getenv("NLSPATH")) - bindtextdomain("WindowMaker", getenv("NLSPATH")); + bindtextdomain("WindowMaker", getenv("NLSPATH")); else - bindtextdomain("WindowMaker", LOCALEDIR); + bindtextdomain("WindowMaker", LOCALEDIR); textdomain("WindowMaker"); if (!XSupportsLocale()) { diff --git a/src/placement.c b/src/placement.c index f5c0b529..55dd9df7 100644 --- a/src/placement.c +++ b/src/placement.c @@ -349,7 +349,7 @@ smartPlaceWindow(WWindow *wwin, int *x_ret, int *y_ret, unsigned int width, unsigned int height, WArea usableArea) { - WScreen *scr = wwin->screen_ptr; + //WScreen *scr = wwin->screen_ptr; int test_x = 0, test_y = Y_ORIGIN(scr); int from_x, to_x, from_y, to_y; int sx; diff --git a/src/text.c b/src/text.c index 58889306..c483d640 100644 --- a/src/text.c +++ b/src/text.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "WindowMaker.h" @@ -42,14 +43,14 @@ #endif -#if 0 +#ifdef DEBUG # define ENTER(X) fprintf(stderr,"Entering: %s()\n", X); # define LEAVE(X) fprintf(stderr,"Leaving: %s()\n", X); -# define DEBUG(X) fprintf(stderr,"debug: %s()\n", X); +# define PDEBUG(X) fprintf(stderr,"debug: %s()\n", X); #else # define ENTER(X) # define LEAVE(X) -# define DEBUG(X) +# define PDEBUG(X) #endif extern Cursor wCursor[WCUR_LAST]; @@ -582,32 +583,32 @@ textEventHandler( WObjDescriptor *desc, XEvent *event ) * text so we can wTextRefresh() */ if( event->xmotion.state & (Button1Mask|Button3Mask|Button2Mask) ) { - DEBUG("MotionNotify"); + PDEBUG("MotionNotify"); handled = True; wtext->text.endPos = textXtoPos( wtext, event->xmotion.x ); } break; case ButtonPress: - DEBUG("ButtonPress"); + PDEBUG("ButtonPress"); handled = True; wtext->text.startPos = textXtoPos( wtext, event->xbutton.x ); wtext->text.endPos = wtext->text.startPos; break; case ButtonRelease: - DEBUG("ButtonRelease"); + PDEBUG("ButtonRelease"); handled = True; wtext->text.endPos = textXtoPos( wtext, event->xbutton.x ); break; case KeyPress: - DEBUG("KeyPress"); + PDEBUG("KeyPress"); handled = handleKeyPress( wtext, &event->xkey ); break; case EnterNotify: - DEBUG("EnterNotify"); + PDEBUG("EnterNotify"); handled = True; #if 0 if (!wtext->magic) @@ -621,7 +622,7 @@ textEventHandler( WObjDescriptor *desc, XEvent *event ) break; case LeaveNotify: - DEBUG("LeaveNotify"); + PDEBUG("LeaveNotify"); handled = True; #if 0 wtext->blinking = 0; diff --git a/src/xdnd.c b/src/xdnd.c index 35085db7..b9a11dff 100644 --- a/src/xdnd.c +++ b/src/xdnd.c @@ -86,7 +86,7 @@ void wXDNDMakeAwareness(Window window) { } void wXDNDClearAwareness(Window window) { - long int xdnd_version = 3; + //long int xdnd_version = 3; XDeleteProperty (dpy, window, _XA_XdndAware); } diff --git a/src/xutil.c b/src/xutil.c index 71c9f981..964d602e 100644 --- a/src/xutil.c +++ b/src/xutil.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "wconfig.h" diff --git a/test/wtest.c b/test/wtest.c index 563dbe85..692a5341 100644 --- a/test/wtest.c +++ b/test/wtest.c @@ -9,6 +9,7 @@ */ #include +#include #include #include #include diff --git a/util/Makefile.am b/util/Makefile.am index d42a0a58..1346f994 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -3,9 +3,10 @@ AUTOMAKE_OPTIONS = no-dependencies pkgdatadir = $(datadir)/@PACKAGE@ -bin_PROGRAMS = wxcopy wxpaste wdwrite wdread getstyle setstyle seticons geticonset wmsetbg wmsetup wmagnify +bin_PROGRAMS = wxcopy wxpaste wdwrite wdread getstyle setstyle convertfonts \ + seticons geticonset wmsetbg wmsetup wmagnify -bin_SCRIPTS = wmaker.inst wm-oldmenu2new wsetfont wmchlocale wkdemenu.pl\ +bin_SCRIPTS = wmaker.inst wm-oldmenu2new wsetfont wmchlocale wkdemenu.pl \ wcopy wpaste EXTRA_DIST = wmaker.inst.in bughint wm-oldmenu2new wsetfont directjpeg.c \ @@ -31,6 +32,8 @@ setstyle_LDADD = \ $(top_builddir)/WINGs/libWUtil.a \ @XLFLAGS@ @XLIBS@ $(liblist) +convertfonts_LDADD = $(top_builddir)/WINGs/libWUtil.a $(liblist) + seticons_LDADD= $(top_builddir)/WINGs/libWUtil.a $(liblist) geticonset_LDADD= $(top_builddir)/WINGs/libWUtil.a $(liblist) diff --git a/util/convertfonts.c b/util/convertfonts.c new file mode 100644 index 00000000..2ed83a8a --- /dev/null +++ b/util/convertfonts.c @@ -0,0 +1,317 @@ +/* convertfonts.c - converts fonts in a style file to fontconfig format + * + * WindowMaker window manager + * + * Copyright (c) 2004 Dan Pascu + * + * 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. + */ + + +#define PROG_VERSION "convertfonts (Window Maker) 1.0" + +#include +#include +#include +#include +#include + +#include "../src/wconfig.h" + +#define DEFAULT_FONT "sans-serif:pixelsize=12" + +char *FontOptions[] = { + "IconTitleFont", + "ClipTitleFont", + "DisplayFont", + "LargeDisplayFont", + "MenuTextFont", + "MenuTitleFont", + "WindowTitleFont", + "SystemFont", + "BoldSystemFont", + NULL +}; + + +char *ProgName; + + +static int +countChar(char *str, char c) +{ + int count = 0; + + if (!str) + return 0; + + for (; *str!=0; str++) { + if (*str == c) { + count++; + } + } + + return count; +} + + +typedef struct str { + char *str; + int len; +} str; + +#define XLFD_TOKENS 14 + + +static str* +getXLFDTokens(char *xlfd) +{ + static str tokens[XLFD_TOKENS]; + int i, len, size; + char *ptr; + + if (!xlfd || *xlfd!='-' || countChar(xlfd, '-')0; i++) { + /* skip one '-' */ + ptr++; + len--; + if (len <= 0) + break; + size = strcspn(ptr, "-"); + tokens[i].str = ptr; + tokens[i].len = size; + ptr += size; + len -= size; + } + + return tokens; +} + + +static int +strToInt(str *token) +{ + int res=0, pos, c; + + if (token->len==0 || token->str[0]=='*') { + return -1; + } else { + for (res=0, pos=0; poslen; pos++) { + c = token->str[pos] - '0'; + if (c<0 || c>9) + break; + res = res*10 + c; + } + } + return res; +} + + +static char* +mapSlantToName(str *slant) +{ + if (slant->len==0 || slant->str[0]=='*') + return "roman"; + + switch(slant->str[0]) { + case 'i': + return "italic"; + case 'o': + return "oblique"; + case 'r': + default: + return "roman"; + } +} + + +char* +xlfdToFc(char *xlfd, char *useFamily, Bool keepXLFD) +{ + str *tokens, *family, *weight, *slant; + char *name, buf[512]; + int size, pixelsize; + + tokens = getXLFDTokens(xlfd); + if (!tokens) + return wstrdup(DEFAULT_FONT); + + family = &(tokens[1]); + weight = &(tokens[2]); + slant = &(tokens[3]); + + if (useFamily) { + name = wstrdup(useFamily); + } else { + if (family->len==0 || family->str[0]=='*') + return wstrdup(DEFAULT_FONT); + + sprintf(buf, "%.*s", family->len, family->str); + name = wstrdup(buf); + } + + pixelsize = strToInt(&tokens[6]); + size = strToInt(&tokens[7]); + + if (size<=0 && pixelsize<=0) { + name = wstrappend(name, ":pixelsize=12"); + } else if (pixelsize>0) { + /* if pixelsize is present size will be ignored so we skip it */ + sprintf(buf, ":pixelsize=%d", pixelsize); + name = wstrappend(name, buf); + } else { + sprintf(buf, "-%d", size/10); + name = wstrappend(name, buf); + } + + if (weight->len>0 && weight->str[0]!='*') { + sprintf(buf, ":weight=%.*s", weight->len, weight->str); + name = wstrappend(name, buf); + } + + if (slant->len>0 && slant->str[0]!='*') { + sprintf(buf, ":slant=%s", mapSlantToName(slant)); + name = wstrappend(name, buf); + } + + if (keepXLFD) { + name = wstrappend(name, ":xlfd="); + name = wstrappend(name, xlfd); + } + + return name; +} + + +/* return converted font (if conversion is needed) else the original font */ +static char* +convertFont(char *font, Bool keepXLFD) +{ + if (font[0]=='-') { + if (!strchr(font, ',')) { + return xlfdToFc(font, NULL, keepXLFD); + } else { + return xlfdToFc(font, "sans-serif", keepXLFD); + } + } else { + return font; + } +} + + +void +print_help() +{ + printf("\nUsage: %s \n\n", ProgName); + puts("Converts fonts in a style file into fontconfig format"); + puts(""); + puts(" --help display this help and exit"); + puts(" --version output version information and exit"); + puts(" --keep-xlfd preserve the original xlfd by appending a ':xlfd=' hint"); + puts(" to the font name. This property is not used by the fontconfig"); + puts(" matching engine to find the font, but it is useful as a hint"); + puts(" about what the original font was to allow hand tuning the"); + puts(" result or restoring the xlfd. The default is to not add it"); + puts(" as it results in long, unreadable and confusing names."); + puts(" --sets-too try to approximate fontsets by using their first complete xlfd."); + puts(" This only works for singlebyte languages. The default is to"); + puts(" replace the fontset with the default: 'sans-serif:pixelsize=12'"); + puts(" which should display properly for any language."); + puts(""); +} + +// replace --sets-too with something better +int +main(int argc, char **argv) +{ + WMPropList *style, *key, *val; + char *file = NULL, *oldfont, *newfont; + struct stat statbuf; + Bool keepXLFD = False; + int i; + + ProgName = argv[0]; + + if (argc<2) { + print_help(); + exit(0); + } + + for (i=1; i < argc; i++) { + if (strcmp("--version", argv[i])==0) { + puts(PROG_VERSION); + exit(0); + } else if (strcmp("--help", argv[i])==0) { + print_help(); + exit(0); + } else if (strcmp("--keep-xlfd", argv[i])==0) { + keepXLFD = True;; + } else if (argv[i][0]=='-') { + printf("%s: invalid argument '%s'\n", ProgName, argv[i]); + printf("Try '%s --help' for more information\n", ProgName); + exit(1); + } else { + file = argv[i]; + } + } + + WMPLSetCaseSensitive(False); + + if (stat(file, &statbuf) < 0) { + perror(file); + exit(1); + } + + style = WMReadPropListFromFile(file); + if (!style) { + perror(file); + printf("%s: could not load style file.\n", ProgName); + exit(1); + } + + if (!WMIsPLDictionary(style)) { + printf("%s: '%s' is not a well formatted style file\n", ProgName, file); + exit(1); + } + + for (i=0; FontOptions[i]!=NULL; i++) { + key = WMCreatePLString(FontOptions[i]); + val = WMGetFromPLDictionary(style, key); + if (val) { + oldfont = WMGetFromPLString(val); + newfont = convertFont(oldfont, keepXLFD); + if (oldfont != newfont) { + val = WMCreatePLString(newfont); + WMPutInPLDictionary(style, key, val); + WMReleasePropList(val); + wfree(newfont); + } + } + WMReleasePropList(key); + } + + WMWritePropListToFile(style, file, True); + + exit(0); +} + + diff --git a/util/getstyle.c b/util/getstyle.c index e0c54625..9585cfe9 100644 --- a/util/getstyle.c +++ b/util/getstyle.c @@ -467,7 +467,7 @@ strToInt(str *token) int res=0, pos, c; if (token->len==0 || token->str[0]=='*') { - return -1; + return -1; } else { for (res=0, pos=0; poslen; pos++) { c = token->str[pos] - '0'; @@ -589,7 +589,7 @@ findCopyFile(char *dir, char *file) if (!fullPath) { char buffer[4000]; - sprintf(buffer, "coould not find file %s", file); + sprintf(buffer, "could not find file %s", file); abortar(buffer); } copyFile(dir, fullPath); @@ -776,7 +776,7 @@ main(int argc, char **argv) oldfont = WMGetFromPLString(val); newfont = convertFont(oldfont); - /* font is a reference to old if conversion is not needed */ + /* newfont is a reference to old if conversion is not needed */ if (newfont != oldfont) { WMReleasePropList(val); val = WMCreatePLString(newfont); diff --git a/util/wmagnify.c b/util/wmagnify.c index 0ab49b79..9d6703d9 100644 --- a/util/wmagnify.c +++ b/util/wmagnify.c @@ -10,6 +10,7 @@ #include #include +#include #include /* diff --git a/util/wmsetbg.c b/util/wmsetbg.c index 31592cb0..ba7c56fa 100644 --- a/util/wmsetbg.c +++ b/util/wmsetbg.c @@ -495,7 +495,7 @@ parseTexture(RContext *rc, char *text) XColor color; Pixmap pixmap = None; RImage *image = NULL; - int w, h; + //int w, h; int iwidth, iheight; RColor rcolor; diff --git a/wmlib/app.c b/wmlib/app.c index 96e11a75..6a7f5769 100644 --- a/wmlib/app.c +++ b/wmlib/app.c @@ -21,6 +21,7 @@ #include #include +#include #include "WMaker.h" #include "app.h" diff --git a/wrlib/convert.c b/wrlib/convert.c index ba96643e..95689bba 100644 --- a/wrlib/convert.c +++ b/wrlib/convert.c @@ -678,7 +678,8 @@ image2StandardPseudoColor(RContext *ctx, RImage *image) int x1, ofs; #ifdef DEBUG - printf("pseudo color dithering with %d colors per channel\n", cpc); + printf("pseudo color dithering with %d colors per channel\n", + ctx->attribs->colors_per_channel); #endif err = (short*)malloc(3*(image->width+2)*sizeof(short)); nerr = (short*)malloc(3*(image->width+2)*sizeof(short)); -- 2.11.4.GIT