diff --git a/include/sway/server.h b/include/sway/server.h index a017d1c4..70bde6d4 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -56,6 +56,7 @@ struct sway_server server; bool server_privileged_prepare(struct sway_server *server); bool server_init(struct sway_server *server); void server_fini(struct sway_server *server); +bool server_start_backend(struct sway_server *server); void server_run(struct sway_server *server); void handle_new_output(struct wl_listener *listener, void *data); diff --git a/sway/config.c b/sway/config.c index c620e4c7..00500812 100644 --- a/sway/config.c +++ b/sway/config.c @@ -649,7 +649,6 @@ bool read_config(FILE *file, struct sway_config *config) { } else { res = config_command(expanded); } - free(expanded); switch(res->status) { case CMD_FAILURE: case CMD_INVALID: @@ -660,7 +659,7 @@ bool read_config(FILE *file, struct sway_config *config) { case CMD_DEFER: wlr_log(WLR_DEBUG, "Deferring command `%s'", line); - list_add(config->cmd_queue, strdup(line)); + list_add(config->cmd_queue, strdup(expanded)); break; case CMD_BLOCK_COMMANDS: @@ -693,6 +692,7 @@ bool read_config(FILE *file, struct sway_config *config) { sizeof(config->handler_context)); default:; } + free(expanded); free(line); free_cmd_results(res); } diff --git a/sway/main.c b/sway/main.c index 1a55b519..a20f1dac 100644 --- a/sway/main.c +++ b/sway/main.c @@ -429,9 +429,16 @@ int main(int argc, char **argv) { security_sanity_check(); - config->active = true; setenv("WAYLAND_DISPLAY", server.socket, true); + if (!terminate_request) { + if (!server_start_backend(&server)) { + sway_terminate(EXIT_FAILURE); + } + } + + config->active = true; // Execute commands until there are none left + wlr_log(WLR_DEBUG, "Running deferred commands"); while (config->cmd_queue->length) { char *line = config->cmd_queue->items[0]; struct cmd_results *res = execute_command(line, NULL); diff --git a/sway/server.c b/sway/server.c index bad2b7e6..89dfbf8c 100644 --- a/sway/server.c +++ b/sway/server.c @@ -137,13 +137,19 @@ void server_fini(struct sway_server *server) { list_free(server->transactions); } -void server_run(struct sway_server *server) { - wlr_log(WLR_INFO, "Running compositor on wayland display '%s'", +bool server_start_backend(struct sway_server *server) { + wlr_log(WLR_INFO, "Starting backend on wayland display '%s'", server->socket); if (!wlr_backend_start(server->backend)) { wlr_log(WLR_ERROR, "Failed to start backend"); wlr_backend_destroy(server->backend); - return; + return false; } + return true; +} + +void server_run(struct sway_server *server) { + wlr_log(WLR_INFO, "Running compositor on wayland display '%s'", + server->socket); wl_display_run(server->wl_display); } diff --git a/sway/tree/view.c b/sway/tree/view.c index fc31699c..7881e6d7 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -564,7 +564,11 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) { } focus = seat_get_focus_inactive(seat, workspace); } else { - // TODO: CT_ASSIGN_OUTPUT + // CT_ASSIGN_OUTPUT + struct sway_container *output = output_by_name(criteria->target); + if (output) { + focus = seat_get_focus_inactive(seat, output); + } } } // If we're about to launch the view into the floating container, then