| 
									
										
										
										
											2019-03-17 11:30:55 +02:00
										 |  |  | #define _XOPEN_SOURCE 700 // for snprintf
 | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | #include <stdarg.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <time.h>
 | 
					
						
							| 
									
										
										
										
											2018-02-12 21:29:23 +01:00
										 |  |  | #include <unistd.h>
 | 
					
						
							| 
									
										
										
										
											2019-07-27 11:53:54 +03:00
										 |  |  | #include <wayland-server-core.h>
 | 
					
						
							| 
									
										
										
										
											2017-06-21 12:10:07 -04:00
										 |  |  | #include <wlr/util/log.h>
 | 
					
						
							| 
									
										
										
										
											2020-06-05 17:56:13 -04:00
										 |  |  | #include "util/time.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | static bool colored = true; | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | static enum wlr_log_importance log_importance = WLR_ERROR; | 
					
						
							| 
									
										
										
										
											2020-03-05 13:17:46 +01:00
										 |  |  | static struct timespec start_time = {-1}; | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | static const char *verbosity_colors[] = { | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 	[WLR_SILENT] = "", | 
					
						
							| 
									
										
										
										
											2020-05-01 16:21:57 +02:00
										 |  |  | 	[WLR_ERROR] = "\x1B[1;31m", | 
					
						
							|  |  |  | 	[WLR_INFO] = "\x1B[1;34m", | 
					
						
							| 
									
										
										
										
											2020-05-23 11:13:11 -04:00
										 |  |  | 	[WLR_DEBUG] = "\x1B[1;90m", | 
					
						
							| 
									
										
										
										
											2020-05-01 16:21:57 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const char *verbosity_headers[] = { | 
					
						
							|  |  |  | 	[WLR_SILENT] = "", | 
					
						
							|  |  |  | 	[WLR_ERROR] = "[ERROR]", | 
					
						
							|  |  |  | 	[WLR_INFO] = "[INFO]", | 
					
						
							|  |  |  | 	[WLR_DEBUG] = "[DEBUG]", | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-05 13:17:46 +01:00
										 |  |  | static void init_start_time(void) { | 
					
						
							|  |  |  | 	if (start_time.tv_sec >= 0) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	clock_gettime(CLOCK_MONOTONIC, &start_time); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | static void log_stderr(enum wlr_log_importance verbosity, const char *fmt, | 
					
						
							| 
									
										
										
										
											2018-04-21 11:42:18 +01:00
										 |  |  | 		va_list args) { | 
					
						
							| 
									
										
										
										
											2020-03-05 13:17:46 +01:00
										 |  |  | 	init_start_time(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-31 14:29:05 -07:00
										 |  |  | 	if (verbosity > log_importance) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-05 13:17:46 +01:00
										 |  |  | 	struct timespec ts = {0}; | 
					
						
							|  |  |  | 	clock_gettime(CLOCK_MONOTONIC, &ts); | 
					
						
							|  |  |  | 	timespec_sub(&ts, &ts, &start_time); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fprintf(stderr, "%02d:%02d:%02d.%03ld ", (int)(ts.tv_sec / 60 / 60), | 
					
						
							|  |  |  | 		(int)(ts.tv_sec / 60 % 60), (int)(ts.tv_sec % 60), | 
					
						
							|  |  |  | 		ts.tv_nsec / 1000000); | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 	unsigned c = (verbosity < WLR_LOG_IMPORTANCE_LAST) ? verbosity : WLR_LOG_IMPORTANCE_LAST - 1; | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (colored && isatty(STDERR_FILENO)) { | 
					
						
							|  |  |  | 		fprintf(stderr, "%s", verbosity_colors[c]); | 
					
						
							| 
									
										
										
										
											2020-05-01 16:21:57 +02:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		fprintf(stderr, "%s ", verbosity_headers[c]); | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-05 14:50:33 +12:00
										 |  |  | 	vfprintf(stderr, fmt, args); | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (colored && isatty(STDERR_FILENO)) { | 
					
						
							|  |  |  | 		fprintf(stderr, "\x1B[0m"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	fprintf(stderr, "\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | static wlr_log_func_t log_callback = log_stderr; | 
					
						
							| 
									
										
										
										
											2017-06-21 12:10:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-17 11:30:55 +02:00
										 |  |  | static void log_wl(const char *fmt, va_list args) { | 
					
						
							|  |  |  | 	static char wlr_fmt[1024]; | 
					
						
							|  |  |  | 	int n = snprintf(wlr_fmt, sizeof(wlr_fmt), "[wayland] %s", fmt); | 
					
						
							|  |  |  | 	if (n > 0 && wlr_fmt[n - 1] == '\n') { | 
					
						
							|  |  |  | 		wlr_fmt[n - 1] = '\0'; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_wlr_vlog(WLR_INFO, wlr_fmt, args); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | void wlr_log_init(enum wlr_log_importance verbosity, wlr_log_func_t callback) { | 
					
						
							| 
									
										
										
										
											2020-03-05 13:17:46 +01:00
										 |  |  | 	init_start_time(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 	if (verbosity < WLR_LOG_IMPORTANCE_LAST) { | 
					
						
							| 
									
										
										
										
											2017-12-31 14:29:05 -07:00
										 |  |  | 		log_importance = verbosity; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (callback) { | 
					
						
							|  |  |  | 		log_callback = callback; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-17 11:30:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	wl_log_set_handler_server(log_wl); | 
					
						
							| 
									
										
										
										
											2017-06-21 12:10:07 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | void _wlr_vlog(enum wlr_log_importance verbosity, const char *fmt, va_list args) { | 
					
						
							| 
									
										
										
										
											2017-06-05 14:50:33 +12:00
										 |  |  | 	log_callback(verbosity, fmt, args); | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | void _wlr_log(enum wlr_log_importance verbosity, const char *fmt, ...) { | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 	va_list args; | 
					
						
							| 
									
										
										
										
											2017-06-05 14:50:33 +12:00
										 |  |  | 	va_start(args, fmt); | 
					
						
							|  |  |  | 	log_callback(verbosity, fmt, args); | 
					
						
							| 
									
										
										
										
											2017-04-25 15:06:58 -04:00
										 |  |  | 	va_end(args); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-19 20:01:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-01 15:12:53 +05:30
										 |  |  | enum wlr_log_importance wlr_log_get_verbosity(void) { | 
					
						
							|  |  |  | 	return log_importance; | 
					
						
							|  |  |  | } |