cmd_workspace: Don't fill up config->workspace_outputs with duplicates.

This also fixes a bug where issuing a new "workspace a output b" command
for an already assigned workspace would not work (the old config would
be found first and used instead).
master
S. Christoffer Eliesen 10 years ago
parent d0af224e6d
commit 5531dbe1b2

@ -54,10 +54,10 @@ void list_sort(list_t *list, int compare(const void *left, const void *right)) {
qsort(list->items, list->length, sizeof(void *), compare);
}
int list_seq_find(list_t *list, int (*cmp)(const void *item, const void *data), const void *data) {
int list_seq_find(list_t *list, int compare(const void *item, const void *data), const void *data) {
for (int i = 0; i < list->length; i++) {
void *item = list->items[i];
if ((cmp)(item, data) == 0) {
if (compare(item, data) == 0) {
return i;
}
}

@ -102,6 +102,8 @@ char *do_var_replacement(char *str);
void apply_output_config(struct output_config *oc, swayc_t *output);
void free_output_config(struct output_config *oc);
int workspace_output_cmp_workspace(const void *a, const void *b);
/**
* Global config singleton.
*/

@ -1318,9 +1318,15 @@ static struct cmd_results *cmd_workspace(int argc, char **argv) {
return error;
}
struct workspace_output *wso = calloc(1, sizeof(struct workspace_output));
sway_log(L_DEBUG, "Assigning workspace %s to output %s", argv[0], argv[2]);
wso->workspace = strdup(argv[0]);
wso->output = strdup(argv[2]);
int i = -1;
if ((i = list_seq_find(config->workspace_outputs, workspace_output_cmp_workspace, wso)) != -1) {
struct workspace_output *old = config->workspace_outputs->items[i];
free(old); // workspaces can only be assigned to a single output
list_del(config->workspace_outputs, i);
}
sway_log(L_DEBUG, "Assigning workspace %s to output %s", argv[0], argv[2]);
list_add(config->workspace_outputs, wso);
if (!config->reading) {
// TODO: Move workspace to output. (dont do so when reloading)

@ -375,3 +375,11 @@ char *do_var_replacement(char *str) {
}
return str;
}
// the naming is intentional (albeit long): a workspace_output_cmp function
// would compare two structs in full, while this method only compares the
// workspace.
int workspace_output_cmp_workspace(const void *a, const void *b) {
const struct workspace_output *wsa = a, *wsb = b;
return lenient_strcmp(wsa->workspace, wsb->workspace);
}

Loading…
Cancel
Save