mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Merge pull request #2439 from RedSoxFan/fix-2434
Allow a fallback color to be specified for swaybg
This commit is contained in:
		
						commit
						78c0f013dd
					
				
					 5 changed files with 57 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -151,6 +151,7 @@ struct output_config {
 | 
			
		|||
 | 
			
		||||
	char *background;
 | 
			
		||||
	char *background_option;
 | 
			
		||||
	char *background_fallback;
 | 
			
		||||
	enum config_dpms dpms_state;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@
 | 
			
		|||
#include <errno.h>
 | 
			
		||||
#include "sway/commands.h"
 | 
			
		||||
#include "sway/config.h"
 | 
			
		||||
#include "sway/swaynag.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "stringop.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +37,7 @@ struct cmd_results *output_cmd_background(int argc, char **argv) {
 | 
			
		|||
		output->background = calloc(1, strlen(argv[0]) + 3);
 | 
			
		||||
		snprintf(output->background, strlen(argv[0]) + 3, "\"%s\"", argv[0]);
 | 
			
		||||
		output->background_option = strdup("solid_color");
 | 
			
		||||
		output->background_fallback = NULL;
 | 
			
		||||
		argc -= 2; argv += 2;
 | 
			
		||||
	} else {
 | 
			
		||||
		bool valid = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -104,16 +106,35 @@ struct cmd_results *output_cmd_background(int argc, char **argv) {
 | 
			
		|||
			free(conf);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (access(src, F_OK) == -1) {
 | 
			
		||||
			struct cmd_results *cmd_res = cmd_results_new(CMD_FAILURE, "output",
 | 
			
		||||
				"Unable to access background file '%s': %s", src, strerror(errno));
 | 
			
		||||
			free(src);
 | 
			
		||||
			return cmd_res;
 | 
			
		||||
		bool can_access = access(src, F_OK) != -1;
 | 
			
		||||
		if (!can_access) {
 | 
			
		||||
			wlr_log(WLR_ERROR, "Unable to access background file '%s': %s",
 | 
			
		||||
					src, strerror(errno));
 | 
			
		||||
			if (!config->validating) {
 | 
			
		||||
				swaynag_log(config->swaynag_command,
 | 
			
		||||
						&config->swaynag_config_errors,
 | 
			
		||||
						"Unable to access background file '%s'", src);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			free(src);
 | 
			
		||||
		} else {
 | 
			
		||||
			output->background = src;
 | 
			
		||||
			output->background_option = strdup(mode);
 | 
			
		||||
		}
 | 
			
		||||
		argc -= j + 1; argv += j + 1;
 | 
			
		||||
 | 
			
		||||
		output->background_fallback = NULL;
 | 
			
		||||
		if (argc && *argv[0] == '#') {
 | 
			
		||||
			output->background_fallback = calloc(1, strlen(argv[0]) + 3);
 | 
			
		||||
			snprintf(output->background_fallback, strlen(argv[0]) + 3,
 | 
			
		||||
					"\"%s\"", argv[0]);
 | 
			
		||||
			argc--; argv++;
 | 
			
		||||
 | 
			
		||||
			if (!can_access) {
 | 
			
		||||
				output->background = output->background_fallback;
 | 
			
		||||
				output->background_option = strdup("solid_color");
 | 
			
		||||
				output->background_fallback = NULL;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	config->handler_context.leftovers.argc = argc;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,6 +77,10 @@ void merge_output_config(struct output_config *dst, struct output_config *src) {
 | 
			
		|||
		free(dst->background_option);
 | 
			
		||||
		dst->background_option = strdup(src->background_option);
 | 
			
		||||
	}
 | 
			
		||||
	if (src->background_fallback) {
 | 
			
		||||
		free(dst->background_fallback);
 | 
			
		||||
		dst->background_fallback = strdup(src->background_fallback);
 | 
			
		||||
	}
 | 
			
		||||
	if (src->dpms_state != 0) {
 | 
			
		||||
		dst->dpms_state = src->dpms_state;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -226,17 +230,19 @@ void apply_output_config(struct output_config *oc, struct sway_container *output
 | 
			
		|||
		wlr_log(WLR_DEBUG, "Setting background for output %d to %s",
 | 
			
		||||
				output_i, oc->background);
 | 
			
		||||
 | 
			
		||||
		size_t len = snprintf(NULL, 0, "%s %d %s %s",
 | 
			
		||||
		size_t len = snprintf(NULL, 0, "%s %d %s %s %s",
 | 
			
		||||
				config->swaybg_command ? config->swaybg_command : "swaybg",
 | 
			
		||||
				output_i, oc->background, oc->background_option);
 | 
			
		||||
				output_i, oc->background, oc->background_option,
 | 
			
		||||
				oc->background_fallback ? oc->background_fallback : "");
 | 
			
		||||
		char *command = malloc(len + 1);
 | 
			
		||||
		if (!command) {
 | 
			
		||||
			wlr_log(WLR_DEBUG, "Unable to allocate swaybg command");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		snprintf(command, len + 1, "%s %d %s %s",
 | 
			
		||||
		snprintf(command, len + 1, "%s %d %s %s %s",
 | 
			
		||||
				config->swaybg_command ? config->swaybg_command : "swaybg",
 | 
			
		||||
				output_i, oc->background, oc->background_option);
 | 
			
		||||
				output_i, oc->background, oc->background_option,
 | 
			
		||||
				oc->background_fallback ? oc->background_fallback : "");
 | 
			
		||||
		wlr_log(WLR_DEBUG, "-> %s", command);
 | 
			
		||||
 | 
			
		||||
		char *const cmd[] = { "sh", "-c", command, NULL };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -489,9 +489,13 @@ The default colors are:
 | 
			
		|||
	setting an integral scale factor and adjusting the font size of your
 | 
			
		||||
	applications to taste.
 | 
			
		||||
 | 
			
		||||
*output* <name> background|bg <file> <mode>
 | 
			
		||||
*output* <name> background|bg <file> <mode> [<fallback\_color>]
 | 
			
		||||
	Sets the wallpaper for the given output to the specified file, using the
 | 
			
		||||
	given scaling mode (one of "stretch", "fill", "fit", "center", "tile").
 | 
			
		||||
	given scaling mode (one of "stretch", "fill", "fit", "center", "tile"). If
 | 
			
		||||
	the specified file cannot be accessed or if the image does fill the entire
 | 
			
		||||
	output, a fallback color may be provided to cover the rest of the output.
 | 
			
		||||
	__fallback\_color__ should be specified as _#RRGGBB_. Alpha is not
 | 
			
		||||
	supported.
 | 
			
		||||
 | 
			
		||||
**output** <name> background|bg <color> solid\_color
 | 
			
		||||
	Sets the background of the given output to the specified color. _color_
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@ struct swaybg_args {
 | 
			
		|||
	int output_idx;
 | 
			
		||||
	const char *path;
 | 
			
		||||
	enum background_mode mode;
 | 
			
		||||
	const char *fallback;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct swaybg_context {
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +77,10 @@ static void render_frame(struct swaybg_state *state) {
 | 
			
		|||
		cairo_set_source_u32(cairo, state->context.color);
 | 
			
		||||
		cairo_paint(cairo);
 | 
			
		||||
	} else {
 | 
			
		||||
		if (state->args->fallback && state->context.color) {
 | 
			
		||||
			cairo_set_source_u32(cairo, state->context.color);
 | 
			
		||||
			cairo_paint(cairo);
 | 
			
		||||
		}
 | 
			
		||||
		render_background_image(cairo, state->context.image,
 | 
			
		||||
				state->args->mode, buffer_width, buffer_height);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -91,6 +96,9 @@ static bool prepare_context(struct swaybg_state *state) {
 | 
			
		|||
		state->context.color = parse_color(state->args->path);
 | 
			
		||||
		return is_valid_color(state->args->path);
 | 
			
		||||
	}
 | 
			
		||||
	if (state->args->fallback && is_valid_color(state->args->fallback)) {
 | 
			
		||||
		state->context.color = parse_color(state->args->fallback);
 | 
			
		||||
	}
 | 
			
		||||
	if (!(state->context.image = load_background_image(state->args->path))) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -190,7 +198,7 @@ int main(int argc, const char **argv) {
 | 
			
		|||
	state.args = &args;
 | 
			
		||||
	wlr_log_init(WLR_DEBUG, NULL);
 | 
			
		||||
 | 
			
		||||
	if (argc != 4) {
 | 
			
		||||
	if (argc < 4 || argc > 5) {
 | 
			
		||||
		wlr_log(WLR_ERROR, "Do not run this program manually. "
 | 
			
		||||
				"See man 5 sway and look for output options.");
 | 
			
		||||
		return 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -202,6 +210,9 @@ int main(int argc, const char **argv) {
 | 
			
		|||
	if (args.mode == BACKGROUND_MODE_INVALID) {
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	args.fallback = argc == 5 ? argv[4] : NULL;
 | 
			
		||||
 | 
			
		||||
	if (!prepare_context(&state)) {
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue