Kris YotamImport dmenu historya5d79a72 months agoHistory
68 lines · 1.4 KB · C
RawDownload
#include <fcntl.h>#include <unistd.h>#include <sys/select.h> static voidreadstdin(void){	static size_t max = 0;	static struct item **end = &items; 	char buf[sizeof text], *p, *maxstr;	struct item *item; 	#if PASSWORD_PATCH	if (passwd) {		inputw = lines = 0;		return;	}	#endif // PASSWORD_PATCH 	/* read each line from stdin and add it to the item list */	while (fgets(buf, sizeof buf, stdin)) {		if (!(item = malloc(sizeof *item)))			die("cannot malloc %u bytes:", sizeof *item);		if ((p = strchr(buf, '\n')))			*p = '\0';		if (!(item->text = strdup(buf)))			die("cannot strdup %u bytes:", strlen(buf)+1);		if (strlen(item->text) > max) {			max = strlen(maxstr = item->text);			#if PANGO_PATCH			inputw = maxstr ? TEXTWM(maxstr) : 0;			#else			inputw = maxstr ? TEXTW(maxstr) : 0;			#endif // PANGO_PATCH		}		*end = item;		end = &item->next;		item->next = NULL;		item->out = 0;	}	match();	drawmenu();} static voidrun(void){	fd_set fds;	int flags, xfd = XConnectionNumber(dpy); 	if ((flags = fcntl(0, F_GETFL)) == -1)		die("cannot get stdin control flags:");	if (fcntl(0, F_SETFL, flags | O_NONBLOCK) == -1)		die("cannot set stdin control flags:");	for (;;) {		FD_ZERO(&fds);		FD_SET(xfd, &fds);		if (!feof(stdin))			FD_SET(0, &fds);		if (select(xfd + 1, &fds, NULL, NULL, NULL) == -1)			die("cannot multiplex input:");		if (FD_ISSET(xfd, &fds))			readevent();		if (FD_ISSET(0, &fds))			readstdin();	}}