config/output: Return merged config if any

merge_id_on_name and merge_wildcard_on_all look for a matching
configuration and merges the new configuration into them. The caller
ultimately needs a reference to merged configuration, so return if there
was a match.
This commit is contained in:
Kenny Levinsen 2024-03-08 21:12:08 +01:00
parent 0e69bec782
commit 92062cff53

View file

@ -141,20 +141,25 @@ void merge_output_config(struct output_config *dst, struct output_config *src) {
} }
} }
static void merge_wildcard_on_all(struct output_config *wildcard) { static struct output_config *merge_wildcard_on_all(struct output_config *wildcard) {
struct output_config *existing_wildcard = NULL;
for (int i = 0; i < config->output_configs->length; i++) { for (int i = 0; i < config->output_configs->length; i++) {
struct output_config *oc = config->output_configs->items[i]; struct output_config *oc = config->output_configs->items[i];
if (strcmp(wildcard->name, oc->name) != 0) {
sway_log(SWAY_DEBUG, "Merging output * config on %s", oc->name); sway_log(SWAY_DEBUG, "Merging output * config on %s", oc->name);
merge_output_config(oc, wildcard); merge_output_config(oc, wildcard);
if (strcmp(wildcard->name, oc->name) == 0) {
existing_wildcard = oc;
} }
} }
return existing_wildcard;
} }
static void merge_id_on_name(struct output_config *oc) { static struct output_config *merge_id_on_name(struct output_config *oc) {
struct sway_output *output = all_output_by_name_or_id(oc->name); struct sway_output *output = all_output_by_name_or_id(oc->name);
if (output == NULL) { if (output == NULL) {
return; return NULL;
} }
const char *name = output->wlr_output->name; const char *name = output->wlr_output->name;
@ -163,20 +168,24 @@ static void merge_id_on_name(struct output_config *oc) {
char *id_on_name = format_str("%s on %s", id, name); char *id_on_name = format_str("%s on %s", id, name);
if (!id_on_name) { if (!id_on_name) {
return; return NULL;
} }
int i = list_seq_find(config->output_configs, output_name_cmp, id_on_name); int i = list_seq_find(config->output_configs, output_name_cmp, id_on_name);
if (i >= 0) { if (i >= 0) {
sway_log(SWAY_DEBUG, "Merging on top of existing id on name config"); sway_log(SWAY_DEBUG, "Merging on top of existing id on name config");
merge_output_config(config->output_configs->items[i], oc); merge_output_config(config->output_configs->items[i], oc);
} else { free(id_on_name);
return config->output_configs->items[i];
}
// If both a name and identifier config, exist generate an id on name // If both a name and identifier config, exist generate an id on name
struct output_config *ion_oc = NULL;
int ni = list_seq_find(config->output_configs, output_name_cmp, name); int ni = list_seq_find(config->output_configs, output_name_cmp, name);
int ii = list_seq_find(config->output_configs, output_name_cmp, id); int ii = list_seq_find(config->output_configs, output_name_cmp, id);
if ((ni >= 0 && ii >= 0) || (ni >= 0 && strcmp(oc->name, id) == 0) if ((ni >= 0 && ii >= 0) || (ni >= 0 && strcmp(oc->name, id) == 0)
|| (ii >= 0 && strcmp(oc->name, name) == 0)) { || (ii >= 0 && strcmp(oc->name, name) == 0)) {
struct output_config *ion_oc = new_output_config(id_on_name); ion_oc = new_output_config(id_on_name);
if (ni >= 0) { if (ni >= 0) {
merge_output_config(ion_oc, config->output_configs->items[ni]); merge_output_config(ion_oc, config->output_configs->items[ni]);
} }
@ -194,8 +203,9 @@ static void merge_id_on_name(struct output_config *oc) {
ion_oc->background_option, ion_oc->power, ion_oc->background_option, ion_oc->power,
ion_oc->max_render_time); ion_oc->max_render_time);
} }
}
free(id_on_name); free(id_on_name);
return ion_oc;
} }
struct output_config *store_output_config(struct output_config *oc) { struct output_config *store_output_config(struct output_config *oc) {