Implement window switching and status line
This commit is contained in:
		
							parent
							
								
									0728eb39a4
								
							
						
					
					
						commit
						ec83332e15
					
				
							
								
								
									
										15
									
								
								chat.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								chat.c
									
									
									
									
									
								
							| @ -76,19 +76,8 @@ int main(int argc, char *argv[]) { | ||||
| 	ircConfig(insecure, cert, priv); | ||||
| 
 | ||||
| 	uiInit(); | ||||
| 	uiFormat(Network, Cold, NULL, C "3Trave" U "ling" U C "0,3.." C "0,4." R); | ||||
| 	uiFormat( | ||||
| 		Network, Cold, NULL, | ||||
| 		"Jackdaws love my big sphinx of quartz. " | ||||
| 		"The quick brown fox jumps over the lazy dog. " | ||||
| 		"Jackdaws love my big sphinx of quartz. " | ||||
| 		"Jackdaws love my big sphinx of quartz. " | ||||
| 		"Jackdaws love my big sphinx of quartz. " | ||||
| 		"The quick brown fox jumps over the lazy dog. " | ||||
| 		"The quick brown fox jumps over the lazy dog. " | ||||
| 		"Jackdaws love my big sphinx of quartz. " | ||||
| 		"Jackdaws love my big sphinx of quartz. " | ||||
| 	); | ||||
| 	uiShowID(Network); | ||||
| 	uiFormat(Network, Cold, NULL, "Traveling..."); | ||||
| 	uiDraw(); | ||||
| 	 | ||||
| 	int irc = ircConnect(host, port); | ||||
|  | ||||
							
								
								
									
										1
									
								
								chat.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								chat.h
									
									
									
									
									
								
							| @ -117,6 +117,7 @@ void handle(struct Message msg); | ||||
| enum Heat { Cold, Warm, Hot }; | ||||
| void uiInit(void); | ||||
| void uiDraw(void); | ||||
| void uiShowID(size_t id); | ||||
| void uiWrite(size_t id, enum Heat heat, const struct tm *time, const char *str); | ||||
| void uiFormat( | ||||
| 	size_t id, enum Heat heat, const struct tm *time, const char *format, ... | ||||
|  | ||||
							
								
								
									
										22
									
								
								handle.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								handle.c
									
									
									
									
									
								
							| @ -65,9 +65,11 @@ static void set(char **field, const char *value) { | ||||
| 	if (!*field) err(EX_OSERR, "strdup"); | ||||
| } | ||||
| 
 | ||||
| static void require(const struct Message *msg, bool origin, size_t len) { | ||||
| 	if (origin && !msg->nick) { | ||||
| 		errx(EX_PROTOCOL, "%s missing origin", msg->cmd); | ||||
| static void require(struct Message *msg, bool origin, size_t len) { | ||||
| 	if (origin) { | ||||
| 		if (!msg->nick) errx(EX_PROTOCOL, "%s missing origin", msg->cmd); | ||||
| 		if (!msg->user) msg->user = msg->nick; | ||||
| 		if (!msg->host) msg->host = msg->user; | ||||
| 	} | ||||
| 	for (size_t i = 0; i < len; ++i) { | ||||
| 		if (msg->params[i]) continue; | ||||
| @ -177,6 +179,19 @@ static void handleReplyMOTD(struct Message *msg) { | ||||
| 	uiFormat(Network, Cold, tagTime(msg), "%s", line); | ||||
| } | ||||
| 
 | ||||
| static void handleJoin(struct Message *msg) { | ||||
| 	require(msg, true, 1); | ||||
| 	size_t id = idFor(msg->params[0]); | ||||
| 	if (self.nick && !strcmp(msg->nick, self.nick)) { | ||||
| 		uiShowID(id); | ||||
| 	} | ||||
| 	uiFormat( | ||||
| 		id, Cold, tagTime(msg), | ||||
| 		C"%02d%s"C" arrives in "C"%02d%s"C, | ||||
| 		hash(msg->user), msg->nick, hash(idNames[id]), idNames[id] | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| static void handlePing(struct Message *msg) { | ||||
| 	require(msg, false, 1); | ||||
| 	ircFormat("PONG :%s\r\n", msg->params[0]); | ||||
| @ -197,6 +212,7 @@ static const struct Handler { | ||||
| 	{ "906", handleErrorSASLFail }, | ||||
| 	{ "AUTHENTICATE", handleAuthenticate }, | ||||
| 	{ "CAP", handleCap }, | ||||
| 	{ "JOIN", handleJoin }, | ||||
| 	{ "PING", handlePing }, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										34
									
								
								ui.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								ui.c
									
									
									
									
									
								
							| @ -262,6 +262,40 @@ static void styleAdd(WINDOW *win, const char *str) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void statusUpdate(void) { | ||||
| 	wmove(status, 0, 0); | ||||
| 	int num; | ||||
| 	const struct Window *window; | ||||
| 	for (num = 0, window = windows.head; window; ++num, window = window->next) { | ||||
| 		if (!window->unread && window != windows.active) continue; | ||||
| 		enum Color color = hash(idNames[window->id]); // FIXME: queries.
 | ||||
| 		int unread; | ||||
| 		char buf[256]; | ||||
| 		snprintf( | ||||
| 			buf, sizeof(buf), C"%d%s %d %s %n("C"%02d%d"C"%d) ", | ||||
| 			color, (window == windows.active ? V : ""), | ||||
| 			num, idNames[window->id], | ||||
| 			&unread, (window->heat > Warm ? White : color), window->unread, | ||||
| 			color | ||||
| 		); | ||||
| 		if (!window->unread) buf[unread] = '\0'; | ||||
| 		styleAdd(status, buf); | ||||
| 	} | ||||
| 	wclrtoeol(status); | ||||
| } | ||||
| 
 | ||||
| void uiShowID(size_t id) { | ||||
| 	struct Window *window = windowFor(id); | ||||
| 	window->heat = Cold; | ||||
| 	window->unread = 0; | ||||
| 	window->mark = false; | ||||
| 	if (windows.active) windows.active->mark = true; | ||||
| 	windows.other = windows.active; | ||||
| 	windows.active = window; | ||||
| 	touchwin(window->pad); | ||||
| 	statusUpdate(); | ||||
| } | ||||
| 
 | ||||
| void uiWrite(size_t id, enum Heat heat, const struct tm *time, const char *str) { | ||||
| 	(void)time; | ||||
| 	struct Window *window = windowFor(id); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user