diff --git a/include/sway/server.h b/include/sway/server.h index 0b7c8ba28..a19618319 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -63,7 +63,7 @@ struct sway_server { struct sway_server server; -bool server_init(struct sway_server *server); +bool server_init(struct sway_server *server, bool headless); void server_fini(struct sway_server *server); void server_run(struct sway_server *server); diff --git a/sway/main.c b/sway/main.c index f2f24be35..a9e92d45b 100644 --- a/sway/main.c +++ b/sway/main.c @@ -251,12 +251,14 @@ static void drop_permissions(bool keep_caps) { int main(int argc, char **argv) { static int verbose = 0, debug = 0, validate = 0; + bool headless = false; static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"config", required_argument, NULL, 'c'}, {"validate", no_argument, NULL, 'C'}, {"debug", no_argument, NULL, 'd'}, + {"headless", no_argument, NULL, 'H'}, {"version", no_argument, NULL, 'v'}, {"verbose", no_argument, NULL, 'V'}, {"get-socketpath", no_argument, NULL, 'p'}, @@ -272,6 +274,7 @@ int main(int argc, char **argv) { " -c, --config Specify a config file.\n" " -C, --validate Check the validity of the config file, then exit.\n" " -d, --debug Enables full logging, including debug information.\n" + " -H, --headless Starts sway with the headless backend.\n" " -v, --version Show the version number and quit.\n" " -V, --verbose Enables more verbose logging.\n" " --get-socketpath Gets the IPC socket path and prints it, then exits.\n" @@ -288,7 +291,7 @@ int main(int argc, char **argv) { int c; while (1) { int option_index = 0; - c = getopt_long(argc, argv, "hCdvVc:", long_options, &option_index); + c = getopt_long(argc, argv, "hCHdvVc:", long_options, &option_index); if (c == -1) { break; } @@ -306,6 +309,9 @@ int main(int argc, char **argv) { case 'd': // debug debug = 1; break; + case 'H': + headless = true; + break; case 'v': // version fprintf(stdout, "sway version " SWAY_VERSION "\n"); exit(EXIT_SUCCESS); @@ -384,7 +390,7 @@ int main(int argc, char **argv) { init_layout(); - if (!server_init(&server)) { + if (!server_init(&server, headless)) { return 1; } diff --git a/sway/server.c b/sway/server.c index a2933680a..5772b8522 100644 --- a/sway/server.c +++ b/sway/server.c @@ -39,17 +39,28 @@ static void server_ready(struct wl_listener *listener, void *data) { } } -bool server_init(struct sway_server *server) { +bool server_init(struct sway_server *server, bool headless) { wlr_log(L_DEBUG, "Initializing Wayland server"); server->wl_display = wl_display_create(); server->wl_event_loop = wl_display_get_event_loop(server->wl_display); - server->backend = wlr_backend_autocreate(server->wl_display); + wl_list_init(&server->subbackends); - server->renderer = wlr_gles2_renderer_create(server->backend); + if (headless) { + server->backend = wlr_multi_backend_create(server->wl_display); + struct sway_subbackend *subbackend = + sway_subbackend_create(SWAY_SUBBACKEND_HEADLESS, "headless"); + sway_server_add_subbackend(server, subbackend); + } else { + // TODO add whatever this function creates to the subbackends + server->backend = wlr_backend_autocreate(server->wl_display); + } + wl_display_init_shm(server->wl_display); + server->renderer = wlr_backend_get_renderer(server->backend); + server->compositor = wlr_compositor_create( server->wl_display, server->renderer); @@ -181,13 +192,9 @@ static struct wlr_backend *x11_backend_create(struct sway_server *server) { static struct wlr_backend *headless_backend_create( struct sway_server *server) { - wlr_log(L_DEBUG, "TODO: create headless backend"); - return NULL; - /* struct wlr_backend *backend = wlr_headless_backend_create(server->wl_display); return backend; - */ } static struct wlr_backend *drm_backend_create(struct sway_server *server) {