diff --git a/compositor/compositor-x11.c b/compositor/compositor-x11.c index b2f4a7bc..fe3f9a01 100644 --- a/compositor/compositor-x11.c +++ b/compositor/compositor-x11.c @@ -100,6 +100,17 @@ x11_input_create(struct x11_compositor *c) 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 @@ x11_compositor_init_egl(struct x11_compositor *c) 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 @@ x11_compositor_get_resources(struct x11_compositor *c) 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); }