https://wiki.haskell.org/index.php?title=Dmenu-4.0-xft.diff&feed=atom&action=history
Dmenu-4.0-xft.diff - Revision history
2024-03-19T12:44:45Z
Revision history for this page on the wiki
MediaWiki 1.35.5
https://wiki.haskell.org/index.php?title=Dmenu-4.0-xft.diff&diff=63898&oldid=prev
Gwern: Reverted edits by Tomjaguarpaw (talk) to last revision by Jsyjr
2021-02-06T15:19:05Z
<p>Reverted edits by <a href="/Special:Contributions/Tomjaguarpaw" title="Special:Contributions/Tomjaguarpaw">Tomjaguarpaw</a> (<a href="/User_talk:Tomjaguarpaw" title="User talk:Tomjaguarpaw">talk</a>) to last revision by <a href="/index.php?title=User:Jsyjr&action=edit&redlink=1" class="new" title="User:Jsyjr (page does not exist)">Jsyjr</a></p>
<a href="https://wiki.haskell.org/index.php?title=Dmenu-4.0-xft.diff&diff=63898&oldid=63745">Show changes</a>
Gwern
https://wiki.haskell.org/index.php?title=Dmenu-4.0-xft.diff&diff=63745&oldid=prev
Tomjaguarpaw: Deleting page that hasn't been edited for over 10 years
2021-02-06T14:24:16Z
<p>Deleting page that hasn't been edited for over 10 years</p>
<a href="https://wiki.haskell.org/index.php?title=Dmenu-4.0-xft.diff&diff=63745&oldid=28368">Show changes</a>
Tomjaguarpaw
https://wiki.haskell.org/index.php?title=Dmenu-4.0-xft.diff&diff=28368&oldid=prev
Jsyjr at 01:40, 28 May 2009
2009-05-28T01:40:45Z
<p></p>
<p><b>New page</b></p><div><pre><br />
diff -r cdaa1062e534 config.h<br />
--- a/config.h Fri May 22 06:02:00 2009 -0400<br />
+++ b/config.h Wed May 27 20:39:52 2009 -0400<br />
@@ -5,5 +5,4 @@<br />
static const char *normbgcolor = "#cccccc";<br />
static const char *normfgcolor = "#000000";<br />
static const char *selbgcolor = "#0066ff";<br />
-static const char *selfgcolor = "#ffffff";<br />
static unsigned int spaceitem = 30; /* px between menu items */<br />
diff -r cdaa1062e534 config.mk<br />
--- a/config.mk Fri May 22 06:02:00 2009 -0400<br />
+++ b/config.mk Wed May 27 20:39:52 2009 -0400<br />
@@ -14,12 +14,17 @@<br />
XINERAMALIBS = -L${X11LIB} -lXinerama<br />
XINERAMAFLAGS = -DXINERAMA<br />
<br />
+# Xft, comment if you don't want it<br />
+XFTINCS = `pkg-config --cflags xft`<br />
+XFTLIBS = `pkg-config --libs xft`<br />
+XFTFLAGS = -DXFT<br />
+<br />
# includes and libs<br />
-INCS = -I. -I/usr/include -I${X11INC}<br />
-LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS}<br />
+INCS = -I. -I/usr/include -I${X11INC} ${XFTINCS}<br />
+LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} ${XFTLIBS}<br />
<br />
# flags<br />
-CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}<br />
+CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} ${XFTFLAGS}<br />
CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}<br />
LDFLAGS = -s ${LIBS}<br />
<br />
diff -r cdaa1062e534 dmenu.c<br />
--- a/dmenu.c Fri May 22 06:02:00 2009 -0400<br />
+++ b/dmenu.c Wed May 27 20:39:52 2009 -0400<br />
@@ -10,6 +10,9 @@<br />
#include <X11/keysym.h><br />
#include <X11/Xlib.h><br />
#include <X11/Xutil.h><br />
+#ifdef XFT<br />
+#include <X11/Xft/Xft.h><br />
+#endif<br />
#ifdef XINERAMA<br />
#include <X11/extensions/Xinerama.h><br />
#endif<br />
@@ -28,6 +31,11 @@<br />
unsigned long norm[ColLast];<br />
unsigned long sel[ColLast];<br />
Drawable drawable;<br />
+#ifdef XFT<br />
+ XftColor xftnorm[ColLast];<br />
+ XftColor xftsel[ColLast];<br />
+ XftDraw *xftdrawable;<br />
+#endif<br />
GC gc;<br />
struct {<br />
XFontStruct *xfont;<br />
@@ -35,6 +43,10 @@<br />
int ascent;<br />
int descent;<br />
int height;<br />
+#ifdef XFT<br />
+ XftFont *xftfont;<br />
+ XGlyphInfo *extents;<br />
+#endif<br />
} font;<br />
} DC; /* draw context */<br />
<br />
@@ -54,6 +66,9 @@<br />
static void drawtext(const char *text, unsigned long col[ColLast]);<br />
static void eprint(const char *errstr, ...);<br />
static unsigned long getcolor(const char *colstr);<br />
+#ifdef XFT<br />
+static unsigned long getxftcolor(const char *colstr, XftColor *color);<br />
+#endif<br />
static Bool grabkeyboard(void);<br />
static void initfont(const char *fontstr);<br />
static void kpress(XKeyEvent * e);<br />
@@ -74,7 +89,7 @@<br />
static int promptw = 0;<br />
static int ret = 0;<br />
static int screen;<br />
-static unsigned int mw, mh;<br />
+static unsigned int mw, mh, bh;<br />
static unsigned int numlockmask = 0;<br />
static Bool running = True;<br />
static Display *dpy;<br />
@@ -160,10 +175,12 @@<br />
free(allitems);<br />
allitems = itm;<br />
}<br />
- if(dc.font.set)<br />
- XFreeFontSet(dpy, dc.font.set);<br />
- else<br />
- XFreeFont(dpy, dc.font.xfont);<br />
+ if(!dc.font.xftfont) {<br />
+ if(dc.font.set)<br />
+ XFreeFontSet(dpy, dc.font.set);<br />
+ else<br />
+ XFreeFont(dpy, dc.font.xfont);<br />
+ }<br />
XFreePixmap(dpy, dc.drawable);<br />
XFreeGC(dpy, dc.gc);<br />
XDestroyWindow(dpy, win);<br />
@@ -232,11 +249,19 @@<br />
memcpy(buf, text, len);<br />
if(len < olen)<br />
for(i = len; i && i > len - 3; buf[--i] = '.');<br />
+#ifdef XFT<br />
+ if(dc.font.xftfont)<br />
+ XftDrawStringUtf8(dc.xftdrawable, &dc.xftnorm[ColFG], dc.font.xftfont, x, y, (unsigned char*) buf, len);<br />
+ else {<br />
+#endif<br />
XSetForeground(dpy, dc.gc, col[ColFG]);<br />
if(dc.font.set)<br />
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);<br />
else<br />
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);<br />
+#ifdef XFT<br />
+ }<br />
+#endif<br />
}<br />
<br />
void<br />
@@ -259,6 +284,18 @@<br />
return color.pixel;<br />
}<br />
<br />
+#ifdef XFT<br />
+unsigned long<br />
+getxftcolor(const char *colstr, XftColor *color) {<br />
+ Colormap cmap = DefaultColormap(dpy, screen);<br />
+ Visual *vis = DefaultVisual(dpy, screen);<br />
+<br />
+ if(!XftColorAllocName(dpy, vis, cmap, colstr, color))<br />
+ eprint("error, cannot allocate color '%s'\n", colstr);<br />
+ return color->pixel;<br />
+}<br />
+#endif<br />
+<br />
Bool<br />
grabkeyboard(void) {<br />
unsigned int len;<br />
@@ -274,6 +311,22 @@<br />
<br />
void<br />
initfont(const char *fontstr) {<br />
+#ifdef XFT<br />
+ dc.font.xftfont = 0;<br />
+ if(cistrstr(fontstr,"xft:")) {<br />
+ dc.font.xftfont = XftFontOpenXlfd(dpy, screen, fontstr+4);<br />
+ if(!dc.font.xftfont)<br />
+ dc.font.xftfont = XftFontOpenName(dpy, screen, fontstr+4);<br />
+ if(!dc.font.xftfont)<br />
+ eprint("error, cannot load font: '%s'\n", fontstr+4);<br />
+ dc.font.extents = malloc(sizeof(XGlyphInfo));<br />
+ XftTextExtentsUtf8(dpy, dc.font.xftfont, (unsigned const char *) fontstr+4, strlen(fontstr+4), dc.font.extents);<br />
+ dc.font.height = dc.font.xftfont->ascent + dc.font.xftfont->descent;<br />
+ dc.font.ascent = dc.font.xftfont->ascent;<br />
+ dc.font.descent = dc.font.xftfont->descent;<br />
+ }<br />
+ else {<br />
+#endif<br />
char *def, **missing;<br />
int i, n;<br />
<br />
@@ -306,6 +359,9 @@<br />
dc.font.descent = dc.font.xfont->descent;<br />
}<br />
dc.font.height = dc.font.ascent + dc.font.descent;<br />
+#ifdef XFT<br />
+ }<br />
+#endif<br />
}<br />
<br />
void<br />
@@ -585,11 +641,21 @@<br />
XFreeModifiermap(modmap);<br />
<br />
/* style */<br />
+ initfont(font);<br />
+#ifdef XFT<br />
+ if(dc.font.xftfont) {<br />
+ dc.norm[ColBG] = getxftcolor(normbgcolor, &dc.xftnorm[ColBG]);<br />
+ dc.norm[ColFG] = getxftcolor(normfgcolor, &dc.xftnorm[ColFG]);<br />
+ dc.sel[ColBG] = getxftcolor(selbgcolor, &dc.xftsel[ColBG]);<br />
+ }<br />
+ else {<br />
+#endif<br />
dc.norm[ColBG] = getcolor(normbgcolor);<br />
dc.norm[ColFG] = getcolor(normfgcolor);<br />
dc.sel[ColBG] = getcolor(selbgcolor);<br />
- dc.sel[ColFG] = getcolor(selfgcolor);<br />
- initfont(font);<br />
+#ifdef XFT<br />
+ }<br />
+#endif<br />
<br />
/* menu window */<br />
wa.override_redirect = True;<br />
@@ -598,6 +664,8 @@<br />
<br />
/* menu window geometry */<br />
mh = dc.font.height + 2;<br />
+ if(mh < bh)<br />
+ mh = bh;<br />
#if XINERAMA<br />
if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) {<br />
i = 0;<br />
@@ -632,8 +700,19 @@<br />
dc.drawable = XCreatePixmap(dpy, root, mw, mh, DefaultDepth(dpy, screen));<br />
dc.gc = XCreateGC(dpy, root, 0, NULL);<br />
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);<br />
+#ifdef XFT<br />
+ if(dc.font.xftfont) {<br />
+ dc.xftdrawable = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy,screen), DefaultColormap(dpy,screen));<br />
+ if(!dc.xftdrawable)<br />
+ eprint("error, cannot create drawable\n");<br />
+ }<br />
+ else {<br />
+#endif<br />
if(!dc.font.set)<br />
XSetFont(dpy, dc.gc, dc.font.xfont->fid);<br />
+#ifdef XFT<br />
+ }<br />
+#endif<br />
if(maxname)<br />
cmdw = textw(maxname);<br />
if(cmdw > mw / 3)<br />
@@ -649,6 +728,15 @@<br />
<br />
int<br />
textnw(const char *text, unsigned int len) {<br />
+#ifdef XFT<br />
+ if (dc.font.xftfont) {<br />
+ XftTextExtentsUtf8(dpy, dc.font.xftfont, (unsigned const char *) text, strlen(text), dc.font.extents);<br />
+ if(dc.font.extents->height > dc.font.height)<br />
+ dc.font.height = dc.font.extents->height;<br />
+ return dc.font.extents->xOff;<br />
+ }<br />
+ else {<br />
+#endif<br />
XRectangle r;<br />
<br />
if(dc.font.set) {<br />
@@ -656,6 +744,9 @@<br />
return r.width;<br />
}<br />
return XTextWidth(dc.font.xfont, text, len);<br />
+#ifdef XFT<br />
+ }<br />
+#endif<br />
}<br />
<br />
int<br />
@@ -691,14 +782,14 @@<br />
else if(!strcmp(argv[i], "-sb")) {<br />
if(++i < argc) selbgcolor = argv[i];<br />
}<br />
- else if(!strcmp(argv[i], "-sf")) {<br />
- if(++i < argc) selfgcolor = argv[i];<br />
+ else if(!strcmp(argv[i], "-bh")) {<br />
+ if(++i < argc) bh = atoi(argv[i]);<br />
}<br />
else if(!strcmp(argv[i], "-v"))<br />
eprint("dmenu-"VERSION", © 2006-2008 dmenu engineers, see LICENSE for details\n");<br />
else<br />
eprint("usage: dmenu [-i] [-b] [-fn <font>] [-nb <color>] [-nf <color>]\n"<br />
- " [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");<br />
+ " [-sb <color>] [-bh <height>] [-p <prompt>] [-v]\n");<br />
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())<br />
fprintf(stderr, "warning: no locale support\n");<br />
if(!(dpy = XOpenDisplay(NULL)))<br />
</pre></div>
Jsyjr