1
0
mirror of https://github.com/emersion/kanshi synced 2024-09-15 00:20:36 +02:00
kanshi/ipc.c
Jason Francis afab6397ed Add optional varlink interface.
We don't want to fallback to libwayland's defaults, so WAYLAND_DISPLAY
needs to be set in env. Since IPC in the future is going to use
XDG_RUNTIME_DIR, we also require it.

Because these functions will be used in other parts of the code as well,
we rework the build system slightly to accommodate it.

Co-authored-by: Érico Nogueira <erico.erc@gmail.com>
2021-07-24 08:34:35 +02:00

70 lines
1.9 KiB
C

#define _POSIX_C_SOURCE 200809L
#include <limits.h>
#include <stdio.h>
#include <varlink.h>
#include "kanshi.h"
#include "ipc.h"
static void reload_config_done(void *data, struct wl_callback *callback,
uint32_t serial) {
VarlinkCall *call = data;
varlink_call_reply(call, NULL, 0);
wl_callback_destroy(callback);
}
static struct wl_callback_listener reload_config_listener = {
.done = reload_config_done
};
static long handle_reload(VarlinkService *service, VarlinkCall *call,
VarlinkObject *parameters, uint64_t flags, void *userdata) {
struct kanshi_state *state = userdata;
kanshi_reload_config(state);
// this only ensures that the server has received the configuration request,
// the server is free to wait an arbitrary amount of time before applying the configuration
// TODO: use the wlr-output-management event instead
struct wl_callback *callback = wl_display_sync(state->display);
wl_callback_add_listener(callback, &reload_config_listener, call);
return 0;
}
int kanshi_init_ipc(struct kanshi_state *state) {
VarlinkService *service;
char address[PATH_MAX];
if (get_ipc_address(address, sizeof(address)) < 0) {
return -1;
}
if (varlink_service_new(&service,
"emersion", "kanshi", KANSHI_VERSION, "https://wayland.emersion.fr/kanshi/",
address, -1) < 0) {
fprintf(stderr, "Couldn't start kanshi varlink service at %s.\n"
"Is the kanshi daemon already running?\n", address);
return -1;
}
const char *interface = "interface fr.emersion.kanshi\n"
"method Reload() -> ()";
long result = varlink_service_add_interface(service, interface,
"Reload", handle_reload, state,
NULL);
if (result != 0) {
fprintf(stderr, "varlink_service_add_interface failed: %s\n",
varlink_error_string(-result));
varlink_service_free(service);
return -1;
}
state->service = service;
return 0;
}
void kanshi_free_ipc(struct kanshi_state *state) {
if (state->service) {
varlink_service_free(state->service);
state->service = NULL;
}
}