aboutsummaryrefslogtreecommitdiff
path: root/sway/tree
diff options
context:
space:
mode:
authorRyan Dwyer <ryandwyer1@gmail.com>2019-01-17 20:16:23 +1000
committeremersion <contact@emersion.fr>2019-01-22 09:55:13 +0100
commit2301349ad59751640ed9e59dd22edeafaf09da39 (patch)
tree1726c2f8ec1cd9baaf27fbed62aa6a337bc85ce7 /sway/tree
parentab0248a54564b2f644b6fb367f9eb44fe0bf5f3c (diff)
Use noop output when there's no outputs connected
Instead of having NULL workspace->output pointers, use a noop output. This should be safer.
Diffstat (limited to 'sway/tree')
-rw-r--r--sway/tree/output.c21
-rw-r--r--sway/tree/root.c10
-rw-r--r--sway/tree/view.c7
-rw-r--r--sway/tree/workspace.c6
4 files changed, 18 insertions, 26 deletions
diff --git a/sway/tree/output.c b/sway/tree/output.c
index 50a2c535..5a992f2d 100644
--- a/sway/tree/output.c
+++ b/sway/tree/output.c
@@ -57,12 +57,12 @@ static void restore_workspaces(struct sway_output *output) {
}
// Saved workspaces
- for (int i = 0; i < root->saved_workspaces->length; ++i) {
- struct sway_workspace *ws = root->saved_workspaces->items[i];
+ while (root->noop_output->workspaces->length) {
+ struct sway_workspace *ws = root->noop_output->workspaces->items[0];
+ workspace_detach(ws);
output_add_workspace(output, ws);
ipc_event_workspace(NULL, ws, "move");
}
- root->saved_workspaces->length = 0;
output_sort_workspaces(output);
}
@@ -177,6 +177,9 @@ static void output_evacuate(struct sway_output *output) {
if (!new_output) {
new_output = fallback_output;
}
+ if (!new_output) {
+ new_output = root->noop_output;
+ }
if (workspace_is_empty(workspace)) {
// If floating is not empty, there are sticky containers to move
@@ -187,14 +190,10 @@ static void output_evacuate(struct sway_output *output) {
continue;
}
- if (new_output) {
- workspace_output_add_priority(workspace, new_output);
- output_add_workspace(new_output, workspace);
- output_sort_workspaces(new_output);
- ipc_event_workspace(NULL, workspace, "move");
- } else {
- list_add(root->saved_workspaces, workspace);
- }
+ workspace_output_add_priority(workspace, new_output);
+ output_add_workspace(new_output, workspace);
+ output_sort_workspaces(new_output);
+ ipc_event_workspace(NULL, workspace, "move");
}
}
diff --git a/sway/tree/root.c b/sway/tree/root.c
index d4b97be3..ec6bccf6 100644
--- a/sway/tree/root.c
+++ b/sway/tree/root.c
@@ -39,7 +39,6 @@ struct sway_root *root_create(void) {
wl_signal_init(&root->events.new_node);
root->outputs = create_list();
root->scratchpad = create_list();
- root->saved_workspaces = create_list();
root->output_layout_change.notify = output_layout_handle_change;
wl_signal_add(&root->output_layout->events.change,
@@ -50,7 +49,6 @@ struct sway_root *root_create(void) {
void root_destroy(struct sway_root *root) {
wl_list_remove(&root->output_layout_change.link);
list_free(root->scratchpad);
- list_free(root->saved_workspaces);
list_free(root->outputs);
wlr_output_layout_destroy(root->output_layout);
free(root);
@@ -327,8 +325,8 @@ void root_for_each_container(void (*f)(struct sway_container *con, void *data),
}
// Saved workspaces
- for (int i = 0; i < root->saved_workspaces->length; ++i) {
- struct sway_workspace *ws = root->saved_workspaces->items[i];
+ for (int i = 0; i < root->noop_output->workspaces->length; ++i) {
+ struct sway_workspace *ws = root->noop_output->workspaces->items[i];
workspace_for_each_container(ws, f, data);
}
}
@@ -380,8 +378,8 @@ struct sway_container *root_find_container(
}
// Saved workspaces
- for (int i = 0; i < root->saved_workspaces->length; ++i) {
- struct sway_workspace *ws = root->saved_workspaces->items[i];
+ for (int i = 0; i < root->noop_output->workspaces->length; ++i) {
+ struct sway_workspace *ws = root->noop_output->workspaces->items[i];
if ((result = workspace_find_container(ws, test, data))) {
return result;
}
diff --git a/sway/tree/view.c b/sway/tree/view.c
index bc252521..edbfca97 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -518,9 +518,10 @@ static struct sway_workspace *select_workspace(struct sway_view *view) {
return node->sway_container->workspace;
}
- // If there's no focus_inactive workspace then we must be running without
- // any outputs connected
- return root->saved_workspaces->items[0];
+ // When there's no outputs connected, the above should match a workspace on
+ // the noop output.
+ sway_assert(false, "Expected to find a workspace");
+ return NULL;
}
static bool should_focus(struct sway_view *view) {
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index e89c0849..8b3eb2ad 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -158,13 +158,7 @@ void workspace_begin_destroy(struct sway_workspace *workspace) {
if (workspace->output) {
workspace_detach(workspace);
- } else {
- int index = list_find(root->saved_workspaces, workspace);
- if (index != -1) {
- list_del(root->saved_workspaces, index);
- }
}
-
workspace->node.destroying = true;
node_set_dirty(&workspace->node);
}