[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: