itInitialize font through fontconfig + freetype - xmenu - drop-down menu for X11 Err z3bra.org 70 hgit clone git://git.z3bra.org/xmenu.git URL:git://git.z3bra.org/xmenu.git z3bra.org 70 1Log /scm/xmenu/log.gph z3bra.org 70 1Files /scm/xmenu/files.gph z3bra.org 70 1Refs /scm/xmenu/refs.gph z3bra.org 70 i--- Err z3bra.org 70 1commit 769a43b6022669b39f11685961727945be3a016c /scm/xmenu/commit/769a43b6022669b39f11685961727945be3a016c.gph z3bra.org 70 1parent 7ee5c0bf82d7491c1f62d381fcde373ec154d066 /scm/xmenu/commit/7ee5c0bf82d7491c1f62d381fcde373ec154d066.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:dev@z3bra.org z3bra.org 70 iDate: Fri, 8 Nov 2019 23:05:57 +0100 Err z3bra.org 70 i Err z3bra.org 70 iInitialize font through fontconfig + freetype Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i M config.def.h | 3 +++ Err z3bra.org 70 i M config.mk | 4 ++-- Err z3bra.org 70 i M xmenu.c | 52 +++++++++++++++++++++++++++++++ Err z3bra.org 70 i Err z3bra.org 70 i3 files changed, 57 insertions(+), 2 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/config.def.h b/config.def.h /scm/xmenu/file/config.def.h.gph z3bra.org 70 it@@ -5,3 +5,6 @@ int height = 480; Err z3bra.org 70 i /* widget colors, given as RGB hex values */ Err z3bra.org 70 i uint32_t background = 0x666666; Err z3bra.org 70 i uint32_t foreground = 0xffffff; Err z3bra.org 70 i+ Err z3bra.org 70 i+/* font used for entries */ Err z3bra.org 70 i+char *font = "sans:pixelsize=14"; Err z3bra.org 70 1diff --git a/config.mk b/config.mk /scm/xmenu/file/config.mk.gph z3bra.org 70 it@@ -6,7 +6,7 @@ LD = $(CC) Err z3bra.org 70 i PREFIX = /usr/local Err z3bra.org 70 i MANDIR = ${PREFIX}/man Err z3bra.org 70 i Err z3bra.org 70 i-CPPFLAGS = -DVERSION=\"${VERSION}\" Err z3bra.org 70 i+CPPFLAGS = -DVERSION=\"${VERSION}\" -I/usr/include/freetype2 Err z3bra.org 70 i CFLAGS = $(CPPFLAGS) -Wall -Wextra -pedantic Err z3bra.org 70 i LDFLAGS = Err z3bra.org 70 i-LDLIBS = -lxcb Err z3bra.org 70 i+LDLIBS = -lxcb -lfontconfig -lfreetype Err z3bra.org 70 1diff --git a/xmenu.c b/xmenu.c /scm/xmenu/file/xmenu.c.gph z3bra.org 70 it@@ -4,6 +4,9 @@ Err z3bra.org 70 i #include Err z3bra.org 70 i Err z3bra.org 70 i #include Err z3bra.org 70 i+#include Err z3bra.org 70 i+#include Err z3bra.org 70 i+#include FT_FREETYPE_H Err z3bra.org 70 i Err z3bra.org 70 i #include "arg.h" Err z3bra.org 70 i #include "config.h" Err z3bra.org 70 it@@ -20,11 +23,57 @@ usage(FILE *fd, char *name) Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i int Err z3bra.org 70 i+setfont(char *fn, FT_Face *face) Err z3bra.org 70 i+{ Err z3bra.org 70 i+ FcBool status; Err z3bra.org 70 i+ FcResult result; Err z3bra.org 70 i+ FcPattern *pattern, *match; Err z3bra.org 70 i+ FcValue file, index; Err z3bra.org 70 i+ Err z3bra.org 70 i+ FT_Library lib; Err z3bra.org 70 i+ Err z3bra.org 70 i+ FcInit(); Err z3bra.org 70 i+ FT_Init_FreeType(&lib); Err z3bra.org 70 i+ Err z3bra.org 70 i+ /* parse font name and fill default attributes */ Err z3bra.org 70 i+ pattern = FcNameParse((FcChar8 *)fn); Err z3bra.org 70 i+ FcDefaultSubstitute(pattern); Err z3bra.org 70 i+ status = FcConfigSubstitute(NULL, pattern, FcMatchPattern); Err z3bra.org 70 i+ if (status == FcFalse) { Err z3bra.org 70 i+ fprintf(stderr, "Bad font name '%s'\n", fn); Err z3bra.org 70 i+ return -1; Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ /* load and actual font from the previously matched pattern */ Err z3bra.org 70 i+ match = FcFontMatch(NULL, pattern, &result); Err z3bra.org 70 i+ if (result != FcResultMatch) { Err z3bra.org 70 i+ fprintf(stderr, "Font not found: '%s'\n", fn); Err z3bra.org 70 i+ return -1; Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ /* get fontconfig attributes from matched pattern like filename and index */ Err z3bra.org 70 i+ if (FcPatternGet(match, FC_FILE, 0, &file) != FcResultMatch) { Err z3bra.org 70 i+ fprintf(stderr, "Font has no file: '%s'\n", fn); Err z3bra.org 70 i+ return -1; Err z3bra.org 70 i+ } Err z3bra.org 70 i+ if (FcPatternGet(match, FC_INDEX, 0, &index) != FcResultMatch) { Err z3bra.org 70 i+ fprintf(stderr, "Font has no file: '%s'\n", fn); Err z3bra.org 70 i+ index.type = FcTypeInteger; Err z3bra.org 70 i+ index.u.i = 0; Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ /* allocate freetype face according from fontconfig result */ Err z3bra.org 70 i+ return FT_New_Face(lib, (const char *)file.u.s, index.u.i, face); Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+int Err z3bra.org 70 i main(int argc, char *argv[]) Err z3bra.org 70 i { Err z3bra.org 70 i int mask, val[4]; Err z3bra.org 70 i char *argv0; Err z3bra.org 70 i Err z3bra.org 70 i+ FT_Face face; Err z3bra.org 70 i+ Err z3bra.org 70 i ARGBEGIN { Err z3bra.org 70 i case 'h': Err z3bra.org 70 i usage(stdout, argv0); Err z3bra.org 70 it@@ -43,6 +92,9 @@ main(int argc, char *argv[]) Err z3bra.org 70 i if (xcb_connection_has_error(dpy)) Err z3bra.org 70 i return -1; Err z3bra.org 70 i Err z3bra.org 70 i+ if (setfont(font, &face) < 0) Err z3bra.org 70 i+ return -1; Err z3bra.org 70 i+ Err z3bra.org 70 i screen = xcb_setup_roots_iterator(xcb_get_setup(dpy)).data; Err z3bra.org 70 i if (!screen) Err z3bra.org 70 i return -1; Err z3bra.org 70 .