From 1bb72a819849af23da8d399ca0c6048391c32e57 Mon Sep 17 00:00:00 2001 From: Kirill Elagin Date: Fri, 19 Jun 2015 20:58:50 +0300 Subject: tabbed: update and add xft patch --- .../window-managers/tabbed/default.nix | 25 +-- pkgs/applications/window-managers/tabbed/xft.patch | 234 +++++++++++++++++++++ 2 files changed, 247 insertions(+), 12 deletions(-) create mode 100644 pkgs/applications/window-managers/tabbed/xft.patch (limited to 'pkgs/applications/window-managers') diff --git a/pkgs/applications/window-managers/tabbed/default.nix b/pkgs/applications/window-managers/tabbed/default.nix index 4e6c9c9a83e..a7e2059cd04 100644 --- a/pkgs/applications/window-managers/tabbed/default.nix +++ b/pkgs/applications/window-managers/tabbed/default.nix @@ -1,24 +1,25 @@ -{stdenv, fetchhg, xproto, libX11, patches ? []}: +{stdenv, fetchgit, xproto, libX11, enableXft, libXft}: + +with stdenv.lib; stdenv.mkDerivation rec { - name = "tabbed-20120209"; - - src = fetchhg { - url = http://hg.suckless.org/tabbed; - rev = "d7542a6f6dc5"; - sha256 = "1963jsazfmh5k7923c1mfwppz1xbh48z16j0sa64fiscq22as2gj"; + name = "tabbed-20150509"; + + src = fetchgit { + url = http://git.suckless.org/tabbed; + rev = "55dc32b27b73c121cab18009bf087e95ef3d9c18"; + sha256 = "0c5ayf1lrb1xiz5h8dfd4mh05kas42zzi5m5ylrvl67sfz3z4wg1"; }; - # Allow users set their own list of patches - inherit patches; + patches = optional enableXft ./xft.patch; - buildInputs = [ xproto libX11 ]; + buildInputs = [ xproto libX11 ] ++ optional enableXft libXft; preInstall = '' export makeFlags="PREFIX=$out" ''; - - meta = with stdenv.lib; { + + meta = { homepage = http://tools.suckless.org/tabbed; description = "Simple generic tabbed fronted to xembed aware applications"; license = licenses.mit; diff --git a/pkgs/applications/window-managers/tabbed/xft.patch b/pkgs/applications/window-managers/tabbed/xft.patch new file mode 100644 index 00000000000..f4f1e82e705 --- /dev/null +++ b/pkgs/applications/window-managers/tabbed/xft.patch @@ -0,0 +1,234 @@ +diff --git a/config.def.h b/config.def.h +index b3da7f0..ce43686 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -1,7 +1,7 @@ + /* See LICENSE file for copyright and license details. */ + + /* appearance */ +-static const char font[] = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*"; ++static const char font[] = "monospace-9"; + static const char* normbgcolor = "#222222"; + static const char* normfgcolor = "#cccccc"; + static const char* selbgcolor = "#555555"; +diff --git a/config.mk b/config.mk +index dd741e4..ed3a2e9 100644 +--- a/config.mk ++++ b/config.mk +@@ -9,7 +9,7 @@ MANPREFIX = ${PREFIX}/share/man + + # includes and libs + INCS = -I. -I/usr/include +-LIBS = -L/usr/lib -lc -lX11 ++LIBS = -L/usr/lib -lc -lXft -lX11 + + # flags + CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE +diff --git a/tabbed.c b/tabbed.c +index b15f9cb..6e50c41 100644 +--- a/tabbed.c ++++ b/tabbed.c +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + #include "arg.h" + +@@ -64,17 +65,16 @@ typedef struct { + + typedef struct { + int x, y, w, h; +- unsigned long norm[ColLast]; +- unsigned long sel[ColLast]; +- unsigned long urg[ColLast]; ++ XftColor norm[ColLast]; ++ XftColor sel[ColLast]; ++ XftColor urg[ColLast]; + Drawable drawable; + GC gc; + struct { + int ascent; + int descent; + int height; +- XFontSet set; +- XFontStruct *xfont; ++ XftFont *xfont; + } font; + } DC; /* draw context */ + +@@ -97,7 +97,7 @@ static void unmapnotify(const XEvent *e); + static void destroynotify(const XEvent *e); + static void die(const char *errstr, ...); + static void drawbar(void); +-static void drawtext(const char *text, unsigned long col[ColLast]); ++static void drawtext(const char *text, XftColor col[ColLast]); + static void *ecalloc(size_t n, size_t size); + static void *erealloc(void *o, size_t size); + static void expose(const XEvent *e); +@@ -107,7 +107,7 @@ static void focusonce(const Arg *arg); + static void fullscreen(const Arg *arg); + static char* getatom(int a); + static int getclient(Window w); +-static unsigned long getcolor(const char *colstr); ++static XftColor getcolor(const char *colstr); + static int getfirsttab(void); + static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void initfont(const char *fontstr); +@@ -220,12 +220,6 @@ cleanup(void) { + free(clients); + clients = NULL; + +- if(dc.font.set) { +- XFreeFontSet(dpy, dc.font.set); +- } else { +- XFreeFont(dpy, dc.font.xfont); +- } +- + XFreePixmap(dpy, dc.drawable); + XFreeGC(dpy, dc.gc); + XDestroyWindow(dpy, win); +@@ -315,7 +309,7 @@ die(const char *errstr, ...) { + + void + drawbar(void) { +- unsigned long *col; ++ XftColor *col; + int c, cc, fc, width; + char *name = NULL; + +@@ -368,12 +362,13 @@ drawbar(void) { + } + + void +-drawtext(const char *text, unsigned long col[ColLast]) { ++drawtext(const char *text, XftColor col[ColLast]) { + int i, x, y, h, len, olen; + char buf[256]; ++ XftDraw *d; + XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + +- XSetForeground(dpy, dc.gc, col[ColBG]); ++ XSetForeground(dpy, dc.gc, col[ColBG].pixel); + XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); + if(!text) + return; +@@ -394,13 +389,12 @@ drawtext(const char *text, unsigned long col[ColLast]) { + for(i = len; i && i > len - 3; buf[--i] = '.'); + } + +- XSetForeground(dpy, dc.gc, col[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); +- } ++ XSetForeground(dpy, dc.gc, col[ColFG].pixel); ++ ++ d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy,screen)); ++ ++ XftDrawStringUtf8(d, &col[ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len); ++ XftDrawDestroy(d); + } + + void * +@@ -537,15 +531,14 @@ getclient(Window w) { + return -1; + } + +-unsigned long ++XftColor + getcolor(const char *colstr) { +- Colormap cmap = DefaultColormap(dpy, screen); +- XColor color; ++ XftColor color; + +- if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) ++ if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color)) + die("tabbed: cannot allocate color '%s'\n", colstr); + +- return color.pixel; ++ return color; + } + + int +@@ -594,41 +587,11 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) { + + void + initfont(const char *fontstr) { +- char *def, **missing, **font_names; +- int i, n; +- XFontStruct **xfonts; +- +- missing = NULL; +- if(dc.font.set) +- XFreeFontSet(dpy, dc.font.set); +- +- dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); +- if(missing) { +- while(n--) +- fprintf(stderr, "tabbed: missing fontset: %s\n", missing[n]); +- XFreeStringList(missing); +- } +- +- if(dc.font.set) { +- dc.font.ascent = dc.font.descent = 0; +- n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); +- for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { +- dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent); +- dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent); +- xfonts++; +- } +- } else { +- if(dc.font.xfont) +- XFreeFont(dpy, dc.font.xfont); +- dc.font.xfont = NULL; +- if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) +- && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) { +- die("tabbed: cannot load font: '%s'\n", fontstr); +- } ++ 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.ascent = dc.font.xfont->ascent; ++ dc.font.descent = dc.font.xfont->descent; + dc.font.height = dc.font.ascent + dc.font.descent; + } + +@@ -1000,11 +963,9 @@ setup(void) { + dc.drawable = XCreatePixmap(dpy, root, ww, wh, + DefaultDepth(dpy, screen)); + dc.gc = XCreateGC(dpy, root, 0, 0); +- if(!dc.font.set) +- XSetFont(dpy, dc.gc, dc.font.xfont->fid); + + win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0, +- dc.norm[ColFG], dc.norm[ColBG]); ++ dc.norm[ColFG].pixel, dc.norm[ColBG].pixel); + XMapRaised(dpy, win); + XSelectInput(dpy, win, SubstructureNotifyMask|FocusChangeMask| + ButtonPressMask|ExposureMask|KeyPressMask|PropertyChangeMask| +@@ -1070,15 +1031,9 @@ spawn(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); ++ XGlyphInfo ext; ++ XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext); ++ return ext.xOff; + } + + void -- cgit 1.4.1