Add option to allow changing VT

Code that does the VT switch taken from sway.
This commit is contained in:
Jan Tatje 2020-07-15 16:50:38 +02:00 committed by Jente Hidskes
parent bd961db6f5
commit 79992f39f3
3 changed files with 28 additions and 13 deletions

21
cage.c
View file

@ -192,6 +192,7 @@ usage(FILE *file, const char *cage)
" -m extend Extend the display across all connected outputs (default)\n" " -m extend Extend the display across all connected outputs (default)\n"
" -m last Use only the last connected output\n" " -m last Use only the last connected output\n"
" -r\t Rotate the output 90 degrees clockwise, specify up to three times\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" " -v\t Show the version number and exit\n"
"\n" "\n"
" Use -- when you want to pass arguments to APPLICATION\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; int c;
#ifdef DEBUG #ifdef DEBUG
while ((c = getopt(argc, argv, "dDhm:rv")) != -1) { while ((c = getopt(argc, argv, "dDhm:rsv")) != -1) {
#else #else
while ((c = getopt(argc, argv, "dhm:rv")) != -1) { while ((c = getopt(argc, argv, "dhm:rsv")) != -1) {
#endif #endif
switch (c) { switch (c) {
case 'd': case 'd':
@ -232,6 +233,9 @@ parse_args(struct cg_server *server, int argc, char *argv[])
server->output_transform = WL_OUTPUT_TRANSFORM_NORMAL; server->output_transform = WL_OUTPUT_TRANSFORM_NORMAL;
} }
break; break;
case 's':
server->allow_vt_switch = true;
break;
case 'v': case 'v':
fprintf(stdout, "Cage version " CAGE_VERSION "\n"); fprintf(stdout, "Cage version " CAGE_VERSION "\n");
exit(0); exit(0);
@ -257,7 +261,6 @@ main(int argc, char *argv[])
struct wl_event_source *sigint_source = NULL; struct wl_event_source *sigint_source = NULL;
struct wl_event_source *sigterm_source = NULL; struct wl_event_source *sigterm_source = NULL;
struct wl_event_source *sigchld_source = NULL; struct wl_event_source *sigchld_source = NULL;
struct wlr_backend *backend = NULL;
struct wlr_renderer *renderer = NULL; struct wlr_renderer *renderer = NULL;
struct wlr_compositor *compositor = NULL; struct wlr_compositor *compositor = NULL;
struct wlr_data_device_manager *data_device_manager = 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); 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); sigterm_source = wl_event_loop_add_signal(event_loop, SIGTERM, handle_signal, &server.wl_display);
backend = wlr_backend_autocreate(server.wl_display, NULL); server.backend = wlr_backend_autocreate(server.wl_display, NULL);
if (!backend) { if (!server.backend) {
wlr_log(WLR_ERROR, "Unable to create the wlroots backend"); wlr_log(WLR_ERROR, "Unable to create the wlroots backend");
ret = 1; ret = 1;
goto end; goto end;
@ -313,7 +316,7 @@ main(int argc, char *argv[])
goto end; goto end;
} }
renderer = wlr_backend_get_renderer(backend); renderer = wlr_backend_get_renderer(server.backend);
wlr_renderer_init_wl_display(renderer, server.wl_display); wlr_renderer_init_wl_display(renderer, server.wl_display);
wl_list_init(&server.views); 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 * available on the backend. We use this only to detect the
* first output and ignore subsequent outputs. */ * first output and ignore subsequent outputs. */
server.new_output.notify = handle_new_output; 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) { if (!server.seat) {
wlr_log(WLR_ERROR, "Unable to create the seat"); wlr_log(WLR_ERROR, "Unable to create the seat");
ret = 1; ret = 1;
@ -467,7 +470,7 @@ main(int argc, char *argv[])
goto end; goto end;
} }
if (!wlr_backend_start(backend)) { if (!wlr_backend_start(server.backend)) {
wlr_log(WLR_ERROR, "Unable to start the wlroots backend"); wlr_log(WLR_ERROR, "Unable to start the wlroots backend");
ret = 1; ret = 1;
goto end; goto end;

18
seat.c
View file

@ -12,6 +12,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <wayland-server-core.h> #include <wayland-server-core.h>
#include <wlr/backend.h> #include <wlr/backend.h>
#include <wlr/backend/multi.h>
#include <wlr/types/wlr_cursor.h> #include <wlr/types/wlr_cursor.h>
#include <wlr/types/wlr_data_device.h> #include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_idle.h> #include <wlr/types/wlr_idle.h>
@ -225,13 +226,22 @@ handle_modifier_event(struct wlr_input_device *device, struct cg_seat *seat)
static bool static bool
handle_keybinding(struct cg_server *server, xkb_keysym_t sym) handle_keybinding(struct cg_server *server, xkb_keysym_t sym)
{ {
switch (sym) {
#ifdef DEBUG #ifdef DEBUG
case XKB_KEY_Escape: if (sym == XKB_KEY_Escape) {
wl_display_terminate(server->wl_display); wl_display_terminate(server->wl_display);
break; } else
#endif #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; return false;
} }
wlr_idle_notify_activity(server->idle, server->seat->seat); wlr_idle_notify_activity(server->idle, server->seat->seat);

View file

@ -24,6 +24,7 @@ enum cg_multi_output_mode {
struct cg_server { struct cg_server {
struct wl_display *wl_display; struct wl_display *wl_display;
struct wl_list views; struct wl_list views;
struct wlr_backend *backend;
struct cg_seat *seat; struct cg_seat *seat;
struct wlr_idle *idle; struct wlr_idle *idle;
@ -45,6 +46,7 @@ struct cg_server {
#endif #endif
bool xdg_decoration; bool xdg_decoration;
bool allow_vt_switch;
enum wl_output_transform output_transform; enum wl_output_transform output_transform;
#ifdef DEBUG #ifdef DEBUG
bool debug_damage_tracking; bool debug_damage_tracking;