xserver: Clean up wm on X server exit
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 11 Aug 2011 21:58:59 +0000 (17:58 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 11 Aug 2011 21:58:59 +0000 (17:58 -0400)
compositor/xserver-launcher.c

index 02f022a..a5203b7 100644 (file)
@@ -414,6 +414,7 @@ wlsc_wm_create(struct wlsc_xserver *wxs)
        wl_client_flush(wxs->client);
        close(sv[1]);
        
+       /* xcb_connect_to_fd takes ownership of the fd. */
        wm->conn = xcb_connect_to_fd(sv[0], NULL);
        if (xcb_connection_has_error(wm->conn)) {
                fprintf(stderr, "xcb_connect_to_fd failed\n");
@@ -451,6 +452,16 @@ wlsc_wm_create(struct wlsc_xserver *wxs)
 }
 
 static void
+wlsc_wm_destroy(struct wlsc_wm *wm)
+{
+       /* FIXME: Free windows in hash. */
+       wl_hash_table_destroy(wm->window_hash);
+       xcb_disconnect(wm->conn);
+       wl_event_source_remove(wm->source);
+       free(wm);
+}
+
+static void
 wlsc_xserver_bind(struct wl_client *client,
                  struct wl_object *global,
                  uint32_t version)
@@ -556,6 +567,9 @@ wlsc_xserver_cleanup(struct wlsc_process *process, int status)
                wl_event_loop_add_fd(mxs->loop, mxs->unix_fd,
                                     WL_EVENT_READABLE,
                                     wlsc_xserver_handle_event, mxs);
+
+       wlsc_wm_destroy(mxs->wm);
+       mxs->wm = NULL;
 }
 
 static void