Skip to content

Commit

Permalink
Replace wlr_log with sway_log
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mstoeckl authored and emersion committed Jan 21, 2019
1 parent 5c834d3 commit 1211a81
Show file tree
Hide file tree
Showing 108 changed files with 610 additions and 501 deletions.
10 changes: 5 additions & 5 deletions common/background-image.c
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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;
}

Expand All @@ -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;
}
Expand All @@ -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."
Expand Down
2 changes: 1 addition & 1 deletion common/ipc-client.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ struct ipc_response *ipc_recv_response(int socketfd) {
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;
}

Expand Down
89 changes: 85 additions & 4 deletions common/log.c
Original file line number Diff line number Diff line change
@@ -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, ...) {
Expand All @@ -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
Expand All @@ -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;
}
6 changes: 3 additions & 3 deletions common/loop.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions common/pango.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions common/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
44 changes: 38 additions & 6 deletions include/log.h
Original file line number Diff line number Diff line change
@@ -1,22 +1,54 @@
#ifndef _SWAY_LOG_H
#define _SWAY_LOG_H

#include <stdbool.h>
#include <wlr/util/log.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>

typedef enum {
SWAY_SILENT = 0,
SWAY_ERROR = 1,
SWAY_INFO = 2,
SWAY_DEBUG = 3,
SWAY_LOG_IMPORTANCE_LAST,
} sway_log_importance_t;

#ifdef __GNUC__
#define ATTRIB_PRINTF(start, end) __attribute__((format(printf, start, end)))
#else
#define ATTRIB_PRINTF(start, end)
#endif

void error_handler(int sig);

typedef void (*terminate_callback_t)(int exit_code);

// Will log all messages less than or equal to `verbosity`
// The `terminate` callback is called by `sway_abort`
void sway_log_init(sway_log_importance_t verbosity, terminate_callback_t terminate);

void _sway_log(sway_log_importance_t verbosity, const char *format, ...) ATTRIB_PRINTF(2, 3);
void _sway_vlog(sway_log_importance_t verbosity, const char *format, va_list args) ATTRIB_PRINTF(2, 0);
void _sway_abort(const char *filename, ...) ATTRIB_PRINTF(1, 2);
bool _sway_assert(bool condition, const char* format, ...) ATTRIB_PRINTF(2, 3);

// TODO: get meson to precompute this, for better reproducibility/less overhead
const char *_sway_strip_path(const char *filepath);

