mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-09-23 16:49:10 -07:00
x11-misc/dmenu: Old.
Package-Manager: portage-2.2.28
This commit is contained in:
@@ -1,2 +1 @@
|
||||
DIST dmenu-4.5.tar.gz 11543 SHA256 082cd698d82125ca0b3989006fb84ac4675c2a5585bf5bb8af0ea09cfb95a850 SHA512 872dee68c35a93c663eb0a941653eaaa4aa83d8379e05b4dbca089a2c9335036b496de85d8ddf7af1228a5625490a06a89031fb1aac726236b608b952962c248 WHIRLPOOL b91660f3028d314f1a10b994af73e6239c4aaabda6c9ab269bda7e37e0cd22c0eaf3b93998c4cb0fe1f9d8f2fd198afc2e70c237a46921ece9fd9a697f58c869
|
||||
DIST dmenu-4.6.tar.gz 15057 SHA256 4a7a24008a621c3cd656155ad91ab8136db8f0d3b9ec56dafeec518cabda96b3 SHA512 e54fd10c0b1274eb90173aea442f0bfc496f4dda861a36d94f939e1fd835594f9aa12f3d0f90043d64e519d919b9a5273ab65012230ac022f727ee6bb64862e3 WHIRLPOOL b4354552356ab5ab93b20c44a313f0d8e626c22c589cf4376f82f876dc742b961a07bad45d12b5fe749b03354dfa76acf36e4089a701754e341ec0383232fa5d
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
# Copyright 1999-2013 Gentoo Foundation
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
# $Id$
|
||||
|
||||
EAPI=5
|
||||
inherit eutils toolchain-funcs
|
||||
|
||||
DESCRIPTION="a generic, highly customizable, and efficient menu for the X Window System"
|
||||
HOMEPAGE="http://tools.suckless.org/dmenu/"
|
||||
SRC_URI="http://dl.suckless.org/tools/${P}.tar.gz"
|
||||
|
||||
LICENSE="MIT"
|
||||
SLOT="0"
|
||||
KEYWORDS="amd64 hppa ppc ppc64 x86 ~x86-fbsd"
|
||||
IUSE="xft xinerama"
|
||||
|
||||
RDEPEND="
|
||||
x11-libs/libX11
|
||||
xft? ( x11-libs/libXft )
|
||||
xinerama? ( x11-libs/libXinerama )
|
||||
"
|
||||
DEPEND="${RDEPEND}
|
||||
xft? ( virtual/pkgconfig )
|
||||
xinerama? ( virtual/pkgconfig )
|
||||
"
|
||||
|
||||
src_prepare() {
|
||||
# Respect our flags
|
||||
sed -i \
|
||||
-e '/^CFLAGS/{s|=.*|+= -ansi -pedantic -Wall $(INCS) $(CPPFLAGS)|}' \
|
||||
-e '/^LDFLAGS/s|= -s|+=|' \
|
||||
config.mk || die
|
||||
# Make make verbose
|
||||
sed -i \
|
||||
-e 's|^ @| |g' \
|
||||
-e '/^ echo/d' \
|
||||
Makefile || die
|
||||
use xft && epatch "${FILESDIR}"/${PN}-4.5-xft-2.patch
|
||||
|
||||
epatch_user
|
||||
}
|
||||
|
||||
src_compile() {
|
||||
emake CC=$(tc-getCC) \
|
||||
"XFTINC=$( $(tc-getPKG_CONFIG) --cflags xft 2>/dev/null )" \
|
||||
"XFTLIBS=$( $(tc-getPKG_CONFIG) --libs xft 2>/dev/null )" \
|
||||
"XINERAMAFLAGS=$(
|
||||
usex xinerama "-DXINERAMA $(
|
||||
$(tc-getPKG_CONFIG) --cflags xinerama 2>/dev/null
|
||||
)" ''
|
||||
)" \
|
||||
"XINERAMALIBS=$(
|
||||
usex xinerama "$( $(tc-getPKG_CONFIG) --libs xinerama 2>/dev/null)" ''
|
||||
)"
|
||||
}
|
||||
|
||||
src_install() {
|
||||
emake DESTDIR="${D}" PREFIX="/usr" install
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
# Copyright 1999-2014 Gentoo Foundation
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
# $Id$
|
||||
|
||||
EAPI=5
|
||||
inherit eutils toolchain-funcs
|
||||
|
||||
DESCRIPTION="a generic, highly customizable, and efficient menu for the X Window System"
|
||||
HOMEPAGE="http://tools.suckless.org/dmenu/"
|
||||
SRC_URI="http://dl.suckless.org/tools/${P}.tar.gz"
|
||||
|
||||
LICENSE="MIT"
|
||||
SLOT="0"
|
||||
KEYWORDS="~amd64 ~hppa ~ppc ~ppc64 ~x86 ~x86-fbsd"
|
||||
IUSE="xft xinerama"
|
||||
|
||||
RDEPEND="
|
||||
x11-libs/libX11
|
||||
xft? ( x11-libs/libXft )
|
||||
xinerama? ( x11-libs/libXinerama )
|
||||
"
|
||||
DEPEND="${RDEPEND}
|
||||
xft? ( virtual/pkgconfig )
|
||||
xinerama? ( virtual/pkgconfig )
|
||||
"
|
||||
|
||||
src_prepare() {
|
||||
# Respect our flags
|
||||
sed -i \
|
||||
-e '/^CFLAGS/{s|=.*|+= -ansi -pedantic -Wall $(INCS) $(CPPFLAGS)|}' \
|
||||
-e '/^LDFLAGS/s|= -s|+=|' \
|
||||
config.mk || die
|
||||
# Make make verbose
|
||||
sed -i \
|
||||
-e 's|^ @| |g' \
|
||||
-e '/^ echo/d' \
|
||||
Makefile || die
|
||||
use xft && epatch "${FILESDIR}"/${PN}-4.5-xft-3.patch
|
||||
|
||||
epatch_user
|
||||
}
|
||||
|
||||
src_compile() {
|
||||
emake CC=$(tc-getCC) \
|
||||
"XFTINC=$( $(tc-getPKG_CONFIG) --cflags xft 2>/dev/null )" \
|
||||
"XFTLIBS=$( $(tc-getPKG_CONFIG) --libs xft 2>/dev/null )" \
|
||||
"XINERAMAFLAGS=$(
|
||||
usex xinerama "-DXINERAMA $(
|
||||
$(tc-getPKG_CONFIG) --cflags xinerama 2>/dev/null
|
||||
)" ''
|
||||
)" \
|
||||
"XINERAMALIBS=$(
|
||||
usex xinerama "$( $(tc-getPKG_CONFIG) --libs xinerama 2>/dev/null)" ''
|
||||
)"
|
||||
}
|
||||
|
||||
src_install() {
|
||||
emake DESTDIR="${D}" PREFIX="/usr" install
|
||||
}
|
||||
@@ -1,410 +0,0 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -12,9 +12,13 @@
|
||||
XINERAMALIBS = -lXinerama
|
||||
XINERAMAFLAGS = -DXINERAMA
|
||||
|
||||
+# Xft, comment if you don't want it
|
||||
+XFTINC = $(shell pkg-config --cflags xft)
|
||||
+XFTLIBS = $(shell pkg-config --libs xft)
|
||||
+
|
||||
# includes and libs
|
||||
-INCS = -I${X11INC}
|
||||
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
|
||||
+INCS = -I${X11INC} ${XFTINC}
|
||||
+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${XFTLIBS}
|
||||
|
||||
# flags
|
||||
CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||
--- a/dmenu.1
|
||||
+++ b/dmenu.1
|
||||
@@ -53,7 +53,7 @@
|
||||
defines the prompt to be displayed to the left of the input field.
|
||||
.TP
|
||||
.BI \-fn " font"
|
||||
-defines the font or font set used.
|
||||
+defines the font or font set used. eg. "fixed" or "Monospace-12:normal" (an xft font)
|
||||
.TP
|
||||
.BI \-nb " color"
|
||||
defines the normal background color.
|
||||
--- a/dmenu.c
|
||||
+++ b/dmenu.c
|
||||
@@ -17,6 +17,7 @@
|
||||
* MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org)))
|
||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
+#define DEFFONT "fixed" /* xft example: "Monospace-11" */
|
||||
|
||||
typedef struct Item Item;
|
||||
struct Item {
|
||||
@@ -26,6 +27,7 @@
|
||||
|
||||
static void appenditem(Item *item, Item **list, Item **last);
|
||||
static void calcoffsets(void);
|
||||
+static void cleanup(void);
|
||||
static char *cistrstr(const char *s, const char *sub);
|
||||
static void drawmenu(void);
|
||||
static void grabkeyboard(void);
|
||||
@@ -50,10 +52,12 @@
|
||||
static const char *selbgcolor = "#005577";
|
||||
static const char *selfgcolor = "#eeeeee";
|
||||
static unsigned int lines = 0;
|
||||
-static unsigned long normcol[ColLast];
|
||||
-static unsigned long selcol[ColLast];
|
||||
+static ColorSet *normcol;
|
||||
+static ColorSet *selcol;
|
||||
static Atom clip, utf8;
|
||||
static Bool topbar = True;
|
||||
+static Bool running = True;
|
||||
+static int ret = 0;
|
||||
static DC *dc;
|
||||
static Item *items = NULL;
|
||||
static Item *matches, *matchend;
|
||||
@@ -104,7 +108,9 @@
|
||||
usage();
|
||||
|
||||
dc = initdc();
|
||||
- initfont(dc, font);
|
||||
+ initfont(dc, font ? font : DEFFONT);
|
||||
+ normcol = initcolor(dc, normfgcolor, normbgcolor);
|
||||
+ selcol = initcolor(dc, selfgcolor, selbgcolor);
|
||||
|
||||
if(fast) {
|
||||
grabkeyboard();
|
||||
@@ -117,7 +123,8 @@
|
||||
setup();
|
||||
run();
|
||||
|
||||
- return 1; /* unreachable */
|
||||
+ cleanup();
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -160,6 +167,15 @@
|
||||
}
|
||||
|
||||
void
|
||||
+cleanup(void) {
|
||||
+ freecol(dc, normcol);
|
||||
+ freecol(dc, selcol);
|
||||
+ XDestroyWindow(dc->dpy, win);
|
||||
+ XUngrabKeyboard(dc->dpy, CurrentTime);
|
||||
+ freedc(dc);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
drawmenu(void) {
|
||||
int curpos;
|
||||
Item *item;
|
||||
@@ -167,7 +183,7 @@
|
||||
dc->x = 0;
|
||||
dc->y = 0;
|
||||
dc->h = bh;
|
||||
- drawrect(dc, 0, 0, mw, mh, True, BG(dc, normcol));
|
||||
+ drawrect(dc, 0, 0, mw, mh, True, normcol->BG);
|
||||
|
||||
if(prompt) {
|
||||
dc->w = promptw;
|
||||
@@ -178,7 +194,7 @@
|
||||
dc->w = (lines > 0 || !matches) ? mw - dc->x : inputw;
|
||||
drawtext(dc, text, normcol);
|
||||
if((curpos = textnw(dc, text, cursor) + dc->h/2 - 2) < dc->w)
|
||||
- drawrect(dc, curpos, 2, 1, dc->h - 4, True, FG(dc, normcol));
|
||||
+ drawrect(dc, curpos, 2, 1, dc->h - 4, True, normcol->FG);
|
||||
|
||||
if(lines > 0) {
|
||||
/* draw vertical list */
|
||||
@@ -321,7 +337,8 @@
|
||||
sel = matchend;
|
||||
break;
|
||||
case XK_Escape:
|
||||
- exit(EXIT_FAILURE);
|
||||
+ ret = EXIT_FAILURE;
|
||||
+ running = False;
|
||||
case XK_Home:
|
||||
if(sel == matches) {
|
||||
cursor = 0;
|
||||
@@ -359,7 +376,8 @@
|
||||
case XK_Return:
|
||||
case XK_KP_Enter:
|
||||
puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
|
||||
- exit(EXIT_SUCCESS);
|
||||
+ ret = EXIT_SUCCESS;
|
||||
+ running = False;
|
||||
case XK_Right:
|
||||
if(text[cursor] != '\0') {
|
||||
cursor = nextrune(+1);
|
||||
@@ -490,7 +508,7 @@
|
||||
run(void) {
|
||||
XEvent ev;
|
||||
|
||||
- while(!XNextEvent(dc->dpy, &ev)) {
|
||||
+ while(running && !XNextEvent(dc->dpy, &ev)) {
|
||||
if(XFilterEvent(&ev, win))
|
||||
continue;
|
||||
switch(ev.type) {
|
||||
@@ -524,11 +542,6 @@
|
||||
XineramaScreenInfo *info;
|
||||
#endif
|
||||
|
||||
- normcol[ColBG] = getcolor(dc, normbgcolor);
|
||||
- normcol[ColFG] = getcolor(dc, normfgcolor);
|
||||
- selcol[ColBG] = getcolor(dc, selbgcolor);
|
||||
- selcol[ColFG] = getcolor(dc, selfgcolor);
|
||||
-
|
||||
clip = XInternAtom(dc->dpy, "CLIPBOARD", False);
|
||||
utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False);
|
||||
|
||||
@@ -582,7 +595,7 @@
|
||||
|
||||
/* create menu window */
|
||||
swa.override_redirect = True;
|
||||
- swa.background_pixel = normcol[ColBG];
|
||||
+ swa.background_pixel = normcol->BG;
|
||||
swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
|
||||
win = XCreateWindow(dc->dpy, root, x, y, mw, mh, 0,
|
||||
DefaultDepth(dc->dpy, screen), CopyFromParent,
|
||||
--- a/draw.c
|
||||
+++ b/draw.c
|
||||
@@ -9,9 +9,6 @@
|
||||
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
-#define DEFAULTFN "fixed"
|
||||
-
|
||||
-static Bool loadfont(DC *dc, const char *fontstr);
|
||||
|
||||
void
|
||||
drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) {
|
||||
@@ -23,7 +20,7 @@
|
||||
}
|
||||
|
||||
void
|
||||
-drawtext(DC *dc, const char *text, unsigned long col[ColLast]) {
|
||||
+drawtext(DC *dc, const char *text, ColorSet *col) {
|
||||
char buf[BUFSIZ];
|
||||
size_t mn, n = strlen(text);
|
||||
|
||||
@@ -35,19 +32,24 @@
|
||||
if(mn < n)
|
||||
for(n = MAX(mn-3, 0); n < mn; buf[n++] = '.');
|
||||
|
||||
- drawrect(dc, 0, 0, dc->w, dc->h, True, BG(dc, col));
|
||||
+ drawrect(dc, 0, 0, dc->w, dc->h, True, col->BG);
|
||||
drawtextn(dc, buf, mn, col);
|
||||
}
|
||||
|
||||
void
|
||||
-drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]) {
|
||||
+drawtextn(DC *dc, const char *text, size_t n, ColorSet *col) {
|
||||
int x = dc->x + dc->font.height/2;
|
||||
int y = dc->y + dc->font.ascent+1;
|
||||
|
||||
- XSetForeground(dc->dpy, dc->gc, FG(dc, col));
|
||||
- if(dc->font.set)
|
||||
+ XSetForeground(dc->dpy, dc->gc, col->FG);
|
||||
+ if(dc->font.xft_font) {
|
||||
+ if (!dc->xftdraw)
|
||||
+ eprintf("error, xft drawable does not exist");
|
||||
+ XftDrawStringUtf8(dc->xftdraw, &col->FG_xft,
|
||||
+ dc->font.xft_font, x, y, (unsigned char*)text, n);
|
||||
+ } else if(dc->font.set) {
|
||||
XmbDrawString(dc->dpy, dc->canvas, dc->font.set, dc->gc, x, y, text, n);
|
||||
- else {
|
||||
+ } else {
|
||||
XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid);
|
||||
XDrawString(dc->dpy, dc->canvas, dc->gc, x, y, text, n);
|
||||
}
|
||||
@@ -69,16 +71,33 @@
|
||||
}
|
||||
|
||||
void
|
||||
+freecol(DC *dc, ColorSet *col) {
|
||||
+ if(col) {
|
||||
+ if(&col->FG_xft)
|
||||
+ XftColorFree(dc->dpy, DefaultVisual(dc->dpy, DefaultScreen(dc->dpy)),
|
||||
+ DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)), &col->FG_xft);
|
||||
+ free(col);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
freedc(DC *dc) {
|
||||
+ if(dc->font.xft_font) {
|
||||
+ XftFontClose(dc->dpy, dc->font.xft_font);
|
||||
+ XftDrawDestroy(dc->xftdraw);
|
||||
+ }
|
||||
if(dc->font.set)
|
||||
XFreeFontSet(dc->dpy, dc->font.set);
|
||||
- if(dc->font.xfont)
|
||||
+ if(dc->font.xfont)
|
||||
XFreeFont(dc->dpy, dc->font.xfont);
|
||||
- if(dc->canvas)
|
||||
+ if(dc->canvas)
|
||||
XFreePixmap(dc->dpy, dc->canvas);
|
||||
- XFreeGC(dc->dpy, dc->gc);
|
||||
- XCloseDisplay(dc->dpy);
|
||||
- free(dc);
|
||||
+ if(dc->gc)
|
||||
+ XFreeGC(dc->dpy, dc->gc);
|
||||
+ if(dc->dpy)
|
||||
+ XCloseDisplay(dc->dpy);
|
||||
+ if(dc)
|
||||
+ free(dc);
|
||||
}
|
||||
|
||||
unsigned long
|
||||
@@ -91,6 +110,20 @@
|
||||
return color.pixel;
|
||||
}
|
||||
|
||||
+ColorSet *
|
||||
+initcolor(DC *dc, const char * foreground, const char * background) {
|
||||
+ ColorSet * col = (ColorSet *)malloc(sizeof(ColorSet));
|
||||
+ if(!col)
|
||||
+ eprintf("error, cannot allocate memory for color set");
|
||||
+ col->BG = getcolor(dc, background);
|
||||
+ col->FG = getcolor(dc, foreground);
|
||||
+ if(dc->font.xft_font)
|
||||
+ if(!XftColorAllocName(dc->dpy, DefaultVisual(dc->dpy, DefaultScreen(dc->dpy)),
|
||||
+ DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)), foreground, &col->FG_xft))
|
||||
+ eprintf("error, cannot allocate xft font color '%s'\n", foreground);
|
||||
+ return col;
|
||||
+}
|
||||
+
|
||||
DC *
|
||||
initdc(void) {
|
||||
DC *dc;
|
||||
@@ -109,23 +142,11 @@
|
||||
|
||||
void
|
||||
initfont(DC *dc, const char *fontstr) {
|
||||
- if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) {
|
||||
- if(fontstr != NULL)
|
||||
- fprintf(stderr, "cannot load font '%s'\n", fontstr);
|
||||
- if(fontstr == NULL || !loadfont(dc, DEFAULTFN))
|
||||
- eprintf("cannot load font '%s'\n", DEFAULTFN);
|
||||
- }
|
||||
- dc->font.height = dc->font.ascent + dc->font.descent;
|
||||
-}
|
||||
-
|
||||
-Bool
|
||||
-loadfont(DC *dc, const char *fontstr) {
|
||||
char *def, **missing, **names;
|
||||
int i, n;
|
||||
XFontStruct **xfonts;
|
||||
|
||||
- if(!*fontstr)
|
||||
- return False;
|
||||
+ missing = NULL;
|
||||
if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) {
|
||||
n = XFontsOfFontSet(dc->font.set, &xfonts, &names);
|
||||
for(i = 0; i < n; i++) {
|
||||
@@ -133,15 +154,21 @@
|
||||
dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent);
|
||||
dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width);
|
||||
}
|
||||
- }
|
||||
- else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) {
|
||||
- dc->font.ascent = dc->font.xfont->ascent;
|
||||
+ } else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) {
|
||||
+ dc->font.ascent = dc->font.xfont->ascent;
|
||||
dc->font.descent = dc->font.xfont->descent;
|
||||
dc->font.width = dc->font.xfont->max_bounds.width;
|
||||
+ } else if((dc->font.xft_font = XftFontOpenName(dc->dpy, DefaultScreen(dc->dpy), fontstr))) {
|
||||
+ dc->font.ascent = dc->font.xft_font->ascent;
|
||||
+ dc->font.descent = dc->font.xft_font->descent;
|
||||
+ dc->font.width = dc->font.xft_font->max_advance_width;
|
||||
+ } else {
|
||||
+ eprintf("cannot load font '%s'\n", fontstr);
|
||||
}
|
||||
if(missing)
|
||||
XFreeStringList(missing);
|
||||
- return dc->font.set || dc->font.xfont;
|
||||
+ dc->font.height = dc->font.ascent + dc->font.descent;
|
||||
+ return;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -151,20 +178,29 @@
|
||||
|
||||
void
|
||||
resizedc(DC *dc, unsigned int w, unsigned int h) {
|
||||
+ int screen = DefaultScreen(dc->dpy);
|
||||
if(dc->canvas)
|
||||
XFreePixmap(dc->dpy, dc->canvas);
|
||||
|
||||
dc->w = w;
|
||||
dc->h = h;
|
||||
dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h,
|
||||
- DefaultDepth(dc->dpy, DefaultScreen(dc->dpy)));
|
||||
+ DefaultDepth(dc->dpy, screen));
|
||||
+ if(dc->font.xft_font && !(dc->xftdraw)) {
|
||||
+ dc->xftdraw = XftDrawCreate(dc->dpy, dc->canvas, DefaultVisual(dc->dpy,screen), DefaultColormap(dc->dpy,screen));
|
||||
+ if(!(dc->xftdraw))
|
||||
+ eprintf("error, cannot create xft drawable\n");
|
||||
+ }
|
||||
}
|
||||
|
||||
int
|
||||
textnw(DC *dc, const char *text, size_t len) {
|
||||
- if(dc->font.set) {
|
||||
+ if(dc->font.xft_font) {
|
||||
+ XGlyphInfo gi;
|
||||
+ XftTextExtentsUtf8(dc->dpy, dc->font.xft_font, (const FcChar8*)text, len, &gi);
|
||||
+ return gi.width;
|
||||
+ } else if(dc->font.set) {
|
||||
XRectangle r;
|
||||
-
|
||||
XmbTextExtents(dc->font.set, text, len, NULL, &r);
|
||||
return r.width;
|
||||
}
|
||||
--- a/draw.h
|
||||
+++ b/draw.h
|
||||
@@ -1,9 +1,6 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
-#define FG(dc, col) ((col)[(dc)->invert ? ColBG : ColFG])
|
||||
-#define BG(dc, col) ((col)[(dc)->invert ? ColFG : ColBG])
|
||||
-
|
||||
-enum { ColBG, ColFG, ColBorder, ColLast };
|
||||
+#include <X11/Xft/Xft.h>
|
||||
|
||||
typedef struct {
|
||||
int x, y, w, h;
|
||||
@@ -11,6 +8,7 @@
|
||||
Display *dpy;
|
||||
GC gc;
|
||||
Pixmap canvas;
|
||||
+ XftDraw *xftdraw;
|
||||
struct {
|
||||
int ascent;
|
||||
int descent;
|
||||
@@ -18,15 +16,24 @@
|
||||
int width;
|
||||
XFontSet set;
|
||||
XFontStruct *xfont;
|
||||
+ XftFont *xft_font;
|
||||
} font;
|
||||
} DC; /* draw context */
|
||||
|
||||
+typedef struct {
|
||||
+ unsigned long FG;
|
||||
+ XftColor FG_xft;
|
||||
+ unsigned long BG;
|
||||
+} ColorSet;
|
||||
+
|
||||
void drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color);
|
||||
-void drawtext(DC *dc, const char *text, unsigned long col[ColLast]);
|
||||
-void drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]);
|
||||
+void drawtext(DC *dc, const char *text, ColorSet *col);
|
||||
+void drawtextn(DC *dc, const char *text, size_t n, ColorSet *col);
|
||||
+void freecol(DC *dc, ColorSet *col);
|
||||
void eprintf(const char *fmt, ...);
|
||||
void freedc(DC *dc);
|
||||
unsigned long getcolor(DC *dc, const char *colstr);
|
||||
+ColorSet *initcolor(DC *dc, const char *foreground, const char *background);
|
||||
DC *initdc(void);
|
||||
void initfont(DC *dc, const char *fontstr);
|
||||
void mapdc(DC *dc, Window win, unsigned int w, unsigned int h);
|
||||
@@ -1,412 +0,0 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -12,9 +12,13 @@
|
||||
XINERAMALIBS = -lXinerama
|
||||
XINERAMAFLAGS = -DXINERAMA
|
||||
|
||||
+# Xft, comment if you don't want it
|
||||
+XFTINC = $(shell pkg-config --cflags xft)
|
||||
+XFTLIBS = $(shell pkg-config --libs xft)
|
||||
+
|
||||
# includes and libs
|
||||
-INCS = -I${X11INC}
|
||||
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
|
||||
+INCS = -I${X11INC} ${XFTINC}
|
||||
+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${XFTLIBS}
|
||||
|
||||
# flags
|
||||
CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||
--- a/dmenu.1
|
||||
+++ b/dmenu.1
|
||||
@@ -53,7 +53,7 @@
|
||||
defines the prompt to be displayed to the left of the input field.
|
||||
.TP
|
||||
.BI \-fn " font"
|
||||
-defines the font or font set used.
|
||||
+defines the font or font set used. eg. "fixed" or "Monospace-12:normal" (an xft font)
|
||||
.TP
|
||||
.BI \-nb " color"
|
||||
defines the normal background color.
|
||||
--- a/dmenu.c
|
||||
+++ b/dmenu.c
|
||||
@@ -17,6 +17,7 @@
|
||||
* MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org)))
|
||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
+#define DEFFONT "fixed" /* xft example: "Monospace-11" */
|
||||
|
||||
typedef struct Item Item;
|
||||
struct Item {
|
||||
@@ -26,6 +27,7 @@
|
||||
|
||||
static void appenditem(Item *item, Item **list, Item **last);
|
||||
static void calcoffsets(void);
|
||||
+static void cleanup(void);
|
||||
static char *cistrstr(const char *s, const char *sub);
|
||||
static void drawmenu(void);
|
||||
static void grabkeyboard(void);
|
||||
@@ -50,10 +52,12 @@
|
||||
static const char *selbgcolor = "#005577";
|
||||
static const char *selfgcolor = "#eeeeee";
|
||||
static unsigned int lines = 0;
|
||||
-static unsigned long normcol[ColLast];
|
||||
-static unsigned long selcol[ColLast];
|
||||
+static ColorSet *normcol;
|
||||
+static ColorSet *selcol;
|
||||
static Atom clip, utf8;
|
||||
static Bool topbar = True;
|
||||
+static Bool running = True;
|
||||
+static int ret = 0;
|
||||
static DC *dc;
|
||||
static Item *items = NULL;
|
||||
static Item *matches, *matchend;
|
||||
@@ -104,7 +108,9 @@
|
||||
usage();
|
||||
|
||||
dc = initdc();
|
||||
- initfont(dc, font);
|
||||
+ initfont(dc, font ? font : DEFFONT);
|
||||
+ normcol = initcolor(dc, normfgcolor, normbgcolor);
|
||||
+ selcol = initcolor(dc, selfgcolor, selbgcolor);
|
||||
|
||||
if(fast) {
|
||||
grabkeyboard();
|
||||
@@ -117,7 +123,8 @@
|
||||
setup();
|
||||
run();
|
||||
|
||||
- return 1; /* unreachable */
|
||||
+ cleanup();
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -160,6 +167,15 @@
|
||||
}
|
||||
|
||||
void
|
||||
+cleanup(void) {
|
||||
+ freecol(dc, normcol);
|
||||
+ freecol(dc, selcol);
|
||||
+ XDestroyWindow(dc->dpy, win);
|
||||
+ XUngrabKeyboard(dc->dpy, CurrentTime);
|
||||
+ freedc(dc);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
drawmenu(void) {
|
||||
int curpos;
|
||||
Item *item;
|
||||
@@ -167,7 +183,7 @@
|
||||
dc->x = 0;
|
||||
dc->y = 0;
|
||||
dc->h = bh;
|
||||
- drawrect(dc, 0, 0, mw, mh, True, BG(dc, normcol));
|
||||
+ drawrect(dc, 0, 0, mw, mh, True, normcol->BG);
|
||||
|
||||
if(prompt) {
|
||||
dc->w = promptw;
|
||||
@@ -178,7 +194,7 @@
|
||||
dc->w = (lines > 0 || !matches) ? mw - dc->x : inputw;
|
||||
drawtext(dc, text, normcol);
|
||||
if((curpos = textnw(dc, text, cursor) + dc->h/2 - 2) < dc->w)
|
||||
- drawrect(dc, curpos, 2, 1, dc->h - 4, True, FG(dc, normcol));
|
||||
+ drawrect(dc, curpos, 2, 1, dc->h - 4, True, normcol->FG);
|
||||
|
||||
if(lines > 0) {
|
||||
/* draw vertical list */
|
||||
@@ -321,7 +337,9 @@
|
||||
sel = matchend;
|
||||
break;
|
||||
case XK_Escape:
|
||||
- exit(EXIT_FAILURE);
|
||||
+ ret = EXIT_FAILURE;
|
||||
+ running = False;
|
||||
+ break;
|
||||
case XK_Home:
|
||||
if(sel == matches) {
|
||||
cursor = 0;
|
||||
@@ -359,7 +377,9 @@
|
||||
case XK_Return:
|
||||
case XK_KP_Enter:
|
||||
puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
|
||||
- exit(EXIT_SUCCESS);
|
||||
+ ret = EXIT_SUCCESS;
|
||||
+ running = False;
|
||||
+ break;
|
||||
case XK_Right:
|
||||
if(text[cursor] != '\0') {
|
||||
cursor = nextrune(+1);
|
||||
@@ -490,7 +510,7 @@
|
||||
run(void) {
|
||||
XEvent ev;
|
||||
|
||||
- while(!XNextEvent(dc->dpy, &ev)) {
|
||||
+ while(running && !XNextEvent(dc->dpy, &ev)) {
|
||||
if(XFilterEvent(&ev, win))
|
||||
continue;
|
||||
switch(ev.type) {
|
||||
@@ -524,11 +544,6 @@
|
||||
XineramaScreenInfo *info;
|
||||
#endif
|
||||
|
||||
- normcol[ColBG] = getcolor(dc, normbgcolor);
|
||||
- normcol[ColFG] = getcolor(dc, normfgcolor);
|
||||
- selcol[ColBG] = getcolor(dc, selbgcolor);
|
||||
- selcol[ColFG] = getcolor(dc, selfgcolor);
|
||||
-
|
||||
clip = XInternAtom(dc->dpy, "CLIPBOARD", False);
|
||||
utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False);
|
||||
|
||||
@@ -582,7 +597,7 @@
|
||||
|
||||
/* create menu window */
|
||||
swa.override_redirect = True;
|
||||
- swa.background_pixel = normcol[ColBG];
|
||||
+ swa.background_pixel = normcol->BG;
|
||||
swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
|
||||
win = XCreateWindow(dc->dpy, root, x, y, mw, mh, 0,
|
||||
DefaultDepth(dc->dpy, screen), CopyFromParent,
|
||||
--- a/draw.c
|
||||
+++ b/draw.c
|
||||
@@ -9,9 +9,6 @@
|
||||
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
-#define DEFAULTFN "fixed"
|
||||
-
|
||||
-static Bool loadfont(DC *dc, const char *fontstr);
|
||||
|
||||
void
|
||||
drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) {
|
||||
@@ -23,7 +20,7 @@
|
||||
}
|
||||
|
||||
void
|
||||
-drawtext(DC *dc, const char *text, unsigned long col[ColLast]) {
|
||||
+drawtext(DC *dc, const char *text, ColorSet *col) {
|
||||
char buf[BUFSIZ];
|
||||
size_t mn, n = strlen(text);
|
||||
|
||||
@@ -35,19 +32,24 @@
|
||||
if(mn < n)
|
||||
for(n = MAX(mn-3, 0); n < mn; buf[n++] = '.');
|
||||
|
||||
- drawrect(dc, 0, 0, dc->w, dc->h, True, BG(dc, col));
|
||||
+ drawrect(dc, 0, 0, dc->w, dc->h, True, col->BG);
|
||||
drawtextn(dc, buf, mn, col);
|
||||
}
|
||||
|
||||
void
|
||||
-drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]) {
|
||||
+drawtextn(DC *dc, const char *text, size_t n, ColorSet *col) {
|
||||
int x = dc->x + dc->font.height/2;
|
||||
int y = dc->y + dc->font.ascent+1;
|
||||
|
||||
- XSetForeground(dc->dpy, dc->gc, FG(dc, col));
|
||||
- if(dc->font.set)
|
||||
+ XSetForeground(dc->dpy, dc->gc, col->FG);
|
||||
+ if(dc->font.xft_font) {
|
||||
+ if (!dc->xftdraw)
|
||||
+ eprintf("error, xft drawable does not exist");
|
||||
+ XftDrawStringUtf8(dc->xftdraw, &col->FG_xft,
|
||||
+ dc->font.xft_font, x, y, (unsigned char*)text, n);
|
||||
+ } else if(dc->font.set) {
|
||||
XmbDrawString(dc->dpy, dc->canvas, dc->font.set, dc->gc, x, y, text, n);
|
||||
- else {
|
||||
+ } else {
|
||||
XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid);
|
||||
XDrawString(dc->dpy, dc->canvas, dc->gc, x, y, text, n);
|
||||
}
|
||||
@@ -69,16 +71,33 @@
|
||||
}
|
||||
|
||||
void
|
||||
+freecol(DC *dc, ColorSet *col) {
|
||||
+ if(col) {
|
||||
+ if(&col->FG_xft)
|
||||
+ XftColorFree(dc->dpy, DefaultVisual(dc->dpy, DefaultScreen(dc->dpy)),
|
||||
+ DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)), &col->FG_xft);
|
||||
+ free(col);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
freedc(DC *dc) {
|
||||
+ if(dc->font.xft_font) {
|
||||
+ XftFontClose(dc->dpy, dc->font.xft_font);
|
||||
+ XftDrawDestroy(dc->xftdraw);
|
||||
+ }
|
||||
if(dc->font.set)
|
||||
XFreeFontSet(dc->dpy, dc->font.set);
|
||||
- if(dc->font.xfont)
|
||||
+ if(dc->font.xfont)
|
||||
XFreeFont(dc->dpy, dc->font.xfont);
|
||||
- if(dc->canvas)
|
||||
+ if(dc->canvas)
|
||||
XFreePixmap(dc->dpy, dc->canvas);
|
||||
- XFreeGC(dc->dpy, dc->gc);
|
||||
- XCloseDisplay(dc->dpy);
|
||||
- free(dc);
|
||||
+ if(dc->gc)
|
||||
+ XFreeGC(dc->dpy, dc->gc);
|
||||
+ if(dc->dpy)
|
||||
+ XCloseDisplay(dc->dpy);
|
||||
+ if(dc)
|
||||
+ free(dc);
|
||||
}
|
||||
|
||||
unsigned long
|
||||
@@ -91,6 +110,20 @@
|
||||
return color.pixel;
|
||||
}
|
||||
|
||||
+ColorSet *
|
||||
+initcolor(DC *dc, const char * foreground, const char * background) {
|
||||
+ ColorSet * col = (ColorSet *)malloc(sizeof(ColorSet));
|
||||
+ if(!col)
|
||||
+ eprintf("error, cannot allocate memory for color set");
|
||||
+ col->BG = getcolor(dc, background);
|
||||
+ col->FG = getcolor(dc, foreground);
|
||||
+ if(dc->font.xft_font)
|
||||
+ if(!XftColorAllocName(dc->dpy, DefaultVisual(dc->dpy, DefaultScreen(dc->dpy)),
|
||||
+ DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)), foreground, &col->FG_xft))
|
||||
+ eprintf("error, cannot allocate xft font color '%s'\n", foreground);
|
||||
+ return col;
|
||||
+}
|
||||
+
|
||||
DC *
|
||||
initdc(void) {
|
||||
DC *dc;
|
||||
@@ -109,23 +142,11 @@
|
||||
|
||||
void
|
||||
initfont(DC *dc, const char *fontstr) {
|
||||
- if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) {
|
||||
- if(fontstr != NULL)
|
||||
- fprintf(stderr, "cannot load font '%s'\n", fontstr);
|
||||
- if(fontstr == NULL || !loadfont(dc, DEFAULTFN))
|
||||
- eprintf("cannot load font '%s'\n", DEFAULTFN);
|
||||
- }
|
||||
- dc->font.height = dc->font.ascent + dc->font.descent;
|
||||
-}
|
||||
-
|
||||
-Bool
|
||||
-loadfont(DC *dc, const char *fontstr) {
|
||||
char *def, **missing, **names;
|
||||
int i, n;
|
||||
XFontStruct **xfonts;
|
||||
|
||||
- if(!*fontstr)
|
||||
- return False;
|
||||
+ missing = NULL;
|
||||
if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) {
|
||||
n = XFontsOfFontSet(dc->font.set, &xfonts, &names);
|
||||
for(i = 0; i < n; i++) {
|
||||
@@ -133,15 +154,21 @@
|
||||
dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent);
|
||||
dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width);
|
||||
}
|
||||
- }
|
||||
- else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) {
|
||||
- dc->font.ascent = dc->font.xfont->ascent;
|
||||
+ } else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) {
|
||||
+ dc->font.ascent = dc->font.xfont->ascent;
|
||||
dc->font.descent = dc->font.xfont->descent;
|
||||
dc->font.width = dc->font.xfont->max_bounds.width;
|
||||
+ } else if((dc->font.xft_font = XftFontOpenName(dc->dpy, DefaultScreen(dc->dpy), fontstr))) {
|
||||
+ dc->font.ascent = dc->font.xft_font->ascent;
|
||||
+ dc->font.descent = dc->font.xft_font->descent;
|
||||
+ dc->font.width = dc->font.xft_font->max_advance_width;
|
||||
+ } else {
|
||||
+ eprintf("cannot load font '%s'\n", fontstr);
|
||||
}
|
||||
if(missing)
|
||||
XFreeStringList(missing);
|
||||
- return dc->font.set || dc->font.xfont;
|
||||
+ dc->font.height = dc->font.ascent + dc->font.descent;
|
||||
+ return;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -151,20 +178,29 @@
|
||||
|
||||
void
|
||||
resizedc(DC *dc, unsigned int w, unsigned int h) {
|
||||
+ int screen = DefaultScreen(dc->dpy);
|
||||
if(dc->canvas)
|
||||
XFreePixmap(dc->dpy, dc->canvas);
|
||||
|
||||
dc->w = w;
|
||||
dc->h = h;
|
||||
dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h,
|
||||
- DefaultDepth(dc->dpy, DefaultScreen(dc->dpy)));
|
||||
+ DefaultDepth(dc->dpy, screen));
|
||||
+ if(dc->font.xft_font && !(dc->xftdraw)) {
|
||||
+ dc->xftdraw = XftDrawCreate(dc->dpy, dc->canvas, DefaultVisual(dc->dpy,screen), DefaultColormap(dc->dpy,screen));
|
||||
+ if(!(dc->xftdraw))
|
||||
+ eprintf("error, cannot create xft drawable\n");
|
||||
+ }
|
||||
}
|
||||
|
||||
int
|
||||
textnw(DC *dc, const char *text, size_t len) {
|
||||
- if(dc->font.set) {
|
||||
+ if(dc->font.xft_font) {
|
||||
+ XGlyphInfo gi;
|
||||
+ XftTextExtentsUtf8(dc->dpy, dc->font.xft_font, (const FcChar8*)text, len, &gi);
|
||||
+ return gi.width;
|
||||
+ } else if(dc->font.set) {
|
||||
XRectangle r;
|
||||
-
|
||||
XmbTextExtents(dc->font.set, text, len, NULL, &r);
|
||||
return r.width;
|
||||
}
|
||||
--- a/draw.h
|
||||
+++ b/draw.h
|
||||
@@ -1,9 +1,6 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
-#define FG(dc, col) ((col)[(dc)->invert ? ColBG : ColFG])
|
||||
-#define BG(dc, col) ((col)[(dc)->invert ? ColFG : ColBG])
|
||||
-
|
||||
-enum { ColBG, ColFG, ColBorder, ColLast };
|
||||
+#include <X11/Xft/Xft.h>
|
||||
|
||||
typedef struct {
|
||||
int x, y, w, h;
|
||||
@@ -11,6 +8,7 @@
|
||||
Display *dpy;
|
||||
GC gc;
|
||||
Pixmap canvas;
|
||||
+ XftDraw *xftdraw;
|
||||
struct {
|
||||
int ascent;
|
||||
int descent;
|
||||
@@ -18,15 +16,24 @@
|
||||
int width;
|
||||
XFontSet set;
|
||||
XFontStruct *xfont;
|
||||
+ XftFont *xft_font;
|
||||
} font;
|
||||
} DC; /* draw context */
|
||||
|
||||
+typedef struct {
|
||||
+ unsigned long FG;
|
||||
+ XftColor FG_xft;
|
||||
+ unsigned long BG;
|
||||
+} ColorSet;
|
||||
+
|
||||
void drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color);
|
||||
-void drawtext(DC *dc, const char *text, unsigned long col[ColLast]);
|
||||
-void drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]);
|
||||
+void drawtext(DC *dc, const char *text, ColorSet *col);
|
||||
+void drawtextn(DC *dc, const char *text, size_t n, ColorSet *col);
|
||||
+void freecol(DC *dc, ColorSet *col);
|
||||
void eprintf(const char *fmt, ...);
|
||||
void freedc(DC *dc);
|
||||
unsigned long getcolor(DC *dc, const char *colstr);
|
||||
+ColorSet *initcolor(DC *dc, const char *foreground, const char *background);
|
||||
DC *initdc(void);
|
||||
void initfont(DC *dc, const char *fontstr);
|
||||
void mapdc(DC *dc, Window win, unsigned int w, unsigned int h);
|
||||
Reference in New Issue
Block a user