summaryrefslogtreecommitdiff
path: root/sway/commands
diff options
context:
space:
mode:
authorReza Jelveh <[email protected]>2024-04-15 13:39:41 +0800
committerGitHub <[email protected]>2024-04-15 01:39:41 -0400
commitfb86ed6b0588dfdebfb66ce875bc63cfa0a897f6 (patch)
tree29857a1769107adc58696f08d379f608aa4e29a2 /sway/commands
parenta5e79676c4bd22fc5902182acf0667907202a465 (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')
-rw-r--r--sway/commands/assign.c2
-rw-r--r--sway/commands/bar.c4
-rw-r--r--sway/commands/bar/bind.c2
-rw-r--r--sway/commands/bar/tray_bind.c2
-rw-r--r--sway/commands/bind.c13
-rw-r--r--sway/commands/blur.c9
-rw-r--r--sway/commands/blur_brightness.c9
-rw-r--r--sway/commands/blur_contrast.c9
-rw-r--r--sway/commands/blur_noise.c15
-rw-r--r--sway/commands/blur_passes.c9
-rw-r--r--sway/commands/blur_radius.c9
-rw-r--r--sway/commands/blur_saturation.c9
-rw-r--r--sway/commands/blur_xray.c9
-rw-r--r--sway/commands/exec_always.c3
-rw-r--r--sway/commands/floating_minmax_size.c6
-rw-r--r--sway/commands/font.c6
-rw-r--r--sway/commands/for_window.c2
-rw-r--r--sway/commands/hide_edge_borders.c4
-rw-r--r--sway/commands/inhibit_idle.c2
-rw-r--r--sway/commands/input.c2
-rw-r--r--sway/commands/input/events.c10
-rw-r--r--sway/commands/input/map_from_region.c18
-rw-r--r--sway/commands/input/map_to_region.c2
-rw-r--r--sway/commands/input/rotation_angle.c29
-rw-r--r--sway/commands/input/scroll_button.c2
-rw-r--r--sway/commands/input/scroll_button_lock.c26
-rw-r--r--sway/commands/layout.c2
-rw-r--r--sway/commands/move.c36
-rw-r--r--sway/commands/no_focus.c2
-rw-r--r--sway/commands/output.c5
-rw-r--r--sway/commands/output/background.c3
-rw-r--r--sway/commands/primary_selection.c23
-rw-r--r--sway/commands/rename.c4
-rw-r--r--sway/commands/resize.c50
-rw-r--r--sway/commands/seat/cursor.c10
-rw-r--r--sway/commands/seat/idle.c6
-rw-r--r--sway/commands/shadows.c2
-rw-r--r--sway/commands/shadows_on_csd.c4
-rw-r--r--sway/commands/split.c2
-rw-r--r--sway/commands/swap.c179
-rw-r--r--sway/commands/workspace.c8
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");
}