summaryrefslogtreecommitdiff
path: root/lib/libstuff/x11/xft.c
blob: ddbf60b6d4e060fbcdc098054531c601b9bd557b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/* Copyright ©2010 Kris Maglione <maglione.k at Gmail>
 * See LICENSE file for license details.
 */
#include <stuff/x.h>
#include <stuff/util.h>

Xft	*xft;

#ifdef HAVE_RTLD
#include <dlfcn.h>

bool
havexft(void) {
	void *libxft;

	if(xft == nil) {
		libxft = dlopen("libXft.so", RTLD_LAZY);
		if(libxft == nil)
			return false;
		xft = emalloc(sizeof *xft);
		*(void**)(uintptr_t)&xft->drawcreate   = dlsym(libxft, "XftDrawCreate");
		*(void**)(uintptr_t)&xft->drawdestroy  = dlsym(libxft, "XftDrawDestroy");
		*(void**)(uintptr_t)&xft->fontopen     = dlsym(libxft, "XftFontOpenXlfd");
		*(void**)(uintptr_t)&xft->fontopenname = dlsym(libxft, "XftFontOpenName");
		*(void**)(uintptr_t)&xft->fontclose    = dlsym(libxft, "XftFontClose");
		*(void**)(uintptr_t)&xft->textextents  = dlsym(libxft, "XftTextExtentsUtf8");
		*(void**)(uintptr_t)&xft->drawstring   = dlsym(libxft, "XftDrawStringUtf8");
	}
	return xft && xft->drawcreate && xft->drawdestroy && xft->fontopen
		   && xft->fontopenname && xft->fontclose && xft->textextents && xft->drawstring;
}

#else
bool
havexft(void) {
	return false;
}
#endif