diff options
Diffstat (limited to '')
| -rw-r--r-- | dinput.c | 5 | ||||
| -rw-r--r-- | dmenu.c | 56 | ||||
| -rw-r--r-- | draw.c | 12 | ||||
| -rw-r--r-- | draw.h | 2 | 
4 files changed, 42 insertions, 33 deletions
@@ -164,7 +164,7 @@ kpress(XKeyEvent * e) {  				FILE *fp;  				char *s;  				if(!(fp = popen("sselp", "r"))) -					eprint("dinput: cannot popen sselp\n"); +					eprint("cannot popen sselp\n");  				s = fgets(buf, sizeof buf, fp);  				pclose(fp);  				if(s == NULL) @@ -322,6 +322,7 @@ main(int argc, char *argv[]) {  	Bool topbar = True;  	/* command line args */ +	progname = argv[0];  	for(i = 1; i < argc; i++)  		if(!strcmp(argv[i], "-b"))  			topbar = False; @@ -356,7 +357,7 @@ main(int argc, char *argv[]) {  	if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())  		fprintf(stderr, "dinput: warning: no locale support\n");  	if(!(dpy = XOpenDisplay(NULL))) -		eprint("dinput: cannot open display\n"); +		eprint("cannot open display\n");  	screen = DefaultScreen(dpy);  	if(!parent)  		parent = RootWindow(dpy, screen); @@ -34,6 +34,7 @@ static void calcoffsetsh(void);  static void calcoffsetsv(void);  static char *cistrstr(const char *s, const char *sub);  static void cleanup(void); +static void dinput(void);  static void drawmenu(void);  static void drawmenuh(void);  static void drawmenuv(void); @@ -89,28 +90,25 @@ void  calcoffsetsh(void) {  	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  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 * @@ -151,6 +149,13 @@ cleanup(void) {  }  void +dinput(void) { +	cleanup(); +	execlp("dinput", "dinput", text, NULL); /* todo: argv */ +	eprint("cannot exec dinput\n"); +} + +void  drawmenu(void) {  	dc.x = 0;  	dc.y = 0; @@ -290,8 +295,7 @@ kpress(XKeyEvent * e) {  			match(text);  			break;  		case XK_x: -			execlp("dinput", "dinput", text, NULL); /* todo: argv */ -			eprint("dmenu: cannot exec dinput:"); +			dinput();  			break;  		}  	} @@ -369,10 +373,9 @@ kpress(XKeyEvent * e) {  		}  		break;  	case XK_Tab: -		if(!sel) -			return; -		strncpy(text, sel->text, sizeof text); -		match(text); +		if(sel) +			strncpy(text, sel->text, sizeof text); +		dinput();  		break;  	}  	drawmenu(); @@ -431,11 +434,11 @@ readstdin(void) {  		if(buf[len-1] == '\n')  			buf[--len] = '\0';  		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)  			maxname = p;  		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->text = p;  		if(!i) @@ -544,6 +547,7 @@ main(int argc, char *argv[]) {  	Bool topbar = True;  	/* command line args */ +	progname = argv[0];  	for(i = 1; i < argc; i++)  		if(!strcmp(argv[i], "-i")) {  			fstrncmp = strncasecmp; @@ -585,7 +589,7 @@ main(int argc, char *argv[]) {  	if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())  		fprintf(stderr, "dmenu: warning: no locale support\n");  	if(!(dpy = XOpenDisplay(NULL))) -		eprint("dmenu: cannot open display\n"); +		eprint("cannot open display\n");  	screen = DefaultScreen(dpy);  	if(!parent)  		parent = RootWindow(dpy, screen); @@ -13,6 +13,9 @@  #define MIN(a, b)               ((a) < (b) ? (a) : (b))  #define MAX(a, b)               ((a) > (b) ? (a) : (b)) +/* variables */ +char *progname; +  void  drawcleanup(void) {  	if(dc.font.set) @@ -71,6 +74,7 @@ void  eprint(const char *errstr, ...) {  	va_list ap; +	fprintf(stderr, "%s: ", progname);  	va_start(ap, errstr);  	vfprintf(stderr, errstr, ap);  	va_end(ap); @@ -83,7 +87,7 @@ getcolor(const char *colstr) {  	XColor 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;  } @@ -92,8 +96,8 @@ initfont(const char *fontstr) {  	char *def, **missing = NULL;  	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);  	if(missing)  		XFreeStringList(missing); @@ -111,7 +115,7 @@ initfont(const char *fontstr) {  	else {  		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))  		&& !(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.descent = dc.font.xfont->descent;  	} @@ -30,13 +30,13 @@ int textnw(const char *text, unsigned int len);  int textw(const char *text);  /* variables */ +extern char *progname;  extern Display *dpy;  extern DC dc;  extern int screen;  extern unsigned int mw, mh;  extern Window parent; -/* style */  extern const char *font;  extern const char *normbgcolor;  extern const char *normfgcolor;  | 
