aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/ipc-server.h2
-rw-r--r--sway/ipc-server.c34
-rw-r--r--sway/main.c2
3 files changed, 20 insertions, 18 deletions
diff --git a/include/sway/ipc-server.h b/include/sway/ipc-server.h
index dd16a175..026b5554 100644
--- a/include/sway/ipc-server.h
+++ b/include/sway/ipc-server.h
@@ -9,8 +9,6 @@ struct sway_server;
void ipc_init(struct sway_server *server);
-void ipc_terminate(void);
-
struct sockaddr_un *ipc_user_sockaddr(void);
void ipc_event_workspace(struct sway_container *old,
diff --git a/sway/ipc-server.c b/sway/ipc-server.c
index 3e510c2e..abc2d7cb 100644
--- a/sway/ipc-server.c
+++ b/sway/ipc-server.c
@@ -31,6 +31,7 @@ static int ipc_socket = -1;
static struct wl_event_source *ipc_event_source = NULL;
static struct sockaddr_un *ipc_sockaddr = NULL;
static list_t *ipc_client_list = NULL;
+static struct wl_listener ipc_display_destroy;
static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'};
@@ -56,6 +57,22 @@ void ipc_client_disconnect(struct ipc_client *client);
void ipc_client_handle_command(struct ipc_client *client);
bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t payload_length);
+static void handle_display_destroy(struct wl_listener *listener, void *data) {
+ if (ipc_event_source) {
+ wl_event_source_remove(ipc_event_source);
+ }
+ close(ipc_socket);
+ unlink(ipc_sockaddr->sun_path);
+
+ list_free(ipc_client_list);
+
+ if (ipc_sockaddr) {
+ free(ipc_sockaddr);
+ }
+
+ wl_list_remove(&ipc_display_destroy.link);
+}
+
void ipc_init(struct sway_server *server) {
ipc_socket = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
if (ipc_socket == -1) {
@@ -85,24 +102,13 @@ void ipc_init(struct sway_server *server) {
ipc_client_list = create_list();
+ ipc_display_destroy.notify = handle_display_destroy;
+ wl_display_add_destroy_listener(server->wl_display, &ipc_display_destroy);
+
ipc_event_source = wl_event_loop_add_fd(server->wl_event_loop, ipc_socket,
WL_EVENT_READABLE, ipc_handle_connection, server);
}
-void ipc_terminate(void) {
- if (ipc_event_source) {
- wl_event_source_remove(ipc_event_source);
- }
- close(ipc_socket);
- unlink(ipc_sockaddr->sun_path);
-
- list_free(ipc_client_list);
-
- if (ipc_sockaddr) {
- free(ipc_sockaddr);
- }
-}
-
struct sockaddr_un *ipc_user_sockaddr(void) {
struct sockaddr_un *ipc_sockaddr = malloc(sizeof(struct sockaddr_un));
if (ipc_sockaddr == NULL) {
diff --git a/sway/main.c b/sway/main.c
index 8b0b8612..96e41bbc 100644
--- a/sway/main.c
+++ b/sway/main.c
@@ -437,8 +437,6 @@ int main(int argc, char **argv) {
server_fini(&server);
- ipc_terminate();
-
if (config) {
free_config(config);
}