aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/cursor.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-07-19 19:49:50 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-07-19 19:49:50 +1000
commit8533c35a9f15288bb9bade57d972cf0ad0724ec4 (patch)
tree7d6c9bb874f6c2136a1307506bb5483ac104e41a /sway/input/cursor.c
parentMerge pull request #2300 from emersion/override-redirect-updates (diff)
downloadsway-8533c35a9f15288bb9bade57d972cf0ad0724ec4.tar.gz
sway-8533c35a9f15288bb9bade57d972cf0ad0724ec4.tar.zst
sway-8533c35a9f15288bb9bade57d972cf0ad0724ec4.zip
Fix crash and render issues involving cursor_send_pointer_motion
Fixes #2303, as well as a crash. To replicate the crash: * Have multiple outputs * In config: for_window [<criteria>] workspace foo * Also in config: workspace foo output <left-output-name> * Focus the right output, and ensure workspace foo doesn't exist * Launch the app that triggers the criteria When the view maps, it calls workspace_switch which calls send_set_focus which calls cursor_send_pointer_motion which calls transaction_commit_dirty. This call to transaction_commit_dirty is not meant to happen at this time because the tree isn't guaranteed to be in a consistent state, but I'm not sure how exactly this leads to the crash or render issues. In this case the transaction is already committed by the view implementation's handle_map function. So the solution is to remove it from cursor_send_pointer_motion and add it to the other functions in cursor.c which call cursor_send_pointer_motion.
Diffstat (limited to 'sway/input/cursor.c')
-rw-r--r--sway/input/cursor.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index 7a9f3ed7..c76c20b3 100644
--- a/sway/input/cursor.c
+++ b/sway/input/cursor.c
@@ -220,7 +220,6 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor, uint32_t time_msec,
220 struct sway_drag_icon *drag_icon = wlr_drag_icon->data; 220 struct sway_drag_icon *drag_icon = wlr_drag_icon->data;
221 drag_icon_update_position(drag_icon); 221 drag_icon_update_position(drag_icon);
222 } 222 }
223 transaction_commit_dirty();
224} 223}
225 224
226static void handle_cursor_motion(struct wl_listener *listener, void *data) { 225static void handle_cursor_motion(struct wl_listener *listener, void *data) {
@@ -230,6 +229,7 @@ static void handle_cursor_motion(struct wl_listener *listener, void *data) {
230 wlr_cursor_move(cursor->cursor, event->device, 229 wlr_cursor_move(cursor->cursor, event->device,
231 event->delta_x, event->delta_y); 230 event->delta_x, event->delta_y);
232 cursor_send_pointer_motion(cursor, event->time_msec, true); 231 cursor_send_pointer_motion(cursor, event->time_msec, true);
232 transaction_commit_dirty();
233} 233}
234 234
235static void handle_cursor_motion_absolute( 235static void handle_cursor_motion_absolute(
@@ -240,6 +240,7 @@ static void handle_cursor_motion_absolute(
240 struct wlr_event_pointer_motion_absolute *event = data; 240 struct wlr_event_pointer_motion_absolute *event = data;
241 wlr_cursor_warp_absolute(cursor->cursor, event->device, event->x, event->y); 241 wlr_cursor_warp_absolute(cursor->cursor, event->device, event->x, event->y);
242 cursor_send_pointer_motion(cursor, event->time_msec, true); 242 cursor_send_pointer_motion(cursor, event->time_msec, true);
243 transaction_commit_dirty();
243} 244}
244 245
245void dispatch_cursor_button(struct sway_cursor *cursor, 246void dispatch_cursor_button(struct sway_cursor *cursor,
@@ -426,6 +427,7 @@ static void handle_tool_axis(struct wl_listener *listener, void *data) {
426 427
427 wlr_cursor_warp_absolute(cursor->cursor, event->device, x, y); 428 wlr_cursor_warp_absolute(cursor->cursor, event->device, x, y);
428 cursor_send_pointer_motion(cursor, event->time_msec, true); 429 cursor_send_pointer_motion(cursor, event->time_msec, true);
430 transaction_commit_dirty();
429} 431}
430 432
431static void handle_tool_tip(struct wl_listener *listener, void *data) { 433static void handle_tool_tip(struct wl_listener *listener, void *data) {