From 997c70a035e1a57408cab8077b434f18e96bcec2 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Fri, 22 Dec 2017 07:17:11 -0500 Subject: [PATCH] basic backend commands --- include/sway/commands.h | 4 ++++ sway/commands.c | 1 + sway/commands/backend.c | 23 ++++++++++++++++++++++ sway/commands/backend/add.c | 38 +++++++++++++++++++++++++++++++++++++ sway/commands/backend/del.c | 19 +++++++++++++++++++ sway/meson.build | 3 +++ sway/server.c | 31 ++++++++++++++++++++++-------- 7 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 sway/commands/backend.c create mode 100644 sway/commands/backend/add.c create mode 100644 sway/commands/backend/del.c diff --git a/include/sway/commands.h b/include/sway/commands.h index 4ee7af2a3..941bb619e 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -111,6 +111,7 @@ sway_cmd cmd_hide_edge_borders; sway_cmd cmd_include; sway_cmd cmd_input; sway_cmd cmd_seat; +sway_cmd cmd_backend; sway_cmd cmd_ipc; sway_cmd cmd_kill; sway_cmd cmd_layout; @@ -143,6 +144,9 @@ sway_cmd cmd_workspace; sway_cmd cmd_ws_auto_back_and_forth; sway_cmd cmd_workspace_layout; +sway_cmd backend_cmd_add; +sway_cmd backend_cmd_del; + sway_cmd bar_cmd_activate_button; sway_cmd bar_cmd_binding_mode_indicator; sway_cmd bar_cmd_bindsym; diff --git a/sway/commands.c b/sway/commands.c index 34afb6a0f..4478601a5 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -127,6 +127,7 @@ struct cmd_results *add_color(const char *name, char *buffer, const char *color) /* Keep alphabetized */ static struct cmd_handler handlers[] = { + { "backend", cmd_backend }, { "exec", cmd_exec }, { "exec_always", cmd_exec_always }, { "exit", cmd_exit }, diff --git a/sway/commands/backend.c b/sway/commands/backend.c new file mode 100644 index 000000000..3024a5471 --- /dev/null +++ b/sway/commands/backend.c @@ -0,0 +1,23 @@ +#include +#include "sway/commands.h" +#include "log.h" + +struct cmd_results *cmd_backend(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "backend", EXPECTED_AT_LEAST, 2))) { + return error; + } + + int argc_new = argc-1; + char **argv_new = argv+1; + + struct cmd_results *res; + if (strcasecmp("add", argv[0]) == 0) { + res = backend_cmd_add(argc_new, argv_new); + } else if (strcasecmp("del", argv[0]) == 0) { + res = backend_cmd_del(argc_new, argv_new); + } else { + res = cmd_results_new(CMD_INVALID, "backend [args]", "Unknown command %s", argv[1]); + } + return res; +} diff --git a/sway/commands/backend/add.c b/sway/commands/backend/add.c new file mode 100644 index 000000000..14d387d18 --- /dev/null +++ b/sway/commands/backend/add.c @@ -0,0 +1,38 @@ +#define _XOPEN_SOURCE 700 +#include +#include +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/server.h" +#include "log.h" +#include "stringop.h" + +struct cmd_results *backend_cmd_add(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "add", EXPECTED_AT_LEAST, 1))) { + return error; + } + + const char *type_name = argv[0]; + enum sway_subbackend_type type; + if (strcasecmp(type_name, "wayland") == 0) { + type = SWAY_SUBBACKEND_WAYLAND; + } else if (strcasecmp(type_name, "x11") == 0) { + type = SWAY_SUBBACKEND_X11; + } else if (strcasecmp(type_name, "drm") == 0) { + type = SWAY_SUBBACKEND_DRM; + } else if (strcasecmp(type_name, "headless") == 0) { + type = SWAY_SUBBACKEND_HEADLESS; + } else { + error = + cmd_results_new(CMD_INVALID, + "add", "Expected 'add '"); + return error; + } + + struct sway_subbackend *subbackend = + sway_subbackend_create(type, NULL); + sway_server_add_subbackend(&server, subbackend); + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/commands/backend/del.c b/sway/commands/backend/del.c new file mode 100644 index 000000000..206b14aea --- /dev/null +++ b/sway/commands/backend/del.c @@ -0,0 +1,19 @@ +#define _XOPEN_SOURCE 700 +#include +#include +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/server.h" +#include "log.h" +#include "stringop.h" + +struct cmd_results *backend_cmd_del(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "del", EXPECTED_AT_LEAST, 1))) { + return error; + } + + sway_server_remove_subbackend(&server, argv[0]); + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/meson.build b/sway/meson.build index fee2ddd21..558f8ec53 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -6,6 +6,9 @@ sway_sources = files( 'input/seat.c', 'input/cursor.c', 'input/keyboard.c', + 'commands/backend.c', + 'commands/backend/add.c', + 'commands/backend/del.c', 'commands/exit.c', 'commands/exec.c', 'commands/exec_always.c', diff --git a/sway/server.c b/sway/server.c index 137add7d5..eb7202349 100644 --- a/sway/server.c +++ b/sway/server.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include #include @@ -123,22 +125,34 @@ static void handle_subbackend_backend_destroy(struct wl_listener *listener, sway_subbackend_destroy(subbackend); } -static struct wlr_backend *wayland_backend_create() { +static struct wlr_backend *wayland_backend_create(struct sway_server *server) { sway_log(L_DEBUG, "TODO: create wayland backend"); return NULL; + /* + struct wlr_backend *backend = + wlr_wl_backend_create(server->wl_display); + wlr_wl_output_create(backend); + return backend; + */ } -static struct wlr_backend *x11_backend_create() { +static struct wlr_backend *x11_backend_create(struct sway_server *server) { sway_log(L_DEBUG, "TODO: create x11 backend"); return NULL; } -static struct wlr_backend *headless_backend_create() { +static struct wlr_backend *headless_backend_create( + struct sway_server *server) { sway_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() { +static struct wlr_backend *drm_backend_create(struct sway_server *server) { sway_log(L_DEBUG, "TODO: create drm backend"); return NULL; } @@ -149,16 +163,16 @@ void sway_server_add_subbackend(struct sway_server *server, switch (subbackend->type) { case SWAY_SUBBACKEND_WAYLAND: - backend = wayland_backend_create(); + backend = wayland_backend_create(server); break; case SWAY_SUBBACKEND_X11: - backend = x11_backend_create(); + backend = x11_backend_create(server); break; case SWAY_SUBBACKEND_DRM: - backend = drm_backend_create(); + backend = drm_backend_create(server); break; case SWAY_SUBBACKEND_HEADLESS: - backend = headless_backend_create(); + backend = headless_backend_create(server); break; } @@ -175,6 +189,7 @@ void sway_server_add_subbackend(struct sway_server *server, subbackend->backend_destroy.notify = handle_subbackend_backend_destroy; wlr_multi_backend_add(server->backend, backend); + wlr_backend_start(backend); } void sway_server_remove_subbackend(struct sway_server *server, char *name) {