diff --git a/include/rootston/seat.h b/include/rootston/seat.h index 4667cd38..a91d8481 100644 --- a/include/rootston/seat.h +++ b/include/rootston/seat.h @@ -29,7 +29,7 @@ struct roots_seat { struct wl_list views; // roots_seat_view::link bool has_focus; - struct wl_list drag_icons; // roots_drag_icon::link + struct roots_drag_icon *drag_icon; // can be NULL struct wl_list keyboards; struct wl_list pointers; @@ -61,7 +61,6 @@ struct roots_seat_view { struct roots_drag_icon { struct roots_seat *seat; struct wlr_drag_icon *wlr_drag_icon; - struct wl_list link; double x, y; diff --git a/rootston/cursor.c b/rootston/cursor.c index 838f5d78..6e09c06e 100644 --- a/rootston/cursor.c +++ b/rootston/cursor.c @@ -151,9 +151,8 @@ static void roots_passthrough_cursor(struct roots_cursor *cursor, wlr_seat_pointer_clear_focus(seat->seat); } - struct roots_drag_icon *drag_icon; - wl_list_for_each(drag_icon, &seat->drag_icons, link) { - roots_drag_icon_update_position(drag_icon); + if (seat->drag_icon != NULL) { + roots_drag_icon_update_position(seat->drag_icon); } } diff --git a/rootston/output.c b/rootston/output.c index df8328dd..3aad1c06 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -120,15 +120,14 @@ static void drag_icons_for_each_surface(struct roots_input *input, void *user_data) { struct roots_seat *seat; wl_list_for_each(seat, &input->seats, link) { - struct roots_drag_icon *drag_icon; - wl_list_for_each(drag_icon, &seat->drag_icons, link) { - if (!drag_icon->wlr_drag_icon->mapped) { - continue; - } - surface_for_each_surface(drag_icon->wlr_drag_icon->surface, - drag_icon->x, drag_icon->y, 0, layout_data, - iterator, user_data); + struct roots_drag_icon *drag_icon = seat->drag_icon; + if (drag_icon == NULL || !drag_icon->wlr_drag_icon->mapped) { + continue; } + + surface_for_each_surface(drag_icon->wlr_drag_icon->surface, + drag_icon->x, drag_icon->y, 0, layout_data, + iterator, user_data); } } diff --git a/rootston/seat.c b/rootston/seat.c index a6281f50..cd95472d 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -594,7 +594,9 @@ static void roots_drag_icon_handle_destroy(struct wl_listener *listener, wl_container_of(listener, icon, destroy); roots_drag_icon_damage_whole(icon); - wl_list_remove(&icon->link); + assert(icon->seat->drag_icon == icon); + icon->seat->drag_icon = NULL; + wl_list_remove(&icon->surface_commit.link); wl_list_remove(&icon->unmap.link); wl_list_remove(&icon->destroy.link); @@ -622,7 +624,8 @@ static void roots_seat_handle_new_drag_icon(struct wl_listener *listener, icon->destroy.notify = roots_drag_icon_handle_destroy; wl_signal_add(&wlr_drag_icon->events.destroy, &icon->destroy); - wl_list_insert(&seat->drag_icons, &icon->link); + assert(seat->drag_icon == NULL); + seat->drag_icon = icon; roots_drag_icon_update_position(icon); } @@ -706,7 +709,6 @@ struct roots_seat *roots_seat_create(struct roots_input *input, char *name) { wl_list_init(&seat->tablet_pads); wl_list_init(&seat->switches); wl_list_init(&seat->views); - wl_list_init(&seat->drag_icons); seat->input = input;