Introduction
Introduction Statistics Contact Development Disclaimer Help
treverting to plain X11 fonts in order to implement draw.c default - dwm - [for…
git clone git://src.adamsgaard.dk/dwm
Log
Files
Refs
README
LICENSE
---
commit 61fe833a062b0e027ec48ed7c7adeb2ed63089d3
parent 917e28163420b643e2d08b26dfba796d8d468d9b
Author: [email protected] <unknown>
Date: Sun, 18 Nov 2012 10:56:54 +0100
reverting to plain X11 fonts in order to implement draw.c default
Diffstat:
M config.def.h | 2 +-
M config.mk | 4 ++--
M dwm.c | 102 ++++++++++++++++++++---------…
3 files changed, 69 insertions(+), 39 deletions(-)
---
diff --git a/config.def.h b/config.def.h
t@@ -1,7 +1,7 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
-static const char font[] = "Liberation Mono:pixelsize=12:antialias=…
+static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*…
static const char normbordercolor[] = "#444444";
static const char normbgcolor[] = "#222222";
static const char normfgcolor[] = "#bbbbbb";
diff --git a/config.mk b/config.mk
t@@ -15,8 +15,8 @@ XINERAMALIBS = -lXinerama
XINERAMAFLAGS = -DXINERAMA
# includes and libs
-INCS = -I${X11INC} -I/usr/include/freetype2
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} -lutil -lXext -lXft -lfontconfig
+INCS = -I${X11INC}
+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
# flags
CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERA…
diff --git a/dwm.c b/dwm.c
t@@ -37,8 +37,6 @@
#include <X11/Xproto.h>
#include <X11/Xutil.h>
#include <X11/XKBlib.h>
-#include <fontconfig/fontconfig.h>
-#include <X11/Xft/Xft.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif /* XINERAMA */
t@@ -104,15 +102,16 @@ struct Client {
typedef struct {
int x, y, w, h;
- XftColor norm[ColLast];
- XftColor sel[ColLast];
+ unsigned long norm[ColLast];
+ unsigned long sel[ColLast];
Drawable drawable;
GC gc;
struct {
int ascent;
int descent;
int height;
- XftFont *xfont;
+ XFontSet set;
+ XFontStruct *xfont;
} font;
} DC; /* draw context */
t@@ -182,15 +181,15 @@ static void die(const char *errstr, ...);
static Monitor *dirtomon(int dir);
static void drawbar(Monitor *m);
static void drawbars(void);
-static void drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColL…
-static void drawtext(const char *text, XftColor col[ColLast], Bool invert);
+static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col…
+static void drawtext(const char *text, unsigned long col[ColLast], Bool invert…
static void enternotify(XEvent *e);
static void expose(XEvent *e);
static void focus(Client *c);
static void focusin(XEvent *e);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
-static XftColor 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);
t@@ -490,6 +489,10 @@ 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);
t@@ -722,7 +725,7 @@ void
drawbar(Monitor *m) {
int x;
unsigned int i, occ = 0, urg = 0;
- XftColor *col;
+ unsigned long *col;
Client *c;
for(c = m->clients; c; c = c->next) {
t@@ -777,10 +780,10 @@ drawbars(void) {
}
void
-drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]) {
+drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
int x;
- XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG].pixel);
+ XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
x = (dc.font.ascent + dc.font.descent + 2) / 4;
if(filled)
XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x…
t@@ -789,12 +792,11 @@ drawsquare(Bool filled, Bool empty, Bool invert, XftColo…
}
void
-drawtext(const char *text, XftColor col[ColLast], Bool invert) {
+drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
char buf[256];
int i, x, y, h, len, olen;
- XftDraw *d;
- XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG].pixel);
+ XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
if(!text)
return;
t@@ -809,11 +811,11 @@ drawtext(const char *text, XftColor col[ColLast], Bool i…
memcpy(buf, text, len);
if(len < olen)
for(i = len; i && i > len - 3; buf[--i] = '.');
-
- d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), Defaul…
-
- XftDrawStringUtf8(d, &col[invert ? ColBG : ColFG], dc.font.xfont, x, y…
- XftDrawDestroy(d);
+ XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
+ if(dc.font.set)
+ XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf,…
+ else
+ XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
}
void
t@@ -859,7 +861,7 @@ focus(Client *c) {
detachstack(c);
attachstack(c);
grabbuttons(c, True);
- XSetWindowBorder(dpy, c->win, dc.sel[ColBorder].pixel);
+ XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
setfocus(c);
}
else {
t@@ -933,14 +935,14 @@ getatomprop(Client *c, Atom prop) {
return atom;
}
-XftColor
+unsigned long
getcolor(const char *colstr) {
- XftColor color;
+ Colormap cmap = DefaultColormap(dpy, screen);
+ XColor color;
- if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap…
+ if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
die("error, cannot allocate color '%s'\n", colstr);
-
- return color;
+ return color.pixel;
}
Bool
t@@ -1041,13 +1043,35 @@ incnmaster(const Arg *arg) {
void
initfont(const char *fontstr) {
+ char *def, **missing;
+ int n;
- if(!(dc.font.xfont = XftFontOpenName(dpy,screen,fontstr))
- && !(dc.font.xfont = XftFontOpenName(dpy,screen,"fixed")))
- die("error, cannot load font: '%s'\n", fontstr);
-
- dc.font.ascent = dc.font.xfont->ascent;
- dc.font.descent = dc.font.xfont->descent;
+ dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
+ if(missing) {
+ while(n--)
+ fprintf(stderr, "dwm: missing fontset: %s\n", missing[…
+ 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)->desce…
+ 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;
+ }
dc.font.height = dc.font.ascent + dc.font.descent;
}
t@@ -1132,7 +1156,7 @@ manage(Window w, XWindowAttributes *wa) {
wc.border_width = c->bw;
XConfigureWindow(dpy, w, CWBorderWidth, &wc);
- XSetWindowBorder(dpy, w, dc.norm[ColBorder].pixel);
+ XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
configure(c); /* propagates border_width, if size doesn't change */
updatewindowtype(c);
updatesizehints(c);
t@@ -1622,6 +1646,8 @@ setup(void) {
dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, …
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 */
updatebars();
updatestatus();
t@@ -1694,9 +1720,13 @@ tagmon(const Arg *arg) {
int
textnw(const char *text, unsigned int len) {
- XGlyphInfo ext;
- XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
- return ext.xOff;
+ XRectangle r;
+
+ if(dc.font.set) {
+ XmbTextExtents(dc.font.set, text, len, NULL, &r);
+ return r.width;
+ }
+ return XTextWidth(dc.font.xfont, text, len);
}
void
t@@ -1776,7 +1806,7 @@ unfocus(Client *c, Bool setfocus) {
if(!c)
return;
grabbuttons(c, False);
- XSetWindowBorder(dpy, c->win, dc.norm[ColBorder].pixel);
+ XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
if(setfocus) {
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.