diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-07-19 19:49:50 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-07-19 19:49:50 +1000 |
commit | 8533c35a9f15288bb9bade57d972cf0ad0724ec4 (patch) | |
tree | 7d6c9bb874f6c2136a1307506bb5483ac104e41a | |
parent | Merge pull request #2300 from emersion/override-redirect-updates (diff) | |
download | sway-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.
-rw-r--r-- | sway/input/cursor.c | 4 |
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 | ||
226 | static void handle_cursor_motion(struct wl_listener *listener, void *data) { | 225 | static 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 | ||
235 | static void handle_cursor_motion_absolute( | 235 | static 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 | ||
245 | void dispatch_cursor_button(struct sway_cursor *cursor, | 246 | void 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 | ||
431 | static void handle_tool_tip(struct wl_listener *listener, void *data) { | 433 | static void handle_tool_tip(struct wl_listener *listener, void *data) { |