From 1211a81aad18bbc4d9e8fb9973238ad8e7e1f688 Mon Sep 17 00:00:00 2001 From: M Stoeckl Date: Sun, 20 Jan 2019 13:51:12 -0500 Subject: Replace wlr_log with sway_log This commit mostly duplicates the wlr_log functions, although with a sway_* prefix. (This is very similar to PR #2009.) However, the logging function no longer needs to be replaceable, so sway_log_init's second argument is used to set the exit callback for sway_abort. wlr_log_init is still invoked in sway/main.c This commit makes it easier to remove the wlroots dependency for the helper programs swaymsg, swaybg, swaybar, and swaynag. --- common/log.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 4 deletions(-) (limited to 'common/log.c') diff --git a/common/log.c b/common/log.c index 847f3952..669fd360 100644 --- a/common/log.c +++ b/common/log.c @@ -1,16 +1,20 @@ +#define _POSIX_C_SOURCE 199506L #include #include +#include #include +#include +#include #include "log.h" -void sway_terminate(int code); +static terminate_callback_t log_terminate = exit; void _sway_abort(const char *format, ...) { va_list args; va_start(args, format); - _wlr_vlog(WLR_ERROR, format, args); + _sway_vlog(SWAY_ERROR, format, args); va_end(args); - sway_terminate(EXIT_FAILURE); + log_terminate(EXIT_FAILURE); } bool _sway_assert(bool condition, const char *format, ...) { @@ -20,7 +24,7 @@ bool _sway_assert(bool condition, const char *format, ...) { va_list args; va_start(args, format); - _wlr_vlog(WLR_ERROR, format, args); + _sway_vlog(SWAY_ERROR, format, args); va_end(args); #ifndef NDEBUG @@ -29,3 +33,80 @@ bool _sway_assert(bool condition, const char *format, ...) { return false; } + +static bool colored = true; +static sway_log_importance_t log_importance = SWAY_ERROR; + +static const char *verbosity_colors[] = { + [SWAY_SILENT] = "", + [SWAY_ERROR ] = "\x1B[1;31m", + [SWAY_INFO ] = "\x1B[1;34m", + [SWAY_DEBUG ] = "\x1B[1;30m", +}; + +static void sway_log_stderr(sway_log_importance_t verbosity, const char *fmt, + va_list args) { + if (verbosity > log_importance) { + return; + } + // prefix the time to the log message + struct tm result; + time_t t = time(NULL); + struct tm *tm_info = localtime_r(&t, &result); + char buffer[26]; + + // generate time prefix + strftime(buffer, sizeof(buffer), "%F %T - ", tm_info); + fprintf(stderr, "%s", buffer); + + unsigned c = (verbosity < SWAY_LOG_IMPORTANCE_LAST) ? verbosity : + SWAY_LOG_IMPORTANCE_LAST - 1; + + if (colored && isatty(STDERR_FILENO)) { + fprintf(stderr, "%s", verbosity_colors[c]); + } + + vfprintf(stderr, fmt, args); + + if (colored && isatty(STDERR_FILENO)) { + fprintf(stderr, "\x1B[0m"); + } + fprintf(stderr, "\n"); +} + +void sway_log_init(sway_log_importance_t verbosity, terminate_callback_t callback) { + if (verbosity < SWAY_LOG_IMPORTANCE_LAST) { + log_importance = verbosity; + } + if (callback) { + log_terminate = callback; + } +} + +void _sway_vlog(sway_log_importance_t verbosity, const char *fmt, va_list args) { + sway_log_stderr(verbosity, fmt, args); +} + +void _sway_log(sway_log_importance_t verbosity, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + sway_log_stderr(verbosity, fmt, args); + va_end(args); +} + +// strips the path prefix from filepath +// will try to strip SWAY_SRC_DIR as well as a relative src dir +// e.g. '/src/build/sway/util/log.c' and +// '../util/log.c' will both be stripped to +// 'util/log.c' +const char *_sway_strip_path(const char *filepath) { + static int srclen = sizeof(SWAY_SRC_DIR); + if (strstr(filepath, SWAY_SRC_DIR) == filepath) { + filepath += srclen; + } else if (*filepath == '.') { + while (*filepath == '.' || *filepath == '/') { + ++filepath; + } + } + return filepath; +} -- cgit v1.2.3-54-g00ecf