term: colors on Windows console
* isConsole moved to builtin is_atty function * Windows console initialization moved to builtin.initpull/2293/head
							parent
							
								
									de36b61931
								
							
						
					
					
						commit
						e64609387d
					
				|  | @ -151,9 +151,6 @@ byteptr g_str_buf; | ||||||
| int load_so(byteptr); | int load_so(byteptr); | ||||||
| void reload_so(); | void reload_so(); | ||||||
| void init_consts(); | void init_consts(); | ||||||
| #ifdef _WIN32 |  | ||||||
| BOOL isConsole; |  | ||||||
| #endif |  | ||||||
| ' | ' | ||||||
| 
 | 
 | ||||||
| js_headers = ' | js_headers = ' | ||||||
|  |  | ||||||
|  | @ -387,16 +387,6 @@ fn (v mut V) generate_main() { | ||||||
| 		mut consts_init_body := cgen.consts_init.join_lines() | 		mut consts_init_body := cgen.consts_init.join_lines() | ||||||
| 		// vlib can't have `init_consts()`
 | 		// vlib can't have `init_consts()`
 | ||||||
| 		cgen.genln('void init_consts() { | 		cgen.genln('void init_consts() { | ||||||
| #ifdef _WIN32 |  | ||||||
| DWORD consoleMode; |  | ||||||
| isConsole = GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &consoleMode); |  | ||||||
| int mode = isConsole ? _O_U16TEXT : _O_U8TEXT; |  | ||||||
| _setmode(_fileno(stdin), mode); |  | ||||||
| _setmode(_fileno(stdout), _O_U8TEXT); |  | ||||||
| SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_PROCESSED_OUTPUT | 0x0004); |  | ||||||
| // ENABLE_VIRTUAL_TERMINAL_PROCESSING
 |  | ||||||
| setbuf(stdout,0); |  | ||||||
| #endif |  | ||||||
| g_str_buf=malloc(1000); | g_str_buf=malloc(1000); | ||||||
| $consts_init_body | $consts_init_body | ||||||
| }') | }') | ||||||
|  |  | ||||||
|  | @ -4,6 +4,24 @@ | ||||||
| 
 | 
 | ||||||
| module builtin | module builtin | ||||||
| 
 | 
 | ||||||
|  | fn builtin_init() int { | ||||||
|  | 	$if windows {	 | ||||||
|  | 		if is_atty(0) { | ||||||
|  | 			C._setmode(C._fileno(C.stdin), C._O_U16TEXT) | ||||||
|  | 		} else { | ||||||
|  | 			C._setmode(C._fileno(C.stdin), C._O_U8TEXT)		 | ||||||
|  | 		} | ||||||
|  | 		C._setmode(C._fileno(C.stdout), C._O_U8TEXT) | ||||||
|  | 		C.SetConsoleMode(C.GetStdHandle(C.STD_OUTPUT_HANDLE), C.ENABLE_PROCESSED_OUTPUT | 0x0004) // ENABLE_VIRTUAL_TERMINAL_PROCESSING
 | ||||||
|  | 		C.setbuf(C.stdout,0) | ||||||
|  | 	} | ||||||
|  | 	return 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_ = builtin_init() | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| fn C.memcpy(byteptr, byteptr, int) | fn C.memcpy(byteptr, byteptr, int) | ||||||
| fn C.memmove(byteptr, byteptr, int) | fn C.memmove(byteptr, byteptr, int) | ||||||
| //fn C.malloc(int) byteptr
 | //fn C.malloc(int) byteptr
 | ||||||
|  | @ -160,5 +178,13 @@ fn v_ptr_free(ptr voidptr) { | ||||||
| 	C.free(ptr) | 	C.free(ptr) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | pub fn is_atty(fd int) bool { | ||||||
|  | 	$if windows { | ||||||
|  | 		mut mode := 0 | ||||||
|  | 		C.GetConsoleMode(C._get_osfhandle(fd), &mode) | ||||||
|  | 		return mode > 0 | ||||||
|  | 	} $else { | ||||||
|  | 		return C.isatty(fd) != 0 | ||||||
|  | 	} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -69,11 +69,6 @@ fn C.ftell(fp voidptr) int | ||||||
| fn C.getenv(byteptr) byteptr | fn C.getenv(byteptr) byteptr | ||||||
| fn C.sigaction(int, voidptr, int) | fn C.sigaction(int, voidptr, int) | ||||||
| 
 | 
 | ||||||
| fn parse_windows_cmd_line(cmd byteptr) []string { |  | ||||||
| 	s := string(cmd) |  | ||||||
| 	return s.split(' ') |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // read_file reads the file in `path` and returns the contents.
 | // read_file reads the file in `path` and returns the contents.
 | ||||||
| pub fn read_file(path string) ?string { | pub fn read_file(path string) ?string { | ||||||
| 	mode := 'rb' | 	mode := 'rb' | ||||||
|  | @ -533,7 +528,7 @@ pub fn get_raw_line() string { | ||||||
|     $if windows { |     $if windows { | ||||||
|         max_line_chars := 256 |         max_line_chars := 256 | ||||||
|         buf := &byte(malloc(max_line_chars*2)) |         buf := &byte(malloc(max_line_chars*2)) | ||||||
|         if C.isConsole > 0 { |         if is_atty(0) { | ||||||
|             h_input := C.GetStdHandle(STD_INPUT_HANDLE) |             h_input := C.GetStdHandle(STD_INPUT_HANDLE) | ||||||
|             mut nr_chars := 0 |             mut nr_chars := 0 | ||||||
|             C.ReadConsole(h_input, buf, max_line_chars * 2, &nr_chars, 0) |             C.ReadConsole(h_input, buf, max_line_chars * 2, &nr_chars, 0) | ||||||
|  | @ -861,3 +856,4 @@ pub fn print_backtrace() { | ||||||
| 	# backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) ; | 	# backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) ; | ||||||
| */ | */ | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -1,11 +1,13 @@ | ||||||
| module term | module term | ||||||
| 
 | 
 | ||||||
|  | import os | ||||||
|  | 
 | ||||||
| pub fn can_show_color_on_stdout() bool { | pub fn can_show_color_on_stdout() bool { | ||||||
| 	return can_show_color_on_fd(1) | 	return is_atty(1) && os.getenv('TERM') != 'dumb' | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn can_show_color_on_stderr() bool { | pub fn can_show_color_on_stderr() bool { | ||||||
| 	return can_show_color_on_fd(2) | 	return is_atty(2) && os.getenv('TERM') != 'dumb' | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //////////////////////////////////////////////
 | //////////////////////////////////////////////
 | ||||||
|  |  | ||||||
|  | @ -1,11 +0,0 @@ | ||||||
| module term |  | ||||||
| 
 |  | ||||||
| import os |  | ||||||
| 
 |  | ||||||
| fn C.isatty(int) int |  | ||||||
| 
 |  | ||||||
| pub fn can_show_color_on_fd(fd int) bool { |  | ||||||
| 	if os.getenv('TERM') == 'dumb' { return false } |  | ||||||
| 	if C.isatty(fd) != 0 { return true } |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
|  | @ -1,10 +0,0 @@ | ||||||
| module term |  | ||||||
| 
 |  | ||||||
| import os |  | ||||||
| 
 |  | ||||||
| // TODO: implement proper checking on windows too.
 |  | ||||||
| // For now, just return false by default
 |  | ||||||
| pub fn can_show_color_on_fd(fd int) bool { |  | ||||||
| 	if os.getenv('TERM') == 'dumb' { return false } |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue