Created
July 14, 2011 06:31
-
-
Save anonymous/1082030 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -up a/config.def.h p/config.def.h | |
--- a/config.def.h 2011-07-11 05:46:36.841746280 +0000 | |
+++ p/config.def.h 2011-07-12 10:47:22.553923032 +0000 | |
@@ -1,7 +1,7 @@ | |
/* See LICENSE file for copyright and license details. */ | |
/* appearance */ | |
-static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*"; | |
+static const char font[] = "Sans 8"; | |
static const char normbordercolor[] = "#cccccc"; | |
static const char normbgcolor[] = "#cccccc"; | |
static const char normfgcolor[] = "#000000"; | |
Only in p: config.mk | |
diff -up a/dwm.c p/dwm.c | |
--- a/dwm.c 2011-07-11 05:46:15.355152855 +0000 | |
+++ p/dwm.c 2011-07-12 10:51:56.946518666 +0000 | |
@@ -36,6 +36,10 @@ | |
#include <X11/Xlib.h> | |
#include <X11/Xproto.h> | |
#include <X11/Xutil.h> | |
+#include <X11/Xft/Xft.h> | |
+#include <pango/pango.h> | |
+#include <pango/pangoxft.h> | |
+#include <pango/pango-font.h> | |
#ifdef XINERAMA | |
#include <X11/extensions/Xinerama.h> | |
#endif /* XINERAMA */ | |
@@ -46,8 +50,12 @@ | |
#define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH)) | |
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) | |
#define LENGTH(X) (sizeof X / sizeof X[0]) | |
-#define MAX(A, B) ((A) > (B) ? (A) : (B)) | |
+#ifndef MAX | |
+#define MAX(A, B) ((A) > (B) ? (A) : (B)) | |
+#endif | |
+#ifndef MIN | |
#define MIN(A, B) ((A) < (B) ? (A) : (B)) | |
+#endif | |
#define MOUSEMASK (BUTTONMASK|PointerMotionMask) | |
#define WIDTH(X) ((X)->w + 2 * (X)->bw) | |
#define HEIGHT(X) ((X)->h + 2 * (X)->bw) | |
@@ -101,12 +109,19 @@ typedef struct { | |
unsigned long sel[ColLast]; | |
Drawable drawable; | |
GC gc; | |
+ | |
+ XftColor xftnorm[ColLast]; | |
+ XftColor xftsel[ColLast]; | |
+ XftDraw *xftdrawable; | |
+ | |
+ PangoContext *pgc; | |
+ PangoLayout *plo; | |
+ PangoFontDescription *pfd; | |
+ | |
struct { | |
int ascent; | |
int descent; | |
int height; | |
- XFontSet set; | |
- XFontStruct *xfont; | |
} font; | |
} DC; /* draw context */ | |
@@ -183,7 +198,7 @@ static void focus(Client *c); | |
static void focusin(XEvent *e); | |
static void focusmon(const Arg *arg); | |
static void focusstack(const Arg *arg); | |
-static unsigned long getcolor(const char *colstr); | |
+//static unsigned long getcolor(const char *colstr); | |
static Bool getrootptr(int *x, int *y); | |
static long getstate(Window w); | |
static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); | |
@@ -478,10 +493,6 @@ cleanup(void) { | |
for(m = mons; m; m = m->next) | |
while(m->stack) | |
unmanage(m->stack, False); | |
- if(dc.font.set) | |
- XFreeFontSet(dpy, dc.font.set); | |
- else | |
- XFreeFont(dpy, dc.font.xfont); | |
XUngrabKey(dpy, AnyKey, AnyModifier, root); | |
XFreePixmap(dpy, dc.drawable); | |
XFreeGC(dpy, dc.gc); | |
@@ -595,6 +606,7 @@ configurenotify(XEvent *e) { | |
if(dc.drawable != 0) | |
XFreePixmap(dpy, dc.drawable); | |
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); | |
+ XftDrawChange(dc.xftdrawable, dc.drawable); | |
updatebars(); | |
for(m = mons; m; m = m->next) | |
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); | |
@@ -802,7 +814,7 @@ drawtext(const char *text, unsigned long | |
return; | |
olen = strlen(text); | |
h = dc.font.ascent + dc.font.descent; | |
- y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; | |
+ y = dc.y; | |
x = dc.x + (h / 2); | |
/* shorten text if necessary */ | |
for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--); | |
@@ -811,11 +823,8 @@ drawtext(const char *text, unsigned long | |
memcpy(buf, text, len); | |
if(len < olen) | |
for(i = len; i && i > len - 3; buf[--i] = '.'); | |
- XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]); | |
- if(dc.font.set) | |
- XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); | |
- else | |
- XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); | |
+ pango_layout_set_text(dc.plo, text, len); | |
+ pango_xft_render_layout(dc.xftdrawable, (col==dc.norm?dc.xftnorm:dc.xftsel)+(invert?ColBG:ColFG), dc.plo, x * PANGO_SCALE, y * PANGO_SCALE); | |
} | |
void | |
@@ -918,13 +927,13 @@ focusstack(const Arg *arg) { | |
} | |
unsigned long | |
-getcolor(const char *colstr) { | |
+getcolor(const char *colstr, XftColor *color) { | |
Colormap cmap = DefaultColormap(dpy, screen); | |
- XColor color; | |
+ Visual *vis = DefaultVisual(dpy, screen); | |
- if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) | |
+ if(!XftColorAllocName(dpy,vis,cmap,colstr, color)) | |
die("error, cannot allocate color '%s'\n", colstr); | |
- return color.pixel; | |
+ return color->pixel; | |
} | |
Bool | |
@@ -1020,36 +1029,18 @@ grabkeys(void) { | |
void | |
initfont(const char *fontstr) { | |
- char *def, **missing; | |
- int n; | |
+ PangoFontMetrics *metrics; | |
+ dc.pgc = pango_xft_get_context(dpy, screen); | |
+ dc.pfd = pango_font_description_from_string(fontstr); | |
+ | |
+ metrics = pango_context_get_metrics(dc.pgc, dc.pfd, pango_language_from_string(setlocale(LC_CTYPE, ""))); | |
+ dc.font.ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE; | |
+ dc.font.descent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE; | |
- missing = NULL; | |
- dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); | |
- if(missing) { | |
- while(n--) | |
- fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]); | |
- XFreeStringList(missing); | |
- } | |
- if(dc.font.set) { | |
- XFontStruct **xfonts; | |
- char **font_names; | |
- | |
- dc.font.ascent = dc.font.descent = 0; | |
- XExtentsOfFontSet(dc.font.set); | |
- n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); | |
- while(n--) { | |
- dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent); | |
- dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent); | |
- xfonts++; | |
- } | |
- } | |
- else { | |
- if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) | |
- && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) | |
- die("error, cannot load font: '%s'\n", fontstr); | |
- dc.font.ascent = dc.font.xfont->ascent; | |
- dc.font.descent = dc.font.xfont->descent; | |
- } | |
+ pango_font_metrics_unref(metrics); | |
+ | |
+ dc.plo = pango_layout_new(dc.pgc); | |
+ pango_layout_set_font_description(dc.plo, dc.pfd); | |
dc.font.height = dc.font.ascent + dc.font.descent; | |
} | |
@@ -1549,19 +1540,24 @@ setup(void) { | |
cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); | |
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); | |
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); | |
+ | |
/* init appearance */ | |
- dc.norm[ColBorder] = getcolor(normbordercolor); | |
- dc.norm[ColBG] = getcolor(normbgcolor); | |
- dc.norm[ColFG] = getcolor(normfgcolor); | |
- dc.sel[ColBorder] = getcolor(selbordercolor); | |
- dc.sel[ColBG] = getcolor(selbgcolor); | |
- dc.sel[ColFG] = getcolor(selfgcolor); | |
+ dc.norm[ColBorder] = getcolor(normbordercolor, dc.xftnorm+ColBorder); | |
+ dc.norm[ColBG] = getcolor(normbgcolor, dc.xftnorm+ColBG); | |
+ dc.norm[ColFG] = getcolor(normfgcolor, dc.xftnorm+ColFG); | |
+ dc.sel[ColBorder] = getcolor(selbordercolor, dc.xftsel+ColBorder); | |
+ dc.sel[ColBG] = getcolor(selbgcolor, dc.xftsel+ColBG); | |
+ dc.sel[ColFG] = getcolor(selfgcolor, dc.xftsel+ColFG); | |
+ | |
dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen)); | |
dc.gc = XCreateGC(dpy, root, 0, NULL); | |
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | |
- if(!dc.font.set) | |
- XSetFont(dpy, dc.gc, dc.font.xfont->fid); | |
- /* init bars */ | |
+ | |
+ dc.xftdrawable = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy,screen), DefaultColormap(dpy,screen)); | |
+ if(!dc.xftdrawable) | |
+ printf("error, cannot create drawable\n"); | |
+ | |
+ /* init bar */ | |
updatebars(); | |
updatestatus(); | |
/* EWMH support per view */ | |
@@ -1630,13 +1626,10 @@ tagmon(const Arg *arg) { | |
int | |
textnw(const char *text, unsigned int len) { | |
- XRectangle r; | |
- | |
- if(dc.font.set) { | |
- XmbTextExtents(dc.font.set, text, len, NULL, &r); | |
- return r.width; | |
- } | |
- return XTextWidth(dc.font.xfont, text, len); | |
+ PangoRectangle r; | |
+ pango_layout_set_text(dc.plo, text, len); | |
+ pango_layout_get_extents(dc.plo, &r, 0); | |
+ return r.width / PANGO_SCALE; | |
} | |
void |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment