X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fworkspace.c;h=9441042ed38a2e71cf86720f99d76ccb438930d2;hb=bc439de755d23b7f0f7cad76aed23f975aa0c722;hp=643b78dd49c634341290843f4fe4cc5954bd6d45;hpb=145a93d5b44412f04d4966f286876c19601e053b;p=i3%2Fi3 diff --git a/src/workspace.c b/src/workspace.c index 643b78dd..9441042e 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -67,6 +67,33 @@ static void _workspace_apply_default_orientation(Con *ws) { } } +/* + * Returns the first output that is assigned to a workspace specified by the + * given name or number or NULL if no such output exists. If there is a + * workspace with a matching name and another workspace with a matching number, + * the output assigned to the first one is returned. + * If 'name' is NULL it will be ignored. + * If 'parsed_num' is -1 it will be ignored. + * + */ +static Con *get_assigned_output(const char *name, long parsed_num) { + Con *output = NULL; + + struct Workspace_Assignment *assignment; + TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { + if (name && strcmp(assignment->name, name) == 0) { + DLOG("Found workspace name assignment to output \"%s\"\n", assignment->output); + GREP_FIRST(output, croot, !strcmp(child->name, assignment->output)); + break; + } else if (parsed_num != -1 && name_is_digits(assignment->name) && ws_name_to_number(assignment->name) == parsed_num) { + DLOG("Found workspace number assignment to output \"%s\"\n", assignment->output); + GREP_FIRST(output, croot, !strcmp(child->name, assignment->output)); + } + } + + return output; +} + /* * Returns a pointer to the workspace with the given number (starting at 0), * creating the workspace if necessary (by allocating the necessary amount of @@ -78,25 +105,16 @@ Con *workspace_get(const char *num, bool *created) { if (workspace == NULL) { LOG("Creating new workspace \"%s\"\n", num); - /* unless an assignment is found, we will create this workspace on the current output */ - Con *output = con_get_output(focused); - /* look for assignments */ - struct Workspace_Assignment *assignment; /* We set workspace->num to the number if this workspace’s name begins * with a positive number. Otherwise it’s a named ws and num will be * -1. */ long parsed_num = ws_name_to_number(num); - TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { - if (strcmp(assignment->name, num) == 0) { - DLOG("Found workspace name assignment to output \"%s\"\n", assignment->output); - GREP_FIRST(output, croot, !strcmp(child->name, assignment->output)); - break; - } else if (parsed_num != -1 && name_is_digits(assignment->name) && ws_name_to_number(assignment->name) == parsed_num) { - DLOG("Found workspace number assignment to output \"%s\"\n", assignment->output); - GREP_FIRST(output, croot, !strcmp(child->name, assignment->output)); - } + Con *output = get_assigned_output(num, parsed_num); + /* if an assignment is not found, we create this workspace on the current output */ + if (!output) { + output = con_get_output(focused); } Con *content = output_get_content(output); @@ -208,19 +226,10 @@ Con *create_workspace_on_output(Output *output, Con *content) { /* Ensure that this workspace is not assigned to a different output — * otherwise we would create it, then move it over to its output, then * find a new workspace, etc… */ - bool assigned = false; - struct Workspace_Assignment *assignment; - TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) { - if (strcmp(assignment->name, target_name) != 0 || - strcmp(assignment->output, output_primary_name(output)) == 0) - continue; - - assigned = true; - break; - } - - if (assigned) + Con *assigned = get_assigned_output(target_name, -1); + if (assigned && assigned != output->con) { continue; + } exists = (get_existing_workspace_by_name(target_name) != NULL); if (!exists) { @@ -923,8 +932,8 @@ Con *workspace_encapsulate(Con *ws) { * Move the given workspace to the specified output. * This returns true if and only if moving the workspace was successful. */ -bool workspace_move_to_output(Con *ws, const char *name) { - LOG("Trying to move workspace %p / %s to output \"%s\".\n", ws, ws->name, name); +bool workspace_move_to_output(Con *ws, Output *output) { + LOG("Trying to move workspace %p / %s to output %p / \"%s\".\n", ws, ws->name, output, output_primary_name(output)); Output *current_output = get_output_for_con(ws); if (current_output == NULL) { @@ -932,12 +941,6 @@ bool workspace_move_to_output(Con *ws, const char *name) { return false; } - Output *output = get_output_from_string(current_output, name); - if (!output) { - ELOG("Could not get output from string \"%s\"\n", name); - return false; - } - Con *content = output_get_content(output->con); LOG("got output %p with content %p\n", output, content);