Prevent an infinite loop when an output is disabled
Patch status: superseded
Patch by Tony Crisci
Long description:
When looping over workspaces to reassign them from the output being disabled, be sure to remove them from the loop. Do not rely on tree_close to do this, because tree_close refuses to close a workspace that is visible. fixes #1103.
To apply this patch, use:
curl http://cr.i3wm.org/patch/264/raw.patch | git am
b/src/randr.c
| 19 |
@@ -716,13 +716,8 @@ void randr_query_outputs(void) {
|
| 20 |
Con *current; |
| 21 |
Con *old_content = output_get_content(output->con); |
| 22 |
while (!TAILQ_EMPTY(&(old_content->nodes_head))) {
|
| 23 |
+ /* make sure the workspace is re-assigned first to avoid an infinite loop */ |
| 24 |
current = TAILQ_FIRST(&(old_content->nodes_head)); |
| 25 |
- if (current != next && TAILQ_EMPTY(&(current->focus_head))) {
|
| 26 |
- /* the workspace is empty and not focused, get rid of it */ |
| 27 |
- DLOG("Getting rid of current = %p / %s (empty, unfocused)\n", current, current->name);
|
| 28 |
- tree_close(current, DONT_KILL_WINDOW, false, false); |
| 29 |
- continue; |
| 30 |
- } |
| 31 |
DLOG("Detaching current = %p / %s\n", current, current->name);
|
| 32 |
con_detach(current); |
| 33 |
DLOG("Re-attaching current = %p / %s\n", current, current->name);
|
| 34 |
@@ -731,6 +726,11 @@ void randr_query_outputs(void) {
|
| 35 |
Con *floating_con; |
| 36 |
TAILQ_FOREACH(floating_con, &(current->floating_head), floating_windows) |
| 37 |
floating_fix_coordinates(floating_con, &(output->con->rect), &(first->con->rect)); |
| 38 |
+ if (current != next && TAILQ_EMPTY(&(current->focus_head))) {
|
| 39 |
+ /* the workspace is empty and not focused, get rid of it */ |
| 40 |
+ DLOG("Getting rid of current = %p / %s (empty, unfocused)\n", current, current->name);
|
| 41 |
+ tree_close(current, DONT_KILL_WINDOW, false, false); |
| 42 |
+ } |
| 43 |
DLOG("Done, next\n");
|
| 44 |
} |
| 45 |
DLOG("re-attached all workspaces\n");
|