view: remove workspace pid mapping for assigns
If a view is mapped to a workspace using an assign, the pid should still be removed from the pid mapping list. This prevents child processes from matching against it and mapping a view to a likely undesired workspace.
This commit is contained in:
parent
1e2a2b0778
commit
c99d423ad9
|
@ -72,6 +72,8 @@ struct sway_workspace *root_workspace_for_pid(pid_t pid);
|
||||||
|
|
||||||
void root_record_workspace_pid(pid_t pid);
|
void root_record_workspace_pid(pid_t pid);
|
||||||
|
|
||||||
|
void root_remove_workspace_pid(pid_t pid);
|
||||||
|
|
||||||
void root_for_each_workspace(void (*f)(struct sway_workspace *ws, void *data),
|
void root_for_each_workspace(void (*f)(struct sway_workspace *ws, void *data),
|
||||||
void *data);
|
void *data);
|
||||||
|
|
||||||
|
|
|
@ -225,6 +225,13 @@ static pid_t get_parent_pid(pid_t child) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pid_workspace_destroy(struct pid_workspace *pw) {
|
||||||
|
wl_list_remove(&pw->output_destroy.link);
|
||||||
|
wl_list_remove(&pw->link);
|
||||||
|
free(pw->workspace);
|
||||||
|
free(pw);
|
||||||
|
}
|
||||||
|
|
||||||
struct sway_workspace *root_workspace_for_pid(pid_t pid) {
|
struct sway_workspace *root_workspace_for_pid(pid_t pid) {
|
||||||
if (!pid_workspaces.prev && !pid_workspaces.next) {
|
if (!pid_workspaces.prev && !pid_workspaces.next) {
|
||||||
wl_list_init(&pid_workspaces);
|
wl_list_init(&pid_workspaces);
|
||||||
|
@ -261,10 +268,7 @@ found:
|
||||||
ws = workspace_create(pw->output, pw->workspace);
|
ws = workspace_create(pw->output, pw->workspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_list_remove(&pw->output_destroy.link);
|
pid_workspace_destroy(pw);
|
||||||
wl_list_remove(&pw->link);
|
|
||||||
free(pw->workspace);
|
|
||||||
free(pw);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ws;
|
return ws;
|
||||||
|
@ -303,10 +307,7 @@ void root_record_workspace_pid(pid_t pid) {
|
||||||
struct pid_workspace *old, *_old;
|
struct pid_workspace *old, *_old;
|
||||||
wl_list_for_each_safe(old, _old, &pid_workspaces, link) {
|
wl_list_for_each_safe(old, _old, &pid_workspaces, link) {
|
||||||
if (now.tv_sec - old->time_added.tv_sec >= timeout) {
|
if (now.tv_sec - old->time_added.tv_sec >= timeout) {
|
||||||
wl_list_remove(&old->output_destroy.link);
|
pid_workspace_destroy(old);
|
||||||
wl_list_remove(&old->link);
|
|
||||||
free(old->workspace);
|
|
||||||
free(old);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,6 +321,20 @@ void root_record_workspace_pid(pid_t pid) {
|
||||||
wl_list_insert(&pid_workspaces, &pw->link);
|
wl_list_insert(&pid_workspaces, &pw->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void root_remove_workspace_pid(pid_t pid) {
|
||||||
|
if (!pid_workspaces.prev || !pid_workspaces.next) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct pid_workspace *pw, *tmp;
|
||||||
|
wl_list_for_each_safe(pw, tmp, &pid_workspaces, link) {
|
||||||
|
if (pid == pw->pid) {
|
||||||
|
pid_workspace_destroy(pw);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void root_for_each_workspace(void (*f)(struct sway_workspace *ws, void *data),
|
void root_for_each_workspace(void (*f)(struct sway_workspace *ws, void *data),
|
||||||
void *data) {
|
void *data) {
|
||||||
for (int i = 0; i < root->outputs->length; ++i) {
|
for (int i = 0; i < root->outputs->length; ++i) {
|
||||||
|
|
|
@ -503,6 +503,7 @@ static struct sway_workspace *select_workspace(struct sway_view *view) {
|
||||||
}
|
}
|
||||||
list_free(criterias);
|
list_free(criterias);
|
||||||
if (ws) {
|
if (ws) {
|
||||||
|
root_remove_workspace_pid(view->pid);
|
||||||
return ws;
|
return ws;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue