From 68258785acebaa648bacf4ef8b6e44f098f4e396 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Tue, 10 Nov 2020 10:24:15 +0100 Subject: [PATCH] create_workspace_on_output: Prevent duplicate workspace nums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When going through the `binding_workspace_names` to prioritize user-specified names, we only check if the workspace exists, not the workspace number. If the user specified a `bindsym … workspace number X` directive, then it is appended in `binding_workspace_names` and a workspace is created using that number even though from the POV of a user that uses numbers to change workspaces, that workspace already exists. In similar code here: https://github.com/i3/i3/blob/1d9160f2d247dbaa83fb62f02fd7041dec767fc2/src/workspace.c#L997 we do the check. Fixes #4238 --- RELEASE-NOTES-next | 3 +-- src/workspace.c | 7 +++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/RELEASE-NOTES-next b/RELEASE-NOTES-next index e896b54e..c24c82a0 100644 --- a/RELEASE-NOTES-next +++ b/RELEASE-NOTES-next @@ -17,5 +17,4 @@ strongly encouraged to upgrade. │ Bugfixes │ └────────────────────────────┘ - • placeholder - + • when initializing new outputs, avoid duplicating workspace numbers diff --git a/src/workspace.c b/src/workspace.c index f3ddf01c..db3afe4a 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -254,12 +254,15 @@ Con *create_workspace_on_output(Output *output, Con *content) { continue; } - exists = (get_existing_workspace_by_name(target_name) != NULL); + const int num = ws_name_to_number(target_name); + exists = (num == -1) + ? get_existing_workspace_by_name(target_name) + : get_existing_workspace_by_num(num); if (!exists) { ws->name = sstrdup(target_name); /* Set ->num to the number of the workspace, if the name actually * is a number or starts with a number */ - ws->num = ws_name_to_number(ws->name); + ws->num = num; LOG("Used number %d for workspace with name %s\n", ws->num, ws->name); break;