From 0b5799412aa1fec5f989ecdea410acc46b10e9a4 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Tue, 27 Mar 2018 22:36:51 +0300 Subject: [PATCH] Introduce get_existing_workspace_by_num --- include/workspace.h | 7 +++++++ src/commands.c | 15 ++------------- src/manage.c | 6 +----- src/workspace.c | 25 ++++++++++++++++--------- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/include/workspace.h b/include/workspace.h index 3e7183b9..1cb24939 100644 --- a/include/workspace.h +++ b/include/workspace.h @@ -31,6 +31,13 @@ */ Con *get_existing_workspace_by_name(const char *name); +/** + * Returns the workspace with the given number or NULL if such a workspace does + * not exist. + * + */ +Con *get_existing_workspace_by_num(int num); + /** * Returns a pointer to the workspace with the given number (starting at 0), * creating the workspace if necessary (by allocating the necessary amount of diff --git a/src/commands.c b/src/commands.c index e6f6174b..d2d15618 100644 --- a/src/commands.c +++ b/src/commands.c @@ -394,21 +394,15 @@ void cmd_move_con_to_workspace_number(I3_CMD, const char *which, const char *_no } LOG("should move window to workspace %s\n", which); - /* get the workspace */ - Con *output, *ws = NULL; long parsed_num = ws_name_to_number(which); - if (parsed_num == -1) { LOG("Could not parse initial part of \"%s\" as a number.\n", which); yerror("Could not parse number \"%s\"", which); return; } - TAILQ_FOREACH(output, &(croot->nodes_head), nodes) - GREP_FIRST(ws, output_get_content(output), - child->num == parsed_num); - + Con *ws = get_existing_workspace_by_num(parsed_num); if (!ws) { ws = workspace_get(which, NULL); } @@ -901,7 +895,6 @@ void cmd_workspace(I3_CMD, const char *which) { */ void cmd_workspace_number(I3_CMD, const char *which, const char *_no_auto_back_and_forth) { const bool no_auto_back_and_forth = (_no_auto_back_and_forth != NULL); - Con *output, *workspace = NULL; if (con_get_fullscreen_con(croot, CF_GLOBAL)) { LOG("Cannot switch workspace while in global fullscreen\n"); @@ -910,17 +903,13 @@ void cmd_workspace_number(I3_CMD, const char *which, const char *_no_auto_back_a } long parsed_num = ws_name_to_number(which); - if (parsed_num == -1) { LOG("Could not parse initial part of \"%s\" as a number.\n", which); yerror("Could not parse number \"%s\"", which); return; } - TAILQ_FOREACH(output, &(croot->nodes_head), nodes) - GREP_FIRST(workspace, output_get_content(output), - child->num == parsed_num); - + Con *workspace = get_existing_workspace_by_num(parsed_num); if (!workspace) { LOG("There is no workspace with number %ld, creating a new one.\n", parsed_num); ysuccess(true); diff --git a/src/manage.c b/src/manage.c index 8b306052..9dcc93f5 100644 --- a/src/manage.c +++ b/src/manage.c @@ -265,13 +265,9 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki Con *assigned_ws = NULL; if (assignment->type == A_TO_WORKSPACE_NUMBER) { - Con *output = NULL; long parsed_num = ws_name_to_number(assignment->dest.workspace); - /* This will only work for workspaces that already exist. */ - TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { - GREP_FIRST(assigned_ws, output_get_content(output), child->num == parsed_num); - } + assigned_ws = get_existing_workspace_by_num(parsed_num); } /* A_TO_WORKSPACE type assignment or fallback from A_TO_WORKSPACE_NUMBER * when the target workspace number does not exist yet. */ diff --git a/src/workspace.c b/src/workspace.c index bdd6f6f4..643b78dd 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -33,6 +33,20 @@ Con *get_existing_workspace_by_name(const char *name) { return workspace; } +/* + * Returns the workspace with the given number or NULL if such a workspace does + * not exist. + * + */ +Con *get_existing_workspace_by_num(int num) { + Con *output, *workspace = NULL; + TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { + GREP_FIRST(workspace, output_get_content(output), child->num == num); + } + + return workspace; +} + /* * Sets ws->layout to splith/splitv if default_orientation was specified in the * configfile. Otherwise, it uses splith/splitv depending on whether the output @@ -225,17 +239,10 @@ Con *create_workspace_on_output(Output *output, Con *content) { DLOG("Getting next unused workspace by number\n"); int c = 0; while (exists) { - c++; - - ws->num = c; - - Con *out, *current = NULL; - TAILQ_FOREACH(out, &(croot->nodes_head), nodes) - GREP_FIRST(current, output_get_content(out), child->num == ws->num); - exists = (current != NULL); - + exists = (get_existing_workspace_by_num(++c) != NULL); DLOG("result for ws %d: exists = %d\n", c, exists); } + ws->num = c; sasprintf(&(ws->name), "%d", c); } con_attach(ws, content, false); -- 2.39.2