Introduce get_existing_workspace_by_name

This commit is contained in:
Orestis Floros 2018-03-27 22:18:17 +03:00
parent 45be56be33
commit 6a2728ba79
No known key found for this signature in database
GPG Key ID: E9AD9F32E401E38F
5 changed files with 32 additions and 38 deletions

View File

@ -24,6 +24,13 @@
#define NET_WM_DESKTOP_NONE 0xFFFFFFF0 #define NET_WM_DESKTOP_NONE 0xFFFFFFF0
#define NET_WM_DESKTOP_ALL 0xFFFFFFFF #define NET_WM_DESKTOP_ALL 0xFFFFFFFF
/**
* Returns the workspace with the given name or NULL if such a workspace does
* not exist.
*
*/
Con *get_existing_workspace_by_name(const char *name);
/** /**
* Returns a pointer to the workspace with the given number (starting at 0), * Returns a pointer to the workspace with the given number (starting at 0),
* creating the workspace if necessary (by allocating the necessary amount of * creating the workspace if necessary (by allocating the necessary amount of

View File

@ -1955,11 +1955,9 @@ void cmd_rename_workspace(I3_CMD, const char *old_name, const char *new_name) {
LOG("Renaming current workspace to \"%s\"\n", new_name); LOG("Renaming current workspace to \"%s\"\n", new_name);
} }
Con *output, *workspace = NULL; Con *workspace;
if (old_name) { if (old_name) {
TAILQ_FOREACH(output, &(croot->nodes_head), nodes) workspace = get_existing_workspace_by_name(old_name);
GREP_FIRST(workspace, output_get_content(output),
!strcasecmp(child->name, old_name));
} else { } else {
workspace = con_get_workspace(focused); workspace = con_get_workspace(focused);
old_name = workspace->name; old_name = workspace->name;
@ -1970,10 +1968,7 @@ void cmd_rename_workspace(I3_CMD, const char *old_name, const char *new_name) {
return; return;
} }
Con *check_dest = NULL; Con *check_dest = get_existing_workspace_by_name(new_name);
TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
GREP_FIRST(check_dest, output_get_content(output),
!strcasecmp(child->name, new_name));
/* If check_dest == workspace, the user might be changing the case of the /* If check_dest == workspace, the user might be changing the case of the
* workspace, or it might just be a no-op. */ * workspace, or it might just be a no-op. */

View File

@ -108,18 +108,11 @@ static int json_end_map(void *ctx) {
/* Prevent name clashes when appending a workspace, e.g. when the /* Prevent name clashes when appending a workspace, e.g. when the
* user tries to restore a workspace called 1 but already has a * user tries to restore a workspace called 1 but already has a
* workspace called 1. */ * workspace called 1. */
Con *output;
Con *workspace = NULL;
TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, json_node->name));
char *base = sstrdup(json_node->name); char *base = sstrdup(json_node->name);
int cnt = 1; int cnt = 1;
while (workspace != NULL) { while (get_existing_workspace_by_name(json_node->name) != NULL) {
FREE(json_node->name); FREE(json_node->name);
sasprintf(&(json_node->name), "%s_%d", base, cnt++); sasprintf(&(json_node->name), "%s_%d", base, cnt++);
workspace = NULL;
TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, json_node->name));
} }
free(base); free(base);

View File

