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/background-image.c | 10 +++--- common/ipc-client.c | 2 +- common/log.c | 89 ++++++++++++++++++++++++++++++++++++++++++++--- common/loop.c | 6 ++-- common/pango.c | 6 ++-- common/util.c | 4 +-- 6 files changed, 99 insertions(+), 18 deletions(-) (limited to 'common') diff --git a/common/background-image.c b/common/background-image.c index 72f39a79..d15c2989 100644 --- a/common/background-image.c +++ b/common/background-image.c @@ -1,8 +1,8 @@ #include #include -#include #include "background-image.h" #include "cairo.h" +#include "log.h" enum background_mode parse_background_mode(const char *mode) { if (strcmp(mode, "stretch") == 0) { @@ -18,7 +18,7 @@ enum background_mode parse_background_mode(const char *mode) { } else if (strcmp(mode, "solid_color") == 0) { return BACKGROUND_MODE_SOLID_COLOR; } - wlr_log(WLR_ERROR, "Unsupported background mode: %s", mode); + sway_log(SWAY_ERROR, "Unsupported background mode: %s", mode); return BACKGROUND_MODE_INVALID; } @@ -28,7 +28,7 @@ cairo_surface_t *load_background_image(const char *path) { GError *err = NULL; GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, &err); if (!pixbuf) { - wlr_log(WLR_ERROR, "Failed to load background image (%s).", + sway_log(SWAY_ERROR, "Failed to load background image (%s).", err->message); return false; } @@ -38,11 +38,11 @@ cairo_surface_t *load_background_image(const char *path) { image = cairo_image_surface_create_from_png(path); #endif // HAVE_GDK_PIXBUF if (!image) { - wlr_log(WLR_ERROR, "Failed to read background image."); + sway_log(SWAY_ERROR, "Failed to read background image."); return NULL; } if (cairo_surface_status(image) != CAIRO_STATUS_SUCCESS) { - wlr_log(WLR_ERROR, "Failed to read background image: %s." + sway_log(SWAY_ERROR, "Failed to read background image: %s." #if !HAVE_GDK_PIXBUF "\nSway was compiled without gdk_pixbuf support, so only" "\nPNG images can be loaded. This is the likely cause." diff --git a/common/ipc-client.c b/common/ipc-client.c index 79ed3555..13e2dfa3 100644 --- a/common/ipc-client.c +++ b/common/ipc-client.c @@ -111,7 +111,7 @@ error_2: free(response); free(payload); error_1: - wlr_log(WLR_ERROR, "Unable to allocate memory for IPC response"); + sway_log(SWAY_ERROR, "Unable to allocate memory for IPC response"); return NULL; } 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; +} diff --git a/common/loop.c b/common/loop.c index 295f3a30..aecad2f3 100644 --- a/common/loop.c +++ b/common/loop.c @@ -34,7 +34,7 @@ struct loop { struct loop *loop_create(void) { struct loop *loop = calloc(1, sizeof(struct loop)); if (!loop) { - wlr_log(WLR_ERROR, "Unable to allocate memory for loop"); + sway_log(SWAY_ERROR, "Unable to allocate memory for loop"); return NULL; } loop->fd_capacity = 10; @@ -107,7 +107,7 @@ void loop_add_fd(struct loop *loop, int fd, short mask, void (*callback)(int fd, short mask, void *data), void *data) { struct loop_fd_event *event = calloc(1, sizeof(struct loop_fd_event)); if (!event) { - wlr_log(WLR_ERROR, "Unable to allocate memory for event"); + sway_log(SWAY_ERROR, "Unable to allocate memory for event"); return; } event->callback = callback; @@ -129,7 +129,7 @@ struct loop_timer *loop_add_timer(struct loop *loop, int ms, void (*callback)(void *data), void *data) { struct loop_timer *timer = calloc(1, sizeof(struct loop_timer)); if (!timer) { - wlr_log(WLR_ERROR, "Unable to allocate memory for timer"); + sway_log(SWAY_ERROR, "Unable to allocate memory for timer"); return NULL; } timer->callback = callback; diff --git a/common/pango.c b/common/pango.c index 7e164043..fc3d0688 100644 --- a/common/pango.c +++ b/common/pango.c @@ -61,7 +61,7 @@ PangoLayout *get_pango_layout(cairo_t *cairo, const char *font, pango_layout_set_text(layout, buf, -1); free(buf); } else { - wlr_log(WLR_ERROR, "pango_parse_markup '%s' -> error %s", text, + sway_log(SWAY_ERROR, "pango_parse_markup '%s' -> error %s", text, error->message); g_error_free(error); markup = false; // fallback to plain text @@ -92,7 +92,7 @@ void get_text_size(cairo_t *cairo, const char *font, int *width, int *height, char *buf = malloc(length); if (buf == NULL) { - wlr_log(WLR_ERROR, "Failed to allocate memory"); + sway_log(SWAY_ERROR, "Failed to allocate memory"); return; } va_start(args, fmt); @@ -119,7 +119,7 @@ void pango_printf(cairo_t *cairo, const char *font, char *buf = malloc(length); if (buf == NULL) { - wlr_log(WLR_ERROR, "Failed to allocate memory"); + sway_log(SWAY_ERROR, "Failed to allocate memory"); return; } va_start(args, fmt); diff --git a/common/util.c b/common/util.c index d66058a6..27039dcb 100644 --- a/common/util.c +++ b/common/util.c @@ -116,7 +116,7 @@ uint32_t parse_color(const char *color) { int len = strlen(color); if (len != 6 && len != 8) { - wlr_log(WLR_DEBUG, "Invalid color %s, defaulting to color 0xFFFFFFFF", color); + sway_log(SWAY_DEBUG, "Invalid color %s, defaulting to color 0xFFFFFFFF", color); return 0xFFFFFFFF; } uint32_t res = (uint32_t)strtoul(color, NULL, 16); @@ -147,7 +147,7 @@ float parse_float(const char *value) { char *end; float flt = strtof(value, &end); if (*end || errno) { - wlr_log(WLR_DEBUG, "Invalid float value '%s', defaulting to NAN", value); + sway_log(SWAY_DEBUG, "Invalid float value '%s', defaulting to NAN", value); return NAN; } return flt; -- cgit v1.2.3-54-g00ecf