diff options
author | Stivvo <stivvo01@gmail.com> | 2020-10-31 12:43:07 +0100 |
---|---|---|
committer | Stivvo <stivvo01@gmail.com> | 2020-10-31 12:52:22 +0100 |
commit | 25671d79051e9054f64de88e77e089a2daf7008f (patch) | |
tree | ab409cd59aa97e7c8d82fbe5e88c217027ddfb84 /dwl.c | |
parent | 60a63b637c094d4c55aaf3bafc00df0e46ca3d15 (diff) |
Fix crash when disabling focused mon
m->link.next leads to errors if the monitor to disable doesn't have a
"next" (right) monitor and is currently focused. dirtmon() does more
checks.
In some previous commits m->link.next is told to be left monitor, which
is wrong
Also focusclient() explicitly checks for disabled monitors (this fixes
in case of more than one disabled monitor)
Diffstat (limited to 'dwl.c')
-rw-r--r-- | dwl.c | 18 |
1 files changed, 14 insertions, 4 deletions
@@ -1459,16 +1459,26 @@ outputmgrapplyortest(struct wlr_output_configuration_v1 *config, bool test) { struct wlr_output_configuration_head_v1 *config_head; bool ok = true; + Arg ar = {.i = -1}; wl_list_for_each(config_head, &config->heads, link) { struct wlr_output *wlr_output = config_head->state.output; Monitor *m, *newmon; + if (!config_head->state.enabled) { + wl_list_for_each(m, &mons, link) { + if (m->wlr_output->name == wlr_output->name) { + // make sure that the monitor to clean is focused + selmon = m; + focusclient(selclient(), focustop(selmon), 1); + + // focus the left monitor (relative to the current focus) + focusmon(&ar); + closemon(m, wl_container_of(&selmon->link, newmon, link)); + } + } + } wlr_output_enable(wlr_output, config_head->state.enabled); - if (!config_head->state.enabled) - wl_list_for_each(m, &mons, link) - if (m->wlr_output->name == wlr_output->name) - closemon(m, wl_container_of(m->link.next, newmon, link)); if (config_head->state.enabled) { if (config_head->state.mode) |