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().
next
Orestis Floros 2018-03-28 03:35:40 +03:00
parent 6339427f01
commit bc439de755
No known key found for this signature in database
GPG Key ID: E9AD9F32E401E38F
1 changed files with 34 additions and 25 deletions

View File

@ -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 workspaces name begins
* with a positive number. Otherwise its 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) {