diff --git a/Bugs.md b/Bugs.md index f81d2fc..580f458 100644 --- a/Bugs.md +++ b/Bugs.md @@ -265,3 +265,35 @@ when scanning out views. Cagebreak up to and including release 1.4.3 sometimes had null pointer dereferences on view destroy. + +### Issue 22 + + * github issue number: #2 + * Fixed: 1.5.0 + +Cagebreak up to and including release 1.4.4 did not offer any means to disable +outputs. This option is now added to output. See cagebreak-config man page for +details. + +Github issue text: + +``` +Hello, I have two outputs (or heads) eDP-1 and HDMA-A-1, and always want to disable eDP-1, how to do it? + +Thank you! +``` + +### Issue 23 + + * github issue number: N/A + * Fixed: 1.5.0 + +Cagebreak up to and including release 1.4.4 had a potential use-after-free bug. + +### Issue 24 + + * github issue number: N/A + * Fixed: 1.5.0 + +Cagebreak up to and including release 1.4.4 could have focussed views without tiles. + diff --git a/README.md b/README.md index e5e0d99..96b1c69 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,11 @@ ninja -C build For every release after 1.0.5, hashes will be provided. +1.5.0 + + * sha 256: 22010e2916493b0d7cfb08c2196f12589509ce11010a7107aed13ddbfd9709cc + * sha 512: 707d6cc01326ba32402f9fb402ff8aceaeaba63ca6ba2eb157e5a4c83123515a3a74da960813479db303eddc2e7f79f39b241dff05b89d47d72d5f1d20ca6d37 + 1.4.4 * sha 256: c6e08e19feb17f768e136cf02f5692ef121ff289763dc60ef8678103803d3307 @@ -266,6 +271,8 @@ keys. * 4739D329C9187A1C2795C20A02ABFDEC3A40545F * 7535AB89220A5C15A728B75F74104CC7DCA5D7A8 * 827BC2320D535AEAD0540E6E2E66F65D99761A6F + * A88D7431E5BAAD0B6EAE550AC8D61D8BD4FA3C46 + * 8F872885968EB8C589A32E9539ACC012896D450F Should we at any point retire a key, we will only replace it with keys signed by at least one of the above collection. @@ -384,6 +391,10 @@ Adds IPC as described in the man pages. Adds close command for windows as described in the man pages. +### Release 1.5.0 + +Adds options to disable or enable outputs. See Issue 22 in Bugs.md and Issue #2 on github. + ## License Please see [LICENSE](https://github.com/project-repo/cagebreak/blob/master/LICENSE) diff --git a/cagebreak.c b/cagebreak.c index 4d1bd3b..0e3b9bb 100644 --- a/cagebreak.c +++ b/cagebreak.c @@ -335,6 +335,7 @@ main(int argc, char *argv[]) { server.bg_color = (float[4]){0, 0, 0, 1}; wl_list_init(&server.outputs); + wl_list_init(&server.disabled_outputs); server.output_layout = wlr_output_layout_create(); if(!server.output_layout) { @@ -544,8 +545,9 @@ main(int argc, char *argv[]) { } { - struct cg_output *output; - wl_list_for_each(output, &server.outputs, link) { + + struct cg_output *output, *output_tmp; + wl_list_for_each_safe(output, output_tmp, &server.outputs, link) { output_configure(&server, output); } } diff --git a/examples/config b/examples/config index 66ce97e..b6a3ca2 100644 --- a/examples/config +++ b/examples/config @@ -75,4 +75,6 @@ definekey top XF86MonBrightnessUp exec xbacklight -inc 1 ###################### #Output configuration ###################### -#output eDP-1 pos 0 0 res 1366x768 rate 60 +output eDP-1 pos 0 0 res 1366x768 rate 60 +output eDP-1 disable +output eDP-1 enable diff --git a/fuzz/fuzz-lib.c b/fuzz/fuzz-lib.c index a32e062..c916777 100644 --- a/fuzz/fuzz-lib.c +++ b/fuzz/fuzz-lib.c @@ -219,6 +219,7 @@ LLVMFuzzerInitialize(int *argc, char ***argv) { server.bg_color[2] = 0; server.bg_color[3] = 1; wl_list_init(&server.outputs); + wl_list_init(&server.disabled_outputs); server.output_layout = wlr_output_layout_create(); if(!server.output_layout) { diff --git a/keybinding.c b/keybinding.c index a061bc2..8f70ffd 100644 --- a/keybinding.c +++ b/keybinding.c @@ -60,6 +60,9 @@ keybinding_free(struct keybinding *keybinding, bool recursive) { keybinding_free(keybinding->data.kb, true); } break; + case KEYBINDING_CONFIGURE_OUTPUT: + free(keybinding->data.o_cfg->output_name); + free(keybinding->data.o_cfg); default: break; } @@ -838,6 +841,20 @@ keybinding_configure_output(struct cg_server *server, } } wl_list_insert(&server->output_config, &cfg->link); + + struct cg_output *output, *tmp_output; + wl_list_for_each_safe(output, tmp_output, &server->outputs, link) { + if(strcmp(cfg->output_name, output->wlr_output->name) == 0) { + output_configure(server, output); + return; + } + } + wl_list_for_each_safe(output, tmp_output, &server->disabled_outputs, link) { + if(strcmp(cfg->output_name, output->wlr_output->name) == 0) { + output_configure(server, output); + return; + } + } } /* Hint: see keybinding.h for details on "data" */ diff --git a/keys/cagebreak@project-repo.co.pub b/keys/cagebreak@project-repo.co.pub index 2642c1e..7ccde5b 100644 --- a/keys/cagebreak@project-repo.co.pub +++ b/keys/cagebreak@project-repo.co.pub @@ -47,29 +47,41 @@ f4FlX7Mn6YAG94h6HN3qRo/c+E47XBqj9XmvFe0e+bWg9oar3rWGkVN+YzUaSgp3 iNXRYQfQZbCHf7vTDzQZ8lWix7IBcAdoBgHl7d0RW4VNqbXISZvKMMTZK8WQVYYz wcW9+Ll/fEwE8PGs5FolnynEg9YLLzj0OADSfaly/woqXUul14mWpM/gFsxQTyuQ 7n7xyAu5PImTjC7WzVMF9OAH35ng9u76bDkmwVfrMzGvKZ2DRsJQeNRUAd4EIM8S -6+ipTKNASzj4mCnURgS2zMplReE30icE8Vpol/ZYgC2qouS89nq29kLOuQINBF7T -e/sBEADSdSZVGEumZeeXzM1uPp1OUWHCkmCiPu6jfP2M2GI4VnSCcsxM4XcbR26O -sqMmMo9f4Fuie/+K6oyqE1LMeGTpasWJrd8w2TME0V5Nqsszp+PtKJBTIskk2c7b -ctQDeZDTcuIGPi03SxLCn+ZeDpVscBKbuc78twNYl0xXM86P67D73cA5WZPqQIKS -Me+8iRzpzB/Hk/lcDun3QlrXq+bMwSPSMD0ikcPdpiGf+RuQH/ZB5JVQqgA92Vt3 -QFA4RAgKyQCdS0DOaScAvXotriFWbZdGt/iTGzzQ8e1O0C9COhgNms4r5bwRVzH5 -k/kQ1BC1S+Me5shNUO8DabRWPh+CgZjtYV5oHY1jik1p72DnTTajIMYwhcLOJXRl -l+zlq20qqqdp05DSloIYEizsgNTQ0F7XP0uXyVaDsUxGv4ZucRHJVuedilEhz9MW -k/iqeQ2hWRuR3vuiknj3F8O/Z7kJNfx8Hi6PgfCMyCv3YZxpkXhXwXRbYndhbQHK -F/9gVvDxx0yw+BCYj+iDdo0mwdI0LFh+ddpwWBFhzJpMdUsDEHmG5yOmbUIZDCmt -GCLSBDPl61FUaGUljSFWtW7b3bgv+a6RUTbkw3ZuvyxV9lMbLDAPSZmRjQHGydZJ -cdRmxX262CjpxP707c51EhlhsL5Q1cBXcBgwlbQ3ltC4VFRI1wARAQABiQI8BBgB -CAAmFiEEsVuSZCdg4R/gAt4WhwjUJFGpSrUFAl7Te/sCGwwFCQHhM4AACgkQhwjU -JFGpSrWLGQ//f07ynATQpyyichXwMQDZhOS2/jocTNHaUfecO2OoPjc69wldyvN6 -wv0HDUmom1rJK/v25KxGnKKKg/UX9XxCSK2G85UX4niT/jTKcI5D9OiOwlFbs917 -VYYU/8u45KDDqDLqhhepAa5QttKXMDU2nx9V82W/gVjEcLIseKeIg4i24bJHi6ax -WySklo1Vwo+RGtwfhT+/UxLv9bDOWRxHRsOnlTZo+PSMgescgWDkYOR33wxmLw6P -Ckv/Sb/kIXrXuFey7bs3zciM1hL4+/iIAr2DSQi5bGUBnBCrwsV4wnVru06Ua013 -sPqHTMgucbhYDS4sTPOXD7szQAzze1dxez55h5ziaf7tFilvaulSs2bubGuAWgKm -VCeZINzEbA4bYUAyuWtMu+vbXWimcg54BGVCS7IdVGF78FjgVTqjH8nkiGtrzGRW -94ebx61EcuNdcRuri3OgrO009fzJy8sswQmuanyF4gyXml9FUVc93HO8mDnNyFZd -O5FHgYFLn+ymd2Ra5cUvFYsJ5b2ydkX7CigcqyyysMoYpc1PpJN1kpX0e1D6JDp9 -Xk02SoUP9t/y6C/h7f14WUefgZnDwK2/YCYogyrgMSSLw54j85kS/Ycr2OlJ3If5 -MHObamGEWsqr6H240IxeT4xrsMUuSFYHEEGnKuPfiSPVF2QjVbOTeSw= -=QlUC +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 +=ZN9o -----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/cagebreak_signing_key_5@project-repo.co b/keys/cagebreak_signing_key_5@project-repo.co new file mode 100644 index 0000000..5fee531 --- /dev/null +++ b/keys/cagebreak_signing_key_5@project-repo.co @@ -0,0 +1,100 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +5w== +=Dm8H +-----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/cagebreak_signing_key_6@project-repo.co b/keys/cagebreak_signing_key_6@project-repo.co new file mode 100644 index 0000000..c9424a8 --- /dev/null +++ b/keys/cagebreak_signing_key_6@project-repo.co @@ -0,0 +1,88 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +qF/GtdHBq8rhkEM= +=c37G +-----END PGP PUBLIC KEY BLOCK----- diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index 197c91a..29907b8 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -% CAGEBREAK-CONFIG(1) Version 1.4.4 | Cagebreak Manual +% CAGEBREAK-CONFIG(1) Version 1.5.0 | Cagebreak Manual # NAME @@ -136,12 +136,14 @@ by prepending a line with the # symbol. > Remove all splits and make the current window fill the entire screen -**output pos res x rate ** +**output [[pos res x rate ] | enable | disable]** > Configure the output "". and are the position of the monitor > in pixels. The top-left monitor should have the coordinates 0 0. and > specify the resolution in pixels and sets the refresh rate of -> the monitor (often this is 50 or 60). +> the monitor (often this is 50 or 60). The options enable and disable +> enable or disable the output . Note that if is the only enabled +> output, `output disable` has no effect. **prev** @@ -253,7 +255,7 @@ See GitHub Issues: # LICENSE -Copyright (c) 2020 The Cagebreak authors +Copyright (c) 2020-2021 The Cagebreak authors Copyright (c) 2018-2020 Jente Hidskes Copyright (c) 2019 The Sway authors diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index 3640ee3..7ddec01 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -% CAGEBREAK(1) Version 1.4.4 | Cagebreak Manual +% CAGEBREAK(1) Version 1.5.0 | Cagebreak Manual # NAME @@ -81,7 +81,7 @@ See GitHub Issues: # LICENSE -Copyright (c) 2020 The Cagebreak authors +Copyright (c) 2020-2021 The Cagebreak authors Copyright (c) 2018-2020 Jente Hidskes Copyright (c) 2019 The Sway authors diff --git a/meson.build b/meson.build index 64bbe40..2b3afc1 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('cagebreak', 'c', - version: '1.4.4', + version: '1.5.0', license: 'MIT', default_options: [ 'c_std=c11', @@ -196,11 +196,11 @@ reproducible_build_versions = { 'wayland_client': '1.18.0', 'wayland_cursor': '1.18.0', 'wlroots': '0.12.0', - 'xkbcommon': '1.0.1', + 'xkbcommon': '1.0.3', 'fontconfig': '2.13.91', 'pixman': '0.40.0', 'pango': '1.48.0', - 'cairo': '1.17.3', + 'cairo': '1.17.4', 'pangocairo': '1.48.0', 'math': '-1' } diff --git a/output.c b/output.c index a38d65f..42ed10e 100644 --- a/output.c +++ b/output.c @@ -364,7 +364,7 @@ static void handle_output_transform(struct wl_listener *listener, void *data) { struct cg_output *output = wl_container_of(listener, output, transform); - if(!output->wlr_output->enabled) { + if(!output->wlr_output->enabled || output->workspaces == NULL) { return; } @@ -379,7 +379,7 @@ static void handle_output_mode(struct wl_listener *listener, void *data) { struct cg_output *output = wl_container_of(listener, output, mode); - if(!output->wlr_output->enabled) { + if(!output->wlr_output->enabled || output->workspaces == NULL) { return; } @@ -390,22 +390,16 @@ handle_output_mode(struct wl_listener *listener, void *data) { } } -static void -output_destroy(struct cg_output *output) { +void +output_clear(struct cg_output *output) { struct cg_server *server = output->server; - - wl_list_remove(&output->destroy.link); - wl_list_remove(&output->mode.link); - wl_list_remove(&output->transform.link); - wl_list_remove(&output->damage_frame.link); - wl_list_remove(&output->damage_destroy.link); - wlr_output_layout_remove(server->output_layout, output->wlr_output); if(server->running && server->curr_output == output && wl_list_length(&server->outputs) > 1) { keybinding_cycle_outputs(server, false); } + wl_list_remove(&output->link); message_clear(output); @@ -413,6 +407,14 @@ output_destroy(struct cg_output *output) { struct cg_view *view, *view_tmp; if(server->running) { for(unsigned int i = 0; i < server->nws; ++i) { + + bool first = true; + for(struct cg_tile *tile = output->workspaces[i]->focused_tile; + first || output->workspaces[i]->focused_tile != tile; + tile = tile->next) { + first = false; + tile->view = NULL; + } wl_list_for_each_safe(view, view_tmp, &output->workspaces[i]->views, link) { wl_list_remove(&view->link); @@ -450,6 +452,19 @@ output_destroy(struct cg_output *output) { } } } +} + +static void +output_destroy(struct cg_output *output) { + struct cg_server *server = output->server; + + wl_list_remove(&output->destroy.link); + wl_list_remove(&output->mode.link); + wl_list_remove(&output->transform.link); + wl_list_remove(&output->damage_frame.link); + wl_list_remove(&output->damage_destroy.link); + + output_clear(output); /*Important: due to unfortunate events, "workspace" and "output->workspace" * have nothing in common. The former is the workspace of a single output, @@ -530,11 +545,16 @@ void output_configure(struct cg_server *server, struct cg_output *output) { struct wlr_output *wlr_output = output->wlr_output; struct cg_output_config *config = output_find_config(server, wlr_output); + /* Refuse to disable the only output */ + if(config != NULL && config->status == OUTPUT_DISABLE && + wl_list_length(&server->outputs) == 1) { + return; + } if(output->wlr_output->enabled) { wlr_output_layout_remove(server->output_layout, wlr_output); } - if(config == NULL) { + if(config == NULL || config->status == OUTPUT_ENABLE) { wlr_output_layout_add_auto(server->output_layout, wlr_output); struct wlr_output_mode *preferred_mode = @@ -542,11 +562,24 @@ output_configure(struct cg_server *server, struct cg_output *output) { if(preferred_mode) { wlr_output_set_mode(wlr_output, preferred_mode); } + wl_list_remove(&output->link); + wl_list_insert(&server->outputs, &output->link); + wlr_output_enable(wlr_output, true); + wlr_output_commit(wlr_output); + } else if(config->status == OUTPUT_DISABLE) { + output_clear(output); + wl_list_insert(&server->disabled_outputs, &output->link); + wlr_output_enable(wlr_output, false); + wlr_output_commit(wlr_output); } else { + wl_list_remove(&output->link); + wl_list_insert(&server->outputs, &output->link); output_set_mode(wlr_output, config->pos.width, config->pos.height, config->refresh_rate); wlr_output_layout_add(server->output_layout, wlr_output, config->pos.x, config->pos.y); + wlr_output_enable(wlr_output, true); + wlr_output_commit(wlr_output); } } @@ -569,7 +602,6 @@ handle_new_output(struct wl_listener *listener, void *data) { output->server = server; output->damage = wlr_output_damage_create(wlr_output); output->last_scanned_out_view = NULL; - wl_list_insert(&server->outputs, &output->link); output->mode.notify = handle_output_mode; wl_signal_add(&wlr_output->events.mode, &output->mode); @@ -583,19 +615,7 @@ handle_new_output(struct wl_listener *listener, void *data) { wl_signal_add(&output->damage->events.destroy, &output->damage_destroy); wlr_output_set_transform(wlr_output, server->output_transform); - - output_configure(server, output); - - output->workspaces = malloc(server->nws * sizeof(struct cg_workspace *)); - for(unsigned int i = 0; i < server->nws; ++i) { - output->workspaces[i] = full_screen_workspace(output); - if(!output->workspaces[i]) { - wlr_log(WLR_ERROR, "Failed to allocate workspaces for output"); - return; - } - wl_list_init(&output->workspaces[i]->views); - wl_list_init(&output->workspaces[i]->unmanaged_views); - } + output->workspaces = NULL; output->curr_workspace = 0; wl_list_init(&output->messages); @@ -607,14 +627,12 @@ handle_new_output(struct wl_listener *listener, void *data) { wlr_output->name, wlr_output->scale); } + wl_list_insert(&server->outputs, &output->link); + output_configure(server, output); wlr_output_damage_add_whole(output->damage); - wlr_output_enable(wlr_output, true); - wlr_output_commit(wlr_output); - - /* TODO:If you see a way to circumvent having to loop twice, please do so */ + output->workspaces = malloc(server->nws * sizeof(struct cg_workspace *)); for(unsigned int i = 0; i < server->nws; ++i) { - workspace_free(output->workspaces[i]); output->workspaces[i] = full_screen_workspace(output); if(!output->workspaces[i]) { wlr_log(WLR_ERROR, "Failed to allocate workspaces for output"); diff --git a/output.h b/output.h index b114176..a11d4be 100644 --- a/output.h +++ b/output.h @@ -28,7 +28,10 @@ struct cg_output { struct wl_list link; // cg_server::outputs }; +enum output_status { OUTPUT_ENABLE, OUTPUT_DISABLE, OUTPUT_DEFAULT }; + struct cg_output_config { + enum output_status status; struct wlr_box pos; char *output_name; float refresh_rate; diff --git a/parse.c b/parse.c index 043625b..46b275a 100644 --- a/parse.c +++ b/parse.c @@ -259,6 +259,23 @@ parse_float(char **saveptr, const char *delim) { } } +int +parse_output_config_keyword(char *key_str, enum output_status *status) { + if(key_str == NULL) { + return -1; + } + if(strcmp(key_str, "pos") == 0) { + *status = OUTPUT_DEFAULT; + } else if(strcmp(key_str, "enable") == 0) { + *status = OUTPUT_ENABLE; + } else if(strcmp(key_str, "disable") == 0) { + *status = OUTPUT_DISABLE; + } else { + return -1; + } + return 0; +} + struct cg_output_config * parse_output_config(char **saveptr, char **errstr) { struct cg_output_config *cfg = malloc(sizeof(struct cg_output_config)); @@ -273,13 +290,17 @@ parse_output_config(char **saveptr, char **errstr) { log_error("Expected name of output to be configured, got none"); goto error; } - char *pos_str = strtok_r(NULL, " ", saveptr); - if(pos_str == NULL || strcmp(pos_str, "pos") != 0) { - *errstr = log_error( - "Expected keyword \"pos\" in output configuration for output %s", - name); + char *key_str = strtok_r(NULL, " ", saveptr); + if(parse_output_config_keyword(key_str, &(cfg->status)) != 0) { + *errstr = log_error("Expected keyword \"pos\", \"enable\" or " + "\"disable\" in output configuration for output %s", + name); goto error; } + if(cfg->status == OUTPUT_ENABLE || cfg->status == OUTPUT_DISABLE) { + cfg->output_name = strdup(name); + return cfg; + } cfg->pos.x = parse_uint(saveptr, " "); if(cfg->pos.x < 0) { diff --git a/seat.c b/seat.c index 13ef04e..fc22669 100644 --- a/seat.c +++ b/seat.c @@ -54,6 +54,12 @@ view_at(const struct cg_view *view, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy) { struct wlr_box *output_layout_box = wlr_output_layout_get_box( view->server->output_layout, view->workspace->output->wlr_output); + if(output_layout_box == NULL) { + fprintf(stderr, "OUTPUT:%d\n", + view->workspace->output->wlr_output->enabled); + return output_layout_box->x; + return false; + } double view_sx = lx - view->ox - output_layout_box->x; double view_sy = ly - view->oy - output_layout_box->y; @@ -966,10 +972,6 @@ seat_set_focus(struct cg_seat *seat, struct cg_view *view) { } } - if(seat->seat->keyboard_state.focused_surface == view->wlr_surface) { - return; - } - #if CG_HAS_XWAYLAND if(view->type == CG_XWAYLAND_VIEW && !xwayland_view_should_manage(view)) { const struct cg_xwayland_view *xwayland_view = diff --git a/server.h b/server.h index 24c2fb1..4e594b9 100644 --- a/server.h +++ b/server.h @@ -26,6 +26,7 @@ struct cg_server { struct wl_list inhibitors; struct wlr_output_layout *output_layout; + struct wl_list disabled_outputs; struct wl_list outputs; struct cg_output *curr_output; struct wl_listener new_output; diff --git a/signatures/1.4.4.sig b/signatures/1.4.4.sig new file mode 100644 index 0000000..6480250 Binary files /dev/null and b/signatures/1.4.4.sig differ diff --git a/signatures/cagebreak.sig b/signatures/cagebreak.sig index 6480250..4310d30 100644 Binary files a/signatures/cagebreak.sig and b/signatures/cagebreak.sig differ diff --git a/view.c b/view.c index d938526..f9bfcc3 100644 --- a/view.c +++ b/view.c @@ -291,21 +291,25 @@ view_unmap(struct cg_view *view) { { struct cg_tile *view_tile = view_get_tile(view); if(view_tile != NULL) { - struct cg_view *prev = view_get_prev_view(view); wlr_output_damage_add_box(view_tile->workspace->output->damage, &view_tile->tile); - if(view == view->server->seat->focused_view) { - seat_set_focus(view->server->seat, prev); - } else if(view->server->seat->seat->keyboard_state - .focused_surface == view->wlr_surface) { - wlr_seat_keyboard_clear_focus(view->server->seat->seat); - seat_set_focus(view->server->seat, - view->server->seat->focused_view); - } else { - view_tile->view = prev; - if(prev != NULL) { - view_maximize(prev, &view_tile->tile); - } + } + struct cg_view *prev = view_get_prev_view(view); + if(view == view->server->seat->focused_view) { + seat_set_focus(view->server->seat, prev); + } else if(view->server->seat->seat->keyboard_state.focused_surface == + view->wlr_surface) { + wlr_seat_keyboard_clear_focus(view->server->seat->seat); + seat_set_focus(view->server->seat, + view->server->seat->focused_view); + } + view_tile = view_get_tile(view); + if(view_tile != NULL) { + wlr_output_damage_add_box(view_tile->workspace->output->damage, + &view_tile->tile); + view_tile->view = prev; + if(prev != NULL) { + view_maximize(prev, &view_tile->tile); } } }