Bug#514277: setting font via toolkit options is broken [PATCH]
This is a little uglier than I would like because I wanted to keep
it a compile-time option as well; now a truetype font is used if
both XFT_SUPPORT is defined and a fontName is set. If it is not,
dclock falls back to the non-freetype code.
---
Dclock.c | 140 +++++++++++++++++++++++++++++++++++--------------------------
DclockP.h | 3 +-
2 files changed, 83 insertions(+), 60 deletions(-)
diff --git a/Dclock.c b/Dclock.c
index 0e41d85..cd83a24 100644
--- a/Dclock.c
+++ b/Dclock.c
@@ -165,7 +165,7 @@ static XtResource resources[] = {
XtOffset(DclockWidget,dclock.font), XtRString, "fixed"},
#ifdef XFT_SUPPORT
{ XftNfontName, "fontName", XtRString, sizeof(String),
- XtOffset(DclockWidget,dclock.xftfontname), XtRString, "charter"},
+ XtOffset(DclockWidget,dclock.xftfontname), XtRString, NULL},
#endif
{ XtNangle, "Slope", XtRFloat, sizeof(float),
XtOffset(DclockWidget,dclock.angle), XtRFloat, (caddr_t)&sslope},
@@ -344,6 +344,12 @@ typedef XfPoint segment_pts[NUM_SEGS][MAX_PTS];
segment_pts tiny_segment_pts;
segment_pts norm_segment_pts;
+#ifdef XFT_SUPPORT
+#define XFT_COND(dclock) ((dclock).xftfontname)
+#else
+#define XFT_COND(dclock) (0)
+#endif
+
/* ARGSUSED */
static void
Initialize (request, new)
@@ -386,11 +392,13 @@ DclockWidget new;
if (new->dclock.sec_gap < 0.0) new->dclock.sec_gap = 0.0;
#ifdef XFT_SUPPORT
- new->dclock.xftfont = XftFontOpen(dpy, DefaultScreen(dpy),
+ if (XFT_COND(new->dclock)) {
+ new->dclock.xftfont = XftFontOpen(dpy, DefaultScreen(dpy),
XFT_FAMILY, XftTypeString, new->dclock.xftfontname,
XFT_SIZE, XftTypeDouble, ((float)new->core.height / 6.0) - 4.0,
NULL);
- new->dclock.xftdraw = NULL;
+ new->dclock.xftdraw = NULL;
+ }
#endif
GetGC(new);
@@ -447,11 +455,11 @@ DclockWidget new;
if (new->dclock.date_fmt && !*new->dclock.date_fmt)
new->dclock.date_fmt = NULL;
if (new->dclock.dateup && new->dclock.date_fmt)
-#ifdef XFT_SUPPORT
+ if (XFT_COND(new->dclock)) {
TopOffset = new->core.height / 6;
-#else
+ } else {
TopOffset = new->dclock.font->ascent + new->dclock.font->descent;
-#endif
+ }
else
TopOffset = 0;
@@ -519,7 +527,7 @@ XSetWindowAttributes *attrs;
XtCreateWindow(w, InputOutput, (Visual *)CopyFromParent, *valueMask, attrs);
#ifdef XFT_SUPPORT
- if (dw->dclock.xftdraw == NULL) {
+ if (XFT_COND(dw->dclock) && dw->dclock.xftdraw == NULL) {
XColor color;
Colormap cm = DefaultColormap(dp, sc);
@@ -574,7 +582,8 @@ DclockWidget w;
XDestroyRegion(clip_colon);
#ifdef XFT_SUPPORT
- XftFontClose(XtDisplay(w), w->dclock.xftfont);
+ if (XFT_COND(w->dclock))
+ XftFontClose(XtDisplay(w), w->dclock.xftfont);
#endif
}
@@ -596,11 +605,13 @@ DclockWidget w;
winheight = w->core.height;
#ifdef XFT_SUPPORT
- XftFontClose(dpy, w->dclock.xftfont);
- w->dclock.xftfont = XftFontOpen(dpy, DefaultScreen(dpy),
+ if(XFT_COND(w->dclock)) {
+ XftFontClose(dpy, w->dclock.xftfont);
+ w->dclock.xftfont = XftFontOpen(dpy, DefaultScreen(dpy),
XFT_FAMILY, XftTypeString, w->dclock.xftfontname,
XFT_SIZE, XftTypeDouble, ((float)winheight / 6.0) - 4.0,
NULL);
+ }
#endif
y_ratio = (float)winheight / CLOCK_HEIGHT;
@@ -608,11 +619,13 @@ DclockWidget w;
if (w->dclock.date_fmt || !w->dclock.display_time || w->dclock.alarm ||
w->dclock.bell)
/* make win temporarily shorter so digits will fit on top of date */
-#ifdef XFT_SUPPORT
- winheight -= w->core.height / 6;
-#else
- winheight -= w->dclock.font->ascent + w->dclock.font->descent;
-#endif
+ {
+ if(XFT_COND(w->dclock)) {
+ winheight -= w->core.height / 6;
+ } else {
+ winheight -= w->dclock.font->ascent + w->dclock.font->descent;
+ }
+ }
/*
* if the width of all segments are equal, then the width in x is the
@@ -1669,51 +1682,60 @@ struct tm *now;
char datestr[128];
register char *p;
int x, datep;
+ int tsize;
#ifdef XFT_SUPPORT
- int tsize = w->core.height / 6;
XGlyphInfo xftextents;
-#else
- int tsize = w->dclock.font->ascent + w->dclock.font->descent;
#endif
+ if (XFT_COND(w->dclock)) {
+ tsize = w->core.height / 6;
+ } else {
+ tsize = w->dclock.font->ascent + w->dclock.font->descent;
+ }
+
if (!w->dclock.display_time)
datep = strlen(strcpy(datestr, "Push HERE to Set/Unset Alarm"));
else
datep = strftime(datestr, 128, w->dclock.date_fmt, now);
+ if (XFT_COND(w->dclock)) {
#ifdef XFT_SUPPORT
- XftTextExtents8(dpy, w->dclock.xftfont, datestr, datep, &xftextents);
- x = (w->core.width - xftextents.width) / 2;
-#else
- x = (w->core.width - XTextWidth(w->dclock.font, datestr, datep)) / 2;
+ XftTextExtents8(dpy, w->dclock.xftfont, datestr, datep, &xftextents);
+ x = (w->core.width - xftextents.width) / 2;
#endif
+ } else {
+ x = (w->core.width - XTextWidth(w->dclock.font, datestr, datep)) / 2;
+ }
+
if (x < 2)
x = 2;
if (TopOffset) {
-
+ if (XFT_COND(w->dclock)) {
#ifdef XFT_SUPPORT
- XftDrawRect(w->dclock.xftdraw, &w->dclock.xftbg, 0, 0, winwidth, tsize);
- XftDrawString8(w->dclock.xftdraw, &w->dclock.xftfg, w->dclock.xftfont, x,
+ XftDrawRect(w->dclock.xftdraw, &w->dclock.xftbg, 0, 0, winwidth, tsize);
+ XftDrawString8(w->dclock.xftdraw, &w->dclock.xftfg, w->dclock.xftfont, x,
(BORDER/2) + tsize - 2, datestr, datep);
-#else
- XFillRectangle(dpy, win, w->dclock.backGC,
- 0, 0, winwidth, tsize);
- XDrawString(dpy, win, w->dclock.foreGC,
- x, ((BORDER/2)+w->dclock.xftfont->height), datestr, datep);
#endif
+ } else {
+ XFillRectangle(dpy, win, w->dclock.backGC,
+ 0, 0, winwidth, tsize);
+ XDrawString(dpy, win, w->dclock.foreGC,
+ x, ((BORDER/2)+tsize), datestr, datep);
+ }
} else {
-
+ if (XFT_COND(w->dclock)) {
#ifdef XFT_SUPPORT
- XftDrawRect(w->dclock.xftdraw, &w->dclock.xftbg, 0, winheight - tsize,
+ XftDrawRect(w->dclock.xftdraw, &w->dclock.xftbg, 0, winheight - tsize,
winwidth, tsize);
- XftDrawString8(w->dclock.xftdraw, &w->dclock.xftfg, w->dclock.xftfont, x,
+ XftDrawString8(w->dclock.xftdraw, &w->dclock.xftfg, w->dclock.xftfont, x,
winheight - BORDER - 2, datestr, datep);
-#else
- XFillRectangle(dpy, win, w->dclock.backGC,
- 0, winheight - tsize, winwidth, tsize);
- XDrawString(dpy, win, w->dclock.foreGC,
- x, winheight - BORDER, datestr, datep);
#endif
+ } else {
+ XFillRectangle(dpy, win, w->dclock.backGC,
+ 0, winheight - tsize, winwidth, tsize);
+ XDrawString(dpy, win, w->dclock.foreGC,
+ x, winheight - BORDER, datestr, datep);
+ }
}
}
@@ -1992,13 +2014,13 @@ DclockWidget w;
w->dclock.date_fmt = saved_date;
saved_date = tmp;
- if (w->dclock.dateup && w->dclock.date_fmt)
-#ifdef XFT_SUPPORT
- TopOffset = w->core.height / 6;
-#else
- TopOffset = w->dclock.font->ascent + w->dclock.font->descent;
-#endif
- else
+ if (w->dclock.dateup && w->dclock.date_fmt) {
+ if (XFT_COND(w->dclock)) {
+ TopOffset = w->core.height / 6;
+ } else {
+ TopOffset = w->dclock.font->ascent + w->dclock.font->descent;
+ }
+ } else
TopOffset = 0;
before.tm_wday = -1;
@@ -2021,13 +2043,13 @@ DclockWidget w;
XtSetArg(arg, XtNdateUp, !w->dclock.dateup);
XtSetValues((Widget)w, &arg, 1);
- if (w->dclock.dateup && w->dclock.date_fmt)
-#ifdef XFT_SUPPORT
- TopOffset = w->core.height / 6;
-#else
- TopOffset = w->dclock.font->ascent + w->dclock.font->descent;
-#endif
- else
+ if (w->dclock.dateup && w->dclock.date_fmt) {
+ if (XFT_COND(w->dclock)) {
+ TopOffset = w->core.height / 6;
+ } else {
+ TopOffset = w->dclock.font->ascent + w->dclock.font->descent;
+ }
+ } else
TopOffset = 0;
ResizeNow(w);
@@ -2184,20 +2206,20 @@ XButtonEvent *event;
*/
int i, x, y = (int)((BORDER/2)*y_ratio) + TopOffset;
/* first check to see if user toggles the alarm */
-#ifdef XFT_SUPPORT
- if (TopOffset)
+ if (XFT_COND(w->dclock)) {
+ if (TopOffset)
i = (BORDER + (w->core.height / 6))
- event->y;
- else
+ else
i = event->y - (winheight - (w->core.height / 6));
-#else
- if (TopOffset)
+ } else {
+ if (TopOffset)
i = (BORDER + (w->dclock.font->ascent + w->dclock.font->descent))
- event->y;
- else
+ else
i = event->y - (winheight - (w->dclock.font->ascent
+ w->dclock.font->descent));
-#endif
+ }
if (i >= 0)
toggle_alarm(w);
else for (i = 0; i < 4; i++) {
diff --git a/DclockP.h b/DclockP.h
index bb2c29e..ded7802 100644
--- a/DclockP.h
+++ b/DclockP.h
@@ -9,8 +9,9 @@
#include "Dclock.h"
/* Add -DXFT_SUPPORT in the Imakefile for freefont support */
+#ifdef XFT_SUPPORT
#include <X11/Xft/Xft.h>
-
+#endif
typedef struct {
Pixel foreground;
--
1.6.1.3
--
Robert Macomber
xbylpv@rojoma.com
Reply to: