Implement word wrapping
This commit is contained in:
		
							父節點
							
								
									d6fb797b11
								
							
						
					
					
						當前提交
						3f3fa34d8a
					
				
							
								
								
									
										2
									
								
								pls.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pls.c
									
									
									
									
									
								
							@ -26,7 +26,7 @@ wchar_t *wcssep(wchar_t **stringp, const wchar_t *delim) {
 | 
				
			|||||||
	size_t i = wcscspn(orig, delim);
 | 
						size_t i = wcscspn(orig, delim);
 | 
				
			||||||
	*stringp = NULL;
 | 
						*stringp = NULL;
 | 
				
			||||||
	if (orig[i]) {
 | 
						if (orig[i]) {
 | 
				
			||||||
		orig[i] = '\0';
 | 
							orig[i] = L'\0';
 | 
				
			||||||
		*stringp = &orig[i + 1];
 | 
							*stringp = &orig[i + 1];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return orig;
 | 
						return orig;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								ui.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								ui.c
									
									
									
									
									
								
							@ -198,6 +198,24 @@ static const wchar_t *parseColor(short *pair, const wchar_t *str) {
 | 
				
			|||||||
	return str;
 | 
						return str;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void wordWrap(WINDOW *win, const wchar_t *str) {
 | 
				
			||||||
 | 
						size_t len = wcscspn(str, L" ");
 | 
				
			||||||
 | 
						size_t width = 1;
 | 
				
			||||||
 | 
						for (size_t i = 0; i < len; ++i) {
 | 
				
			||||||
 | 
							if (iswprint(str[i])) width += wcwidth(str[i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int _, x, xMax;
 | 
				
			||||||
 | 
						getyx(win, _, x);
 | 
				
			||||||
 | 
						getmaxyx(win, _, xMax);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (width >= (size_t)(xMax - x)) {
 | 
				
			||||||
 | 
							waddch(win, '\n');
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							waddch(win, ' ');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void addIRC(WINDOW *win, const wchar_t *str) {
 | 
					static void addIRC(WINDOW *win, const wchar_t *str) {
 | 
				
			||||||
	attr_t attr = A_NORMAL;
 | 
						attr_t attr = A_NORMAL;
 | 
				
			||||||
	short pair = -1;
 | 
						short pair = -1;
 | 
				
			||||||
@ -209,6 +227,7 @@ static void addIRC(WINDOW *win, const wchar_t *str) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		str = &str[cc];
 | 
							str = &str[cc];
 | 
				
			||||||
		switch (*str++) {
 | 
							switch (*str++) {
 | 
				
			||||||
 | 
								break; case L' ': wordWrap(win, str);
 | 
				
			||||||
			break; case L'\2': attr ^= A_BOLD;
 | 
								break; case L'\2': attr ^= A_BOLD;
 | 
				
			||||||
			break; case L'\3': str = parseColor(&pair, str);
 | 
								break; case L'\3': str = parseColor(&pair, str);
 | 
				
			||||||
			break; case L'\35': attr ^= A_ITALIC;
 | 
								break; case L'\35': attr ^= A_ITALIC;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user