[wiki] [sites] Add xft patch for tabbed 0.6 || Danil Semelenov

From: <git_AT_suckless.org>
Date: Thu, 10 Sep 2015 16:35:04 +0200

commit 9e37b315f3e17d107f98d94a40fe591171412a45
Author: Danil Semelenov <mail_AT_danil.mobi>
Date: Thu Sep 10 17:34:48 2015 +0300

    Add xft patch for tabbed 0.6

diff --git a/tools.suckless.org/tabbed/patches/tabbed-0.6-xft.diff b/tools.suckless.org/tabbed/patches/tabbed-0.6-xft.diff
new file mode 100644
index 0000000..7ec00fb
--- /dev/null
+++ b/tools.suckless.org/tabbed/patches/tabbed-0.6-xft.diff
_AT_@ -0,0 +1,233 @@
+diff --git a/config.def.h b/config.def.h
+index ceda9f7..bc7cfe2 100644
+--- a/config.def.h
++++ b/config.def.h
+_AT_@ -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 5279711..037f9d7 100644
+--- a/config.mk
++++ b/config.mk
+_AT_@ -8,8 +8,8 @@ PREFIX = /usr/local
+ MANPREFIX = ${PREFIX}/share/man
+
+ # includes and libs
+-INCS = -I. -I/usr/include
+-LIBS = -L/usr/lib -lc -lX11
++INCS = -I. -I/usr/include -I/usr/include/freetype2
++LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft
+
+ # flags
+ CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE
+diff --git a/tabbed.c b/tabbed.c
+index d30206b..d08348c 100644
+--- a/tabbed.c
++++ b/tabbed.c
+_AT_@ -15,6 +15,7 @@
+ #include <X11/Xproto.h>
+ #include <X11/Xutil.h>
+ #include <X11/XKBlib.h>
++#include <X11/Xft/Xft.h>
+
+ #include "arg.h"
+
+_AT_@ -64,16 +65,15 @@ typedef struct {
+
+ typedef struct {
+ int x, y, w, h;
+- unsigned long norm[ColLast];
+- unsigned long sel[ColLast];
++ XftColor norm[ColLast];
++ XftColor sel[ColLast];
+ Drawable drawable;
+ GC gc;
+ struct {
+ int ascent;
+ int descent;
+ int height;
+- XFontSet set;
+- XFontStruct *xfont;
++ XftFont *xfont;
+ } font;
+ } DC; /* draw context */
+
+_AT_@ -95,7 +95,7 @@ static void createnotify(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 *emallocz(size_t size);
+ static void *erealloc(void *o, size_t size);
+ static void expose(const XEvent *e);
+_AT_@ -105,7 +105,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);
+_AT_@ -219,12 +219,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);
+_AT_@ -305,7 +299,7 @@ die(const char *errstr, ...) {
+
+ void
+ drawbar(void) {
+- unsigned long *col;
++ XftColor *col;
+ int c, fc, width, n = 0;
+ char *name = NULL;
+
+_AT_@ -362,12 +356,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;
+_AT_@ -388,13 +383,10 @@ 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);
+- }
++ 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 *
+_AT_@ -524,15 +516,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'
", colstr);
+
+- return color.pixel;
++ return color;
+ }
+
+ int
+_AT_@ -585,41 +576,12 @@ 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
", missing[n]);
+- XFreeStringList(missing);
+- }
++ if(!(dc.font.xfont = XftFontOpenName(dpy, screen, fontstr))
++ && !(dc.font.xfont = XftFontOpenName(dpy, screen, "fixed")))
++ die("error, cannot load font: '%s'
", fontstr);
+
+- 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'
", 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;
+ }
+
+_AT_@ -972,11 +934,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|
+_AT_@ -1040,15 +1000,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
diff --git a/tools.suckless.org/tabbed/patches/xft.md b/tools.suckless.org/tabbed/patches/xft.md
new file mode 100644
index 0000000..156e691
--- /dev/null
+++ b/tools.suckless.org/tabbed/patches/xft.md
_AT_@ -0,0 +1,18 @@
+xft
+===
+
+Description
+-----------
+
+This patch implements Xft. This allows users to utilize the UTF8 character set.
+
+Download
+--------
+
+* [tabbed-0.6-xft.diff](tabbed-0.6-xft.diff) (6.5k) (10 Sep 2015)
+
+
+Author
+------
+
+* Danil Semelenov - `<mail at danil dot mobi>`
Received on Thu Sep 10 2015 - 16:35:04 CEST

This archive was generated by hypermail 2.3.0 : Thu Sep 10 2015 - 16:36:12 CEST