struct native_display * x11_create_ximage_display(Display *dpy, struct native_event_handler *event_handler, void *user_data) { struct ximage_display *xdpy; struct sw_winsys *winsys = NULL; xdpy = CALLOC_STRUCT(ximage_display); if (!xdpy) return NULL; xdpy->dpy = dpy; if (!xdpy->dpy) { xdpy->dpy = XOpenDisplay(NULL); if (!xdpy->dpy) { FREE(xdpy); return NULL; } xdpy->own_dpy = TRUE; } xdpy->event_handler = event_handler; xdpy->base.user_data = user_data; xdpy->xscr_number = DefaultScreen(xdpy->dpy); xdpy->xscr = x11_screen_create(xdpy->dpy, xdpy->xscr_number); if (!xdpy->xscr) goto fail; winsys = xlib_create_sw_winsys(xdpy->dpy); if (!winsys) goto fail; xdpy->base.screen = xdpy->event_handler->new_sw_screen(&xdpy->base, winsys); if (!xdpy->base.screen) goto fail; xdpy->base.destroy = ximage_display_destroy; xdpy->base.get_param = ximage_display_get_param; xdpy->base.get_configs = ximage_display_get_configs; xdpy->base.is_pixmap_supported = ximage_display_is_pixmap_supported; xdpy->base.create_window_surface = ximage_display_create_window_surface; xdpy->base.create_pixmap_surface = ximage_display_create_pixmap_surface; return &xdpy->base; fail: if (winsys && winsys->destroy) winsys->destroy(winsys); if (xdpy->xscr) x11_screen_destroy(xdpy->xscr); if (xdpy->dpy && xdpy->own_dpy) XCloseDisplay(xdpy->dpy); FREE(xdpy); return NULL; }
static void ximage_display_destroy(struct native_display *ndpy) { struct ximage_display *xdpy = ximage_display(ndpy); if (xdpy->configs) FREE(xdpy->configs); xdpy->base.screen->destroy(xdpy->base.screen); x11_screen_destroy(xdpy->xscr); if (xdpy->own_dpy) XCloseDisplay(xdpy->dpy); FREE(xdpy); }
static void dri2_display_destroy(struct native_display *ndpy) { struct dri2_display *dri2dpy = dri2_display(ndpy); FREE(dri2dpy->configs); if (dri2dpy->base.screen) dri2dpy->base.screen->destroy(dri2dpy->base.screen); if (dri2dpy->surfaces) util_hash_table_destroy(dri2dpy->surfaces); if (dri2dpy->xscr) x11_screen_destroy(dri2dpy->xscr); if (dri2dpy->own_dpy) XCloseDisplay(dri2dpy->dpy); FREE(dri2dpy); }
static void dri2_display_destroy(struct native_display *ndpy) { struct dri2_display *dri2dpy = dri2_display(ndpy); FREE(dri2dpy->configs); if (dri2dpy->base.screen) dri2dpy->base.screen->destroy(dri2dpy->base.screen); if (dri2dpy->surfaces) util_hash_table_destroy(dri2dpy->surfaces); #ifdef HAVE_WAYLAND_BACKEND wayland_drm_bufmgr_destroy(ndpy->wayland_bufmgr); #endif if (dri2dpy->xscr) x11_screen_destroy(dri2dpy->xscr); if (dri2dpy->own_dpy) XCloseDisplay(dri2dpy->dpy); FREE(dri2dpy); }