mirror of
https://github.com/swaywm/sway.git
synced 2026-07-05 00:06:04 -04:00
Merge 7faee6637f into 3ee286d7f7
This commit is contained in:
commit
aded0015df
91 changed files with 593 additions and 462 deletions
|
|
@ -1,6 +1,6 @@
|
|||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <wlr/util/log.h>
|
||||
#include "log.h"
|
||||
#include "background-image.h"
|
||||
#include "cairo.h"
|
||||
|
||||
|
|
@ -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(L_ERROR, "Unsupported background mode: %s", mode);
|
||||
sway_log(L_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(L_ERROR, "Failed to load background image (%s).",
|
||||
sway_log(L_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(L_ERROR, "Failed to read background image.");
|
||||
sway_log(L_ERROR, "Failed to read background image.");
|
||||
return NULL;
|
||||
}
|
||||
if (cairo_surface_status(image) != CAIRO_STATUS_SUCCESS) {
|
||||
wlr_log(L_ERROR, "Failed to read background image: %s."
|
||||
sway_log(L_ERROR, "Failed to read background image: %s."
|
||||
#ifndef HAVE_GDK_PIXBUF
|
||||
"\nSway was compiled without gdk_pixbuf support, so only"
|
||||
"\nPNG images can be loaded. This is the likely cause."
|
||||
|
|
|
|||
|
|
@ -1,130 +0,0 @@
|
|||
#define _POSIX_C_SOURCE 200809L
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <unistd.h>
|
||||
#include "ipc-client.h"
|
||||
#include "readline.h"
|
||||
#include "log.h"
|
||||
|
||||
static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'};
|
||||
static const size_t ipc_header_size = sizeof(ipc_magic)+8;
|
||||
|
||||
char *get_socketpath(void) {
|
||||
const char *swaysock = getenv("SWAYSOCK");
|
||||
if (swaysock) {
|
||||
return strdup(swaysock);
|
||||
}
|
||||
FILE *fp = popen("sway --get-socketpath 2>/dev/null", "r");
|
||||
if (fp) {
|
||||
char *line = read_line(fp);
|
||||
pclose(fp);
|
||||
if (line && *line) {
|
||||
return line;
|
||||
}
|
||||
}
|
||||
const char *i3sock = getenv("I3SOCK");
|
||||
if (i3sock) {
|
||||
return strdup(i3sock);
|
||||
}
|
||||
fp = popen("i3 --get-socketpath 2>/dev/null", "r");
|
||||
if (fp) {
|
||||
char *line = read_line(fp);
|
||||
pclose(fp);
|
||||
if (line && *line) {
|
||||
return line;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int ipc_open_socket(const char *socket_path) {
|
||||
struct sockaddr_un addr;
|
||||
int socketfd;
|
||||
if ((socketfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
|
||||
sway_abort("Unable to open Unix socket");
|
||||
}
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);
|
||||
addr.sun_path[sizeof(addr.sun_path) - 1] = 0;
|
||||
int l = sizeof(struct sockaddr_un);
|
||||
if (connect(socketfd, (struct sockaddr *)&addr, l) == -1) {
|
||||
sway_abort("Unable to connect to %s", socket_path);
|
||||
}
|
||||
return socketfd;
|
||||
}
|
||||
|
||||
struct ipc_response *ipc_recv_response(int socketfd) {
|
||||
char data[ipc_header_size];
|
||||
uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic));
|
||||
|
||||
size_t total = 0;
|
||||
while (total < ipc_header_size) {
|
||||
ssize_t received = recv(socketfd, data + total, ipc_header_size - total, 0);
|
||||
if (received <= 0) {
|
||||
sway_abort("Unable to receive IPC response");
|
||||
}
|
||||
total += received;
|
||||
}
|
||||
|
||||
struct ipc_response *response = malloc(sizeof(struct ipc_response));
|
||||
if (!response) {
|
||||
goto error_1;
|
||||
}
|
||||
|
||||
total = 0;
|
||||
response->size = data32[0];
|
||||
response->type = data32[1];
|
||||
char *payload = malloc(response->size + 1);
|
||||
if (!payload) {
|
||||
goto error_2;
|
||||
}
|
||||
|
||||
while (total < response->size) {
|
||||
ssize_t received = recv(socketfd, payload + total, response->size - total, 0);
|
||||
if (received < 0) {
|
||||
sway_abort("Unable to receive IPC response");
|
||||
}
|
||||
total += received;
|
||||
}
|
||||
payload[response->size] = '\0';
|
||||
response->payload = payload;
|
||||
|
||||
return response;
|
||||
error_2:
|
||||
free(response);
|
||||
error_1:
|
||||
wlr_log(L_ERROR, "Unable to allocate memory for IPC response");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void free_ipc_response(struct ipc_response *response) {
|
||||
free(response->payload);
|
||||
free(response);
|
||||
}
|
||||
|
||||
char *ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len) {
|
||||
char data[ipc_header_size];
|
||||
uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic));
|
||||
memcpy(data, ipc_magic, sizeof(ipc_magic));
|
||||
data32[0] = *len;
|
||||
data32[1] = type;
|
||||
|
||||
if (write(socketfd, data, ipc_header_size) == -1) {
|
||||
sway_abort("Unable to send IPC header");
|
||||
}
|
||||
|
||||
if (write(socketfd, payload, *len) == -1) {
|
||||
sway_abort("Unable to send IPC payload");
|
||||
}
|
||||
|
||||
struct ipc_response *resp = ipc_recv_response(socketfd);
|
||||
char *response = resp->payload;
|
||||
*len = resp->size;
|
||||
free(resp);
|
||||
|
||||
return response;
|
||||
}
|
||||
88
common/log.c
88
common/log.c
|
|
@ -1,14 +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);
|
||||
|
||||
|
||||
|
||||
void _sway_abort(const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
_wlr_vlog(L_ERROR, format, args);
|
||||
_sway_vlog(L_ERROR, format, args);
|
||||
va_end(args);
|
||||
sway_terminate(EXIT_FAILURE);
|
||||
}
|
||||
|
|
@ -20,7 +26,7 @@ bool _sway_assert(bool condition, const char *format, ...) {
|
|||
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
_wlr_vlog(L_ERROR, format, args);
|
||||
_sway_vlog(L_ERROR, format, args);
|
||||
va_end(args);
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
|
@ -29,3 +35,81 @@ bool _sway_assert(bool condition, const char *format, ...) {
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool colored = true;
|
||||
static log_importance_t log_importance = L_ERROR;
|
||||
|
||||
static const char *verbosity_colors[] = {
|
||||
[L_SILENT] = "",
|
||||
[L_ERROR ] = "\x1B[1;31m",
|
||||
[L_INFO ] = "\x1B[1;34m",
|
||||
[L_DEBUG ] = "\x1B[1;30m",
|
||||
};
|
||||
|
||||
static void log_stderr(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 < L_LAST) ? verbosity : L_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");
|
||||
}
|
||||
|
||||
static log_callback_t log_callback = log_stderr;
|
||||
|
||||
void sway_log_init(log_importance_t verbosity, log_callback_t callback) {
|
||||
if (verbosity < L_LAST) {
|
||||
log_importance = verbosity;
|
||||
}
|
||||
if (callback) {
|
||||
log_callback = callback;
|
||||
}
|
||||
}
|
||||
|
||||
void _sway_vlog(log_importance_t verbosity, const char *fmt, va_list args) {
|
||||
log_callback(verbosity, fmt, args);
|
||||
}
|
||||
|
||||
void _sway_log(log_importance_t verbosity, const char *fmt, ...) {
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
log_callback(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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ lib_sway_common = static_library(
|
|||
files(
|
||||
'background-image.c',
|
||||
'cairo.c',
|
||||
'ipc-client.c',
|
||||
'log.c',
|
||||
'list.c',
|
||||
'pango.c',
|
||||
|
|
@ -17,7 +16,6 @@ lib_sway_common = static_library(
|
|||
gdk_pixbuf,
|
||||
pango,
|
||||
pangocairo,
|
||||
wlroots
|
||||
],
|
||||
include_directories: sway_inc
|
||||
)
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
|
|||
pango_layout_set_markup(layout, buf, -1);
|
||||
free(buf);
|
||||
} else {
|
||||
wlr_log(L_ERROR, "pango_parse_markup '%s' -> error %s", text,
|
||||
sway_log(L_ERROR, "pango_parse_markup '%s' -> error %s", text,
|
||||
error->message);
|
||||
g_error_free(error);
|
||||
markup = false; // fallback to plain text
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ char *read_line(FILE *file) {
|
|||
char *string = malloc(size);
|
||||
char lastChar = '\0';
|
||||
if (!string) {
|
||||
wlr_log(L_ERROR, "Unable to allocate memory for read_line");
|
||||
sway_log(L_ERROR, "Unable to allocate memory for read_line");
|
||||
return NULL;
|
||||
}
|
||||
while (1) {
|
||||
|
|
@ -29,7 +29,7 @@ char *read_line(FILE *file) {
|
|||
char *new_string = realloc(string, size *= 2);
|
||||
if (!new_string) {
|
||||
free(string);
|
||||
wlr_log(L_ERROR, "Unable to allocate memory for read_line");
|
||||
sway_log(L_ERROR, "Unable to allocate memory for read_line");
|
||||
return NULL;
|
||||
}
|
||||
string = new_string;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <xkbcommon/xkbcommon-names.h>
|
||||
#include <wlr/types/wlr_keyboard.h>
|
||||
#include "log.h"
|
||||
#include "readline.h"
|
||||
#include "util.h"
|
||||
|
|
@ -25,58 +24,6 @@ int numlen(int n) {
|
|||
return log10(n) + 1;
|
||||
}
|
||||
|
||||
static struct modifier_key {
|
||||
char *name;
|
||||
uint32_t mod;
|
||||
} modifiers[] = {
|
||||
{ XKB_MOD_NAME_SHIFT, WLR_MODIFIER_SHIFT },
|
||||
{ XKB_MOD_NAME_CAPS, WLR_MODIFIER_CAPS },
|
||||
{ XKB_MOD_NAME_CTRL, WLR_MODIFIER_CTRL },
|
||||
{ "Ctrl", WLR_MODIFIER_CTRL },
|
||||
{ XKB_MOD_NAME_ALT, WLR_MODIFIER_ALT },
|
||||
{ "Alt", WLR_MODIFIER_ALT },
|
||||
{ XKB_MOD_NAME_NUM, WLR_MODIFIER_MOD2 },
|
||||
{ "Mod3", WLR_MODIFIER_MOD3 },
|
||||
{ XKB_MOD_NAME_LOGO, WLR_MODIFIER_LOGO },
|
||||
{ "Mod5", WLR_MODIFIER_MOD5 },
|
||||
};
|
||||
|
||||
uint32_t get_modifier_mask_by_name(const char *name) {
|
||||
int i;
|
||||
for (i = 0; i < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++i) {
|
||||
if (strcasecmp(modifiers[i].name, name) == 0) {
|
||||
return modifiers[i].mod;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *get_modifier_name_by_mask(uint32_t modifier) {
|
||||
int i;
|
||||
for (i = 0; i < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++i) {
|
||||
if (modifiers[i].mod == modifier) {
|
||||
return modifiers[i].name;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int get_modifier_names(const char **names, uint32_t modifier_masks) {
|
||||
int length = 0;
|
||||
int i;
|
||||
for (i = 0; i < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++i) {
|
||||
if ((modifier_masks & modifiers[i].mod) != 0) {
|
||||
names[length] = modifiers[i].name;
|
||||
++length;
|
||||
modifier_masks ^= modifiers[i].mod;
|
||||
}
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
pid_t get_parent_pid(pid_t child) {
|
||||
pid_t parent = -1;
|
||||
char file_name[100];
|
||||
|
|
@ -113,7 +60,7 @@ uint32_t parse_color(const char *color) {
|
|||
|
||||
int len = strlen(color);
|
||||
if (len != 6 && len != 8) {
|
||||
wlr_log(L_DEBUG, "Invalid color %s, defaulting to color 0xFFFFFFFF", color);
|
||||
sway_log(L_DEBUG, "Invalid color %s, defaulting to color 0xFFFFFFFF", color);
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
uint32_t res = (uint32_t)strtoul(color, NULL, 16);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue