output: remove idle_frame event source when destroying output

This prevents the idle event to be activated on a destroyed
output.

This also makes the backend responsible for free-ing modes, as it
is the one allocating them and adding them to the list. Note that
the DRM backend (the only one using modes) already frees them.
This commit is contained in:
emersion 2018-10-09 10:25:38 +02:00
parent 75005fd58d
commit 46b1ba386f
2 changed files with 12 additions and 5 deletions

View file

@ -1347,6 +1347,13 @@ static void drm_connector_cleanup(struct wlr_drm_connector *conn) {
memset(&conn->output.model, 0, sizeof(conn->output.model)); memset(&conn->output.model, 0, sizeof(conn->output.model));
memset(&conn->output.serial, 0, sizeof(conn->output.serial)); memset(&conn->output.serial, 0, sizeof(conn->output.serial));
if (conn->output.idle_frame != NULL) {
wl_event_source_remove(conn->output.idle_frame);
conn->output.idle_frame = NULL;
}
conn->output.needs_swap = false;
conn->output.frame_pending = false;
conn->pageflip_pending = false; conn->pageflip_pending = false;
/* Fallthrough */ /* Fallthrough */
case WLR_DRM_CONN_NEEDS_MODESET: case WLR_DRM_CONN_NEEDS_MODESET:

View file

@ -298,17 +298,17 @@ void wlr_output_destroy(struct wlr_output *output) {
wlr_signal_emit_safe(&output->events.destroy, output); wlr_signal_emit_safe(&output->events.destroy, output);
struct wlr_output_mode *mode, *tmp_mode; // The backend is responsible for free-ing the list of modes
wl_list_for_each_safe(mode, tmp_mode, &output->modes, link) {
wl_list_remove(&mode->link);
free(mode);
}
struct wlr_output_cursor *cursor, *tmp_cursor; struct wlr_output_cursor *cursor, *tmp_cursor;
wl_list_for_each_safe(cursor, tmp_cursor, &output->cursors, link) { wl_list_for_each_safe(cursor, tmp_cursor, &output->cursors, link) {
wlr_output_cursor_destroy(cursor); wlr_output_cursor_destroy(cursor);
} }
if (output->idle_frame != NULL) {
wl_event_source_remove(output->idle_frame);
}
pixman_region32_fini(&output->damage); pixman_region32_fini(&output->damage);
if (output->impl && output->impl->destroy) { if (output->impl && output->impl->destroy) {