dwm.c
changeset 1062 767e76426fda
parent 1061 9d8238793016
child 1063 664b404421fe
equal deleted inserted replaced
1061:9d8238793016 1062:767e76426fda
  1285 }
  1285 }
  1286 
  1286 
  1287 void
  1287 void
  1288 run(void) {
  1288 run(void) {
  1289 	char *p;
  1289 	char *p;
       
  1290 	char buf[sizeof stext];
  1290 	fd_set rd;
  1291 	fd_set rd;
  1291 	int r, xfd;
  1292 	int r, xfd;
  1292 	unsigned int len, offset;
  1293 	unsigned int len, offset;
  1293 	XEvent ev;
  1294 	XEvent ev;
  1294 
  1295 
  1296 	XSync(dpy, False);
  1297 	XSync(dpy, False);
  1297 	xfd = ConnectionNumber(dpy);
  1298 	xfd = ConnectionNumber(dpy);
  1298 	readin = True;
  1299 	readin = True;
  1299 	offset = 0;
  1300 	offset = 0;
  1300 	len = sizeof stext - 1;
  1301 	len = sizeof stext - 1;
  1301 	stext[len] = '\0'; /* 0-terminator is never touched */
  1302 	buf[len] = stext[len] = '\0'; /* 0-terminator is never touched */
  1302 	while(running) {
  1303 	while(running) {
  1303 		FD_ZERO(&rd);
  1304 		FD_ZERO(&rd);
  1304 		if(readin)
  1305 		if(readin)
  1305 			FD_SET(STDIN_FILENO, &rd);
  1306 			FD_SET(STDIN_FILENO, &rd);
  1306 		FD_SET(xfd, &rd);
  1307 		FD_SET(xfd, &rd);
  1308 			if(errno == EINTR)
  1309 			if(errno == EINTR)
  1309 				continue;
  1310 				continue;
  1310 			eprint("select failed\n");
  1311 			eprint("select failed\n");
  1311 		}
  1312 		}
  1312 		if(FD_ISSET(STDIN_FILENO, &rd)) {
  1313 		if(FD_ISSET(STDIN_FILENO, &rd)) {
  1313 			switch((r = read(STDIN_FILENO, stext + offset, len - offset))) {
  1314 			switch((r = read(STDIN_FILENO, buf + offset, len - offset))) {
  1314 			case -1:
  1315 			case -1:
  1315 				strncpy(stext, strerror(errno), len);
  1316 				strncpy(stext, strerror(errno), len);
  1316 				readin = False;
  1317 				readin = False;
  1317 				break;
  1318 				break;
  1318 			case 0:
  1319 			case 0:
  1319 				strncpy(stext, "EOF", 4);
  1320 				strncpy(stext, "EOF", 4);
  1320 				readin = False;
  1321 				readin = False;
  1321 				break;
  1322 				break;
  1322 			default:
  1323 			default:
  1323 				stext[offset + r] = '\0';
  1324 				for(p = buf + offset; r > 0; p++, r--, offset++)
  1324 				for(p = stext; *p && *p != '\n'; p++);
  1325 					if(*p == '\n' || *p == '\0') {
  1325 				if(*p == '\n') {
  1326 						*p = '\0';
  1326 					*p = '\0';
  1327 						strncpy(stext, buf, len);
  1327 					offset = 0;
  1328 						p += r - 1; /* p is buf + offset + r - 1 */
  1328 				}
  1329 						for(r = 0; *(p - r) && *(p - r) != '\n'; r++);
  1329 				else
  1330 						offset = r;
  1330 					offset = (offset + r < len - 1) ? offset + r : 0;
  1331 						if(r)
       
  1332 							memmove(buf, p - r + 1, r);
       
  1333 						break;
       
  1334 					}
       
  1335 				break;
  1331 			}
  1336 			}
  1332 			drawbar();
  1337 			drawbar();
  1333 		}
  1338 		}
  1334 		while(XPending(dpy)) {
  1339 		while(XPending(dpy)) {
  1335 			XNextEvent(dpy, &ev);
  1340 			XNextEvent(dpy, &ev);