diff options
Diffstat (limited to 'sway')
-rw-r--r-- | sway/commands.c | 1 | ||||
-rw-r--r-- | sway/commands/seat/cursor.c | 49 | ||||
-rw-r--r-- | sway/commands/tiling_drag_threshold.c | 22 | ||||
-rw-r--r-- | sway/config.c | 1 | ||||
-rw-r--r-- | sway/desktop/render.c | 2 | ||||
-rw-r--r-- | sway/desktop/transaction.c | 4 | ||||
-rw-r--r-- | sway/input/cursor.c | 75 | ||||
-rw-r--r-- | sway/input/seat.c | 15 | ||||
-rw-r--r-- | sway/meson.build | 1 | ||||
-rw-r--r-- | sway/server.c | 2 | ||||
-rw-r--r-- | sway/sway-output.5.scd | 12 | ||||
-rw-r--r-- | sway/sway.5.scd | 21 | ||||
-rw-r--r-- | sway/tree/view.c | 10 |
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 | ||
20 | struct cmd_results *seat_cmd_cursor(int argc, char **argv) { | 20 | static 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 | ||
52 | struct 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 | |||
61 | static struct cmd_results *press_or_release(struct sway_cursor *cursor, | 86 | static 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 | |||
6 | struct 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 | ||
364 | static int handle_timeout(void *data) { | 364 | static 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 | ||
387 | static 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 | |||
387 | static void calculate_floating_constraints(struct sway_container *con, | 411 | static 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 | ||
600 | void cursor_handle_activity(struct sway_cursor *cursor) { | 624 | int 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 | |||
636 | void 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); | 646 | void 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 | ||
1055 | void 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 | |||
1055 | void seat_begin_move_tiling(struct sway_seat *seat, | 1066 | void 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(); |