fixed offsets, updated eprint, cleaned up
							parent
							
								
									6efe1932be
								
							
						
					
					
						commit
						6c1d0e4d60
					
				
							
								
								
									
										5
									
								
								dinput.c
								
								
								
								
							
							
						
						
									
										5
									
								
								dinput.c
								
								
								
								
							| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										56
									
								
								dmenu.c
								
								
								
								
							
							
						
						
									
										56
									
								
								dmenu.c
								
								
								
								
							| 
						 | 
				
			
			@ -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 *
 | 
			
		||||
| 
						 | 
				
			
			@ -150,6 +148,13 @@ cleanup(void) {
 | 
			
		|||
	XUngrabKeyboard(dpy, CurrentTime);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dinput(void) {
 | 
			
		||||
	cleanup();
 | 
			
		||||
	execlp("dinput", "dinput", text, NULL); /* todo: argv */
 | 
			
		||||
	eprint("cannot exec dinput\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drawmenu(void) {
 | 
			
		||||
	dc.x = 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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								draw.c
								
								
								
								
							
							
						
						
									
										12
									
								
								draw.c
								
								
								
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								draw.h
								
								
								
								
							
							
						
						
									
										2
									
								
								draw.h
								
								
								
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue