@@ -164,7 +164,7 @@ kpress(XKeyEvent * e) { | |||||
FILE *fp; | FILE *fp; | ||||
char *s; | char *s; | ||||
if(!(fp = popen("sselp", "r"))) | if(!(fp = popen("sselp", "r"))) | ||||
eprint("dinput: cannot popen sselp\n"); | |||||
eprint("cannot popen sselp\n"); | |||||
s = fgets(buf, sizeof buf, fp); | s = fgets(buf, sizeof buf, fp); | ||||
pclose(fp); | pclose(fp); | ||||
if(s == NULL) | if(s == NULL) | ||||
@@ -322,6 +322,7 @@ main(int argc, char *argv[]) { | |||||
Bool topbar = True; | Bool topbar = True; | ||||
/* command line args */ | /* command line args */ | ||||
progname = argv[0]; | |||||
for(i = 1; i < argc; i++) | for(i = 1; i < argc; i++) | ||||
if(!strcmp(argv[i], "-b")) | if(!strcmp(argv[i], "-b")) | ||||
topbar = False; | topbar = False; | ||||
@@ -356,7 +357,7 @@ main(int argc, char *argv[]) { | |||||
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | ||||
fprintf(stderr, "dinput: warning: no locale support\n"); | fprintf(stderr, "dinput: warning: no locale support\n"); | ||||
if(!(dpy = XOpenDisplay(NULL))) | if(!(dpy = XOpenDisplay(NULL))) | ||||
eprint("dinput: cannot open display\n"); | |||||
eprint("cannot open display\n"); | |||||
screen = DefaultScreen(dpy); | screen = DefaultScreen(dpy); | ||||
if(!parent) | if(!parent) | ||||
parent = RootWindow(dpy, screen); | parent = RootWindow(dpy, screen); | ||||
@@ -34,6 +34,7 @@ static void calcoffsetsh(void); | |||||
static void calcoffsetsv(void); | static void calcoffsetsv(void); | ||||
static char *cistrstr(const char *s, const char *sub); | static char *cistrstr(const char *s, const char *sub); | ||||
static void cleanup(void); | static void cleanup(void); | ||||
static void dinput(void); | |||||
static void drawmenu(void); | static void drawmenu(void); | ||||
static void drawmenuh(void); | static void drawmenuh(void); | ||||
static void drawmenuv(void); | static void drawmenuv(void); | ||||
@@ -89,28 +90,25 @@ void | |||||
calcoffsetsh(void) { | calcoffsetsh(void) { | ||||
unsigned int w; | unsigned int w; | ||||
if(!curr) | |||||
return; | |||||
w = promptw + cmdw + 2 * spaceitem; | |||||
for(next = curr; next && w < mw; next=next->right) | |||||
w += MIN(textw(next->text), mw / 3); | |||||
w = promptw + cmdw + 2 * spaceitem; | |||||
for(prev = curr; prev && prev->left && w < mw; prev=prev->left) | |||||
w += MIN(textw(prev->left->text), mw / 3); | |||||
w = promptw + cmdw + (2 * spaceitem); | |||||
for(next = curr; next; next = next->right) | |||||
if((w += MIN(textw(next->text), mw / 3)) > mw) | |||||
break; | |||||
w = promptw + cmdw + (2 * spaceitem); | |||||
for(prev = curr; prev && prev->left; prev = prev->left) | |||||
if((w += MIN(textw(prev->left->text), mw / 3)) > mw) | |||||
break; | |||||
} | } | ||||
void | void | ||||
calcoffsetsv(void) { | calcoffsetsv(void) { | ||||
unsigned int h; | |||||
unsigned int i; | |||||
if(!curr) | |||||
return; | |||||
h = (dc.font.height + 2) * lines; | |||||
for(next = curr; next && h > 0; next = next->right) | |||||
h -= dc.font.height + 2; | |||||
h = (dc.font.height + 2) * lines; | |||||
for(prev = curr; prev && prev->left && h > 0; prev = prev->left) | |||||
h -= dc.font.height + 2; | |||||
next = prev = curr; | |||||
for(i = 0; i < lines && next; i++) | |||||
next = next->right; | |||||
for(i = 0; i < lines && prev && prev->left; i++) | |||||
prev = prev->left; | |||||
} | } | ||||
char * | char * | ||||
@@ -150,6 +148,13 @@ cleanup(void) { | |||||
XUngrabKeyboard(dpy, CurrentTime); | XUngrabKeyboard(dpy, CurrentTime); | ||||
} | } | ||||
void | |||||
dinput(void) { | |||||
cleanup(); | |||||
execlp("dinput", "dinput", text, NULL); /* todo: argv */ | |||||
eprint("cannot exec dinput\n"); | |||||
} | |||||
void | void | ||||
drawmenu(void) { | drawmenu(void) { | ||||
dc.x = 0; | dc.x = 0; | ||||
@@ -290,8 +295,7 @@ kpress(XKeyEvent * e) { | |||||
match(text); | match(text); | ||||
break; | break; | ||||
case XK_x: | case XK_x: | ||||
execlp("dinput", "dinput", text, NULL); /* todo: argv */ | |||||
eprint("dmenu: cannot exec dinput:"); | |||||
dinput(); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -369,10 +373,9 @@ kpress(XKeyEvent * e) { | |||||
} | } | ||||
break; | break; | ||||
case XK_Tab: | case XK_Tab: | ||||
if(!sel) | |||||
return; | |||||
strncpy(text, sel->text, sizeof text); | |||||
match(text); | |||||
if(sel) | |||||
strncpy(text, sel->text, sizeof text); | |||||
dinput(); | |||||
break; | break; | ||||
} | } | ||||
drawmenu(); | drawmenu(); | ||||
@@ -431,11 +434,11 @@ readstdin(void) { | |||||
if(buf[len-1] == '\n') | if(buf[len-1] == '\n') | ||||
buf[--len] = '\0'; | buf[--len] = '\0'; | ||||
if(!(p = strdup(buf))) | if(!(p = strdup(buf))) | ||||
eprint("dmenu: cannot strdup %u bytes\n", len); | |||||
eprint("cannot strdup %u bytes\n", len); | |||||
if((max = MAX(max, len)) == len) | if((max = MAX(max, len)) == len) | ||||
maxname = p; | maxname = p; | ||||
if(!(new = malloc(sizeof *new))) | if(!(new = malloc(sizeof *new))) | ||||
eprint("dmenu: cannot malloc %u bytes\n", sizeof *new); | |||||
eprint("cannot malloc %u bytes\n", sizeof *new); | |||||
new->next = new->left = new->right = NULL; | new->next = new->left = new->right = NULL; | ||||
new->text = p; | new->text = p; | ||||
if(!i) | if(!i) | ||||
@@ -544,6 +547,7 @@ main(int argc, char *argv[]) { | |||||
Bool topbar = True; | Bool topbar = True; | ||||
/* command line args */ | /* command line args */ | ||||
progname = argv[0]; | |||||
for(i = 1; i < argc; i++) | for(i = 1; i < argc; i++) | ||||
if(!strcmp(argv[i], "-i")) { | if(!strcmp(argv[i], "-i")) { | ||||
fstrncmp = strncasecmp; | fstrncmp = strncasecmp; | ||||
@@ -585,7 +589,7 @@ main(int argc, char *argv[]) { | |||||
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | ||||
fprintf(stderr, "dmenu: warning: no locale support\n"); | fprintf(stderr, "dmenu: warning: no locale support\n"); | ||||
if(!(dpy = XOpenDisplay(NULL))) | if(!(dpy = XOpenDisplay(NULL))) | ||||
eprint("dmenu: cannot open display\n"); | |||||
eprint("cannot open display\n"); | |||||
screen = DefaultScreen(dpy); | screen = DefaultScreen(dpy); | ||||
if(!parent) | if(!parent) | ||||
parent = RootWindow(dpy, screen); | parent = RootWindow(dpy, screen); | ||||
@@ -13,6 +13,9 @@ | |||||
#define MIN(a, b) ((a) < (b) ? (a) : (b)) | #define MIN(a, b) ((a) < (b) ? (a) : (b)) | ||||
#define MAX(a, b) ((a) > (b) ? (a) : (b)) | #define MAX(a, b) ((a) > (b) ? (a) : (b)) | ||||
/* variables */ | |||||
char *progname; | |||||
void | void | ||||
drawcleanup(void) { | drawcleanup(void) { | ||||
if(dc.font.set) | if(dc.font.set) | ||||
@@ -71,6 +74,7 @@ void | |||||
eprint(const char *errstr, ...) { | eprint(const char *errstr, ...) { | ||||
va_list ap; | va_list ap; | ||||
fprintf(stderr, "%s: ", progname); | |||||
va_start(ap, errstr); | va_start(ap, errstr); | ||||
vfprintf(stderr, errstr, ap); | vfprintf(stderr, errstr, ap); | ||||
va_end(ap); | va_end(ap); | ||||
@@ -83,7 +87,7 @@ getcolor(const char *colstr) { | |||||
XColor color; | XColor color; | ||||
if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) | if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) | ||||
eprint("drawtext: cannot allocate color '%s'\n", colstr); | |||||
eprint("cannot allocate color '%s'\n", colstr); | |||||
return color.pixel; | return color.pixel; | ||||
} | } | ||||
@@ -92,8 +96,8 @@ initfont(const char *fontstr) { | |||||
char *def, **missing = NULL; | char *def, **missing = NULL; | ||||
int i, n; | int i, n; | ||||
if(!fontstr || fontstr[0] == '\0') | |||||
eprint("drawtext: cannot load font: '%s'\n", fontstr); | |||||
if(!fontstr || !*fontstr) | |||||
eprint("cannot load null font\n"); | |||||
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); | dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); | ||||
if(missing) | if(missing) | ||||
XFreeStringList(missing); | XFreeStringList(missing); | ||||
@@ -111,7 +115,7 @@ initfont(const char *fontstr) { | |||||
else { | else { | ||||
if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) | if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) | ||||
&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) | && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) | ||||
eprint("drawtext: cannot load font: '%s'\n", fontstr); | |||||
eprint("cannot load font '%s'\n", fontstr); | |||||
dc.font.ascent = dc.font.xfont->ascent; | dc.font.ascent = dc.font.xfont->ascent; | ||||
dc.font.descent = dc.font.xfont->descent; | dc.font.descent = dc.font.xfont->descent; | ||||
} | } | ||||
@@ -30,13 +30,13 @@ int textnw(const char *text, unsigned int len); | |||||
int textw(const char *text); | int textw(const char *text); | ||||
/* variables */ | /* variables */ | ||||
extern char *progname; | |||||
extern Display *dpy; | extern Display *dpy; | ||||
extern DC dc; | extern DC dc; | ||||
extern int screen; | extern int screen; | ||||
extern unsigned int mw, mh; | extern unsigned int mw, mh; | ||||
extern Window parent; | extern Window parent; | ||||
/* style */ | |||||
extern const char *font; | extern const char *font; | ||||
extern const char *normbgcolor; | extern const char *normbgcolor; | ||||
extern const char *normfgcolor; | extern const char *normfgcolor; | ||||