aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-10-09 10:25:38 +0200
committeremersion <contact@emersion.fr>2018-10-09 10:55:03 +0200
commit46b1ba386f00dfef079b26326a011521026b5f59 (patch)
tree9b2d28049d492182e5868b1a949cef028788553b
parent75005fd58dcf82f8775e1216fb98c9ad3287d116 (diff)
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.
-rw-r--r--backend/drm/drm.c7
-rw-r--r--types/wlr_output.c10
2 files changed, 12 insertions, 5 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index 00525762..b8ef984b 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -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.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;
/* Fallthrough */
case WLR_DRM_CONN_NEEDS_MODESET:
diff --git a/types/wlr_output.c b/types/wlr_output.c
index 35a3ab14..7bcf2556 100644
--- a/types/wlr_output.c
+++ b/types/wlr_output.c
@@ -298,17 +298,17 @@ void wlr_output_destroy(struct wlr_output *output) {
wlr_signal_emit_safe(&output->events.destroy, output);
- struct wlr_output_mode *mode, *tmp_mode;
- wl_list_for_each_safe(mode, tmp_mode, &output->modes, link) {
- wl_list_remove(&mode->link);
- free(mode);
- }
+ // The backend is responsible for free-ing the list of modes
struct wlr_output_cursor *cursor, *tmp_cursor;
wl_list_for_each_safe(cursor, tmp_cursor, &output->cursors, link) {
wlr_output_cursor_destroy(cursor);
}
+ if (output->idle_frame != NULL) {
+ wl_event_source_remove(output->idle_frame);
+ }
+
pixman_region32_fini(&output->damage);
if (output->impl && output->impl->destroy) {