diff options
| author | Reza Jelveh <[email protected]> | 2024-04-15 13:39:41 +0800 | 
|---|---|---|
| committer | GitHub <[email protected]> | 2024-04-15 01:39:41 -0400 | 
| commit | fb86ed6b0588dfdebfb66ce875bc63cfa0a897f6 (patch) | |
| tree | 29857a1769107adc58696f08d379f608aa4e29a2 /sway/commands | |
| parent | a5e79676c4bd22fc5902182acf0667907202a465 (diff) | |
feat: 1.9 merge (#277)
Co-authored-by: William McKinnon <[email protected]>
Co-authored-by: Erik Reider <[email protected]>
Diffstat (limited to 'sway/commands')
41 files changed, 261 insertions, 288 deletions
| diff --git a/sway/commands/assign.c b/sway/commands/assign.c index 976bc3cc..f7d911f7 100644 --- a/sway/commands/assign.c +++ b/sway/commands/assign.c @@ -17,7 +17,7 @@ struct cmd_results *cmd_assign(int argc, char **argv) {  	char *err_str = NULL;  	struct criteria *criteria = criteria_parse(argv[0], &err_str);  	if (!criteria) { -		error = cmd_results_new(CMD_INVALID, err_str); +		error = cmd_results_new(CMD_INVALID, "%s", err_str);  		free(err_str);  		return error;  	} diff --git a/sway/commands/bar.c b/sway/commands/bar.c index 8571d282..22756acb 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c @@ -73,12 +73,10 @@ struct cmd_results *cmd_bar(int argc, char **argv) {  		}  		++argv; --argc;  	} else if (config->reading && !config->current_bar) { -		int len = snprintf(NULL, 0, "bar-%d", config->bars->length) + 1; -		id = malloc(len * sizeof(char)); +		id = format_str("bar-%d", config->bars->length);  		if (!id) {  			return cmd_results_new(CMD_FAILURE, "Unable to allocate bar id");  		} -		snprintf(id, len, "bar-%d", config->bars->length);  	} else if (!config->reading && strcmp(argv[0], "mode") != 0 &&  			strcmp(argv[0], "hidden_state") != 0) {  		if (is_subcommand(argv[0])) { diff --git a/sway/commands/bar/bind.c b/sway/commands/bar/bind.c index b4b5bc45..8a837e3f 100644 --- a/sway/commands/bar/bind.c +++ b/sway/commands/bar/bind.c @@ -96,7 +96,7 @@ static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code,  	}  	if (message) {  		free_bar_binding(binding); -		error = cmd_results_new(CMD_INVALID, message); +		error = cmd_results_new(CMD_INVALID, "%s", message);  		free(message);  		return error;  	} else if (!binding->button) { diff --git a/sway/commands/bar/tray_bind.c b/sway/commands/bar/tray_bind.c index 243834ba..3dc9bc4c 100644 --- a/sway/commands/bar/tray_bind.c +++ b/sway/commands/bar/tray_bind.c @@ -26,7 +26,7 @@ static struct cmd_results *tray_bind(int argc, char **argv, bool code) {  	}  	if (message) {  		free(binding); -		error = cmd_results_new(CMD_INVALID, message); +		error = cmd_results_new(CMD_INVALID, "%s", message);  		free(message);  		return error;  	} else if (!binding->button) { diff --git a/sway/commands/bind.c b/sway/commands/bind.c index c0b383db..979e178f 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c @@ -127,7 +127,7 @@ static struct cmd_results *identify_key(const char* name, bool first_key,  		if (!button) {  			if (message) {  				struct cmd_results *error = -					cmd_results_new(CMD_INVALID, message); +					cmd_results_new(CMD_INVALID, "%s", message);  				free(message);  				return error;  			} else { @@ -143,7 +143,7 @@ static struct cmd_results *identify_key(const char* name, bool first_key,  		if (!button) {  			if (message) {  				struct cmd_results *error = -					cmd_results_new(CMD_INVALID, message); +					cmd_results_new(CMD_INVALID, "%s", message);  				free(message);  				return error;  			} else { @@ -182,7 +182,7 @@ static struct cmd_results *identify_key(const char* name, bool first_key,  			uint32_t button = get_mouse_bindsym(name, &message);  			if (message) {  				struct cmd_results *error = -					cmd_results_new(CMD_INVALID, message); +					cmd_results_new(CMD_INVALID, "%s", message);  				free(message);  				return error;  			} else if (button) { @@ -539,7 +539,7 @@ struct cmd_results *cmd_bind_or_unbind_switch(int argc, char **argv,  		free_switch_binding(binding);  		return cmd_results_new(CMD_FAILURE,  				"Invalid %s command (expected binding with the form " -				"<switch>:<state>)", bindtype, argc); +				"<switch>:<state>)", bindtype);  	}  	if (strcmp(split->items[0], "tablet") == 0) {  		binding->type = WLR_SWITCH_TYPE_TABLET_MODE; @@ -549,7 +549,8 @@ struct cmd_results *cmd_bind_or_unbind_switch(int argc, char **argv,  		free_switch_binding(binding);  		return cmd_results_new(CMD_FAILURE,  				"Invalid %s command (expected switch binding: " -				"unknown switch %s)", bindtype, split->items[0]); +				"unknown switch %s)", bindtype, +				(const char *)split->items[0]);  	}  	if (strcmp(split->items[1], "on") == 0) {  		binding->trigger = SWAY_SWITCH_TRIGGER_ON; @@ -562,7 +563,7 @@ struct cmd_results *cmd_bind_or_unbind_switch(int argc, char **argv,  		return cmd_results_new(CMD_FAILURE,  				"Invalid %s command "  				"(expected switch state: unknown state %s)", -				bindtype, split->items[1]); +				bindtype, (const char *)split->items[1]);  	}  	list_free_items_and_destroy(split); diff --git a/sway/commands/blur.c b/sway/commands/blur.c index 5607d1e2..52e3fdb9 100644 --- a/sway/commands/blur.c +++ b/sway/commands/blur.c @@ -1,3 +1,4 @@ +#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/output.h" @@ -21,10 +22,10 @@ struct cmd_results *cmd_blur(int argc, char **argv) {  	struct sway_output *output;  	wl_list_for_each(output, &root->all_outputs, link) { -		if (output->renderer) { -			output->renderer->blur_buffer_dirty = true; -			output_damage_whole(output); -		} +		struct fx_effect_framebuffers *effect_fbos = +			fx_effect_framebuffers_try_get(output->wlr_output); +		effect_fbos->blur_buffer_dirty = true; +		output_damage_whole(output);  	}  	return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/commands/blur_brightness.c b/sway/commands/blur_brightness.c index 79a40266..6ff60975 100644 --- a/sway/commands/blur_brightness.c +++ b/sway/commands/blur_brightness.c @@ -1,3 +1,4 @@ +#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/output.h" @@ -18,10 +19,10 @@ struct cmd_results *cmd_blur_brightness(int argc, char **argv) {  	struct sway_output *output;  	wl_list_for_each(output, &root->all_outputs, link) { -		if (output->renderer) { -			output->renderer->blur_buffer_dirty = true; -			output_damage_whole(output); -		} +		struct fx_effect_framebuffers *effect_fbos = +			fx_effect_framebuffers_try_get(output->wlr_output); +		effect_fbos->blur_buffer_dirty = true; +		output_damage_whole(output);  	}  	return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/commands/blur_contrast.c b/sway/commands/blur_contrast.c index 61e3aec4..ba046e63 100644 --- a/sway/commands/blur_contrast.c +++ b/sway/commands/blur_contrast.c @@ -1,3 +1,4 @@ +#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/output.h" @@ -18,10 +19,10 @@ struct cmd_results *cmd_blur_contrast(int argc, char **argv) {  	struct sway_output *output;  	wl_list_for_each(output, &root->all_outputs, link) { -		if (output->renderer) { -			output->renderer->blur_buffer_dirty = true; -			output_damage_whole(output); -		} +		struct fx_effect_framebuffers *effect_fbos = +			fx_effect_framebuffers_try_get(output->wlr_output); +		effect_fbos->blur_buffer_dirty = true; +		output_damage_whole(output);  	}  	return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/commands/blur_noise.c b/sway/commands/blur_noise.c index bd737911..358b20f5 100644 --- a/sway/commands/blur_noise.c +++ b/sway/commands/blur_noise.c @@ -1,3 +1,4 @@ +#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/output.h" @@ -16,13 +17,13 @@ struct cmd_results *cmd_blur_noise(int argc, char **argv) {      config->blur_params.noise = value; -    struct sway_output *output; -    wl_list_for_each(output, &root->all_outputs, link) { -        if (output->renderer) { -            output->renderer->blur_buffer_dirty = true; -            output_damage_whole(output); -        } -    } +	struct sway_output *output; +	wl_list_for_each(output, &root->all_outputs, link) { +		struct fx_effect_framebuffers *effect_fbos = +			fx_effect_framebuffers_try_get(output->wlr_output); +		effect_fbos->blur_buffer_dirty = true; +		output_damage_whole(output); +	}      return cmd_results_new(CMD_SUCCESS, NULL);  } diff --git a/sway/commands/blur_passes.c b/sway/commands/blur_passes.c index 0868a568..c79f99d1 100644 --- a/sway/commands/blur_passes.c +++ b/sway/commands/blur_passes.c @@ -1,3 +1,4 @@ +#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/output.h" @@ -18,10 +19,10 @@ struct cmd_results *cmd_blur_passes(int argc, char **argv) {  	struct sway_output *output;  	wl_list_for_each(output, &root->all_outputs, link) { -		if (output->renderer) { -			output->renderer->blur_buffer_dirty = true; -			output_damage_whole(output); -		} +		struct fx_effect_framebuffers *effect_fbos = +			fx_effect_framebuffers_try_get(output->wlr_output); +		effect_fbos->blur_buffer_dirty = true; +		output_damage_whole(output);  	}  	return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/commands/blur_radius.c b/sway/commands/blur_radius.c index f6e7d4ed..85e90e77 100644 --- a/sway/commands/blur_radius.c +++ b/sway/commands/blur_radius.c @@ -1,3 +1,4 @@ +#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/output.h" @@ -18,10 +19,10 @@ struct cmd_results *cmd_blur_radius(int argc, char **argv) {  	struct sway_output *output;  	wl_list_for_each(output, &root->all_outputs, link) { -		if (output->renderer) { -			output->renderer->blur_buffer_dirty = true; -			output_damage_whole(output); -		} +		struct fx_effect_framebuffers *effect_fbos = +			fx_effect_framebuffers_try_get(output->wlr_output); +		effect_fbos->blur_buffer_dirty = true; +		output_damage_whole(output);  	}  	return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/commands/blur_saturation.c b/sway/commands/blur_saturation.c index 35627363..ae6352d2 100644 --- a/sway/commands/blur_saturation.c +++ b/sway/commands/blur_saturation.c @@ -1,3 +1,4 @@ +#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/output.h" @@ -18,10 +19,10 @@ struct cmd_results *cmd_blur_saturation(int argc, char **argv) {  	struct sway_output *output;  	wl_list_for_each(output, &root->all_outputs, link) { -		if (output->renderer) { -			output->renderer->blur_buffer_dirty = true; -			output_damage_whole(output); -		} +		struct fx_effect_framebuffers *effect_fbos = +			fx_effect_framebuffers_try_get(output->wlr_output); +		effect_fbos->blur_buffer_dirty = true; +		output_damage_whole(output);  	}  	return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/commands/blur_xray.c b/sway/commands/blur_xray.c index 045566d0..6986b361 100644 --- a/sway/commands/blur_xray.c +++ b/sway/commands/blur_xray.c @@ -1,3 +1,4 @@ +#include "scenefx/render/fx_renderer/fx_effect_framebuffers.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/output.h" @@ -15,10 +16,10 @@ struct cmd_results *cmd_blur_xray(int argc, char **argv) {  	struct sway_output *output;  	wl_list_for_each(output, &root->all_outputs, link) { -		if (output->renderer) { -			output->renderer->blur_buffer_dirty = true; -			output_damage_whole(output); -		} +		struct fx_effect_framebuffers *effect_fbos = +			fx_effect_framebuffers_try_get(output->wlr_output); +		effect_fbos->blur_buffer_dirty = true; +		output_damage_whole(output);  	}  	return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/commands/exec_always.c b/sway/commands/exec_always.c index e6b09e64..8fca1909 100644 --- a/sway/commands/exec_always.c +++ b/sway/commands/exec_always.c @@ -9,7 +9,6 @@  #include "sway/config.h"  #include "sway/server.h"  #include "sway/desktop/launcher.h" -#include "sway/server.h"  #include "sway/tree/container.h"  #include "sway/tree/root.h"  #include "sway/tree/workspace.h" @@ -64,7 +63,7 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) {  	}  	pid_t pid, child; -	struct launcher_ctx *ctx = launcher_ctx_create(); +	struct launcher_ctx *ctx = launcher_ctx_create_internal();  	// Fork process  	if ((pid = fork()) == 0) {  		// Fork child process again diff --git a/sway/commands/floating_minmax_size.c b/sway/commands/floating_minmax_size.c index 3a1d606a..e8c24ace 100644 --- a/sway/commands/floating_minmax_size.c +++ b/sway/commands/floating_minmax_size.c @@ -23,16 +23,16 @@ static struct cmd_results *handle_command(int argc, char **argv, char *cmd_name,  	char *err;  	int width = (int)strtol(argv[0], &err, 10);  	if (*err) { -		return cmd_results_new(CMD_INVALID, cmd_name, usage); +		return cmd_results_new(CMD_INVALID, "%s", usage);  	}  	if (strcmp(argv[1], "x") != 0) { -		return cmd_results_new(CMD_INVALID, cmd_name, usage); +		return cmd_results_new(CMD_INVALID, "%s", usage);  	}  	int height = (int)strtol(argv[2], &err, 10);  	if (*err) { -		return cmd_results_new(CMD_INVALID, cmd_name, usage); +		return cmd_results_new(CMD_INVALID, "%s", usage);  	}  	*config_width = width; diff --git a/sway/commands/font.c b/sway/commands/font.c index dd80281f..74bb6b9f 100644 --- a/sway/commands/font.c +++ b/sway/commands/font.c @@ -33,10 +33,10 @@ struct cmd_results *cmd_font(int argc, char **argv) {  		return cmd_results_new(CMD_FAILURE, "Invalid font family.");  	} -	const PangoFontMask flags = pango_font_description_get_set_fields(font_description); -	if ((flags & PANGO_FONT_MASK_SIZE) == 0) { +	const gint size = pango_font_description_get_size(font_description); +	if (size == 0) {  		pango_font_description_free(font_description); -		return cmd_results_new(CMD_FAILURE, "Font size not given."); +		return cmd_results_new(CMD_FAILURE, "Invalid font size.");  	}  	if (config->font_description != NULL) { diff --git a/sway/commands/for_window.c b/sway/commands/for_window.c index ee9f4647..905e6776 100644 --- a/sway/commands/for_window.c +++ b/sway/commands/for_window.c @@ -14,7 +14,7 @@ struct cmd_results *cmd_for_window(int argc, char **argv) {  	char *err_str = NULL;  	struct criteria *criteria = criteria_parse(argv[0], &err_str);  	if (!criteria) { -		error = cmd_results_new(CMD_INVALID, err_str); +		error = cmd_results_new(CMD_INVALID, "%s", err_str);  		free(err_str);  		return error;  	} diff --git a/sway/commands/hide_edge_borders.c b/sway/commands/hide_edge_borders.c index 9a1d8445..43bd6dc8 100644 --- a/sway/commands/hide_edge_borders.c +++ b/sway/commands/hide_edge_borders.c @@ -20,7 +20,7 @@ struct cmd_results *cmd_hide_edge_borders(int argc, char **argv) {  	}  	if (!argc) { -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	if (strcmp(argv[0], "none") == 0) { @@ -38,7 +38,7 @@ struct cmd_results *cmd_hide_edge_borders(int argc, char **argv) {  		config->hide_edge_borders = E_NONE;  		config->hide_edge_borders_smart = ESMART_NO_GAPS;  	} else { -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	config->hide_lone_tab = hide_lone_tab; diff --git a/sway/commands/inhibit_idle.c b/sway/commands/inhibit_idle.c index aebc2bf9..6125736a 100644 --- a/sway/commands/inhibit_idle.c +++ b/sway/commands/inhibit_idle.c @@ -41,7 +41,7 @@ struct cmd_results *cmd_inhibit_idle(int argc, char **argv) {  			sway_idle_inhibit_v1_user_inhibitor_destroy(inhibitor);  		} else {  			inhibitor->mode = mode; -			sway_idle_inhibit_v1_check_active(server.idle_inhibit_manager_v1); +			sway_idle_inhibit_v1_check_active();  		}  	} else if (!clear) {  		sway_idle_inhibit_v1_user_inhibitor_register(con->view, mode); diff --git a/sway/commands/input.c b/sway/commands/input.c index ea531659..306c40f7 100644 --- a/sway/commands/input.c +++ b/sway/commands/input.c @@ -25,7 +25,9 @@ static const struct cmd_handler input_handlers[] = {  	{ "pointer_accel", input_cmd_pointer_accel },  	{ "repeat_delay", input_cmd_repeat_delay },  	{ "repeat_rate", input_cmd_repeat_rate }, +	{ "rotation_angle", input_cmd_rotation_angle },  	{ "scroll_button", input_cmd_scroll_button }, +	{ "scroll_button_lock", input_cmd_scroll_button_lock },  	{ "scroll_factor", input_cmd_scroll_factor },  	{ "scroll_method", input_cmd_scroll_method },  	{ "tap", input_cmd_tap }, diff --git a/sway/commands/input/events.c b/sway/commands/input/events.c index 9405181a..08d99bf0 100644 --- a/sway/commands/input/events.c +++ b/sway/commands/input/events.c @@ -1,14 +1,19 @@  #include <limits.h>  #include <string.h>  #include <strings.h> -#include <wlr/backend/libinput.h> +#include <wlr/config.h>  #include "sway/config.h"  #include "sway/commands.h"  #include "sway/input/input-manager.h"  #include "log.h" +#if WLR_HAS_LIBINPUT_BACKEND +#include <wlr/backend/libinput.h> +#endif +  static void toggle_supported_send_events_for_device(struct input_config *ic,  		struct sway_input_device *input_device) { +#if WLR_HAS_LIBINPUT_BACKEND  	struct wlr_input_device *wlr_device = input_device->wlr_device;  	if (!wlr_input_device_is_libinput(wlr_device)) {  		return; @@ -41,6 +46,7 @@ static void toggle_supported_send_events_for_device(struct input_config *ic,  	}  	ic->send_events = mode; +#endif  }  static int mode_for_name(const char *name) { @@ -56,6 +62,7 @@ static int mode_for_name(const char *name) {  static void toggle_select_send_events_for_device(struct input_config *ic,  		struct sway_input_device *input_device, int argc, char **argv) { +#if WLR_HAS_LIBINPUT_BACKEND  	if (!wlr_input_device_is_libinput(input_device->wlr_device)) {  		return;  	} @@ -72,6 +79,7 @@ static void toggle_select_send_events_for_device(struct input_config *ic,  		}  	}  	ic->send_events = mode_for_name(argv[index % argc]); +#endif  }  static void toggle_send_events(int argc, char **argv) { diff --git a/sway/commands/input/map_from_region.c b/sway/commands/input/map_from_region.c index de00b714..4400e111 100644 --- a/sway/commands/input/map_from_region.c +++ b/sway/commands/input/map_from_region.c @@ -11,11 +11,21 @@ static bool parse_coords(const char *str, double *x, double *y, bool *mm) {  	*mm = false;  	char *end; -	*x = strtod(str, &end); -	if (end[0] != 'x') { -		return false; + +	// Check for "0x" prefix to avoid strtod treating the string as hex +	if (str[0] == '0' && str[1] == 'x') { +		if (strlen(str) < 3) { +			return false; +		} +		*x = 0; +		end = (char *)str + 2; +	} else { +		*x = strtod(str, &end); +		if (end[0] != 'x') { +			return false; +		} +		++end;  	} -	++end;  	*y = strtod(end, &end);  	if (end[0] == 'm') { diff --git a/sway/commands/input/map_to_region.c b/sway/commands/input/map_to_region.c index 284b57d0..ad535db2 100644 --- a/sway/commands/input/map_to_region.c +++ b/sway/commands/input/map_to_region.c @@ -49,5 +49,5 @@ struct cmd_results *input_cmd_map_to_region(int argc, char **argv) {  error:  	free(ic->mapped_to_region);  	ic->mapped_to_region = NULL; -	return cmd_results_new(CMD_FAILURE, errstr); +	return cmd_results_new(CMD_FAILURE, "%s", errstr);  } diff --git a/sway/commands/input/rotation_angle.c b/sway/commands/input/rotation_angle.c new file mode 100644 index 00000000..5e278fff --- /dev/null +++ b/sway/commands/input/rotation_angle.c @@ -0,0 +1,29 @@ +#include <math.h> +#include <stdlib.h> +#include <string.h> +#include "sway/config.h" +#include "sway/commands.h" +#include "sway/input/input-manager.h" +#include "util.h" + +struct cmd_results *input_cmd_rotation_angle(int argc, char **argv) { +	struct cmd_results *error = NULL; +	if ((error = checkarg(argc, "rotation_angle", EXPECTED_AT_LEAST, 1))) { +		return error; +	} +	struct input_config *ic = config->handler_context.input_config; +	if (!ic) { +		return cmd_results_new(CMD_FAILURE, "No input device defined."); +	} + +	float rotation_angle = parse_float(argv[0]); +	if (isnan(rotation_angle)) { +		return cmd_results_new(CMD_INVALID, +			"Invalid rotation_angle; expected float."); +	} if (rotation_angle < 0 || rotation_angle > 360) { +		return cmd_results_new(CMD_INVALID, "Input out of range [0, 360)"); +	} +	ic->rotation_angle = rotation_angle; + +	return cmd_results_new(CMD_SUCCESS, NULL); +} diff --git a/sway/commands/input/scroll_button.c b/sway/commands/input/scroll_button.c index 6b331419..81f69a6d 100644 --- a/sway/commands/input/scroll_button.c +++ b/sway/commands/input/scroll_button.c @@ -21,7 +21,7 @@ struct cmd_results *input_cmd_scroll_button(int argc, char **argv) {  	char *message = NULL;  	uint32_t button = get_mouse_button(*argv, &message);  	if (message) { -		error = cmd_results_new(CMD_INVALID, message); +		error = cmd_results_new(CMD_INVALID, "%s", message);  		free(message);  		return error;  	} else if (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_DOWN diff --git a/sway/commands/input/scroll_button_lock.c b/sway/commands/input/scroll_button_lock.c new file mode 100644 index 00000000..f96b6514 --- /dev/null +++ b/sway/commands/input/scroll_button_lock.c @@ -0,0 +1,26 @@ +#include <libinput.h> +#include <string.h> +#include <strings.h> +#include "sway/config.h" +#include "sway/commands.h" +#include "sway/input/input-manager.h" +#include "util.h" + +struct cmd_results *input_cmd_scroll_button_lock(int argc, char **argv) { +	struct cmd_results *error = NULL; +	if ((error = checkarg(argc, "scroll_button_lock", EXPECTED_AT_LEAST, 1))) { +		return error; +	} +	struct input_config *ic = config->handler_context.input_config; +	if (!ic) { +		return cmd_results_new(CMD_FAILURE, "No input device defined."); +	} + +	if (parse_boolean(argv[0], true)) { +		ic->scroll_button_lock = LIBINPUT_CONFIG_SCROLL_BUTTON_LOCK_ENABLED; +	} else { +		ic->scroll_button_lock = LIBINPUT_CONFIG_SCROLL_BUTTON_LOCK_DISABLED; +	} + +	return cmd_results_new(CMD_SUCCESS, NULL); +} diff --git a/sway/commands/layout.c b/sway/commands/layout.c index 2ba61b38..12ce4839 100644 --- a/sway/commands/layout.c +++ b/sway/commands/layout.c @@ -153,7 +153,7 @@ struct cmd_results *cmd_layout(int argc, char **argv) {  				workspace->output);  	}  	if (new_layout == L_NONE) { -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	if (new_layout != old_layout) {  		if (container) { diff --git a/sway/commands/move.c b/sway/commands/move.c index 7bd1fe3e..69ed06c0 100644 --- a/sway/commands/move.c +++ b/sway/commands/move.c @@ -206,9 +206,17 @@ static void container_move_to_workspace(struct sway_container *container,  		container_detach(container);  		workspace_add_floating(workspace, container);  		container_handle_fullscreen_reparent(container); -		// If changing output, center it within the workspace +		// If changing output, adjust the coordinates of the window.  		if (old_output != workspace->output && !container->pending.fullscreen_mode) { -			container_floating_move_to_center(container); +			struct wlr_box workspace_box, old_workspace_box; +			workspace_get_box(workspace, &workspace_box); +			workspace_get_box(old_workspace, &old_workspace_box); +			floating_fix_coordinates(container, &old_workspace_box, &workspace_box); +			if (container->scratchpad && workspace->output) { +				struct wlr_box output_box; +				output_get_box(workspace->output, &output_box); +				container->transform = workspace_box; +			}  		}  	} else {  		container_detach(container); @@ -462,7 +470,7 @@ static struct cmd_results *cmd_move_container(bool no_auto_back_and_forth,  			if (strcasecmp(argv[1], "number") == 0) {  				// move [window|container] [to] "workspace number x"  				if (argc < 3) { -					return cmd_results_new(CMD_INVALID, expected_syntax); +					return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  				}  				if (!isdigit(argv[2][0])) {  					return cmd_results_new(CMD_INVALID, @@ -522,7 +530,7 @@ static struct cmd_results *cmd_move_container(bool no_auto_back_and_forth,  		}  		destination = &dest_con->node;  	} else { -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	if (destination->type == N_CONTAINER && @@ -821,7 +829,7 @@ static struct cmd_results *cmd_move_to_position(int argc, char **argv) {  	}  	if (!argc) { -		return cmd_results_new(CMD_INVALID, expected_position_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_position_syntax);  	}  	bool absolute = false; @@ -831,19 +839,19 @@ static struct cmd_results *cmd_move_to_position(int argc, char **argv) {  		++argv;  	}  	if (!argc) { -		return cmd_results_new(CMD_INVALID, expected_position_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_position_syntax);  	}  	if (strcmp(argv[0], "position") == 0) {  		--argc;  		++argv;  	}  	if (!argc) { -		return cmd_results_new(CMD_INVALID, expected_position_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_position_syntax);  	}  	if (strcmp(argv[0], "cursor") == 0 || strcmp(argv[0], "mouse") == 0 ||  			strcmp(argv[0], "pointer") == 0) {  		if (absolute) { -			return cmd_results_new(CMD_INVALID, expected_position_syntax); +			return cmd_results_new(CMD_INVALID, "%s", expected_position_syntax);  		}  		return cmd_move_to_position_pointer(container);  	} else if (strcmp(argv[0], "center") == 0) { @@ -865,7 +873,7 @@ static struct cmd_results *cmd_move_to_position(int argc, char **argv) {  	}  	if (argc < 2) { -		return cmd_results_new(CMD_FAILURE, expected_position_syntax); +		return cmd_results_new(CMD_FAILURE, "%s", expected_position_syntax);  	}  	struct movement_amount lx = { .amount = 0, .unit = MOVEMENT_UNIT_INVALID }; @@ -878,7 +886,7 @@ static struct cmd_results *cmd_move_to_position(int argc, char **argv) {  	}  	if (argc < 1) { -		return cmd_results_new(CMD_FAILURE, expected_position_syntax); +		return cmd_results_new(CMD_FAILURE, "%s", expected_position_syntax);  	}  	struct movement_amount ly = { .amount = 0, .unit = MOVEMENT_UNIT_INVALID }; @@ -887,7 +895,7 @@ static struct cmd_results *cmd_move_to_position(int argc, char **argv) {  	argc -= num_consumed_args;  	argv += num_consumed_args;  	if (argc > 0) { -		return cmd_results_new(CMD_INVALID, expected_position_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_position_syntax);  	}  	if (ly.unit == MOVEMENT_UNIT_INVALID) {  		return cmd_results_new(CMD_INVALID, "Invalid y position specified"); @@ -1033,13 +1041,13 @@ struct cmd_results *cmd_move(int argc, char **argv) {  	}  	if (!argc) { -		return cmd_results_new(CMD_INVALID, expected_full_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_full_syntax);  	}  	// Only `move [window|container] [to] workspace` supports  	// `--no-auto-back-and-forth` so treat others as invalid syntax  	if (no_auto_back_and_forth && strcasecmp(argv[0], "workspace") != 0) { -		return cmd_results_new(CMD_INVALID, expected_full_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_full_syntax);  	}  	if (strcasecmp(argv[0], "workspace") == 0 || @@ -1053,5 +1061,5 @@ struct cmd_results *cmd_move(int argc, char **argv) {  			strcasecmp(argv[1], "position") == 0)) {  		return cmd_move_to_position(argc, argv);  	} -	return cmd_results_new(CMD_INVALID, expected_full_syntax); +	return cmd_results_new(CMD_INVALID, "%s", expected_full_syntax);  } diff --git a/sway/commands/no_focus.c b/sway/commands/no_focus.c index 2001e04f..ccfdec82 100644 --- a/sway/commands/no_focus.c +++ b/sway/commands/no_focus.c @@ -13,7 +13,7 @@ struct cmd_results *cmd_no_focus(int argc, char **argv) {  	char *err_str = NULL;  	struct criteria *criteria = criteria_parse(argv[0], &err_str);  	if (!criteria) { -		error = cmd_results_new(CMD_INVALID, err_str); +		error = cmd_results_new(CMD_INVALID, "%s", err_str);  		free(err_str);  		return error;  	} diff --git a/sway/commands/output.c b/sway/commands/output.c index df32c673..462dffd2 100644 --- a/sway/commands/output.c +++ b/sway/commands/output.c @@ -111,7 +111,10 @@ struct cmd_results *cmd_output(int argc, char **argv) {  	if (!config->reloading && !config->validating) {  		apply_output_config_to_outputs(output);  		if (background) { -			spawn_swaybg(); +			if (!spawn_swaybg()) { +				return cmd_results_new(CMD_FAILURE, +					"Failed to apply background configuration"); +			}  		}  	} diff --git a/sway/commands/output/background.c b/sway/commands/output/background.c index 67f212ff..d691295f 100644 --- a/sway/commands/output/background.c +++ b/sway/commands/output/background.c @@ -123,7 +123,10 @@ struct cmd_results *output_cmd_background(int argc, char **argv) {  					src);  			config_add_swaynag_warning("Unable to access background file '%s'",  					src); +			struct cmd_results *result = cmd_results_new(CMD_FAILURE, +					"unable to access background file '%s'", src);  			free(src); +			return result;  		} else {  			output->background = src;  			output->background_option = strdup(mode); diff --git a/sway/commands/primary_selection.c b/sway/commands/primary_selection.c new file mode 100644 index 00000000..585b079d --- /dev/null +++ b/sway/commands/primary_selection.c @@ -0,0 +1,23 @@ +#include <string.h> +#include <strings.h> +#include "sway/config.h" +#include "sway/commands.h" +#include "util.h" + +struct cmd_results *cmd_primary_selection(int argc, char **argv) { +	struct cmd_results *error = NULL; +	if ((error = checkarg(argc, "primary_selection", EXPECTED_EQUAL_TO, 1))) { +		return error; +	} + +	bool primary_selection = parse_boolean(argv[0], true); + +	if (config->reloading && config->primary_selection != primary_selection) { +		return cmd_results_new(CMD_FAILURE, +				"primary_selection can only be enabled/disabled at launch"); +	} + +	config->primary_selection = parse_boolean(argv[0], true); + +	return cmd_results_new(CMD_SUCCESS, NULL); +} diff --git a/sway/commands/rename.c b/sway/commands/rename.c index 60a66d58..0d36cc21 100644 --- a/sway/commands/rename.c +++ b/sway/commands/rename.c @@ -26,7 +26,7 @@ struct cmd_results *cmd_rename(int argc, char **argv) {  				"Can't run this command while there's no outputs connected.");  	}  	if (strcasecmp(argv[0], "workspace") != 0) { -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	int argn = 1; @@ -65,7 +65,7 @@ struct cmd_results *cmd_rename(int argc, char **argv) {  	++argn; // move past "to"  	if (argn >= argc) { -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	char *new_name = join_args(argv + argn, argc - argn); diff --git a/sway/commands/resize.c b/sway/commands/resize.c index 425069de..32b746ea 100644 --- a/sway/commands/resize.c +++ b/sway/commands/resize.c @@ -75,6 +75,10 @@ void container_resize_tiled(struct sway_container *con,  		return;  	} +	if (container_is_scratchpad_hidden_or_child(con)) { +		return; +	} +  	// For HORIZONTAL or VERTICAL, we are growing in two directions so select  	// both adjacent siblings. For RIGHT or DOWN, just select the next sibling.  	// For LEFT or UP, convert it to a RIGHT or DOWN resize and reassign con to @@ -249,16 +253,35 @@ static struct cmd_results *resize_adjust_tiled(uint32_t axis,  		struct movement_amount *amount) {  	struct sway_container *current = config->handler_context.container; +	if (container_is_scratchpad_hidden_or_child(current)) { +		return cmd_results_new(CMD_FAILURE, "Cannot resize a hidden scratchpad container"); +	} +  	if (amount->unit == MOVEMENT_UNIT_DEFAULT) {  		amount->unit = MOVEMENT_UNIT_PPT;  	}  	if (amount->unit == MOVEMENT_UNIT_PPT) { +        struct sway_container *parent = current->pending.parent;  		float pct = amount->amount / 100.0f;  		if (is_horizontal(axis)) { -			amount->amount = (float)current->pending.width * pct; +            while (parent && parent->pending.layout != L_HORIZ) { +                parent = parent->pending.parent; +            } +            if (parent) { +                amount->amount = (float)parent->pending.width * pct; +            } else { +                amount->amount = (float)current->pending.workspace->width * pct; +            }  		} else { -			amount->amount = (float)current->pending.height * pct; +            while (parent && parent->pending.layout != L_VERT) { +                parent = parent->pending.parent; +            } +            if (parent) { +                amount->amount = (float)parent->pending.height * pct; +            } else { +                amount->amount = (float)current->pending.workspace->height * pct; +            }  		}  	} @@ -277,6 +300,11 @@ static struct cmd_results *resize_adjust_tiled(uint32_t axis,   */  static struct cmd_results *resize_set_tiled(struct sway_container *con,  		struct movement_amount *width, struct movement_amount *height) { + +	if (container_is_scratchpad_hidden_or_child(con)) { +		return cmd_results_new(CMD_FAILURE, "Cannot resize a hidden scratchpad container"); +	} +  	if (width->amount) {  		if (width->unit == MOVEMENT_UNIT_PPT ||  				width->unit == MOVEMENT_UNIT_DEFAULT) { @@ -415,7 +443,7 @@ static struct cmd_results *cmd_resize_set(int argc, char **argv) {  		argc -= num_consumed_args;  		argv += num_consumed_args;  		if (width.unit == MOVEMENT_UNIT_INVALID) { -			return cmd_results_new(CMD_INVALID, usage); +			return cmd_results_new(CMD_INVALID, "%s", usage);  		}  	} @@ -427,10 +455,10 @@ static struct cmd_results *cmd_resize_set(int argc, char **argv) {  		}  		int num_consumed_args = parse_movement_amount(argc, argv, &height);  		if (argc > num_consumed_args) { -			return cmd_results_new(CMD_INVALID, usage); +			return cmd_results_new(CMD_INVALID, "%s", usage);  		}  		if (width.unit == MOVEMENT_UNIT_INVALID) { -			return cmd_results_new(CMD_INVALID, usage); +			return cmd_results_new(CMD_INVALID, "%s", usage);  		}  	} @@ -462,7 +490,7 @@ static struct cmd_results *cmd_resize_adjust(int argc, char **argv,  		"[<amount> px|ppt [or <amount> px|ppt]]'";  	uint32_t axis = parse_resize_axis(*argv);  	if (axis == WLR_EDGE_NONE) { -		return cmd_results_new(CMD_INVALID, usage); +		return cmd_results_new(CMD_INVALID, "%s", usage);  	}  	--argc; ++argv; @@ -473,7 +501,7 @@ static struct cmd_results *cmd_resize_adjust(int argc, char **argv,  		argc -= num_consumed_args;  		argv += num_consumed_args;  		if (first_amount.unit == MOVEMENT_UNIT_INVALID) { -			return cmd_results_new(CMD_INVALID, usage); +			return cmd_results_new(CMD_INVALID, "%s", usage);  		}  	} else {  		first_amount.amount = 10; @@ -483,7 +511,7 @@ static struct cmd_results *cmd_resize_adjust(int argc, char **argv,  	// "or"  	if (argc) {  		if (strcmp(*argv, "or") != 0) { -			return cmd_results_new(CMD_INVALID, usage); +			return cmd_results_new(CMD_INVALID, "%s", usage);  		}  		--argc; ++argv;  	} @@ -493,10 +521,10 @@ static struct cmd_results *cmd_resize_adjust(int argc, char **argv,  	if (argc) {  		int num_consumed_args = parse_movement_amount(argc, argv, &second_amount);  		if (argc > num_consumed_args) { -			return cmd_results_new(CMD_INVALID, usage); +			return cmd_results_new(CMD_INVALID, "%s", usage);  		}  		if (second_amount.unit == MOVEMENT_UNIT_INVALID) { -			return cmd_results_new(CMD_INVALID, usage); +			return cmd_results_new(CMD_INVALID, "%s", usage);  		}  	} else {  		second_amount.amount = 0; @@ -566,5 +594,5 @@ struct cmd_results *cmd_resize(int argc, char **argv) {  	const char usage[] = "Expected 'resize <shrink|grow> "  		"<width|height|up|down|left|right> [<amount>] [px|ppt]'"; -	return cmd_results_new(CMD_INVALID, usage); +	return cmd_results_new(CMD_INVALID, "%s", usage);  } diff --git a/sway/commands/seat/cursor.c b/sway/commands/seat/cursor.c index 504a9f5e..5a8a3bc8 100644 --- a/sway/commands/seat/cursor.c +++ b/sway/commands/seat/cursor.c @@ -18,7 +18,7 @@ static struct cmd_results *handle_command(struct sway_cursor *cursor,  		int argc, char **argv) {  	if (strcasecmp(argv[0], "move") == 0) {  		if (argc < 3) { -			return cmd_results_new(CMD_INVALID, expected_syntax); +			return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  		}  		int delta_x = strtol(argv[1], NULL, 10);  		int delta_y = strtol(argv[2], NULL, 10); @@ -27,7 +27,7 @@ static struct cmd_results *handle_command(struct sway_cursor *cursor,  		wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat);  	} else if (strcasecmp(argv[0], "set") == 0) {  		if (argc < 3) { -			return cmd_results_new(CMD_INVALID, expected_syntax); +			return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  		}  		// map absolute coords (0..1,0..1) to root container coords  		float x = strtof(argv[1], NULL) / root->width; @@ -37,7 +37,7 @@ static struct cmd_results *handle_command(struct sway_cursor *cursor,  		wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat);  	} else {  		if (argc < 2) { -			return cmd_results_new(CMD_INVALID, expected_syntax); +			return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  		}  		struct cmd_results *error = NULL;  		if ((error = press_or_release(cursor, argv[0], argv[1]))) { @@ -92,14 +92,14 @@ static struct cmd_results *press_or_release(struct sway_cursor *cursor,  	} else if (strcasecmp(action, "release") == 0) {  		state = WLR_BUTTON_RELEASED;  	} else { -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	char *message = NULL;  	button = get_mouse_button(button_str, &message);  	if (message) {  		struct cmd_results *error = -			cmd_results_new(CMD_INVALID, message); +			cmd_results_new(CMD_INVALID, "%s", message);  		free(message);  		return error;  	} else if (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_DOWN diff --git a/sway/commands/seat/idle.c b/sway/commands/seat/idle.c index 82428f2c..62b94db2 100644 --- a/sway/commands/seat/idle.c +++ b/sway/commands/seat/idle.c @@ -3,6 +3,7 @@  #include <string.h>  #include <strings.h>  #include <stdint.h> +#include "log.h"  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/input/seat.h" @@ -69,5 +70,10 @@ struct cmd_results *seat_cmd_idle_wake(int argc, char **argv) {  		return cmd_results_new(CMD_FAILURE, "Invalid idle source");  	}  	config->handler_context.seat_config->idle_wake_sources = sources; +	sway_log(SWAY_INFO, "Warning: seat idle_wake is deprecated"); +	if (config->reading) { +		config_add_swaynag_warning("seat idle_wake is deprecated. " +			"Only seat idle_inhibit is supported."); +	}  	return cmd_results_new(CMD_SUCCESS, NULL);  } diff --git a/sway/commands/shadows.c b/sway/commands/shadows.c index ae7fc019..a213de8f 100644 --- a/sway/commands/shadows.c +++ b/sway/commands/shadows.c @@ -4,8 +4,6 @@  #include "sway/tree/arrange.h"  #include "sway/tree/view.h"  #include "sway/tree/container.h" -#include "log.h" -#include "stringop.h"  #include "util.h"  struct cmd_results *cmd_shadows(int argc, char **argv) { diff --git a/sway/commands/shadows_on_csd.c b/sway/commands/shadows_on_csd.c index c9f56dd1..24f2bea4 100644 --- a/sway/commands/shadows_on_csd.c +++ b/sway/commands/shadows_on_csd.c @@ -2,10 +2,6 @@  #include "sway/commands.h"  #include "sway/config.h"  #include "sway/tree/arrange.h" -#include "sway/tree/view.h" -#include "sway/tree/container.h" -#include "log.h" -#include "stringop.h"  #include "util.h"  struct cmd_results *cmd_shadows_on_csd(int argc, char **argv) { diff --git a/sway/commands/split.c b/sway/commands/split.c index c8a2cfc1..500a497d 100644 --- a/sway/commands/split.c +++ b/sway/commands/split.c @@ -32,7 +32,7 @@ static struct cmd_results *do_split(int layout) {  	return cmd_results_new(CMD_SUCCESS, NULL);  } -static struct cmd_results *do_unsplit() { +static struct cmd_results *do_unsplit(void) {  	struct sway_container *con = config->handler_context.container;  	struct sway_workspace *ws = config->handler_context.workspace; diff --git a/sway/commands/swap.c b/sway/commands/swap.c index 9355944d..d44eb006 100644 --- a/sway/commands/swap.c +++ b/sway/commands/swap.c @@ -5,6 +5,7 @@  #include "sway/commands.h"  #include "sway/output.h"  #include "sway/tree/arrange.h" +#include "sway/tree/container.h"  #include "sway/tree/root.h"  #include "sway/tree/view.h"  #include "sway/tree/workspace.h" @@ -13,180 +14,6 @@  static const char expected_syntax[] =  	"Expected 'swap container with id|con_id|mark <arg>'"; -static void swap_places(struct sway_container *con1, -		struct sway_container *con2) { -	struct sway_container *temp = malloc(sizeof(struct sway_container)); -	temp->pending.x = con1->pending.x; -	temp->pending.y = con1->pending.y; -	temp->pending.width = con1->pending.width; -	temp->pending.height = con1->pending.height; -	temp->width_fraction = con1->width_fraction; -	temp->height_fraction = con1->height_fraction; -	temp->pending.parent = con1->pending.parent; -	temp->pending.workspace = con1->pending.workspace; -	bool temp_floating = container_is_floating(con1); - -	con1->pending.x = con2->pending.x; -	con1->pending.y = con2->pending.y; -	con1->pending.width = con2->pending.width; -	con1->pending.height = con2->pending.height; -	con1->width_fraction = con2->width_fraction; -	con1->height_fraction = con2->height_fraction; - -	con2->pending.x = temp->pending.x; -	con2->pending.y = temp->pending.y; -	con2->pending.width = temp->pending.width; -	con2->pending.height = temp->pending.height; -	con2->width_fraction = temp->width_fraction; -	con2->height_fraction = temp->height_fraction; - -	int temp_index = container_sibling_index(con1); -	if (con2->pending.parent) { -		container_insert_child(con2->pending.parent, con1, -				container_sibling_index(con2)); -	} else if (container_is_floating(con2)) { -		workspace_add_floating(con2->pending.workspace, con1); -	} else { -		workspace_insert_tiling(con2->pending.workspace, con1, -				container_sibling_index(con2)); -	} -	if (temp->pending.parent) { -		container_insert_child(temp->pending.parent, con2, temp_index); -	} else if (temp_floating) { -		workspace_add_floating(temp->pending.workspace, con2); -	} else { -		workspace_insert_tiling(temp->pending.workspace, con2, temp_index); -	} - -	free(temp); -} - -static void swap_focus(struct sway_container *con1, -		struct sway_container *con2, struct sway_seat *seat, -		struct sway_container *focus) { -	if (focus == con1 || focus == con2) { -		struct sway_workspace *ws1 = con1->pending.workspace; -		struct sway_workspace *ws2 = con2->pending.workspace; -		enum sway_container_layout layout1 = container_parent_layout(con1); -		enum sway_container_layout layout2 = container_parent_layout(con2); -		if (focus == con1 && (layout2 == L_TABBED || layout2 == L_STACKED)) { -			if (workspace_is_visible(ws2)) { -				seat_set_focus(seat, &con2->node); -			} -			seat_set_focus_container(seat, ws1 != ws2 ? con2 : con1); -		} else if (focus == con2 && (layout1 == L_TABBED -					|| layout1 == L_STACKED)) { -			if (workspace_is_visible(ws1)) { -				seat_set_focus(seat, &con1->node); -			} -			seat_set_focus_container(seat, ws1 != ws2 ? con1 : con2); -		} else if (ws1 != ws2) { -			seat_set_focus_container(seat, focus == con1 ? con2 : con1); -		} else { -			seat_set_focus_container(seat, focus); -		} -	} else { -		seat_set_focus_container(seat, focus); -	} - -	if (root->fullscreen_global) { -		seat_set_focus(seat, -				seat_get_focus_inactive(seat, &root->fullscreen_global->node)); -	} -} - -void container_swap(struct sway_container *con1, struct sway_container *con2) { -	if (!sway_assert(con1 && con2, "Cannot swap with nothing")) { -		return; -	} -	if (!sway_assert(!container_has_ancestor(con1, con2) -				&& !container_has_ancestor(con2, con1), -				"Cannot swap ancestor and descendant")) { -		return; -	} - -	sway_log(SWAY_DEBUG, "Swapping containers %zu and %zu", -			con1->node.id, con2->node.id); - -	bool scratch1 = con1->scratchpad; -	bool hidden1 = container_is_scratchpad_hidden(con1); -	bool scratch2 = con2->scratchpad; -	bool hidden2 = container_is_scratchpad_hidden(con2); -	if (scratch1) { -		if (hidden1) { -			root_scratchpad_show(con1); -		} -		root_scratchpad_remove_container(con1); -	} -	if (scratch2) { -		if (hidden2) { -			root_scratchpad_show(con2); -		} -		root_scratchpad_remove_container(con2); -	} - -	enum sway_fullscreen_mode fs1 = con1->pending.fullscreen_mode; -	if (fs1) { -		container_fullscreen_disable(con1); -	} -	enum sway_fullscreen_mode fs2 = con2->pending.fullscreen_mode; -	if (fs2) { -		container_fullscreen_disable(con2); -	} - -	struct sway_seat *seat = config->handler_context.seat; -	struct sway_container *focus = seat_get_focused_container(seat); -	struct sway_workspace *vis1 = -		output_get_active_workspace(con1->pending.workspace->output); -	struct sway_workspace *vis2 = -		output_get_active_workspace(con2->pending.workspace->output); -	if (!sway_assert(vis1 && vis2, "con1 or con2 are on an output without a" -				"workspace. This should not happen")) { -		return; -	} - -	char *stored_prev_name = NULL; -	if (seat->prev_workspace_name) { -		stored_prev_name = strdup(seat->prev_workspace_name); -	} - -	swap_places(con1, con2); - -	if (!workspace_is_visible(vis1)) { -		seat_set_focus(seat, seat_get_focus_inactive(seat, &vis1->node)); -	} -	if (!workspace_is_visible(vis2)) { -		seat_set_focus(seat, seat_get_focus_inactive(seat, &vis2->node)); -	} - -	swap_focus(con1, con2, seat, focus); - -	if (stored_prev_name) { -		free(seat->prev_workspace_name); -		seat->prev_workspace_name = stored_prev_name; -	} - -	if (scratch1) { -		root_scratchpad_add_container(con2, NULL); -		if (!hidden1) { -			root_scratchpad_show(con2); -		} -	} -	if (scratch2) { -		root_scratchpad_add_container(con1, NULL); -		if (!hidden2) { -			root_scratchpad_show(con1); -		} -	} - -	if (fs1) { -		container_set_fullscreen(con2, fs1); -	} -	if (fs2) { -		container_set_fullscreen(con1, fs2); -	} -} -  static bool test_con_id(struct sway_container *container, void *data) {  	size_t *con_id = data;  	return container->node.id == *con_id; @@ -219,7 +46,7 @@ struct cmd_results *cmd_swap(int argc, char **argv) {  	}  	if (strcasecmp(argv[0], "container") || strcasecmp(argv[1], "with")) { -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	struct sway_container *current = config->handler_context.container; @@ -238,7 +65,7 @@ struct cmd_results *cmd_swap(int argc, char **argv) {  		other = root_find_container(test_mark, value);  	} else {  		free(value); -		return cmd_results_new(CMD_INVALID, expected_syntax); +		return cmd_results_new(CMD_INVALID, "%s", expected_syntax);  	}  	if (!other) { diff --git a/sway/commands/workspace.c b/sway/commands/workspace.c index a6a0beda..03e488ba 100644 --- a/sway/commands/workspace.c +++ b/sway/commands/workspace.c @@ -61,7 +61,7 @@ static struct cmd_results *cmd_workspace_gaps(int argc, char **argv,  	const char expected[] = "Expected 'workspace <name> gaps "  		"inner|outer|horizontal|vertical|top|right|bottom|left <px>'";  	if (gaps_location == 0) { -		return cmd_results_new(CMD_INVALID, expected); +		return cmd_results_new(CMD_INVALID, "%s", expected);  	}  	struct cmd_results *error = NULL;  	if ((error = checkarg(argc, "workspace", EXPECTED_EQUAL_TO, @@ -79,7 +79,7 @@ static struct cmd_results *cmd_workspace_gaps(int argc, char **argv,  	char *end;  	int amount = strtol(argv[gaps_location + 2], &end, 10);  	if (strlen(end)) { -		return cmd_results_new(CMD_FAILURE, expected); +		return cmd_results_new(CMD_FAILURE, "%s", expected);  	}  	bool valid = false; @@ -110,7 +110,7 @@ static struct cmd_results *cmd_workspace_gaps(int argc, char **argv,  		}  	}  	if (!valid) { -		return cmd_results_new(CMD_INVALID, expected); +		return cmd_results_new(CMD_INVALID, "%s", expected);  	}  	// Prevent invalid gaps configurations. @@ -174,7 +174,7 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {  		}  		if (root->fullscreen_global) { -			return cmd_results_new(CMD_FAILURE, "workspace", +			return cmd_results_new(CMD_FAILURE,  				"Can't switch workspaces while fullscreen global");  		} | 
