/* See LICENSE file for copyright and license details. */
+#define _BSD_SOURCE
#include <ctype.h>
#include <locale.h>
#include <stdarg.h>
enum { ColFG, ColBG, ColLast };
/* typedefs */
-typedef unsigned int uint;
-typedef unsigned long ulong;
typedef struct {
int x, y, w, h;
- ulong norm[ColLast];
- ulong sel[ColLast];
+ unsigned long norm[ColLast];
+ unsigned long sel[ColLast];
Drawable drawable;
GC gc;
struct {
static char *cistrstr(const char *s, const char *sub);
static void cleanup(void);
static void drawmenu(void);
-static void drawtext(const char *text, ulong col[ColLast]);
-static void *emalloc(uint size);
+static void drawtext(const char *text, unsigned long col[ColLast]);
static void eprint(const char *errstr, ...);
-static ulong getcolor(const char *colstr);
+static unsigned long getcolor(const char *colstr);
static Bool grabkeyboard(void);
static void initfont(const char *fontstr);
static void kpress(XKeyEvent * e);
static void readstdin(void);
static void run(void);
static void setup(Bool topbar);
-static int textnw(const char *text, uint len);
+static int textnw(const char *text, unsigned int len);
static int textw(const char *text);
#include "config.h"
/* variables */
-static char *font = FONT;
static char *maxname = NULL;
-static char *normbg = NORMBGCOLOR;
-static char *normfg = NORMFGCOLOR;
static char *prompt = NULL;
-static char *selbg = SELBGCOLOR;
-static char *selfg = SELFGCOLOR;
static char text[4096];
static int cmdw = 0;
static int promptw = 0;
static int ret = 0;
static int screen;
-static uint mw, mh;
-static uint numlockmask = 0;
+static unsigned int mw, mh;
+static unsigned int numlockmask = 0;
static Bool running = True;
static Display *dpy;
static DC dc = {0};
void
calcoffsets(void) {
int tw;
- uint w;
+ unsigned int w;
if(!curr)
return;
char *
cistrstr(const char *s, const char *sub) {
int c, csub;
- uint len;
+ unsigned int len;
if(!sub)
return (char *)s;
}
void
-drawtext(const char *text, ulong col[ColLast]) {
+drawtext(const char *text, unsigned long col[ColLast]) {
int x, y, w, h;
static char buf[256];
- uint len, olen;
+ unsigned int len, olen;
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
XSetForeground(dpy, dc.gc, col[ColBG]);
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
}
-void *
-emalloc(uint size) {
- void *res = malloc(size);
-
- if(!res)
- eprint("fatal: could not malloc() %u bytes\n", size);
- return res;
-}
-
void
eprint(const char *errstr, ...) {
va_list ap;
exit(EXIT_FAILURE);
}
-ulong
+unsigned long
getcolor(const char *colstr) {
Colormap cmap = DefaultColormap(dpy, screen);
XColor color;
Bool
grabkeyboard(void) {
- uint len;
+ unsigned int len;
for(len = 1000; len; len--) {
if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime)
kpress(XKeyEvent * e) {
char buf[32];
int i, num;
- uint len;
+ unsigned int len;
KeySym ksym;
len = strlen(text);
calcoffsets();
break;
case XK_Return:
- if((e->state & ShiftMask) && text)
+ if((e->state & ShiftMask) && *text)
fprintf(stdout, "%s", text);
else if(sel)
fprintf(stdout, "%s", sel->text);
- else if(text)
+ else if(*text)
fprintf(stdout, "%s", text);
fflush(stdout);
running = False;
void
match(char *pattern) {
- uint plen;
+ unsigned int plen;
Item *i, *itemend, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
if(!pattern)
void
readstdin(void) {
char *p, buf[1024];
- uint len = 0, max = 0;
+ unsigned int len = 0, max = 0;
Item *i, *new;
i = 0;
maxname = p;
max = len;
}
- new = emalloc(sizeof(Item));
+ if((new = (Item *)malloc(sizeof(Item))) == NULL)
+ eprint("fatal: could not malloc() %u bytes\n", sizeof(Item));
new->next = new->left = new->right = NULL;
new->text = p;
if(!i)
XFreeModifiermap(modmap);
/* style */
- dc.norm[ColBG] = getcolor(normbg);
- dc.norm[ColFG] = getcolor(normfg);
- dc.sel[ColBG] = getcolor(selbg);
- dc.sel[ColFG] = getcolor(selfg);
+ dc.norm[ColBG] = getcolor(normbgcolor);
+ dc.norm[ColFG] = getcolor(normfgcolor);
+ dc.sel[ColBG] = getcolor(selbgcolor);
+ dc.sel[ColFG] = getcolor(selfgcolor);
initfont(font);
/* menu window */
#if XINERAMA
if(XineramaIsActive(dpy)) {
info = XineramaQueryScreens(dpy, &i);
- x = info[0].x_org;
- y = topbar ? info[0].y_org : info[0].y_org + info[0].height - mh;
- mw = info[0].width;
+ x = info[xidx].x_org;
+ y = topbar ? info[xidx].y_org : info[xidx].y_org + info[xidx].height - mh;
+ mw = info[xidx].width;
XFree(info);
}
else
}
int
-textnw(const char *text, uint len) {
+textnw(const char *text, unsigned int len) {
XRectangle r;
if(dc.font.set) {
int
main(int argc, char *argv[]) {
- uint i;
+ unsigned int i;
Bool topbar = True;
/* command line args */
if(++i < argc) font = argv[i];
}
else if(!strcmp(argv[i], "-nb")) {
- if(++i < argc) normbg = argv[i];
+ if(++i < argc) normbgcolor = argv[i];
}
else if(!strcmp(argv[i], "-nf")) {
- if(++i < argc) normfg = argv[i];
+ if(++i < argc) normfgcolor = argv[i];
}
else if(!strcmp(argv[i], "-p")) {
if(++i < argc) prompt = argv[i];
}
else if(!strcmp(argv[i], "-sb")) {
- if(++i < argc) selbg = argv[i];
+ if(++i < argc) selbgcolor = argv[i];
}
else if(!strcmp(argv[i], "-sf")) {
- if(++i < argc) selfg = argv[i];
+ if(++i < argc) selfgcolor = argv[i];
}
else if(!strcmp(argv[i], "-v"))
eprint("dmenu-"VERSION", © 2006-2008 dmenu engineers, see LICENSE for details\n");
else
eprint("usage: dmenu [-i] [-b] [-fn <font>] [-nb <color>] [-nf <color>]\n"
" [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");
- setlocale(LC_CTYPE, "");
+ if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
+ fprintf(stderr, "warning: no locale support\n");
if(!(dpy = XOpenDisplay(0)))
eprint("dmenu: cannot open display\n");
screen = DefaultScreen(dpy);