it* dwm + patches Err codevoid.de 70 i Err codevoid.de 70 hgit clone git://git.codevoid.de/dwm-sdk URL:git://git.codevoid.de/dwm-sdk codevoid.de 70 1Log /git/dwm-sdk/log.gph codevoid.de 70 1Files /git/dwm-sdk/files.gph codevoid.de 70 1Refs /git/dwm-sdk/refs.gph codevoid.de 70 1README /git/dwm-sdk/file/README.gph codevoid.de 70 1LICENSE /git/dwm-sdk/file/LICENSE.gph codevoid.de 70 i--- Err codevoid.de 70 1commit 5be974e0ca83cc0c67e9944550aa2832a3d14a7c /git/dwm-sdk/commit/5be974e0ca83cc0c67e9944550aa2832a3d14a7c.gph codevoid.de 70 1parent b00613e27fbfa2559bf6035e79efe16e65a49735 /git/dwm-sdk/commit/b00613e27fbfa2559bf6035e79efe16e65a49735.gph codevoid.de 70 hAuthor: Stefan Hagen URL:mailto:sh+git[at]codevoid[dot]de codevoid.de 70 iDate: Thu, 18 Apr 2019 15:38:21 +0200 Err codevoid.de 70 i Err codevoid.de 70 iUpdate to DWM 6.2 Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i M LICENSE | 17 +++++++++++------ Err codevoid.de 70 i M Makefile | 47 +++++++++++++------------------ Err codevoid.de 70 i M README | 3 --- Err codevoid.de 70 i M config.def.h | 58 ++++++++++++++----------------- Err codevoid.de 70 i M config.h | 23 +++++++++++++++++------ Err codevoid.de 70 i M config.mk | 25 +++++++++++++++---------- Err codevoid.de 70 i A drw.c | 436 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A drw.h | 57 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i M dwm.1 | 43 ++++++++++++------------------- Err codevoid.de 70 i M dwm.c | 1905 +++++++++++++++---------------- Err codevoid.de 70 i A transient.c | 42 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A util.c | 35 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A util.h | 8 ++++++++ Err codevoid.de 70 i Err codevoid.de 70 i13 files changed, 1618 insertions(+), 1081 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/LICENSE b/LICENSE /git/dwm-sdk/file/LICENSE.gph codevoid.de 70 it@@ -1,17 +1,22 @@ Err codevoid.de 70 i MIT/X Consortium License Err codevoid.de 70 i Err codevoid.de 70 i-© 2006-2011 Anselm R Garbe Err codevoid.de 70 i-© 2007-2011 Peter Hartlich Err codevoid.de 70 i-© 2010-2011 Connor Lane Smith Err codevoid.de 70 i+© 2006-2019 Anselm R Garbe Err codevoid.de 70 i © 2006-2009 Jukka Salmi Err codevoid.de 70 i-© 2007-2009 Premysl Hruby Err codevoid.de 70 i+© 2006-2007 Sander van Dijk Err codevoid.de 70 i+© 2007-2011 Peter Hartlich Err codevoid.de 70 i © 2007-2009 Szabolcs Nagy Err codevoid.de 70 i © 2007-2009 Christof Musik Err codevoid.de 70 i-© 2009 Mate Nagy Err codevoid.de 70 i+© 2007-2009 Premysl Hruby Err codevoid.de 70 i © 2007-2008 Enno Gottox Boland Err codevoid.de 70 i © 2008 Martin Hurton Err codevoid.de 70 i © 2008 Neale Pickett Err codevoid.de 70 i-© 2006-2007 Sander van Dijk Err codevoid.de 70 i+© 2009 Mate Nagy Err codevoid.de 70 i+© 2010-2016 Hiltjo Posthuma Err codevoid.de 70 i+© 2010-2012 Connor Lane Smith Err codevoid.de 70 i+© 2011 Christoph Lohmann <20h@r-36.net> Err codevoid.de 70 i+© 2015-2016 Quentin Rameau Err codevoid.de 70 i+© 2015-2016 Eric Pruitt Err codevoid.de 70 i+© 2016-2017 Markus Teich Err codevoid.de 70 i Err codevoid.de 70 i Permission is hereby granted, free of charge, to any person obtaining a Err codevoid.de 70 i copy of this software and associated documentation files (the "Software"), Err codevoid.de 70 1diff --git a/Makefile b/Makefile /git/dwm-sdk/file/Makefile.gph codevoid.de 70 it@@ -3,7 +3,7 @@ Err codevoid.de 70 i Err codevoid.de 70 i include config.mk Err codevoid.de 70 i Err codevoid.de 70 i-SRC = dwm.c Err codevoid.de 70 i+SRC = drw.c dwm.c util.c Err codevoid.de 70 i OBJ = ${SRC:.c=.o} Err codevoid.de 70 i Err codevoid.de 70 i all: options dwm Err codevoid.de 70 it@@ -15,46 +15,37 @@ options: Err codevoid.de 70 i @echo "CC = ${CC}" Err codevoid.de 70 i Err codevoid.de 70 i .c.o: Err codevoid.de 70 i- @echo CC $< Err codevoid.de 70 i- @${CC} -c ${CFLAGS} $< Err codevoid.de 70 i+ ${CC} -c ${CFLAGS} $< Err codevoid.de 70 i Err codevoid.de 70 i ${OBJ}: config.h config.mk Err codevoid.de 70 i Err codevoid.de 70 i config.h: Err codevoid.de 70 i- @echo creating $@ from config.def.h Err codevoid.de 70 i- @cp config.def.h $@ Err codevoid.de 70 i+ cp config.def.h $@ Err codevoid.de 70 i Err codevoid.de 70 i dwm: ${OBJ} Err codevoid.de 70 i- @echo CC -o $@ Err codevoid.de 70 i- @${CC} -o $@ ${OBJ} ${LDFLAGS} Err codevoid.de 70 i+ ${CC} -o $@ ${OBJ} ${LDFLAGS} Err codevoid.de 70 i Err codevoid.de 70 i clean: Err codevoid.de 70 i- @echo cleaning Err codevoid.de 70 i- @rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz Err codevoid.de 70 i+ rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz Err codevoid.de 70 i Err codevoid.de 70 i dist: clean Err codevoid.de 70 i- @echo creating dist tarball Err codevoid.de 70 i- @mkdir -p dwm-${VERSION} Err codevoid.de 70 i- @cp -R LICENSE Makefile README config.def.h config.mk \ Err codevoid.de 70 i- dwm.1 ${SRC} dwm-${VERSION} Err codevoid.de 70 i- @tar -cf dwm-${VERSION}.tar dwm-${VERSION} Err codevoid.de 70 i- @gzip dwm-${VERSION}.tar Err codevoid.de 70 i- @rm -rf dwm-${VERSION} Err codevoid.de 70 i+ mkdir -p dwm-${VERSION} Err codevoid.de 70 i+ cp -R LICENSE Makefile README config.def.h config.mk\ Err codevoid.de 70 i+ dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION} Err codevoid.de 70 i+ tar -cf dwm-${VERSION}.tar dwm-${VERSION} Err codevoid.de 70 i+ gzip dwm-${VERSION}.tar Err codevoid.de 70 i+ rm -rf dwm-${VERSION} Err codevoid.de 70 i Err codevoid.de 70 i install: all Err codevoid.de 70 i- @echo installing executable file to ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i- @mkdir -p ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i- @cp -f dwm ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i- @chmod 755 ${DESTDIR}${PREFIX}/bin/dwm Err codevoid.de 70 i- @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 Err codevoid.de 70 i- @mkdir -p ${DESTDIR}${MANPREFIX}/man1 Err codevoid.de 70 i- @sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 Err codevoid.de 70 i- @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 Err codevoid.de 70 i+ mkdir -p ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i+ cp -f dwm ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i+ chmod 755 ${DESTDIR}${PREFIX}/bin/dwm Err codevoid.de 70 i+ mkdir -p ${DESTDIR}${MANPREFIX}/man1 Err codevoid.de 70 i+ sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 Err codevoid.de 70 i+ chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 Err codevoid.de 70 i Err codevoid.de 70 i uninstall: Err codevoid.de 70 i- @echo removing executable file from ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i- @rm -f ${DESTDIR}${PREFIX}/bin/dwm Err codevoid.de 70 i- @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 Err codevoid.de 70 i- @rm -f ${DESTDIR}${MANPREFIX}/man1/dwm.1 Err codevoid.de 70 i+ rm -f ${DESTDIR}${PREFIX}/bin/dwm\ Err codevoid.de 70 i+ ${DESTDIR}${MANPREFIX}/man1/dwm.1 Err codevoid.de 70 i Err codevoid.de 70 i .PHONY: all options clean dist install uninstall Err codevoid.de 70 1diff --git a/README b/README /git/dwm-sdk/file/README.gph codevoid.de 70 it@@ -18,9 +18,6 @@ necessary as root): Err codevoid.de 70 i Err codevoid.de 70 i make clean install Err codevoid.de 70 i Err codevoid.de 70 i-If you are going to use the default bluegray color scheme it is highly Err codevoid.de 70 i-recommended to also install the bluegray files shipped in the dextra package. Err codevoid.de 70 i- Err codevoid.de 70 i Err codevoid.de 70 i Running dwm Err codevoid.de 70 i ----------- Err codevoid.de 70 1diff --git a/config.def.h b/config.def.h /git/dwm-sdk/file/config.def.h.gph codevoid.de 70 it@@ -1,37 +1,40 @@ Err codevoid.de 70 i /* See LICENSE file for copyright and license details. */ Err codevoid.de 70 i Err codevoid.de 70 i /* appearance */ Err codevoid.de 70 i-static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*"; Err codevoid.de 70 i-static const char normbordercolor[] = "#444444"; Err codevoid.de 70 i-static const char normbgcolor[] = "#222222"; Err codevoid.de 70 i-static const char normfgcolor[] = "#bbbbbb"; Err codevoid.de 70 i-static const char selbordercolor[] = "#005577"; Err codevoid.de 70 i-static const char selbgcolor[] = "#005577"; Err codevoid.de 70 i-static const char selfgcolor[] = "#eeeeee"; Err codevoid.de 70 i-static const char floatnormbordercolor[] = "#005577"; Err codevoid.de 70 i-static const char floatselbordercolor[] = "#005577"; Err codevoid.de 70 i static const unsigned int borderpx = 1; /* border pixel of windows */ Err codevoid.de 70 i-static const unsigned int gappx = 18; /* gap pixel between windows */ Err codevoid.de 70 i static const unsigned int snap = 32; /* snap pixel */ Err codevoid.de 70 i-static const unsigned int systrayspacing = 2; /* systray spacing */ Err codevoid.de 70 i-static const Bool showsystray = True; /* False means no systray */ Err codevoid.de 70 i-static const Bool showbar = True; /* False means no bar */ Err codevoid.de 70 i-static const Bool topbar = True; /* False means bottom bar */ Err codevoid.de 70 i-static const Bool extrabar = True; /* False means no extra bar */ Err codevoid.de 70 i+static const int showbar = 1; /* 0 means no bar */ Err codevoid.de 70 i+static const int topbar = 1; /* 0 means bottom bar */ Err codevoid.de 70 i+static const char *fonts[] = { "monospace:size=10" }; Err codevoid.de 70 i+static const char dmenufont[] = "monospace:size=10"; Err codevoid.de 70 i+static const char col_gray1[] = "#222222"; Err codevoid.de 70 i+static const char col_gray2[] = "#444444"; Err codevoid.de 70 i+static const char col_gray3[] = "#bbbbbb"; Err codevoid.de 70 i+static const char col_gray4[] = "#eeeeee"; Err codevoid.de 70 i+static const char col_cyan[] = "#005577"; Err codevoid.de 70 i+static const char *colors[][3] = { Err codevoid.de 70 i+ /* fg bg border */ Err codevoid.de 70 i+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, Err codevoid.de 70 i+ [SchemeSel] = { col_gray4, col_cyan, col_cyan }, Err codevoid.de 70 i+}; Err codevoid.de 70 i Err codevoid.de 70 i /* tagging */ Err codevoid.de 70 i static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; Err codevoid.de 70 i Err codevoid.de 70 i static const Rule rules[] = { Err codevoid.de 70 i+ /* xprop(1): Err codevoid.de 70 i+ * WM_CLASS(STRING) = instance, class Err codevoid.de 70 i+ * WM_NAME(STRING) = title Err codevoid.de 70 i+ */ Err codevoid.de 70 i /* class instance title tags mask isfloating monitor */ Err codevoid.de 70 i- { "Gimp", NULL, NULL, 0, True, -1 }, Err codevoid.de 70 i- { "Firefox", NULL, NULL, 1 << 8, False, -1 }, Err codevoid.de 70 i+ { "Gimp", NULL, NULL, 0, 1, -1 }, Err codevoid.de 70 i+ { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, Err codevoid.de 70 i }; Err codevoid.de 70 i Err codevoid.de 70 i /* layout(s) */ Err codevoid.de 70 i-static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ Err codevoid.de 70 i-static const int nmaster = 1; /* number of clients in master area */ Err codevoid.de 70 i-static const Bool resizehints = True; /* True means respect size hints in tiled resizals */ Err codevoid.de 70 i+static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ Err codevoid.de 70 i+static const int nmaster = 1; /* number of clients in master area */ Err codevoid.de 70 i+static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ Err codevoid.de 70 i Err codevoid.de 70 i static const Layout layouts[] = { Err codevoid.de 70 i /* symbol arrange function */ Err codevoid.de 70 it@@ -52,18 +55,15 @@ static const Layout layouts[] = { Err codevoid.de 70 i #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } Err codevoid.de 70 i Err codevoid.de 70 i /* commands */ Err codevoid.de 70 i-static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; Err codevoid.de 70 i-static const char *termcmd[] = { "uxterm", NULL }; Err codevoid.de 70 i-static const char scratchpadname[] = "scratchpad"; Err codevoid.de 70 i-static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL }; Err codevoid.de 70 i+static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ Err codevoid.de 70 i+static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; Err codevoid.de 70 i+static const char *termcmd[] = { "st", NULL }; Err codevoid.de 70 i Err codevoid.de 70 i static Key keys[] = { Err codevoid.de 70 i /* modifier key function argument */ Err codevoid.de 70 i { MODKEY, XK_p, spawn, {.v = dmenucmd } }, Err codevoid.de 70 i { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, Err codevoid.de 70 i- { MODKEY, XK_minus, togglescratch, {.v = scratchpadcmd } }, Err codevoid.de 70 i { MODKEY, XK_b, togglebar, {0} }, Err codevoid.de 70 i- { MODKEY, XK_b, toggleextrabar, {0} }, Err codevoid.de 70 i { MODKEY, XK_j, focusstack, {.i = +1 } }, Err codevoid.de 70 i { MODKEY, XK_k, focusstack, {.i = -1 } }, Err codevoid.de 70 i { MODKEY, XK_i, incnmaster, {.i = +1 } }, Err codevoid.de 70 it@@ -84,10 +84,6 @@ static Key keys[] = { Err codevoid.de 70 i { MODKEY, XK_period, focusmon, {.i = +1 } }, Err codevoid.de 70 i { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, Err codevoid.de 70 i { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, Err codevoid.de 70 i- { MODKEY, XK_Left, viewtoleft, {0} }, Err codevoid.de 70 i- { MODKEY, XK_Right, viewtoright, {0} }, Err codevoid.de 70 i- { MODKEY|ShiftMask, XK_Left, tagtoleft, {0} }, Err codevoid.de 70 i- { MODKEY|ShiftMask, XK_Right, tagtoright, {0} }, Err codevoid.de 70 i TAGKEYS( XK_1, 0) Err codevoid.de 70 i TAGKEYS( XK_2, 1) Err codevoid.de 70 i TAGKEYS( XK_3, 2) Err codevoid.de 70 it@@ -101,7 +97,7 @@ static Key keys[] = { Err codevoid.de 70 i }; Err codevoid.de 70 i Err codevoid.de 70 i /* button definitions */ Err codevoid.de 70 i-/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ Err codevoid.de 70 i+/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ Err codevoid.de 70 i static Button buttons[] = { Err codevoid.de 70 i /* click event mask button function argument */ Err codevoid.de 70 i { ClkLtSymbol, 0, Button1, setlayout, {0} }, Err codevoid.de 70 1diff --git a/config.h b/config.h /git/dwm-sdk/file/config.h.gph codevoid.de 70 it@@ -1,7 +1,7 @@ Err codevoid.de 70 i /* See LICENSE file for copyright and license details. */ Err codevoid.de 70 i Err codevoid.de 70 i /* appearance */ Err codevoid.de 70 i-static const char font[] = "-xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-15"; Err codevoid.de 70 i+static const char *fonts[] = { "-xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-15" }; Err codevoid.de 70 i static const char normbgcolor[] = "#181818"; // top bar bg Err codevoid.de 70 i static const char normfgcolor[] = "#999999"; // top bar fg Err codevoid.de 70 i static const char selbgcolor[] = "#181818"; // top bar selection bg Err codevoid.de 70 it@@ -13,11 +13,20 @@ static const char floatselbordercolor[] = "#FF0000"; // floating window border Err codevoid.de 70 i static const unsigned int borderpx = 1; // border pixel of windows Err codevoid.de 70 i static const unsigned int gappx = 8; // gap pixel between windows Err codevoid.de 70 i static const unsigned int snap = 8; // snap pixel Err codevoid.de 70 i+static const unsigned int systraypinning = 0; // 0: systray follows mouse, >0: pin systray to monitor X Err codevoid.de 70 i static const unsigned int systrayspacing = 2; // systray spacing Err codevoid.de 70 i-static const Bool showsystray = True; // False means no systray Err codevoid.de 70 i-static const Bool showbar = True; // False means no bar Err codevoid.de 70 i-static const Bool topbar = True; // False means bottom bar Err codevoid.de 70 i-static const Bool extrabar = True; // False means no extra bar Err codevoid.de 70 i+static const int systraypinningfailfirst = 1; // 1 first monitor, 0 last monitor Err codevoid.de 70 i+static const int showsystray = 1; // 0 means no systray Err codevoid.de 70 i+static const int showbar = 1; // False means no bar Err codevoid.de 70 i+static const int topbar = 1; // False means bottom bar Err codevoid.de 70 i+static const int extrabar = 1; // False means no extra bar Err codevoid.de 70 i+ Err codevoid.de 70 i+ Err codevoid.de 70 i+static const char *colors[][3] = { Err codevoid.de 70 i+ /* fg bg border */ Err codevoid.de 70 i+ [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor }, Err codevoid.de 70 i+ [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor }, Err codevoid.de 70 i+}; Err codevoid.de 70 i Err codevoid.de 70 i /* dmenu options */ Err codevoid.de 70 i #define DMENUOPTS "-fn", "Terminus:size=12" , "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor Err codevoid.de 70 it@@ -44,7 +53,7 @@ static const Rule rules[] = { Err codevoid.de 70 i /* layout(s) */ Err codevoid.de 70 i static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ Err codevoid.de 70 i static const int nmaster = 1; /* number of clients in master area */ Err codevoid.de 70 i-static const Bool resizehints = False; /* True means respect size hints in tiled resizals */ Err codevoid.de 70 i+static const int resizehints = 0; /* True means respect size hints in tiled resizals */ Err codevoid.de 70 i Err codevoid.de 70 i static const Layout layouts[] = { Err codevoid.de 70 i /* symbol arrange function */ Err codevoid.de 70 it@@ -65,7 +74,9 @@ static const Layout layouts[] = { Err codevoid.de 70 i static const char scratchpadname[] = "scratchpad"; Err codevoid.de 70 i Err codevoid.de 70 i /* commands */ Err codevoid.de 70 i+static char dmenumon[2] = "0"; Err codevoid.de 70 i static const char *dmenucmd[] = { "dmenu_run", DMENUOPTS, NULL }; Err codevoid.de 70 i+ Err codevoid.de 70 i #ifdef __linux__ Err codevoid.de 70 i static const char *scratchpadcmd[] = { "st","-t", scratchpadname, "-g", "120x34", "-e", "mksh", NULL }; Err codevoid.de 70 i static const char *termcmd[] = { "st", "-e", "mksh", NULL }; Err codevoid.de 70 1diff --git a/config.mk b/config.mk /git/dwm-sdk/file/config.mk.gph codevoid.de 70 it@@ -1,5 +1,5 @@ Err codevoid.de 70 i # dwm version Err codevoid.de 70 i-VERSION = 6.0 Err codevoid.de 70 i+VERSION = 6.2 Err codevoid.de 70 i Err codevoid.de 70 i # Customize below to fit your system Err codevoid.de 70 i Err codevoid.de 70 it@@ -10,20 +10,25 @@ MANPREFIX = ${PREFIX}/share/man Err codevoid.de 70 i X11INC = /usr/X11R6/include Err codevoid.de 70 i X11LIB = /usr/X11R6/lib Err codevoid.de 70 i Err codevoid.de 70 i-# Xinerama Err codevoid.de 70 i-XINERAMALIBS = -L${X11LIB} -lXinerama Err codevoid.de 70 i+# Xinerama, comment if you don't want it Err codevoid.de 70 i+XINERAMALIBS = -lXinerama Err codevoid.de 70 i XINERAMAFLAGS = -DXINERAMA Err codevoid.de 70 i Err codevoid.de 70 i+# freetype Err codevoid.de 70 i+FREETYPELIBS = -lfontconfig -lXft Err codevoid.de 70 i+FREETYPEINC = /usr/include/freetype2 Err codevoid.de 70 i+# OpenBSD (uncomment) Err codevoid.de 70 i+#FREETYPEINC = ${X11INC}/freetype2 Err codevoid.de 70 i+ Err codevoid.de 70 i # includes and libs Err codevoid.de 70 i-INCS = -I. -I/usr/include -I${X11INC} Err codevoid.de 70 i-LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} Err codevoid.de 70 i+INCS = -I${X11INC} -I${FREETYPEINC} Err codevoid.de 70 i+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} Err codevoid.de 70 i Err codevoid.de 70 i # flags Err codevoid.de 70 i-CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} Err codevoid.de 70 i-#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} Err codevoid.de 70 i-CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} Err codevoid.de 70 i-#LDFLAGS = -g ${LIBS} Err codevoid.de 70 i-LDFLAGS = -s ${LIBS} Err codevoid.de 70 i+CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} Err codevoid.de 70 i+#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} Err codevoid.de 70 i+CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} Err codevoid.de 70 i+LDFLAGS = ${LIBS} Err codevoid.de 70 i Err codevoid.de 70 i # Solaris Err codevoid.de 70 i #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" Err codevoid.de 70 1diff --git a/drw.c b/drw.c /git/dwm-sdk/file/drw.c.gph codevoid.de 70 it@@ -0,0 +1,436 @@ Err codevoid.de 70 i+/* See LICENSE file for copyright and license details. */ Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+ Err codevoid.de 70 i+#include "drw.h" Err codevoid.de 70 i+#include "util.h" Err codevoid.de 70 i+ Err codevoid.de 70 i+#define UTF_INVALID 0xFFFD Err codevoid.de 70 i+#define UTF_SIZ 4 Err codevoid.de 70 i+#define FC_COLOR "color" Err codevoid.de 70 i+ Err codevoid.de 70 i+static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; Err codevoid.de 70 i+static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; Err codevoid.de 70 i+static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; Err codevoid.de 70 i+static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; Err codevoid.de 70 i+ Err codevoid.de 70 i+static long Err codevoid.de 70 i+utf8decodebyte(const char c, size_t *i) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) Err codevoid.de 70 i+ if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) Err codevoid.de 70 i+ return (unsigned char)c & ~utfmask[*i]; Err codevoid.de 70 i+ return 0; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+static size_t Err codevoid.de 70 i+utf8validate(long *u, size_t i) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) Err codevoid.de 70 i+ *u = UTF_INVALID; Err codevoid.de 70 i+ for (i = 1; *u > utfmax[i]; ++i) Err codevoid.de 70 i+ ; Err codevoid.de 70 i+ return i; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+static size_t Err codevoid.de 70 i+utf8decode(const char *c, long *u, size_t clen) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ size_t i, j, len, type; Err codevoid.de 70 i+ long udecoded; Err codevoid.de 70 i+ Err codevoid.de 70 i+ *u = UTF_INVALID; Err codevoid.de 70 i+ if (!clen) Err codevoid.de 70 i+ return 0; Err codevoid.de 70 i+ udecoded = utf8decodebyte(c[0], &len); Err codevoid.de 70 i+ if (!BETWEEN(len, 1, UTF_SIZ)) Err codevoid.de 70 i+ return 1; Err codevoid.de 70 i+ for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { Err codevoid.de 70 i+ udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); Err codevoid.de 70 i+ if (type) Err codevoid.de 70 i+ return j; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (j < len) Err codevoid.de 70 i+ return 0; Err codevoid.de 70 i+ *u = udecoded; Err codevoid.de 70 i+ utf8validate(u, len); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return len; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+Drw * Err codevoid.de 70 i+drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ Drw *drw = ecalloc(1, sizeof(Drw)); Err codevoid.de 70 i+ Err codevoid.de 70 i+ drw->dpy = dpy; Err codevoid.de 70 i+ drw->screen = screen; Err codevoid.de 70 i+ drw->root = root; Err codevoid.de 70 i+ drw->w = w; Err codevoid.de 70 i+ drw->h = h; Err codevoid.de 70 i+ drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); Err codevoid.de 70 i+ drw->gc = XCreateGC(dpy, root, 0, NULL); Err codevoid.de 70 i+ XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return drw; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_resize(Drw *drw, unsigned int w, unsigned int h) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (!drw) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ Err codevoid.de 70 i+ drw->w = w; Err codevoid.de 70 i+ drw->h = h; Err codevoid.de 70 i+ if (drw->drawable) Err codevoid.de 70 i+ XFreePixmap(drw->dpy, drw->drawable); Err codevoid.de 70 i+ drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_free(Drw *drw) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ XFreePixmap(drw->dpy, drw->drawable); Err codevoid.de 70 i+ XFreeGC(drw->dpy, drw->gc); Err codevoid.de 70 i+ free(drw); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+/* This function is an implementation detail. Library users should use Err codevoid.de 70 i+ * drw_fontset_create instead. Err codevoid.de 70 i+ */ Err codevoid.de 70 i+static Fnt * Err codevoid.de 70 i+xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ Fnt *font; Err codevoid.de 70 i+ XftFont *xfont = NULL; Err codevoid.de 70 i+ FcPattern *pattern = NULL; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (fontname) { Err codevoid.de 70 i+ /* Using the pattern found at font->xfont->pattern does not yield the Err codevoid.de 70 i+ * same substitution results as using the pattern returned by Err codevoid.de 70 i+ * FcNameParse; using the latter results in the desired fallback Err codevoid.de 70 i+ * behaviour whereas the former just results in missing-character Err codevoid.de 70 i+ * rectangles being drawn, at least with some fonts. */ Err codevoid.de 70 i+ if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { Err codevoid.de 70 i+ fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (!(pattern = FcNameParse((FcChar8 *) fontname))) { Err codevoid.de 70 i+ fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); Err codevoid.de 70 i+ XftFontClose(drw->dpy, xfont); Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } else if (fontpattern) { Err codevoid.de 70 i+ if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { Err codevoid.de 70 i+ fprintf(stderr, "error, cannot load font from pattern.\n"); Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } else { Err codevoid.de 70 i+ die("no font specified."); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* Do not allow using color fonts. This is a workaround for a BadLength Err codevoid.de 70 i+ * error from Xft with color glyphs. Modelled on the Xterm workaround. See Err codevoid.de 70 i+ * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 Err codevoid.de 70 i+ * https://lists.suckless.org/dev/1701/30932.html Err codevoid.de 70 i+ * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 Err codevoid.de 70 i+ * and lots more all over the internet. Err codevoid.de 70 i+ */ Err codevoid.de 70 i+ FcBool iscol; Err codevoid.de 70 i+ if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { Err codevoid.de 70 i+ XftFontClose(drw->dpy, xfont); Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ font = ecalloc(1, sizeof(Fnt)); Err codevoid.de 70 i+ font->xfont = xfont; Err codevoid.de 70 i+ font->pattern = pattern; Err codevoid.de 70 i+ font->h = xfont->ascent + xfont->descent; Err codevoid.de 70 i+ font->dpy = drw->dpy; Err codevoid.de 70 i+ Err codevoid.de 70 i+ return font; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+static void Err codevoid.de 70 i+xfont_free(Fnt *font) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (!font) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ if (font->pattern) Err codevoid.de 70 i+ FcPatternDestroy(font->pattern); Err codevoid.de 70 i+ XftFontClose(font->dpy, font->xfont); Err codevoid.de 70 i+ free(font); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+Fnt* Err codevoid.de 70 i+drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ Fnt *cur, *ret = NULL; Err codevoid.de 70 i+ size_t i; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!drw || !fonts) Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (i = 1; i <= fontcount; i++) { Err codevoid.de 70 i+ if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { Err codevoid.de 70 i+ cur->next = ret; Err codevoid.de 70 i+ ret = cur; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ return (drw->fonts = ret); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_fontset_free(Fnt *font) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (font) { Err codevoid.de 70 i+ drw_fontset_free(font->next); Err codevoid.de 70 i+ xfont_free(font); Err codevoid.de 70 i+ } Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_clr_create(Drw *drw, Clr *dest, const char *clrname) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (!drw || !dest || !clrname) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), Err codevoid.de 70 i+ DefaultColormap(drw->dpy, drw->screen), Err codevoid.de 70 i+ clrname, dest)) Err codevoid.de 70 i+ die("error, cannot allocate color '%s'", clrname); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+/* Wrapper to create color schemes. The caller has to call free(3) on the Err codevoid.de 70 i+ * returned color scheme when done using it. */ Err codevoid.de 70 i+Clr * Err codevoid.de 70 i+drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ size_t i; Err codevoid.de 70 i+ Clr *ret; Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* need at least two colors for a scheme */ Err codevoid.de 70 i+ if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (i = 0; i < clrcount; i++) Err codevoid.de 70 i+ drw_clr_create(drw, &ret[i], clrnames[i]); Err codevoid.de 70 i+ return ret; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_setfontset(Drw *drw, Fnt *set) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (drw) Err codevoid.de 70 i+ drw->fonts = set; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_setscheme(Drw *drw, Clr *scm) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (drw) Err codevoid.de 70 i+ drw->scheme = scm; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (!drw || !drw->scheme) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); Err codevoid.de 70 i+ if (filled) Err codevoid.de 70 i+ XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); Err codevoid.de 70 i+ else Err codevoid.de 70 i+ XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+int Err codevoid.de 70 i+drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char buf[1024]; Err codevoid.de 70 i+ int ty; Err codevoid.de 70 i+ unsigned int ew; Err codevoid.de 70 i+ XftDraw *d = NULL; Err codevoid.de 70 i+ Fnt *usedfont, *curfont, *nextfont; Err codevoid.de 70 i+ size_t i, len; Err codevoid.de 70 i+ int utf8strlen, utf8charlen, render = x || y || w || h; Err codevoid.de 70 i+ long utf8codepoint = 0; Err codevoid.de 70 i+ const char *utf8str; Err codevoid.de 70 i+ FcCharSet *fccharset; Err codevoid.de 70 i+ FcPattern *fcpattern; Err codevoid.de 70 i+ FcPattern *match; Err codevoid.de 70 i+ XftResult result; Err codevoid.de 70 i+ int charexists = 0; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!drw || (render && !drw->scheme) || !text || !drw->fonts) Err codevoid.de 70 i+ return 0; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!render) { Err codevoid.de 70 i+ w = ~w; Err codevoid.de 70 i+ } else { Err codevoid.de 70 i+ XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); Err codevoid.de 70 i+ XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); Err codevoid.de 70 i+ d = XftDrawCreate(drw->dpy, drw->drawable, Err codevoid.de 70 i+ DefaultVisual(drw->dpy, drw->screen), Err codevoid.de 70 i+ DefaultColormap(drw->dpy, drw->screen)); Err codevoid.de 70 i+ x += lpad; Err codevoid.de 70 i+ w -= lpad; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ usedfont = drw->fonts; Err codevoid.de 70 i+ while (1) { Err codevoid.de 70 i+ utf8strlen = 0; Err codevoid.de 70 i+ utf8str = text; Err codevoid.de 70 i+ nextfont = NULL; Err codevoid.de 70 i+ while (*text) { Err codevoid.de 70 i+ utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); Err codevoid.de 70 i+ for (curfont = drw->fonts; curfont; curfont = curfont->next) { Err codevoid.de 70 i+ charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); Err codevoid.de 70 i+ if (charexists) { Err codevoid.de 70 i+ if (curfont == usedfont) { Err codevoid.de 70 i+ utf8strlen += utf8charlen; Err codevoid.de 70 i+ text += utf8charlen; Err codevoid.de 70 i+ } else { Err codevoid.de 70 i+ nextfont = curfont; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!charexists || nextfont) Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ else Err codevoid.de 70 i+ charexists = 0; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (utf8strlen) { Err codevoid.de 70 i+ drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); Err codevoid.de 70 i+ /* shorten text if necessary */ Err codevoid.de 70 i+ for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) Err codevoid.de 70 i+ drw_font_getexts(usedfont, utf8str, len, &ew, NULL); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (len) { Err codevoid.de 70 i+ memcpy(buf, utf8str, len); Err codevoid.de 70 i+ buf[len] = '\0'; Err codevoid.de 70 i+ if (len < utf8strlen) Err codevoid.de 70 i+ for (i = len; i && i > len - 3; buf[--i] = '.') Err codevoid.de 70 i+ ; /* NOP */ Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (render) { Err codevoid.de 70 i+ ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; Err codevoid.de 70 i+ XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], Err codevoid.de 70 i+ usedfont->xfont, x, ty, (XftChar8 *)buf, len); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ x += ew; Err codevoid.de 70 i+ w -= ew; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!*text) { Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ } else if (nextfont) { Err codevoid.de 70 i+ charexists = 0; Err codevoid.de 70 i+ usedfont = nextfont; Err codevoid.de 70 i+ } else { Err codevoid.de 70 i+ /* Regardless of whether or not a fallback font is found, the Err codevoid.de 70 i+ * character must be drawn. */ Err codevoid.de 70 i+ charexists = 1; Err codevoid.de 70 i+ Err codevoid.de 70 i+ fccharset = FcCharSetCreate(); Err codevoid.de 70 i+ FcCharSetAddChar(fccharset, utf8codepoint); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!drw->fonts->pattern) { Err codevoid.de 70 i+ /* Refer to the comment in xfont_create for more information. */ Err codevoid.de 70 i+ die("the first font in the cache must be loaded from a font string."); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ fcpattern = FcPatternDuplicate(drw->fonts->pattern); Err codevoid.de 70 i+ FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); Err codevoid.de 70 i+ FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); Err codevoid.de 70 i+ FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); Err codevoid.de 70 i+ Err codevoid.de 70 i+ FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); Err codevoid.de 70 i+ FcDefaultSubstitute(fcpattern); Err codevoid.de 70 i+ match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); Err codevoid.de 70 i+ Err codevoid.de 70 i+ FcCharSetDestroy(fccharset); Err codevoid.de 70 i+ FcPatternDestroy(fcpattern); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (match) { Err codevoid.de 70 i+ usedfont = xfont_create(drw, NULL, match); Err codevoid.de 70 i+ if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { Err codevoid.de 70 i+ for (curfont = drw->fonts; curfont->next; curfont = curfont->next) Err codevoid.de 70 i+ ; /* NOP */ Err codevoid.de 70 i+ curfont->next = usedfont; Err codevoid.de 70 i+ } else { Err codevoid.de 70 i+ xfont_free(usedfont); Err codevoid.de 70 i+ usedfont = drw->fonts; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (d) Err codevoid.de 70 i+ XftDrawDestroy(d); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return x + (render ? w : 0); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (!drw) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ Err codevoid.de 70 i+ XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); Err codevoid.de 70 i+ XSync(drw->dpy, False); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+unsigned int Err codevoid.de 70 i+drw_fontset_getwidth(Drw *drw, const char *text) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (!drw || !drw->fonts || !text) Err codevoid.de 70 i+ return 0; Err codevoid.de 70 i+ return drw_text(drw, 0, 0, 0, 0, 0, text, 0); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ XGlyphInfo ext; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!font || !text) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ Err codevoid.de 70 i+ XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); Err codevoid.de 70 i+ if (w) Err codevoid.de 70 i+ *w = ext.xOff; Err codevoid.de 70 i+ if (h) Err codevoid.de 70 i+ *h = font->h; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+Cur * Err codevoid.de 70 i+drw_cur_create(Drw *drw, int shape) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ Cur *cur; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ Err codevoid.de 70 i+ cur->cursor = XCreateFontCursor(drw->dpy, shape); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return cur; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+drw_cur_free(Drw *drw, Cur *cursor) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (!cursor) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ Err codevoid.de 70 i+ XFreeCursor(drw->dpy, cursor->cursor); Err codevoid.de 70 i+ free(cursor); Err codevoid.de 70 i+} Err codevoid.de 70 1diff --git a/drw.h b/drw.h /git/dwm-sdk/file/drw.h.gph codevoid.de 70 it@@ -0,0 +1,57 @@ Err codevoid.de 70 i+/* See LICENSE file for copyright and license details. */ Err codevoid.de 70 i+ Err codevoid.de 70 i+typedef struct { Err codevoid.de 70 i+ Cursor cursor; Err codevoid.de 70 i+} Cur; Err codevoid.de 70 i+ Err codevoid.de 70 i+typedef struct Fnt { Err codevoid.de 70 i+ Display *dpy; Err codevoid.de 70 i+ unsigned int h; Err codevoid.de 70 i+ XftFont *xfont; Err codevoid.de 70 i+ FcPattern *pattern; Err codevoid.de 70 i+ struct Fnt *next; Err codevoid.de 70 i+} Fnt; Err codevoid.de 70 i+ Err codevoid.de 70 i+enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */ Err codevoid.de 70 i+typedef XftColor Clr; Err codevoid.de 70 i+ Err codevoid.de 70 i+typedef struct { Err codevoid.de 70 i+ unsigned int w, h; Err codevoid.de 70 i+ Display *dpy; Err codevoid.de 70 i+ int screen; Err codevoid.de 70 i+ Window root; Err codevoid.de 70 i+ Drawable drawable; Err codevoid.de 70 i+ GC gc; Err codevoid.de 70 i+ Clr *scheme; Err codevoid.de 70 i+ Fnt *fonts; Err codevoid.de 70 i+} Drw; Err codevoid.de 70 i+ Err codevoid.de 70 i+/* Drawable abstraction */ Err codevoid.de 70 i+Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); Err codevoid.de 70 i+void drw_resize(Drw *drw, unsigned int w, unsigned int h); Err codevoid.de 70 i+void drw_free(Drw *drw); Err codevoid.de 70 i+ Err codevoid.de 70 i+/* Fnt abstraction */ Err codevoid.de 70 i+Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); Err codevoid.de 70 i+void drw_fontset_free(Fnt* set); Err codevoid.de 70 i+unsigned int drw_font Err codevoid.de 70 .