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:
parent
75005fd58d
commit
46b1ba386f
|
@ -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:
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue