mirror of
https://github.com/swaywm/sway.git
synced 2024-11-25 09:21:28 +00:00
config/output: Support multiple matches in find_output_config
Simplify find_output_config and inline the search through the output
configs instead of using list_seq_find with a comparator function. The
new implementation will merge any amount of matched configs in order,
which will be relied upon in a future commit.
(cherry picked from a0c0349934
)
This commit is contained in:
parent
af86879462
commit
5664103902
|
@ -26,13 +26,6 @@
|
|||
#include <wlr/backend/drm.h>
|
||||
#endif
|
||||
|
||||
int output_name_cmp(const void *item, const void *data) {
|
||||
const struct output_config *output = item;
|
||||
const char *name = data;
|
||||
|
||||
return strcmp(output->name, name);
|
||||
}
|
||||
|
||||
void output_get_identifier(char *identifier, size_t len,
|
||||
struct sway_output *output) {
|
||||
struct wlr_output *wlr_output = output->wlr_output;
|
||||
|
@ -624,8 +617,6 @@ static void default_output_config(struct output_config *oc,
|
|||
// configuration that applies to the specified output.
|
||||
struct output_config *find_output_config(struct sway_output *sway_output) {
|
||||
const char *name = sway_output->wlr_output->name;
|
||||
struct output_config *oc = NULL;
|
||||
|
||||
struct output_config *result = new_output_config(name);
|
||||
if (config->reloading) {
|
||||
default_output_config(result, sway_output->wlr_output);
|
||||
|
@ -634,25 +625,21 @@ struct output_config *find_output_config(struct sway_output *sway_output) {
|
|||
char id[128];
|
||||
output_get_identifier(id, sizeof(id), sway_output);
|
||||
|
||||
int i;
|
||||
bool match = false;
|
||||
if ((i = list_seq_find(config->output_configs, output_name_cmp, "*")) >= 0) {
|
||||
match = true;
|
||||
oc = config->output_configs->items[i];
|
||||
merge_output_config(result, oc);
|
||||
}
|
||||
if ((i = list_seq_find(config->output_configs, output_name_cmp, name)) >= 0) {
|
||||
match = true;
|
||||
oc = config->output_configs->items[i];
|
||||
merge_output_config(result, oc);
|
||||
}
|
||||
if ((i = list_seq_find(config->output_configs, output_name_cmp, id)) >= 0) {
|
||||
match = true;
|
||||
oc = config->output_configs->items[i];
|
||||
merge_output_config(result, oc);
|
||||
// We take a new config and merge on top, in order, the wildcard config,
|
||||
// output config by name, and output config by identifier to form the final
|
||||
// config. If there are multiple matches, they are merged in order.
|
||||
struct output_config *oc = NULL;
|
||||
const char *names[] = {"*", name, id, NULL};
|
||||
for (const char **name = &names[0]; *name; name++) {
|
||||
for (int idx = 0; idx < config->output_configs->length; idx++) {
|
||||
oc = config->output_configs->items[idx];
|
||||
if (strcmp(oc->name, *name) == 0) {
|
||||
merge_output_config(result, oc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!match && !config->reloading) {
|
||||
if (oc == NULL && !config->reloading) {
|
||||
// No name, identifier, or wildcard config. Since we are not
|
||||
// reloading with defaults, the output config will be empty, so
|
||||
// just return NULL
|
||||
|
|
Loading…
Reference in a new issue