diff options
-rw-r--r-- | include/sway/ipc-server.h | 2 | ||||
-rw-r--r-- | sway/desktop/transaction.c | 4 | ||||
-rw-r--r-- | sway/ipc-server.c | 34 | ||||
-rw-r--r-- | sway/main.c | 2 | ||||
-rw-r--r-- | swaylock/render.c | 3 |
5 files changed, 26 insertions, 19 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; | |||
9 | 9 | ||
10 | void ipc_init(struct sway_server *server); | 10 | void ipc_init(struct sway_server *server); |
11 | 11 | ||
12 | void ipc_terminate(void); | ||
13 | |||
14 | struct sockaddr_un *ipc_user_sockaddr(void); | 12 | struct sockaddr_un *ipc_user_sockaddr(void); |
15 | 13 | ||
16 | void ipc_event_workspace(struct sway_container *old, | 14 | void ipc_event_workspace(struct sway_container *old, |
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index 7b670aec..b4d796cb 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c | |||
@@ -377,7 +377,9 @@ static void set_instructions_ready(struct sway_view *view, int index) { | |||
377 | for (int i = 0; i <= index; ++i) { | 377 | for (int i = 0; i <= index; ++i) { |
378 | struct sway_transaction_instruction *instruction = | 378 | struct sway_transaction_instruction *instruction = |
379 | view->swayc->instructions->items[i]; | 379 | view->swayc->instructions->items[i]; |
380 | set_instruction_ready(instruction); | 380 | if (!instruction->ready) { |
381 | set_instruction_ready(instruction); | ||
382 | } | ||
381 | } | 383 | } |
382 | } | 384 | } |
383 | 385 | ||
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; | |||
31 | static struct wl_event_source *ipc_event_source = NULL; | 31 | static struct wl_event_source *ipc_event_source = NULL; |
32 | static struct sockaddr_un *ipc_sockaddr = NULL; | 32 | static struct sockaddr_un *ipc_sockaddr = NULL; |
33 | static list_t *ipc_client_list = NULL; | 33 | static list_t *ipc_client_list = NULL; |
34 | static struct wl_listener ipc_display_destroy; | ||
34 | 35 | ||
35 | static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'}; | 36 | static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'}; |
36 | 37 | ||
@@ -56,6 +57,22 @@ void ipc_client_disconnect(struct ipc_client *client); | |||
56 | void ipc_client_handle_command(struct ipc_client *client); | 57 | void ipc_client_handle_command(struct ipc_client *client); |
57 | bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t payload_length); | 58 | bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t payload_length); |
58 | 59 | ||
60 | static void handle_display_destroy(struct wl_listener *listener, void *data) { | ||
61 | if (ipc_event_source) { | ||
62 | wl_event_source_remove(ipc_event_source); | ||
63 | } | ||
64 | close(ipc_socket); | ||
65 | unlink(ipc_sockaddr->sun_path); | ||
66 | |||
67 | list_free(ipc_client_list); | ||
68 | |||
69 | if (ipc_sockaddr) { | ||
70 | free(ipc_sockaddr); | ||
71 | } | ||
72 | |||
73 | wl_list_remove(&ipc_display_destroy.link); | ||
74 | } | ||
75 | |||
59 | void ipc_init(struct sway_server *server) { | 76 | void ipc_init(struct sway_server *server) { |
60 | ipc_socket = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0); | 77 | ipc_socket = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0); |
61 | if (ipc_socket == -1) { | 78 | if (ipc_socket == -1) { |
@@ -85,24 +102,13 @@ void ipc_init(struct sway_server *server) { | |||
85 | 102 | ||
86 | ipc_client_list = create_list(); | 103 | ipc_client_list = create_list(); |
87 | 104 | ||
105 | ipc_display_destroy.notify = handle_display_destroy; | ||
106 | wl_display_add_destroy_listener(server->wl_display, &ipc_display_destroy); | ||
107 | |||
88 | ipc_event_source = wl_event_loop_add_fd(server->wl_event_loop, ipc_socket, | 108 | ipc_event_source = wl_event_loop_add_fd(server->wl_event_loop, ipc_socket, |
89 | WL_EVENT_READABLE, ipc_handle_connection, server); | 109 | WL_EVENT_READABLE, ipc_handle_connection, server); |
90 | } | 110 | } |
91 | 111 | ||
92 | void ipc_terminate(void) { | ||
93 | if (ipc_event_source) { | ||
94 | wl_event_source_remove(ipc_event_source); | ||
95 | } | ||
96 | close(ipc_socket); | ||
97 | unlink(ipc_sockaddr->sun_path); | ||
98 | |||
99 | list_free(ipc_client_list); | ||
100 | |||
101 | if (ipc_sockaddr) { | ||
102 | free(ipc_sockaddr); | ||
103 | } | ||
104 | } | ||
105 | |||
106 | struct sockaddr_un *ipc_user_sockaddr(void) { | 112 | struct sockaddr_un *ipc_user_sockaddr(void) { |
107 | struct sockaddr_un *ipc_sockaddr = malloc(sizeof(struct sockaddr_un)); | 113 | struct sockaddr_un *ipc_sockaddr = malloc(sizeof(struct sockaddr_un)); |
108 | if (ipc_sockaddr == NULL) { | 114 | 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) { | |||
437 | 437 | ||
438 | server_fini(&server); | 438 | server_fini(&server); |
439 | 439 | ||
440 | ipc_terminate(); | ||
441 | |||
442 | if (config) { | 440 | if (config) { |
443 | free_config(config); | 441 | free_config(config); |
444 | } | 442 | } |
diff --git a/swaylock/render.c b/swaylock/render.c index 2032ddcf..ea23d0d8 100644 --- a/swaylock/render.c +++ b/swaylock/render.c | |||
@@ -30,6 +30,8 @@ void render_frame(struct swaylock_surface *surface) { | |||
30 | cairo_t *cairo = surface->current_buffer->cairo; | 30 | cairo_t *cairo = surface->current_buffer->cairo; |
31 | cairo_identity_matrix(cairo); | 31 | cairo_identity_matrix(cairo); |
32 | 32 | ||
33 | cairo_save(cairo); | ||
34 | cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); | ||
33 | if (state->args.mode == BACKGROUND_MODE_SOLID_COLOR || !surface->image) { | 35 | if (state->args.mode == BACKGROUND_MODE_SOLID_COLOR || !surface->image) { |
34 | cairo_set_source_u32(cairo, state->args.color); | 36 | cairo_set_source_u32(cairo, state->args.color); |
35 | cairo_paint(cairo); | 37 | cairo_paint(cairo); |
@@ -37,6 +39,7 @@ void render_frame(struct swaylock_surface *surface) { | |||
37 | render_background_image(cairo, surface->image, | 39 | render_background_image(cairo, surface->image, |
38 | state->args.mode, buffer_width, buffer_height); | 40 | state->args.mode, buffer_width, buffer_height); |
39 | } | 41 | } |
42 | cairo_restore(cairo); | ||
40 | cairo_identity_matrix(cairo); | 43 | cairo_identity_matrix(cairo); |
41 | 44 | ||
42 | int arc_radius = ARC_RADIUS * surface->scale; | 45 | int arc_radius = ARC_RADIUS * surface->scale; |