mirror of
https://github.com/swaywm/sway.git
synced 2024-12-30 17:06:40 +01:00
Merge pull request #2320 from RedSoxFan/reset-outputs-on-reload
Reset outputs on reload
This commit is contained in:
commit
27f65b94ae
4 changed files with 95 additions and 55 deletions
|
@ -464,8 +464,12 @@ void apply_output_config(struct output_config *oc,
|
||||||
|
|
||||||
struct output_config *store_output_config(struct output_config *oc);
|
struct output_config *store_output_config(struct output_config *oc);
|
||||||
|
|
||||||
|
void apply_output_config_to_outputs(struct output_config *oc);
|
||||||
|
|
||||||
void free_output_config(struct output_config *oc);
|
void free_output_config(struct output_config *oc);
|
||||||
|
|
||||||
|
void create_default_output_configs(void);
|
||||||
|
|
||||||
int workspace_output_cmp_workspace(const void *a, const void *b);
|
int workspace_output_cmp_workspace(const void *a, const void *b);
|
||||||
|
|
||||||
int sway_binding_cmp(const void *a, const void *b);
|
int sway_binding_cmp(const void *a, const void *b);
|
||||||
|
|
|
@ -21,60 +21,6 @@ static struct cmd_handler output_handlers[] = {
|
||||||
{ "transform", output_cmd_transform },
|
{ "transform", output_cmd_transform },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct output_config *get_output_config(char *name, char *identifier) {
|
|
||||||
int i = list_seq_find(config->output_configs, output_name_cmp, name);
|
|
||||||
if (i >= 0) {
|
|
||||||
return config->output_configs->items[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
i = list_seq_find(config->output_configs, output_name_cmp, identifier);
|
|
||||||
if (i >= 0) {
|
|
||||||
return config->output_configs->items[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void apply_output_config_to_outputs(struct output_config *oc) {
|
|
||||||
// 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 wlroots.
|
|
||||||
bool wildcard = strcmp(oc->name, "*") == 0;
|
|
||||||
char id[128];
|
|
||||||
struct sway_output *sway_output;
|
|
||||||
wl_list_for_each(sway_output, &root_container.sway_root->outputs, link) {
|
|
||||||
char *name = sway_output->wlr_output->name;
|
|
||||||
output_get_identifier(id, sizeof(id), sway_output);
|
|
||||||
if (wildcard || !strcmp(name, oc->name) || !strcmp(id, oc->name)) {
|
|
||||||
if (!sway_output->swayc) {
|
|
||||||
if (!oc->enabled) {
|
|
||||||
if (!wildcard) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
output_enable(sway_output);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct output_config *current = oc;
|
|
||||||
if (wildcard) {
|
|
||||||
struct output_config *tmp = get_output_config(name, id);
|
|
||||||
if (tmp) {
|
|
||||||
current = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
apply_output_config(current, sway_output->swayc);
|
|
||||||
|
|
||||||
if (!wildcard) {
|
|
||||||
// Stop looking if the output config isn't applicable to all
|
|
||||||
// outputs
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct cmd_results *cmd_output(int argc, char **argv) {
|
struct cmd_results *cmd_output(int argc, char **argv) {
|
||||||
struct cmd_results *error = checkarg(argc, "output", EXPECTED_AT_LEAST, 1);
|
struct cmd_results *error = checkarg(argc, "output", EXPECTED_AT_LEAST, 1);
|
||||||
if (error != NULL) {
|
if (error != NULL) {
|
||||||
|
@ -115,7 +61,13 @@ struct cmd_results *cmd_output(int argc, char **argv) {
|
||||||
config->handler_context.leftovers.argv = NULL;
|
config->handler_context.leftovers.argv = NULL;
|
||||||
|
|
||||||
output = store_output_config(output);
|
output = store_output_config(output);
|
||||||
apply_output_config_to_outputs(output);
|
|
||||||
|
// If reloading, the output configs will be applied after reading the
|
||||||
|
// entire config and before the deferred commands so that an auto generated
|
||||||
|
// workspace name is not given to re-enabled outputs.
|
||||||
|
if (!config->reloading) {
|
||||||
|
apply_output_config_to_outputs(output);
|
||||||
|
}
|
||||||
|
|
||||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||||
|
|
||||||
|
|
|
@ -361,6 +361,7 @@ bool load_main_config(const char *file, bool is_active) {
|
||||||
wlr_log(WLR_DEBUG, "Performing configuration file reload");
|
wlr_log(WLR_DEBUG, "Performing configuration file reload");
|
||||||
config->reloading = true;
|
config->reloading = true;
|
||||||
config->active = true;
|
config->active = true;
|
||||||
|
create_default_output_configs();
|
||||||
}
|
}
|
||||||
|
|
||||||
config->current_config_path = path;
|
config->current_config_path = path;
|
||||||
|
@ -419,6 +420,9 @@ bool load_main_config(const char *file, bool is_active) {
|
||||||
success = success && load_config(path, config);
|
success = success && load_config(path, config);
|
||||||
|
|
||||||
if (is_active) {
|
if (is_active) {
|
||||||
|
for (int i = 0; i < config->output_configs->length; i++) {
|
||||||
|
apply_output_config_to_outputs(config->output_configs->items[i]);
|
||||||
|
}
|
||||||
config->reloading = false;
|
config->reloading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -263,6 +263,60 @@ void apply_output_config(struct output_config *oc, struct sway_container *output
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct output_config *get_output_config(char *name, char *identifier) {
|
||||||
|
int i = list_seq_find(config->output_configs, output_name_cmp, name);
|
||||||
|
if (i >= 0) {
|
||||||
|
return config->output_configs->items[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
i = list_seq_find(config->output_configs, output_name_cmp, identifier);
|
||||||
|
if (i >= 0) {
|
||||||
|
return config->output_configs->items[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void apply_output_config_to_outputs(struct output_config *oc) {
|
||||||
|
// 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 wlroots.
|
||||||
|
bool wildcard = strcmp(oc->name, "*") == 0;
|
||||||
|
char id[128];
|
||||||
|
struct sway_output *sway_output;
|
||||||
|
wl_list_for_each(sway_output, &root_container.sway_root->outputs, link) {
|
||||||
|
char *name = sway_output->wlr_output->name;
|
||||||
|
output_get_identifier(id, sizeof(id), sway_output);
|
||||||
|
if (wildcard || !strcmp(name, oc->name) || !strcmp(id, oc->name)) {
|
||||||
|
if (!sway_output->swayc) {
|
||||||
|
if (!oc->enabled) {
|
||||||
|
if (!wildcard) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
output_enable(sway_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct output_config *current = oc;
|
||||||
|
if (wildcard) {
|
||||||
|
struct output_config *tmp = get_output_config(name, id);
|
||||||
|
if (tmp) {
|
||||||
|
current = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apply_output_config(current, sway_output->swayc);
|
||||||
|
|
||||||
|
if (!wildcard) {
|
||||||
|
// Stop looking if the output config isn't applicable to all
|
||||||
|
// outputs
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void free_output_config(struct output_config *oc) {
|
void free_output_config(struct output_config *oc) {
|
||||||
if (!oc) {
|
if (!oc) {
|
||||||
return;
|
return;
|
||||||
|
@ -272,3 +326,29 @@ void free_output_config(struct output_config *oc) {
|
||||||
free(oc->background_option);
|
free(oc->background_option);
|
||||||
free(oc);
|
free(oc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void default_output_config(struct output_config *oc,
|
||||||
|
struct wlr_output *wlr_output) {
|
||||||
|
oc->enabled = 1;
|
||||||
|
if (!wl_list_empty(&wlr_output->modes)) {
|
||||||
|
struct wlr_output_mode *mode =
|
||||||
|
wl_container_of(wlr_output->modes.prev, mode, link);
|
||||||
|
oc->width = mode->width;
|
||||||
|
oc->height = mode->height;
|
||||||
|
oc->refresh_rate = mode->refresh;
|
||||||
|
}
|
||||||
|
oc->x = oc->y = -1;
|
||||||
|
oc->scale = 1;
|
||||||
|
oc->transform = WL_OUTPUT_TRANSFORM_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void create_default_output_configs(void) {
|
||||||
|
struct sway_output *sway_output;
|
||||||
|
wl_list_for_each(sway_output, &root_container.sway_root->outputs, link) {
|
||||||
|
char *name = sway_output->wlr_output->name;
|
||||||
|
struct output_config *oc = new_output_config(name);
|
||||||
|
default_output_config(oc, sway_output->wlr_output);
|
||||||
|
list_add(config->output_configs, oc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue