summaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/commands.c1
-rw-r--r--sway/commands/seat/cursor.c49
-rw-r--r--sway/commands/tiling_drag_threshold.c22
-rw-r--r--sway/config.c1
-rw-r--r--sway/desktop/render.c2
-rw-r--r--sway/desktop/transaction.c4
-rw-r--r--sway/input/cursor.c75
-rw-r--r--sway/input/seat.c15
-rw-r--r--sway/meson.build1
-rw-r--r--sway/server.c2
-rw-r--r--sway/sway-output.5.scd12
-rw-r--r--sway/sway.5.scd21
-rw-r--r--sway/tree/view.c10
13 files changed, 168 insertions, 47 deletions
diff --git a/sway/commands.c b/sway/commands.c
index cd595b03..4e524a88 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -87,6 +87,7 @@ static struct cmd_handler handlers[] = {
87 { "smart_borders", cmd_smart_borders }, 87 { "smart_borders", cmd_smart_borders },
88 { "smart_gaps", cmd_smart_gaps }, 88 { "smart_gaps", cmd_smart_gaps },
89 { "tiling_drag", cmd_tiling_drag }, 89 { "tiling_drag", cmd_tiling_drag },
90 { "tiling_drag_threshold", cmd_tiling_drag_threshold },
90 { "title_align", cmd_title_align }, 91 { "title_align", cmd_title_align },
91 { "titlebar_border_thickness", cmd_titlebar_border_thickness }, 92 { "titlebar_border_thickness", cmd_titlebar_border_thickness },
92 { "titlebar_padding", cmd_titlebar_padding }, 93 { "titlebar_padding", cmd_titlebar_padding },
diff --git a/sway/commands/seat/cursor.c b/sway/commands/seat/cursor.c
index 495c2338..b4728543 100644
--- a/sway/commands/seat/cursor.c
+++ b/sway/commands/seat/cursor.c
@@ -17,18 +17,8 @@ static const char *expected_syntax = "Expected 'cursor <move> <x> <y>' or "
17 "'cursor <set> <x> <y>' or " 17 "'cursor <set> <x> <y>' or "
18 "'curor <press|release> <left|right|1|2|3...>'"; 18 "'curor <press|release> <left|right|1|2|3...>'";
19 19
20struct cmd_results *seat_cmd_cursor(int argc, char **argv) { 20static struct cmd_results *handle_command(struct sway_cursor *cursor,
21 struct cmd_results *error = NULL; 21 int argc, char **argv) {
22 if ((error = checkarg(argc, "cursor", EXPECTED_AT_LEAST, 2))) {
23 return error;
24 }
25 struct sway_seat *seat = config->handler_context.seat;
26 if (!seat) {
27 return cmd_results_new(CMD_FAILURE, "cursor", "No seat defined");
28 }
29
30 struct sway_cursor *cursor = seat->cursor;
31
32 if (strcasecmp(argv[0], "move") == 0) { 22 if (strcasecmp(argv[0], "move") == 0) {
33 if (argc < 3) { 23 if (argc < 3) {
34 return cmd_results_new(CMD_INVALID, "cursor", expected_syntax); 24 return cmd_results_new(CMD_INVALID, "cursor", expected_syntax);
@@ -50,6 +40,7 @@ struct cmd_results *seat_cmd_cursor(int argc, char **argv) {
50 if (argc < 2) { 40 if (argc < 2) {
51 return cmd_results_new(CMD_INVALID, "cursor", expected_syntax); 41 return cmd_results_new(CMD_INVALID, "cursor", expected_syntax);
52 } 42 }
43 struct cmd_results *error = NULL;
53 if ((error = press_or_release(cursor, argv[0], argv[1]))) { 44 if ((error = press_or_release(cursor, argv[0], argv[1]))) {
54 return error; 45 return error;
55 } 46 }
@@ -58,6 +49,40 @@ struct cmd_results *seat_cmd_cursor(int argc, char **argv) {
58 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 49 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
59} 50}
60 51
52struct cmd_results *seat_cmd_cursor(int argc, char **argv) {
53 struct cmd_results *error = NULL;
54 if ((error = checkarg(argc, "cursor", EXPECTED_AT_LEAST, 2))) {
55 return error;
56 }
57 struct seat_config *sc = config->handler_context.seat_config;
58 if (!sc) {
59 return cmd_results_new(CMD_FAILURE, "cursor", "No seat defined");
60 }
61
62 if (config->reading || !config->active) {
63 return cmd_results_new(CMD_DEFER, NULL, NULL);
64 }
65
66 if (strcmp(sc->name, "*") != 0) {
67 struct sway_seat *seat = input_manager_get_seat(sc->name);
68 if (!seat) {
69 return cmd_results_new(CMD_FAILURE, "cursor",
70 "Failed to get seat");
71 }
72 error = handle_command(seat->cursor, argc, argv);
73 } else {
74 struct sway_seat *seat = NULL;
75 wl_list_for_each(seat, &server.input->seats, link) {
76 error = handle_command(seat->cursor, argc, argv);
77 if ((error && error->status != CMD_SUCCESS)) {
78 break;
79 }
80 }
81 }
82
83 return error ? error : cmd_results_new(CMD_SUCCESS, NULL, NULL);
84}
85
61static struct cmd_results *press_or_release(struct sway_cursor *cursor, 86static struct cmd_results *press_or_release(struct sway_cursor *cursor,
62 char *action, char *button_str) { 87 char *action, char *button_str) {
63 enum wlr_button_state state; 88 enum wlr_button_state state;
diff --git a/sway/commands/tiling_drag_threshold.c b/sway/commands/tiling_drag_threshold.c
new file mode 100644
index 00000000..6b0531c3
--- /dev/null
+++ b/sway/commands/tiling_drag_threshold.c
@@ -0,0 +1,22 @@
1#include <string.h>
2#include "sway/commands.h"
3#include "sway/config.h"
4#include "log.h"
5
6struct cmd_results *cmd_tiling_drag_threshold(int argc, char **argv) {
7 struct cmd_results *error = NULL;
8 if ((error = checkarg(argc, "tiling_drag_threshold", EXPECTED_EQUAL_TO, 1))) {
9 return error;
10 }
11
12 char *inv;
13 int value = strtol(argv[0], &inv, 10);
14 if (*inv != '\0' || value < 0) {
15 return cmd_results_new(CMD_INVALID, "tiling_drag_threshold",
16 "Invalid threshold specified");
17 }
18
19 config->tiling_drag_threshold = value;
20
21 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
22}
diff --git a/sway/config.c b/sway/config.c
index 9f32d44c..8a0b293c 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -232,6 +232,7 @@ static void config_defaults(struct sway_config *config) {
232 config->show_marks = true; 232 config->show_marks = true;
233 config->title_align = ALIGN_LEFT; 233 config->title_align = ALIGN_LEFT;
234 config->tiling_drag = true; 234 config->tiling_drag = true;
235 config->tiling_drag_threshold = 9;
235 236
236 config->smart_gaps = false; 237 config->smart_gaps = false;
237 config->gaps_inner = 0; 238 config->gaps_inner = 0;
diff --git a/sway/desktop/render.c b/sway/desktop/render.c
index 14881e96..6c9fe23c 100644
--- a/sway/desktop/render.c
+++ b/sway/desktop/render.c
@@ -1017,7 +1017,7 @@ void output_render(struct sway_output *output, struct timespec *when,
1017 if (fullscreen_con->view) { 1017 if (fullscreen_con->view) {
1018 if (fullscreen_con->view->saved_buffer) { 1018 if (fullscreen_con->view->saved_buffer) {
1019 render_saved_view(fullscreen_con->view, output, damage, 1.0f); 1019 render_saved_view(fullscreen_con->view, output, damage, 1.0f);
1020 } else { 1020 } else if (fullscreen_con->view->surface) {
1021 render_view_toplevels(fullscreen_con->view, 1021 render_view_toplevels(fullscreen_con->view,
1022 output, damage, 1.0f); 1022 output, damage, 1.0f);
1023 } 1023 }
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index bf0038b4..f46938e2 100644
--- a/sway/desktop/transaction.c
+++ b/sway/desktop/transaction.c
@@ -363,7 +363,7 @@ static void transaction_progress_queue(void) {
363 363
364static int handle_timeout(void *data) { 364static int handle_timeout(void *data) {
365 struct sway_transaction *transaction = data; 365 struct sway_transaction *transaction = data;
366 wlr_log(WLR_DEBUG, "Transaction %p timed out (%li waiting)", 366 wlr_log(WLR_DEBUG, "Transaction %p timed out (%zi waiting)",
367 transaction, transaction->num_waiting); 367 transaction, transaction->num_waiting);
368 transaction->num_waiting = 0; 368 transaction->num_waiting = 0;
369 transaction_progress_queue(); 369 transaction_progress_queue();
@@ -472,7 +472,7 @@ static void set_instruction_ready(
472 struct timespec *start = &transaction->commit_time; 472 struct timespec *start = &transaction->commit_time;
473 float ms = (now.tv_sec - start->tv_sec) * 1000 + 473 float ms = (now.tv_sec - start->tv_sec) * 1000 +
474 (now.tv_nsec - start->tv_nsec) / 1000000.0; 474 (now.tv_nsec - start->tv_nsec) / 1000000.0;
475 wlr_log(WLR_DEBUG, "Transaction %p: %li/%li ready in %.1fms (%s)", 475 wlr_log(WLR_DEBUG, "Transaction %p: %zi/%zi ready in %.1fms (%s)",
476 transaction, 476 transaction,
477 transaction->num_configures - transaction->num_waiting + 1, 477 transaction->num_configures - transaction->num_waiting + 1,
478 transaction->num_configures, ms, 478 transaction->num_configures, ms,
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index f8302ddf..510030ae 100644
--- a/sway/input/cursor.c
+++ b/sway/input/cursor.c
@@ -384,6 +384,30 @@ static void handle_move_tiling_motion(struct sway_seat *seat,
384 desktop_damage_box(&seat->op_drop_box); 384 desktop_damage_box(&seat->op_drop_box);
385} 385}
386 386
387static void handle_move_tiling_threshold_motion(struct sway_seat *seat,
388 struct sway_cursor *cursor) {
389 double cx = seat->cursor->cursor->x;
390 double cy = seat->cursor->cursor->y;
391 double sx = seat->op_ref_lx;
392 double sy = seat->op_ref_ly;
393
394 // Get the scaled threshold for the output. Even if the operation goes
395 // across multiple outputs of varying scales, just use the scale for the
396 // output that the cursor is currently on for simplicity.
397 struct wlr_output *wlr_output = wlr_output_layout_output_at(
398 root->output_layout, cx, cy);
399 double output_scale = wlr_output ? wlr_output->scale : 1;
400 double threshold = config->tiling_drag_threshold * output_scale;
401 threshold *= threshold;
402
403 // If the threshold has been exceeded, start the actual drag
404 if ((cx - sx) * (cx - sx) + (cy - sy) * (cy - sy) > threshold) {
405 seat->operation = OP_MOVE_TILING;
406 cursor_set_image(cursor, "grab", NULL);
407 handle_move_tiling_motion(seat, cursor);
408 }
409}
410
387static void calculate_floating_constraints(struct sway_container *con, 411static void calculate_floating_constraints(struct sway_container *con,
388 int *min_width, int *max_width, int *min_height, int *max_height) { 412 int *min_width, int *max_width, int *min_height, int *max_height) {
389 if (config->floating_minimum_width == -1) { // no minimum 413 if (config->floating_minimum_width == -1) { // no minimum
@@ -597,7 +621,7 @@ static int hide_notify(void *data) {
597 return 1; 621 return 1;
598} 622}
599 623
600void cursor_handle_activity(struct sway_cursor *cursor) { 624int cursor_get_timeout(struct sway_cursor *cursor){
601 struct seat_config *sc = seat_get_config(cursor->seat); 625 struct seat_config *sc = seat_get_config(cursor->seat);
602 if (!sc) { 626 if (!sc) {
603 sc = seat_get_config_by_name("*"); 627 sc = seat_get_config_by_name("*");
@@ -606,20 +630,31 @@ void cursor_handle_activity(struct sway_cursor *cursor) {
606 if (timeout < 0) { 630 if (timeout < 0) {
607 timeout = 0; 631 timeout = 0;
608 } 632 }
609 wl_event_source_timer_update(cursor->hide_source, timeout); 633 return timeout;
634}
635
636void cursor_handle_activity(struct sway_cursor *cursor) {
637 wl_event_source_timer_update(
638 cursor->hide_source, cursor_get_timeout(cursor));
610 639
611 wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); 640 wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat);
612 if (cursor->hidden) { 641 if (cursor->hidden) {
613 cursor->hidden = false; 642 cursor_unhide(cursor);
614 if (cursor->image_surface) { 643 }
615 cursor_set_image_surface(cursor, cursor->image_surface, 644}
616 cursor->hotspot_x, cursor->hotspot_y, 645
617 cursor->image_client); 646void cursor_unhide(struct sway_cursor *cursor) {
618 } else { 647 cursor->hidden = false;
619 const char *image = cursor->image; 648 if (cursor->image_surface) {
620 cursor->image = NULL; 649 cursor_set_image_surface(cursor,
621 cursor_set_image(cursor, image, cursor->image_client); 650 cursor->image_surface,
622 } 651 cursor->hotspot_x,
652 cursor->hotspot_y,
653 cursor->image_client);
654 } else {
655 const char *image = cursor->image;
656 cursor->image = NULL;
657 cursor_set_image(cursor, image, cursor->image_client);
623 } 658 }
624} 659}
625 660
@@ -640,6 +675,9 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor,
640 case OP_MOVE_FLOATING: 675 case OP_MOVE_FLOATING:
641 handle_move_floating_motion(seat, cursor); 676 handle_move_floating_motion(seat, cursor);
642 break; 677 break;
678 case OP_MOVE_TILING_THRESHOLD:
679 handle_move_tiling_threshold_motion(seat, cursor);
680 break;
643 case OP_MOVE_TILING: 681 case OP_MOVE_TILING:
644 handle_move_tiling_motion(seat, cursor); 682 handle_move_tiling_motion(seat, cursor);
645 break; 683 break;
@@ -984,12 +1022,21 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
984 if (config->tiling_drag && (mod_pressed || on_titlebar) && 1022 if (config->tiling_drag && (mod_pressed || on_titlebar) &&
985 state == WLR_BUTTON_PRESSED && !is_floating_or_child && 1023 state == WLR_BUTTON_PRESSED && !is_floating_or_child &&
986 cont && !cont->is_fullscreen) { 1024 cont && !cont->is_fullscreen) {
987 if (on_titlebar) { 1025 struct sway_container *focus = seat_get_focused_container(seat);
1026 bool focused = focus == cont || container_has_ancestor(focus, cont);
1027 if (on_titlebar && !focused) {
988 node = seat_get_focus_inactive(seat, &cont->node); 1028 node = seat_get_focus_inactive(seat, &cont->node);
989 seat_set_focus(seat, node); 1029 seat_set_focus(seat, node);
990 } 1030 }
1031
991 seat_pointer_notify_button(seat, time_msec, button, state); 1032 seat_pointer_notify_button(seat, time_msec, button, state);
992 seat_begin_move_tiling(seat, cont, button); 1033
1034 // If moving a container by it's title bar, use a threshold for the drag
1035 if (!mod_pressed && config->tiling_drag_threshold > 0) {
1036 seat_begin_move_tiling_threshold(seat, cont, button);
1037 } else {
1038 seat_begin_move_tiling(seat, cont, button);
1039 }
993 return; 1040 return;
994 } 1041 }
995 1042
diff --git a/sway/input/seat.c b/sway/input/seat.c
index fa82c9ce..52790039 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -1052,6 +1052,17 @@ void seat_begin_move_floating(struct sway_seat *seat,
1052 cursor_set_image(seat->cursor, "grab", NULL); 1052 cursor_set_image(seat->cursor, "grab", NULL);
1053} 1053}
1054 1054
1055void seat_begin_move_tiling_threshold(struct sway_seat *seat,
1056 struct sway_container *con, uint32_t button) {
1057 seat->operation = OP_MOVE_TILING_THRESHOLD;
1058 seat->op_container = con;
1059 seat->op_button = button;
1060 seat->op_target_node = NULL;
1061 seat->op_target_edge = 0;
1062 seat->op_ref_lx = seat->cursor->cursor->x;
1063 seat->op_ref_ly = seat->cursor->cursor->y;
1064}
1065
1055void seat_begin_move_tiling(struct sway_seat *seat, 1066void seat_begin_move_tiling(struct sway_seat *seat,
1056 struct sway_container *con, uint32_t button) { 1067 struct sway_container *con, uint32_t button) {
1057 seat->operation = OP_MOVE_TILING; 1068 seat->operation = OP_MOVE_TILING;
@@ -1220,4 +1231,8 @@ void seat_consider_warp_to_focus(struct sway_seat *seat) {
1220 } else { 1231 } else {
1221 cursor_warp_to_workspace(seat->cursor, focus->sway_workspace); 1232 cursor_warp_to_workspace(seat->cursor, focus->sway_workspace);
1222 } 1233 }
1234 if (seat->cursor->hidden){
1235 cursor_unhide(seat->cursor);
1236 wl_event_source_timer_update(seat->cursor->hide_source, cursor_get_timeout(seat->cursor));
1237 }
1223} 1238}
diff --git a/sway/meson.build b/sway/meson.build
index 7f739287..98676ce0 100644
--- a/sway/meson.build
+++ b/sway/meson.build
@@ -89,6 +89,7 @@ sway_sources = files(
89 'commands/swaynag_command.c', 89 'commands/swaynag_command.c',
90 'commands/swap.c', 90 'commands/swap.c',
91 'commands/tiling_drag.c', 91 'commands/tiling_drag.c',
92 'commands/tiling_drag_threshold.c',
92 'commands/title_align.c', 93 'commands/title_align.c',
93 'commands/title_format.c', 94 'commands/title_format.c',
94 'commands/titlebar_border_thickness.c', 95 'commands/titlebar_border_thickness.c',
diff --git a/sway/server.c b/sway/server.c
index b1d7d3fc..13264a2c 100644
--- a/sway/server.c
+++ b/sway/server.c
@@ -7,6 +7,7 @@
7#include <wlr/backend/session.h> 7#include <wlr/backend/session.h>
8#include <wlr/render/wlr_renderer.h> 8#include <wlr/render/wlr_renderer.h>
9#include <wlr/types/wlr_compositor.h> 9#include <wlr/types/wlr_compositor.h>
10#include <wlr/types/wlr_data_control_v1.h>
10#include <wlr/types/wlr_export_dmabuf_v1.h> 11#include <wlr/types/wlr_export_dmabuf_v1.h>
11#include <wlr/types/wlr_gamma_control_v1.h> 12#include <wlr/types/wlr_gamma_control_v1.h>
12#include <wlr/types/wlr_gamma_control.h> 13#include <wlr/types/wlr_gamma_control.h>
@@ -140,6 +141,7 @@ bool server_init(struct sway_server *server) {
140 141
141 wlr_export_dmabuf_manager_v1_create(server->wl_display); 142 wlr_export_dmabuf_manager_v1_create(server->wl_display);
142 wlr_screencopy_manager_v1_create(server->wl_display); 143 wlr_screencopy_manager_v1_create(server->wl_display);
144 wlr_data_control_manager_v1_create(server->wl_display);
143 145
144 server->socket = wl_display_add_socket_auto(server->wl_display); 146 server->socket = wl_display_add_socket_auto(server->wl_display);
145 if (!server->socket) { 147 if (!server->socket) {
diff --git a/sway/sway-output.5.scd b/sway/sway-output.5.scd
index 9940d8e8..28524478 100644
--- a/sway/sway-output.5.scd
+++ b/sway/sway-output.5.scd
@@ -38,17 +38,20 @@ must be separated by one space. For example:
38 Places the specified output at the specific position in the global 38 Places the specified output at the specific position in the global
39 coordinate space. If scaling is active, it has to be considered when 39 coordinate space. If scaling is active, it has to be considered when
40 positioning. For example, if the scaling factor for the left output is 2, 40 positioning. For example, if the scaling factor for the left output is 2,
41 the relative position for the right output has to be divided by 2. 41 the relative position for the right output has to be divided by 2. The
42 reference point is the top left corner so if you want the bottoms aligned
43 this has to be considered as well.
42 44
43 Example: 45 Example:
44 46
45 output HDMI1 scale 2 47 output HDMI1 scale 2
46 48
47 output HDMI1 pos 0 0 res 3200x1800 49 output HDMI1 pos 0 1020 res 3200x1800
48 50
49 output eDP1 pos 1600 0 res 1920x1080 51 output eDP1 pos 1600 0 res 1920x1080
50 52
51 Note that the x-pos of eDP1 is 1600 = 3200/2. 53 Note that the left x-pos of eDP1 is 1600 = 3200/2 and the bottom y-pos is
54 1020 + (1800 / 2) = 1920 = 0 + 1920
52 55
53*output* <name> scale <factor> 56*output* <name> scale <factor>
54 Scales the specified output by the specified scale _factor_. An integer is 57 Scales the specified output by the specified scale _factor_. An integer is
@@ -57,7 +60,8 @@ must be separated by one space. For example:
57 represent the contents of your windows - they will be rendered at the next 60 represent the contents of your windows - they will be rendered at the next
58 highest integral scale factor and downscaled. You may be better served by 61 highest integral scale factor and downscaled. You may be better served by
59 setting an integral scale factor and adjusting the font size of your 62 setting an integral scale factor and adjusting the font size of your
60 applications to taste. 63 applications to taste. HiDPI isn't supported with Xwayland clients (windows
64 will blur).
61 65
62*output* <name> background|bg <file> <mode> [<fallback\_color>] 66*output* <name> background|bg <file> <mode> [<fallback\_color>]
63 Sets the wallpaper for the given output to the specified file, using the 67 Sets the wallpaper for the given output to the specified file, using the
diff --git a/sway/sway.5.scd b/sway/sway.5.scd
index e6abef56..3757a097 100644
--- a/sway/sway.5.scd
+++ b/sway/sway.5.scd
@@ -327,7 +327,8 @@ runtime.
327 A view that does not have focus. 327 A view that does not have focus.
328 328
329 *client.urgent* 329 *client.urgent*
330 A view with an urgency hint. *Note*: This is not currently implemented. 330 A view with an urgency hint. *Note*: Native Wayland windows do not
331 support urgency. Urgency only works for Xwayland windows.
331 332
332 The meaning of each color is: 333 The meaning of each color is:
333 334
@@ -431,7 +432,7 @@ The default colors are:
431 432
432*focus\_follows\_mouse* yes|no|always 433*focus\_follows\_mouse* yes|no|always
433 If set to _yes_, moving your mouse over a window will focus that window. If 434 If set to _yes_, moving your mouse over a window will focus that window. If
434 set to _always_, the window under the cursor will always be focused, even 435 set to _always_, the window under the cursor will always be focused, even
435 after switching between workspaces. 436 after switching between workspaces.
436 437
437*focus\_wrapping* yes|no|force 438*focus\_wrapping* yes|no|force
@@ -450,11 +451,11 @@ The default colors are:
450 Thickness of the titlebar border in pixels 451 Thickness of the titlebar border in pixels
451 452
452*titlebar\_padding* <horizontal> [<vertical>] 453*titlebar\_padding* <horizontal> [<vertical>]
453 Padding of the text in the titlebar. _horizontal_ value affects horizontal 454 Padding of the text in the titlebar. _horizontal_ value affects horizontal
454 padding of the text while _vertical_ value affects vertical padding (space 455 padding of the text while _vertical_ value affects vertical padding (space
455 above and below text). Padding includes titlebar borders so their value 456 above and below text). Padding includes titlebar borders so their value
456 should be greater than titlebar\_border\_thickness. If _vertical_ value is 457 should be greater than titlebar\_border\_thickness. If _vertical_ value is
457 not specified it is set to the _horizontal_ value. 458 not specified it is set to the _horizontal_ value.
458 459
459*for\_window* <criteria> <command> 460*for\_window* <criteria> <command>
460 Whenever a window that matches _criteria_ appears, run list of commands. 461 Whenever a window that matches _criteria_ appears, run list of commands.
@@ -572,6 +573,14 @@ The default colors are:
572 the _floating\_mod_ will also allow the container to be dragged. _toggle_ 573 the _floating\_mod_ will also allow the container to be dragged. _toggle_
573 should not be used in the config file. 574 should not be used in the config file.
574 575
576*tiling\_drag\_threshold* <threshold>
577 Sets the threshold that must be exceeded for a container to be dragged by
578 its titlebar. This has no effect if _floating\_mod_ is used or if
579 _tiling\_drag_ is set to _disable_. Once the threshold has been exceeded
580 once, the drag starts and the cursor can come back inside the threshold
581 without stopping the drag. _threshold_ is multiplied by the scale of the
582 output that the cursor on. The default is 9.
583
575*title\_align* left|center|right 584*title\_align* left|center|right
576 Sets the title alignment. If _right_ is selected and _show\_marks_ is set 585 Sets the title alignment. If _right_ is selected and _show\_marks_ is set
577 to _yes_, the marks will be shown on the _left_ side instead of the 586 to _yes_, the marks will be shown on the _left_ side instead of the
diff --git a/sway/tree/view.c b/sway/tree/view.c
index deb20676..5371ee20 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -654,14 +654,8 @@ void view_unmap(struct sway_view *view) {
654 654
655 struct sway_seat *seat; 655 struct sway_seat *seat;
656 wl_list_for_each(seat, &server.input->seats, link) { 656 wl_list_for_each(seat, &server.input->seats, link) {
657 if (config->mouse_warping == WARP_CONTAINER) { 657 seat->cursor->image_surface = NULL;
658 struct sway_node *node = seat_get_focus(seat); 658 seat_consider_warp_to_focus(seat);
659 if (node && node->type == N_CONTAINER) {
660 cursor_warp_to_container(seat->cursor, node->sway_container);
661 } else if (node && node->type == N_WORKSPACE) {
662 cursor_warp_to_workspace(seat->cursor, node->sway_workspace);
663 }
664 }
665 } 659 }
666 660
667 transaction_commit_dirty(); 661 transaction_commit_dirty();