Introduce get_assigned_output
This also replaces code in create_workspace_on_output() that is theoretically more efficient but: 1. It isn't a huge difference since it depends on the number of outputs, that shouldn't be high. 2. get_assigned_output will be modified and used for #555, then its logic should be followed in create_workspace_on_output() too. Another note for create_workspace_on_output: if assigned is not NULL the condition (assigned != output->con) should never be false, ie if there is an assigned output to this name, it isn't the current one. This happens because the current callers check for assignments before calling create_workspace_on_output().
This commit is contained in:
parent
6339427f01
commit
bc439de755
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue