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.
This commit is contained in:
M Stoeckl 2019-01-20 13:51:12 -05:00 committed by emersion
parent 5c834d36e1
commit 1211a81aad
108 changed files with 613 additions and 504 deletions

View file

@ -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."

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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);

View file

@ -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;