@ -427,11 +427,7 @@ void init_ws_for_output(Output *output, Con *content) {
if (strcmp(assignment->output, output_primary_name(output)) != 0) if (strcmp(assignment->output, output_primary_name(output)) != 0)
continue; continue;
/* check if this workspace actually exists */ Con *workspace = get_existing_workspace_by_name(assignment->name);
Con *workspace = NULL, *out;
TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
GREP_FIRST(workspace, output_get_content(out),
!strcasecmp(child->name, assignment->name));
if (workspace == NULL) if (workspace == NULL)
continue; continue;

View File

@ -19,6 +19,20 @@ static char *previous_workspace_name = NULL;
* keybindings. */ * keybindings. */
static char **binding_workspace_names = NULL; static char **binding_workspace_names = NULL;
/*
* Returns the workspace with the given name or NULL if such a workspace does
* not exist.
*
*/
Con *get_existing_workspace_by_name(const char *name) {
Con *output, *workspace = NULL;
TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, name));
}
return workspace;
}
/* /*
* Sets ws->layout to splith/splitv if default_orientation was specified in the * Sets ws->layout to splith/splitv if default_orientation was specified in the
* configfile. Otherwise, it uses splith/splitv depending on whether the output * configfile. Otherwise, it uses splith/splitv depending on whether the output
@ -46,15 +60,12 @@ static void _workspace_apply_default_orientation(Con *ws) {
* *
*/ */
Con *workspace_get(const char *num, bool *created) { Con *workspace_get(const char *num, bool *created) {
Con *output, *workspace = NULL; Con *workspace = get_existing_workspace_by_name(num);
TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, num));
if (workspace == NULL) { if (workspace == NULL) {
LOG("Creating new workspace \"%s\"\n", num); LOG("Creating new workspace \"%s\"\n", num);
/* unless an assignment is found, we will create this workspace on the current output */ /* unless an assignment is found, we will create this workspace on the current output */
output = con_get_output(focused); Con *output = con_get_output(focused);
/* look for assignments */ /* look for assignments */
struct Workspace_Assignment *assignment; struct Workspace_Assignment *assignment;
@ -172,7 +183,6 @@ void extract_workspace_names_from_bindings(void) {
*/ */
Con *create_workspace_on_output(Output *output, Con *content) { Con *create_workspace_on_output(Output *output, Con *content) {
/* add a workspace to this output */ /* add a workspace to this output */
Con *out, *current;
char *name; char *name;
bool exists = true; bool exists = true;
Con *ws = con_new(NULL, NULL); Con *ws = con_new(NULL, NULL);
@ -198,10 +208,7 @@ Con *create_workspace_on_output(Output *output, Con *content) {
if (assigned) if (assigned)
continue; continue;
current = NULL; exists = (get_existing_workspace_by_name(target_name) != NULL);
TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
GREP_FIRST(current, output_get_content(out), !strcasecmp(child->name, target_name));
exists = (current != NULL);
if (!exists) { if (!exists) {
ws->name = sstrdup(target_name); ws->name = sstrdup(target_name);
/* Set ->num to the number of the workspace, if the name actually /* Set ->num to the number of the workspace, if the name actually
@ -222,7 +229,7 @@ Con *create_workspace_on_output(Output *output, Con *content) {
ws->num = c; ws->num = c;
current = NULL; Con *out, *current = NULL;
TAILQ_FOREACH(out, &(croot->nodes_head), nodes) TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
GREP_FIRST(current, output_get_content(out), child->num == ws->num); GREP_FIRST(current, output_get_content(out), child->num == ws->num);
exists = (current != NULL); exists = (current != NULL);
@ -940,14 +947,10 @@ bool workspace_move_to_output(Con *ws, const char *name) {
TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) {
if (assignment->output == NULL || strcmp(assignment->output, output_primary_name(current_output)) != 0) if (assignment->output == NULL || strcmp(assignment->output, output_primary_name(current_output)) != 0)
continue; continue;
/* check if this workspace is already attached to the tree */ /* check if this workspace is already attached to the tree */
Con *workspace = NULL, *out; if (get_existing_workspace_by_name(assignment->name) != NULL) {
TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
GREP_FIRST(workspace, output_get_content(out),
!strcasecmp(child->name, assignment->name));
if (workspace != NULL)
continue; continue;
}
/* so create the workspace referenced to by this assignment */ /* so create the workspace referenced to by this assignment */
LOG("Creating workspace from assignment %s.\n", assignment->name); LOG("Creating workspace from assignment %s.\n", assignment->name);