aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/background-image.c10
-rw-r--r--common/ipc-client.c2
-rw-r--r--common/log.c89
-rw-r--r--common/loop.c6
-rw-r--r--common/pango.c6
-rw-r--r--common/util.c4
6 files changed, 99 insertions, 18 deletions
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 <assert.h>
#include <stdbool.h>
-#include <wlr/util/log.h>
#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 <signal.h>
#include <stdarg.h>
+#include <stdio.h>
#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
#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;