aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/config.h3
-rw-r--r--sway/commands.c14
-rw-r--r--sway/config.c29
-rw-r--r--sway/container.c30
4 files changed, 49 insertions, 27 deletions
diff --git a/include/config.h b/include/config.h
index 676218c8..2a8e36fa 100644
--- a/include/config.h
+++ b/include/config.h
@@ -6,6 +6,7 @@
#include <xkbcommon/xkbcommon.h>
#include "list.h"
#include "layout.h"
+#include "container.h"
struct sway_variable {
char *name;
@@ -62,6 +63,8 @@ struct sway_config {
bool load_config(const char *file);
bool read_config(FILE *file, bool is_active);
char *do_var_replacement(char *str);
+// Setup output container by applying given config
+void apply_output_config(struct output_config *oc, swayc_t *output);
extern struct sway_config *config;
diff --git a/sway/commands.c b/sway/commands.c
index 7b026fd2..9eb0928e 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -622,6 +622,20 @@ static enum cmd_status cmd_output(int argc, char **argv) {
sway_log(L_DEBUG, "Config stored for output %s (%d x %d @ %d, %d)",
output->name, output->width, output->height, output->x, output->y);
+ if (output->name) {
+ // Try to find the output container and apply configuration now. If
+ // this is during startup then there will be no container and config
+ // will be applied during normal "new output" event from wlc.
+ swayc_t *cont = NULL;
+ for (int i = 0; i < root_container.children->length; ++i) {
+ cont = root_container.children->items[i];
+ if (cont->name && strcmp(cont->name, output->name) == 0) {
+ apply_output_config(output, cont);
+ break;
+ }
+ }
+ }
+
return CMD_SUCCESS;
}
diff --git a/sway/config.c b/sway/config.c
index 46a26424..b5d442c5 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -283,6 +283,35 @@ bool read_config(FILE *file, bool is_active) {
return success;
}
+void apply_output_config(struct output_config *oc, swayc_t *output) {
+ if (oc && oc->width != -1 && oc->height != -1) {
+ output->width = oc->width;
+ output->height = oc->height;
+
+ sway_log(L_DEBUG, "Set %s size to %ix%i", oc->name, oc->width, oc->height);
+ struct wlc_size new_size = { .w = oc->width, .h = oc->height };
+ wlc_output_set_resolution(output->handle, &new_size);
+ }
+
+ // Find position for it
+ if (oc && oc->x != -1 && oc->y != -1) {
+ sway_log(L_DEBUG, "Set %s position to %d, %d", oc->name, oc->x, oc->y);
+ output->x = oc->x;
+ output->y = oc->y;
+ } else {
+ int x = 0;
+ for (int i = 0; i < root_container.children->length; ++i) {
+ swayc_t *c = root_container.children->items[i];
+ if (c->type == C_OUTPUT) {
+ if (c->width + c->x > x) {
+ x = c->width + c->x;
+ }
+ }
+ }
+ output->x = x;
+ }
+}
+
char *do_var_replacement(char *str) {
int i;
char *find = str;
diff --git a/sway/container.c b/sway/container.c
index b8ff7150..6c4206fb 100644
--- a/sway/container.c
+++ b/sway/container.c
@@ -88,36 +88,12 @@ swayc_t *new_output(wlc_handle handle) {
}
swayc_t *output = new_swayc(C_OUTPUT);
- if (oc && oc->width != -1 && oc->height != -1) {
- output->width = oc->width;
- output->height = oc->height;
- struct wlc_size new_size = { .w = oc->width, .h = oc->height };
- wlc_output_set_resolution(handle, &new_size);
- } else {
- output->width = size->w;
- output->height = size->h;
- }
output->handle = handle;
output->name = name ? strdup(name) : NULL;
-
- // Find position for it
- if (oc && oc->x != -1 && oc->y != -1) {
- sway_log(L_DEBUG, "Set %s position to %d, %d", name, oc->x, oc->y);
- output->x = oc->x;
- output->y = oc->y;
- } else {
- int x = 0;
- for (i = 0; i < root_container.children->length; ++i) {
- swayc_t *c = root_container.children->items[i];
- if (c->type == C_OUTPUT) {
- if (c->width + c->x > x) {
- x = c->width + c->x;
- }
- }
- }
- output->x = x;
- }
+ output->width = size->w;
+ output->height = size->h;
+ apply_output_config(oc, output);
add_child(&root_container, output);
// Create workspace