aboutsummaryrefslogtreecommitdiffstats
path: root/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c132
1 files changed, 62 insertions, 70 deletions
diff --git a/dwm.c b/dwm.c
index 9393a01..6dd904e 100644
--- a/dwm.c
+++ b/dwm.c
@@ -37,9 +37,9 @@
#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 <X11/Xft/Xft.h>
+//#include <pango/pango.h>
+//#include <pango/pangoxft.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif /* XINERAMA */
@@ -113,14 +113,11 @@ typedef struct {
Drawable tabdrawable;
GC gc;
struct {
- XftColor colors[MAXCOLORS][ColLast];
- XftDraw *drawable;
- } xft;
- struct {
int ascent;
int descent;
int height;
- PangoLayout *layout;
+ XFontSet set;
+ XFontStruct *xfont;
} font;
} DC; /* draw context */
@@ -214,8 +211,7 @@ static void focuswin(const Arg* arg);
static void focusin(XEvent *e);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
-//static unsigned long getcolor(const char *colstr); patched!
-static unsigned long getcolor(const char *colstr, XftColor *color);
+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);
@@ -284,7 +280,7 @@ static void zoom(const Arg *arg);
/* variables */
static const char broken[] = "broken";
-static char stext[512];
+static char stext[256];
static int screen;
static int sw, sh; /* X display screen geometry width, height */
static int bh, blw = 0; /* bar geometry */
@@ -542,23 +538,19 @@ cleanup(void) {
Arg a = {.ui = ~0};
Layout foo = { "", NULL };
Monitor *m;
- int i;
view(&a);
selmon->lt[selmon->sellt] = &foo;
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);
XFreePixmap(dpy, dc.tabdrawable);
- for(int c=0; c<NUMCOLORS; c++) {
- for(i = ColBorder; i < ColLast; i++) {
- XftColorFree(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), dc.xft.colors[c] + i);
- }
- }
- XftDrawDestroy(dc.xft.drawable);
- g_object_unref(dc.font.layout);
XFreeGC(dpy, dc.gc);
XFreeCursor(dpy, cursor[CurNormal]);
XFreeCursor(dpy, cursor[CurResize]);
@@ -651,7 +643,6 @@ configurenotify(XEvent *e) {
if(dc.drawable != 0)
XFreePixmap(dpy, dc.drawable);
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
- XftDrawChange(dc.xft.drawable, dc.drawable);
if(dc.tabdrawable != 0)
XFreePixmap(dpy, dc.tabdrawable);
dc.tabdrawable = XCreatePixmap(dpy, root, sw, th, DefaultDepth(dpy, screen));
@@ -1015,7 +1006,7 @@ drawsquare(Bool filled, Bool empty, int col) {
void
//drawtext(Drawable drawable, const char *text, unsigned long col[ColLast], Bool pad) {
drawtext(Drawable drawable, const char *text, int col, Bool pad) {
- char buf[512];
+ char buf[256];
int i, x, y, h, len, olen;
XSetForeground(dpy, dc.gc, dc.colors[col][ColBG]);
@@ -1024,8 +1015,7 @@ drawtext(Drawable drawable, const char *text, int col, Bool pad) {
return;
olen = strlen(text);
h = pad ? (dc.font.ascent + dc.font.descent) : 0;
- //y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2); patched!
- y = dc.y + (dc.h / 2) - (h / 2);
+ y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);
x = dc.x + (h / 2);
/* shorten text if necessary (this could wreak havoc with pango markup but fortunately
dc.w is adjusted to the width of the status text and not the other way around) */
@@ -1035,19 +1025,11 @@ drawtext(Drawable drawable, const char *text, int col, Bool pad) {
memcpy(buf, text, len);
if(len < olen)
for(i = len; i && i > len - 3; buf[--i] = '.');
- //XSetForeground(dpy, dc.gc, col[ColFG]); patched!
- //if(dc.font.set)
- // XmbDrawString(dpy, drawable, dc.font.set, dc.gc, x, y, buf, len);
- if(text == stext && statusmarkup)
- pango_layout_set_markup(dc.font.layout, buf, len);
-
+ XSetForeground(dpy, dc.gc, col[ColFG]); patched!
+ if(dc.font.set)
+ XmbDrawString(dpy, drawable, dc.font.set, dc.gc, x, y, buf, len);
else
- //XDrawString(dpy, drawable, dc.gc, x, y, buf, len); patched! and further ahead, patchy issues
- pango_layout_set_text(dc.font.layout, buf, len);
- pango_xft_render_layout(dc.xft.drawable, dc.xft.colors[col] + ColFG,
- dc.font.layout, x * PANGO_SCALE, y * PANGO_SCALE);
- if(text == stext && statusmarkup) /* clear markup attributes */
- pango_layout_set_attributes(dc.font.layout, NULL);
+ XDrawString(dpy, drawable, dc.gc, x, y, buf, len);
}
@@ -1182,13 +1164,12 @@ getatomprop(Client *c, Atom prop) {
}
unsigned long
-getcolor(const char *colstr, XftColor *color) {
+getcolor(const char *colstr) {
Colormap cmap = DefaultColormap(dpy, screen);
- Visual *vis = DefaultVisual(dpy, screen);
-
- if(!XftColorAllocName(dpy, vis, cmap, colstr, color))
+ XColor color;
+ if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
die("error, cannot allocate color '%s'\n", colstr);
- return color->pixel;
+ return color.pixel;
}
Bool
@@ -1289,24 +1270,36 @@ incnmaster(const Arg *arg) {
void
initfont(const char *fontstr) {
- PangoFontMap *fontmap;
- PangoContext *context;
- PangoFontDescription *desc;
- PangoFontMetrics *metrics;
-
- fontmap = pango_xft_get_font_map(dpy, screen);
- context = pango_font_map_create_context(fontmap);
- desc = pango_font_description_from_string(fontstr);
- dc.font.layout = pango_layout_new(context);
- pango_layout_set_font_description(dc.font.layout, desc);
-
- metrics = pango_context_get_metrics(context, desc, NULL);
- dc.font.ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
- dc.font.descent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
- dc.font.height = dc.font.ascent + dc.font.descent;
+ char *def, **missing;
+ int n;
- pango_font_metrics_unref(metrics);
- g_object_unref(context);
+ 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;
+ }
+ dc.font.height = dc.font.ascent + dc.font.descent;
}
#ifdef XINERAMA
@@ -1863,15 +1856,16 @@ setup(void) {
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
/* init appearance */
for(int i=0; i<NUMCOLORS; i++) {
- dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder], dc.xft.colors[i] + ColBorder );
- dc.colors[i][ColFG] = getcolor( colors[i][ColFG], dc.xft.colors[i] + ColFG );
- dc.colors[i][ColBG] = getcolor( colors[i][ColBG], dc.xft.colors[i] + ColBG );
+ dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] );
+ dc.colors[i][ColFG] = getcolor( colors[i][ColFG] );
+ dc.colors[i][ColBG] = getcolor( colors[i][ColBG] );
}
dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
dc.tabdrawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), th, DefaultDepth(dpy, screen));
- dc.xft.drawable = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(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 */
updatebars();
updatestatus();
@@ -1941,15 +1935,13 @@ tagmon(const Arg *arg) {
int
textnw(const char *text, unsigned int len) {
- PangoRectangle r;
- if(text == stext && statusmarkup)
- pango_layout_set_markup(dc.font.layout, text, len);
- else
- pango_layout_set_text(dc.font.layout, text, len);
- pango_layout_get_extents(dc.font.layout, 0, &r);
- if(text == stext && statusmarkup) /* clear markup attributes */
- pango_layout_set_attributes(dc.font.layout, NULL);
- return r.width / PANGO_SCALE;
+ 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