From 79992f39f3f451cac8140bc1053f57e2355c4f3c Mon Sep 17 00:00:00 2001 From: Jan Tatje Date: Wed, 15 Jul 2020 16:50:38 +0200 Subject: [PATCH] Add option to allow changing VT Code that does the VT switch taken from sway. --- cage.c | 21 ++++++++++++--------- seat.c | 18 ++++++++++++++---- server.h | 2 ++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/cage.c b/cage.c index 6853587..5281436 100644 --- a/cage.c +++ b/cage.c @@ -192,6 +192,7 @@ usage(FILE *file, const char *cage) " -m extend Extend the display across all connected outputs (default)\n" " -m last Use only the last connected output\n" " -r\t Rotate the output 90 degrees clockwise, specify up to three times\n" + " -s\t Allow VT switching\n" " -v\t Show the version number and exit\n" "\n" " Use -- when you want to pass arguments to APPLICATION\n", @@ -203,9 +204,9 @@ parse_args(struct cg_server *server, int argc, char *argv[]) { int c; #ifdef DEBUG - while ((c = getopt(argc, argv, "dDhm:rv")) != -1) { + while ((c = getopt(argc, argv, "dDhm:rsv")) != -1) { #else - while ((c = getopt(argc, argv, "dhm:rv")) != -1) { + while ((c = getopt(argc, argv, "dhm:rsv")) != -1) { #endif switch (c) { case 'd': @@ -232,6 +233,9 @@ parse_args(struct cg_server *server, int argc, char *argv[]) server->output_transform = WL_OUTPUT_TRANSFORM_NORMAL; } break; + case 's': + server->allow_vt_switch = true; + break; case 'v': fprintf(stdout, "Cage version " CAGE_VERSION "\n"); exit(0); @@ -257,7 +261,6 @@ main(int argc, char *argv[]) struct wl_event_source *sigint_source = NULL; struct wl_event_source *sigterm_source = NULL; struct wl_event_source *sigchld_source = NULL; - struct wlr_backend *backend = NULL; struct wlr_renderer *renderer = NULL; struct wlr_compositor *compositor = NULL; struct wlr_data_device_manager *data_device_manager = NULL; @@ -301,8 +304,8 @@ main(int argc, char *argv[]) sigint_source = wl_event_loop_add_signal(event_loop, SIGINT, handle_signal, &server.wl_display); sigterm_source = wl_event_loop_add_signal(event_loop, SIGTERM, handle_signal, &server.wl_display); - backend = wlr_backend_autocreate(server.wl_display, NULL); - if (!backend) { + server.backend = wlr_backend_autocreate(server.wl_display, NULL); + if (!server.backend) { wlr_log(WLR_ERROR, "Unable to create the wlroots backend"); ret = 1; goto end; @@ -313,7 +316,7 @@ main(int argc, char *argv[]) goto end; } - renderer = wlr_backend_get_renderer(backend); + renderer = wlr_backend_get_renderer(server.backend); wlr_renderer_init_wl_display(renderer, server.wl_display); wl_list_init(&server.views); @@ -344,9 +347,9 @@ main(int argc, char *argv[]) * available on the backend. We use this only to detect the * first output and ignore subsequent outputs. */ server.new_output.notify = handle_new_output; - wl_signal_add(&backend->events.new_output, &server.new_output); + wl_signal_add(&server.backend->events.new_output, &server.new_output); - server.seat = seat_create(&server, backend); + server.seat = seat_create(&server, server.backend); if (!server.seat) { wlr_log(WLR_ERROR, "Unable to create the seat"); ret = 1; @@ -467,7 +470,7 @@ main(int argc, char *argv[]) goto end; } - if (!wlr_backend_start(backend)) { + if (!wlr_backend_start(server.backend)) { wlr_log(WLR_ERROR, "Unable to start the wlroots backend"); ret = 1; goto end; diff --git a/seat.c b/seat.c index 56c7d14..48c126f 100644 --- a/seat.c +++ b/seat.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -225,13 +226,22 @@ handle_modifier_event(struct wlr_input_device *device, struct cg_seat *seat) static bool handle_keybinding(struct cg_server *server, xkb_keysym_t sym) { - switch (sym) { #ifdef DEBUG - case XKB_KEY_Escape: + if (sym == XKB_KEY_Escape) { wl_display_terminate(server->wl_display); - break; + } else #endif - default: + if (server->allow_vt_switch && sym >= XKB_KEY_XF86Switch_VT_1 + && sym <= XKB_KEY_XF86Switch_VT_12) { + if (wlr_backend_is_multi(server->backend)) { + struct wlr_session *session = + wlr_backend_get_session(server->backend); + if (session) { + unsigned vt = sym - XKB_KEY_XF86Switch_VT_1 + 1; + wlr_session_change_vt(session, vt); + } + } + } else { return false; } wlr_idle_notify_activity(server->idle, server->seat->seat); diff --git a/server.h b/server.h index 1469802..817637b 100644 --- a/server.h +++ b/server.h @@ -24,6 +24,7 @@ enum cg_multi_output_mode { struct cg_server { struct wl_display *wl_display; struct wl_list views; + struct wlr_backend *backend; struct cg_seat *seat; struct wlr_idle *idle; @@ -45,6 +46,7 @@ struct cg_server { #endif bool xdg_decoration; + bool allow_vt_switch; enum wl_output_transform output_transform; #ifdef DEBUG bool debug_damage_tracking;