#define sway_log(verb, fmt, ...) \
_sway_log(verb, "[%s:%d] " fmt, _sway_strip_path(__FILE__), __LINE__, ##__VA_ARGS__)

#define sway_vlog(verb, fmt, args) \
_sway_vlog(verb, "[%s:%d] " fmt, _sway_strip_path(__FILE__), __LINE__, args)

#define sway_log_errno(verb, fmt, ...) \
sway_log(verb, fmt ": %s", ##__VA_ARGS__, strerror(errno))

#define sway_abort(FMT, ...) \
_sway_abort("[%s:%d] " FMT, _wlr_strip_path(__FILE__), __LINE__, ##__VA_ARGS__)
_sway_abort("[%s:%d] " FMT, _sway_strip_path(__FILE__), __LINE__, ##__VA_ARGS__)

bool _sway_assert(bool condition, const char* format, ...) ATTRIB_PRINTF(2, 3);
#define sway_assert(COND, FMT, ...) \
_sway_assert(COND, "[%s:%d] %s:" FMT, _wlr_strip_path(__FILE__), __LINE__, __func__, ##__VA_ARGS__)

void error_handler(int sig);
_sway_assert(COND, "[%s:%d] %s:" FMT, _sway_strip_path(__FILE__), __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)

#endif
2 changes: 2 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ project(

add_project_arguments(
[
'-DSWAY_SRC_DIR="@0@"'.format(meson.current_source_dir()),

'-DWL_HIDE_DEPRECATED',
'-DWLR_USE_UNSTABLE',

Expand Down
16 changes: 8 additions & 8 deletions sway/commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ struct cmd_handler *find_handler(char *line, struct cmd_handler *cmd_handlers,
int handlers_size) {
struct cmd_handler d = { .command=line };
struct cmd_handler *res = NULL;
wlr_log(WLR_DEBUG, "find_handler(%s)", line);
sway_log(SWAY_DEBUG, "find_handler(%s)", line);

bool config_loading = config->reading || !config->active;

Expand Down Expand Up @@ -247,10 +247,10 @@ list_t *execute_command(char *_exec, struct sway_seat *seat,
cmd = argsep(&cmdlist, ",");
for (; isspace(*cmd); ++cmd) {}
if (strcmp(cmd, "") == 0) {
wlr_log(WLR_INFO, "Ignoring empty command.");
sway_log(SWAY_INFO, "Ignoring empty command.");
continue;
}
wlr_log(WLR_INFO, "Handling command '%s'", cmd);
sway_log(SWAY_INFO, "Handling command '%s'", cmd);
//TODO better handling of argv
int argc;
char **argv = split_args(cmd, &argc);
Expand Down Expand Up @@ -353,7 +353,7 @@ struct cmd_results *config_command(char *exec, char **new_block) {
}

// Determine the command handler
wlr_log(WLR_INFO, "Config command: %s", exec);
sway_log(SWAY_INFO, "Config command: %s", exec);
struct cmd_handler *handler = find_handler(argv[0], NULL, 0);
if (!handler || !handler->handle) {
const char *error = handler
Expand All @@ -373,7 +373,7 @@ struct cmd_results *config_command(char *exec, char **new_block) {
argv[1] = temp;
}
char *command = do_var_replacement(join_args(argv, argc));
wlr_log(WLR_INFO, "After replacement: %s", command);
sway_log(SWAY_INFO, "After replacement: %s", command);
free_argv(argc, argv);
argv = split_args(command, &argc);
free(command);
Expand Down Expand Up @@ -402,7 +402,7 @@ struct cmd_results *config_command(char *exec, char **new_block) {
struct cmd_results *config_subcommand(char **argv, int argc,
struct cmd_handler *handlers, size_t handlers_size) {
char *command = join_args(argv, argc);
wlr_log(WLR_DEBUG, "Subcommand: %s", command);
sway_log(SWAY_DEBUG, "Subcommand: %s", command);
free(command);

struct cmd_handler *handler = find_handler(argv[0], handlers,
Expand Down Expand Up @@ -489,7 +489,7 @@ struct cmd_results *config_commands_command(char *exec) {
}
policy->context = context;

wlr_log(WLR_INFO, "Set command policy for %s to %d",
sway_log(SWAY_INFO, "Set command policy for %s to %d",
policy->command, policy->context);

results = cmd_results_new(CMD_SUCCESS, NULL);
Expand All @@ -503,7 +503,7 @@ struct cmd_results *cmd_results_new(enum cmd_status status,
const char *format, ...) {
struct cmd_results *results = malloc(sizeof(struct cmd_results));
if (!results) {
wlr_log(WLR_ERROR, "Unable to allocate command results");
sway_log(SWAY_ERROR, "Unable to allocate command results");
return NULL;
}
results->status = status;
Expand Down
2 changes: 1 addition & 1 deletion sway/commands/assign.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ struct cmd_results *cmd_assign(int argc, char **argv) {
criteria->target = join_args(argv, argc);

list_add(config->criteria, criteria);
wlr_log(WLR_DEBUG, "assign: '%s' -> '%s' added", criteria->raw,
sway_log(SWAY_DEBUG, "assign: '%s' -> '%s' added", criteria->raw,
criteria->target);

return cmd_results_new(CMD_SUCCESS, NULL);
Expand Down
Loading

0 comments on commit 1211a81

Please sign in to comment.