compositor-x11: improve x11_destroy()
Free many things we were leaking before:
- input device
- EGL resources
- xcb event source
- X Display
Fixes lots of Valgrind leaks.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
diff --git a/compositor/compositor-x11.c b/compositor/compositor-x11.c
index b2f4a7b..fe3f9a0 100644
--- a/compositor/compositor-x11.c
+++ b/compositor/compositor-x11.c
@@ -100,6 +100,17 @@
return 0;
}
+static void
+x11_input_destroy(struct x11_compositor *compositor)
+{
+ struct x11_input *input = container_of(compositor->base.input_device,
+ struct x11_input,
+ base.input_device);
+
+ wlsc_input_device_fini(&input->base);
+ free(input);
+}
+
static int
x11_compositor_init_egl(struct x11_compositor *c)
{
@@ -163,6 +174,17 @@
return 0;
}
+static void
+x11_compositor_fini_egl(struct x11_compositor *compositor)
+{
+ eglMakeCurrent(compositor->base.display,
+ EGL_NO_SURFACE, EGL_NO_SURFACE,
+ EGL_NO_CONTEXT);
+
+ eglTerminate(compositor->base.display);
+ eglReleaseThread();
+}
+
static int
x11_output_prepare_render(struct wlsc_output *output_base)
{
@@ -745,8 +767,16 @@
static void
x11_destroy(struct wlsc_compositor *ec)
{
- wlsc_compositor_shutdown(ec);
+ struct x11_compositor *compositor = (struct x11_compositor *)ec;
+ wl_event_source_remove(compositor->xcb_source);
+ x11_input_destroy(compositor);
+
+ wlsc_compositor_shutdown(ec); /* destroys outputs, too */
+
+ x11_compositor_fini_egl(compositor);
+
+ XCloseDisplay(compositor->dpy);
free(ec);
}