aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/xdg_shell_v6.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-10-24 19:38:52 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-10-24 19:38:52 +1000
commitbdae625cb344209424841a7c5f0c0967773c8c10 (patch)
tree754adb52ec2e2eb9d336d1c826bab62ea96e6c52 /sway/desktop/xdg_shell_v6.c
parentMerge pull request #2933 from Snaipe/xwayland-window-properties (diff)
downloadsway-bdae625cb344209424841a7c5f0c0967773c8c10.tar.gz
sway-bdae625cb344209424841a7c5f0c0967773c8c10.tar.zst
sway-bdae625cb344209424841a7c5f0c0967773c8c10.zip
Rebase the cursor after mapping a view
I originally put the rebase at the end of view_map, but at this point the view is still at its native size and will ignore the motion event if it falls outside of its native size. The only way to do this properly is to rebase the cursor later - either after sending the configure, after the view commits with the new size, or after applying the transaction. I chose to do it after applying the transaction for simplicity. I then attempted to just call cursor_rebase after applying every transaction, but this causes crashes when exiting sway (and possibly other places) because cursor_rebase assumes the tree is in a valid state. So my chosen solution introduces transaction_commit_dirty_with_callback which allows handle_map to register a callback which will run when the transaction is applied.
Diffstat (limited to 'sway/desktop/xdg_shell_v6.c')
-rw-r--r--sway/desktop/xdg_shell_v6.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c
index 7159f1ed..90bf55b2 100644
--- a/sway/desktop/xdg_shell_v6.c
+++ b/sway/desktop/xdg_shell_v6.c
@@ -8,6 +8,7 @@
8#include "sway/decoration.h" 8#include "sway/decoration.h"
9#include "sway/desktop.h" 9#include "sway/desktop.h"
10#include "sway/desktop/transaction.h" 10#include "sway/desktop/transaction.h"
11#include "sway/input/cursor.h"
11#include "sway/input/input-manager.h" 12#include "sway/input/input-manager.h"
12#include "sway/input/seat.h" 13#include "sway/input/seat.h"
13#include "sway/output.h" 14#include "sway/output.h"
@@ -393,6 +394,11 @@ static void handle_unmap(struct wl_listener *listener, void *data) {
393 wl_list_remove(&xdg_shell_v6_view->set_app_id.link); 394 wl_list_remove(&xdg_shell_v6_view->set_app_id.link);
394} 395}
395 396
397static void do_rebase(void *data) {
398 struct sway_cursor *cursor = data;
399 cursor_rebase(cursor);
400}
401
396static void handle_map(struct wl_listener *listener, void *data) { 402static void handle_map(struct wl_listener *listener, void *data) {
397 struct sway_xdg_shell_v6_view *xdg_shell_v6_view = 403 struct sway_xdg_shell_v6_view *xdg_shell_v6_view =
398 wl_container_of(listener, xdg_shell_v6_view, map); 404 wl_container_of(listener, xdg_shell_v6_view, map);
@@ -413,7 +419,8 @@ static void handle_map(struct wl_listener *listener, void *data) {
413 view_map(view, view->wlr_xdg_surface_v6->surface, 419 view_map(view, view->wlr_xdg_surface_v6->surface,
414 xdg_surface->toplevel->client_pending.fullscreen, csd); 420 xdg_surface->toplevel->client_pending.fullscreen, csd);
415 421
416 transaction_commit_dirty(); 422 struct sway_seat *seat = input_manager_current_seat();
423 transaction_commit_dirty_with_callback(do_rebase, seat->cursor);
417 424
418 xdg_shell_v6_view->commit.notify = handle_commit; 425 xdg_shell_v6_view->commit.notify = handle_commit;
419 wl_signal_add(&xdg_surface->surface->events.commit, 426 wl_signal_add(&xdg_surface->surface->events.commit,