aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/commands.h1
-rw-r--r--include/sway/config.h1
-rw-r--r--sway/commands.c1
-rw-r--r--sway/commands/raise_floating.c14
-rw-r--r--sway/config.c1
-rw-r--r--sway/input/seat.c15
-rw-r--r--sway/meson.build1
7 files changed, 33 insertions, 1 deletions
diff --git a/include/sway/commands.h b/include/sway/commands.h
index 64f707f4..f7fafb96 100644
--- a/include/sway/commands.h
+++ b/include/sway/commands.h
@@ -125,6 +125,7 @@ sway_cmd cmd_floating_modifier;
sway_cmd cmd_floating_scroll;
sway_cmd cmd_focus;
sway_cmd cmd_focus_follows_mouse;
+sway_cmd cmd_raise_floating;
sway_cmd cmd_focus_on_window_activation;
sway_cmd cmd_focus_wrapping;
sway_cmd cmd_font;
diff --git a/include/sway/config.h b/include/sway/config.h
index 98a18b76..02ace979 100644
--- a/include/sway/config.h
+++ b/include/sway/config.h
@@ -359,6 +359,7 @@ struct sway_config {
// Flags
bool focus_follows_mouse;
+ bool raise_floating;
bool mouse_warping;
enum focus_wrapping_mode focus_wrapping;
bool active;
diff --git a/sway/commands.c b/sway/commands.c
index 72db8ab9..5dd27f7e 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -107,6 +107,7 @@ static struct cmd_handler handlers[] = {
{ "new_window", cmd_default_border },
{ "no_focus", cmd_no_focus },
{ "output", cmd_output },
+ { "raise_floating", cmd_raise_floating },
{ "seat", cmd_seat },
{ "set", cmd_set },
{ "show_marks", cmd_show_marks },
diff --git a/sway/commands/raise_floating.c b/sway/commands/raise_floating.c
new file mode 100644
index 00000000..930299a1
--- /dev/null
+++ b/sway/commands/raise_floating.c
@@ -0,0 +1,14 @@
+#include <string.h>
+#include <strings.h>
+#include "sway/commands.h"
+#include "util.h"
+
+struct cmd_results *cmd_raise_floating(int argc, char **argv) {
+ struct cmd_results *error = NULL;
+ if ((error = checkarg(argc, "raise_floating", EXPECTED_EQUAL_TO, 1))) {
+ return error;
+ }
+ config->raise_floating =
+ parse_boolean(argv[0], config->raise_floating);
+ return cmd_results_new(CMD_SUCCESS, NULL, NULL);
+}
diff --git a/sway/config.c b/sway/config.c
index 048b57de..b56c4f71 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -221,6 +221,7 @@ static void config_defaults(struct sway_config *config) {
// Flags
config->focus_follows_mouse = true;
+ config->raise_floating = true;
config->mouse_warping = true;
config->focus_wrapping = WRAP_YES;
config->validating = false;
diff --git a/sway/input/seat.c b/sway/input/seat.c
index 69bee47e..c747eafc 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -734,7 +734,7 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node,
// If we've focused a floating container, bring it to the front.
// We do this by putting it at the end of the floating list.
- if (container) {
+ if (container && config->raise_floating) {
struct sway_container *floater = container;
while (floater->parent) {
floater = floater->parent;
@@ -1017,6 +1017,19 @@ void seat_begin_down(struct sway_seat *seat, struct sway_container *con,
seat->op_ref_con_lx = sx;
seat->op_ref_con_ly = sy;
seat->op_moved = false;
+
+ // If we've focused a floating container, bring it to the front.
+ // We do this by putting it at the end of the floating list.
+ if (con && !config->raise_floating) {
+ struct sway_container *floater = con;
+ while (floater->parent) {
+ floater = floater->parent;
+ }
+ if (container_is_floating(floater)) {
+ list_move_to_end(floater->workspace->floating, floater);
+ node_set_dirty(&floater->workspace->node);
+ }
+ }
}
void seat_begin_move_floating(struct sway_seat *seat,
diff --git a/sway/meson.build b/sway/meson.build
index 00ebcb40..8ab28869 100644
--- a/sway/meson.build
+++ b/sway/meson.build
@@ -48,6 +48,7 @@ sway_sources = files(
'commands/floating_modifier.c',
'commands/focus.c',
'commands/focus_follows_mouse.c',
+ 'commands/raise_floating.c',
'commands/focus_on_window_activation.c',
'commands/focus_wrapping.c',
'commands/font.c',