aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-03-15 15:09:55 -0400
committerLibravatar Drew DeVault <sir@cmpwn.com>2019-03-16 10:40:46 -0600
commit3106ef23a7b4f7f7efeb43d47e724f5b23c4fd78 (patch)
tree82335e0f8877d291a36e3c67f8cfefe07bbdde56
parentFlush stdout in swaymsg when in subscribe mode (diff)
downloadsway-3106ef23a7b4f7f7efeb43d47e724f5b23c4fd78.tar.gz
sway-3106ef23a7b4f7f7efeb43d47e724f5b23c4fd78.tar.zst
sway-3106ef23a7b4f7f7efeb43d47e724f5b23c4fd78.zip
Fix output config retrieval for new outputs
This removes `output_find_config`, which would take the first matching output config it found. This is fine if only a name output config, identifier output config, or even just wildcard exist, but if there is a name output config and identifier output config, they are not merged. Instead, this introduces find_output_config, which is just a wrapper for `get_output_config`. This ensures that both the name and identifier output configs are respected. This fixes the following case: - For simplicity in this example, remove all output configs from config - Run `swaymsg output <name> bg #ff0000 solid_color` - Run `swaymsg output <identifier> scale 2` - Disconnect and reconnect output Without this, the output will have the background, but not the scale. With this, the output will have both the background and scale
-rw-r--r--include/sway/config.h2
-rw-r--r--include/sway/output.h2
-rw-r--r--sway/config/output.c6
-rw-r--r--sway/desktop/output.c4
-rw-r--r--sway/tree/output.c30
5 files changed, 10 insertions, 34 deletions
diff --git a/include/sway/config.h b/include/sway/config.h
index 46ca7cee..7c544541 100644
--- a/include/sway/config.h
+++ b/include/sway/config.h
@@ -585,6 +585,8 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output);
585 585
586struct output_config *store_output_config(struct output_config *oc); 586struct output_config *store_output_config(struct output_config *oc);
587 587
588struct output_config *find_output_config(struct sway_output *output);
589
588void apply_output_config_to_outputs(struct output_config *oc); 590void apply_output_config_to_outputs(struct output_config *oc);
589 591
590void reset_outputs(void); 592void reset_outputs(void);
diff --git a/include/sway/output.h b/include/sway/output.h
index 32ed1e28..8015f211 100644
--- a/include/sway/output.h
+++ b/include/sway/output.h
@@ -88,8 +88,6 @@ struct sway_output *output_by_name_or_id(const char *name_or_id);
88 88
89void output_sort_workspaces(struct sway_output *output); 89void output_sort_workspaces(struct sway_output *output);
90 90
91struct output_config *output_find_config(struct sway_output *output);
92
93void output_enable(struct sway_output *output, struct output_config *oc); 91void output_enable(struct sway_output *output, struct output_config *oc);
94 92
95void output_disable(struct sway_output *output); 93void output_disable(struct sway_output *output);
diff --git a/sway/config/output.c b/sway/config/output.c
index 1f55fd6a..a20c5ad4 100644
--- a/sway/config/output.c
+++ b/sway/config/output.c
@@ -438,6 +438,12 @@ static struct output_config *get_output_config(char *identifier,
438 return result; 438 return result;
439} 439}
440 440
441struct output_config *find_output_config(struct sway_output *output) {
442 char id[128];
443 output_get_identifier(id, sizeof(id), output);
444 return get_output_config(id, output);
445}
446
441void apply_output_config_to_outputs(struct output_config *oc) { 447void apply_output_config_to_outputs(struct output_config *oc) {
442 // Try to find the output container and apply configuration now. If 448 // Try to find the output container and apply configuration now. If
443 // this is during startup then there will be no container and config 449 // this is during startup then there will be no container and config
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 1d9abbfd..9d0c0ef5 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -533,7 +533,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
533static void handle_mode(struct wl_listener *listener, void *data) { 533static void handle_mode(struct wl_listener *listener, void *data) {
534 struct sway_output *output = wl_container_of(listener, output, mode); 534 struct sway_output *output = wl_container_of(listener, output, mode);
535 if (!output->configured && !output->enabled) { 535 if (!output->configured && !output->enabled) {
536 struct output_config *oc = output_find_config(output); 536 struct output_config *oc = find_output_config(output);
537 if (output->wlr_output->current_mode != NULL && 537 if (output->wlr_output->current_mode != NULL &&
538 (!oc || oc->enabled)) { 538 (!oc || oc->enabled)) {
539 // We want to enable this output, but it didn't work last time, 539 // We want to enable this output, but it didn't work last time,
@@ -634,7 +634,7 @@ void handle_new_output(struct wl_listener *listener, void *data) {
634 output->damage_destroy.notify = damage_handle_destroy; 634 output->damage_destroy.notify = damage_handle_destroy;
635 wl_list_init(&output->swaybg_client_destroy.link); 635 wl_list_init(&output->swaybg_client_destroy.link);
636 636
637 struct output_config *oc = output_find_config(output); 637 struct output_config *oc = find_output_config(output);
638 if (!oc || oc->enabled) { 638 if (!oc || oc->enabled) {
639 output_enable(output, oc); 639 output_enable(output, oc);
640 } else { 640 } else {
diff --git a/sway/tree/output.c b/sway/tree/output.c
index 227d487c..1202ba3c 100644
--- a/sway/tree/output.c
+++ b/sway/tree/output.c
@@ -267,36 +267,6 @@ void output_begin_destroy(struct sway_output *output) {
267 output->wlr_output = NULL; 267 output->wlr_output = NULL;
268} 268}
269 269
270struct output_config *output_find_config(struct sway_output *output) {
271 const char *name = output->wlr_output->name;
272 char identifier[128];
273 output_get_identifier(identifier, sizeof(identifier), output);
274
275 struct output_config *oc = NULL, *all = NULL;
276 for (int i = 0; i < config->output_configs->length; ++i) {
277 struct output_config *cur = config->output_configs->items[i];
278
279 if (strcasecmp(name, cur->name) == 0 ||
280 strcasecmp(identifier, cur->name) == 0) {
281 sway_log(SWAY_DEBUG, "Matched output config for %s", name);
282 oc = cur;
283 }
284 if (strcasecmp("*", cur->name) == 0) {
285 sway_log(SWAY_DEBUG, "Matched wildcard output config for %s", name);
286 all = cur;
287 }
288
289 if (oc && all) {
290 break;
291 }
292 }
293 if (!oc) {
294 oc = all;
295 }
296
297 return oc;
298}
299
300struct sway_output *output_from_wlr_output(struct wlr_output *output) { 270struct sway_output *output_from_wlr_output(struct wlr_output *output) {
301 return output->data; 271 return output->data;
302} 272}