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; }
struct native_display * x11_create_dri2_display(Display *dpy, const struct native_event_handler *event_handler) { struct dri2_display *dri2dpy; dri2dpy = CALLOC_STRUCT(dri2_display); if (!dri2dpy) return NULL; dri2dpy->event_handler = event_handler; dri2dpy->dpy = dpy; if (!dri2dpy->dpy) { dri2dpy->dpy = XOpenDisplay(NULL); if (!dri2dpy->dpy) { dri2_display_destroy(&dri2dpy->base); return NULL; } dri2dpy->own_dpy = TRUE; } dri2dpy->xscr_number = DefaultScreen(dri2dpy->dpy); dri2dpy->xscr = x11_screen_create(dri2dpy->dpy, dri2dpy->xscr_number); if (!dri2dpy->xscr) { dri2_display_destroy(&dri2dpy->base); return NULL; } dri2dpy->surfaces = util_hash_table_create(dri2_display_hash_table_hash, dri2_display_hash_table_compare); if (!dri2dpy->surfaces) { dri2_display_destroy(&dri2dpy->base); return NULL; } dri2dpy->base.init_screen = dri2_display_init_screen; dri2dpy->base.destroy = dri2_display_destroy; dri2dpy->base.get_param = dri2_display_get_param; dri2dpy->base.get_configs = dri2_display_get_configs; dri2dpy->base.get_pixmap_format = dri2_display_get_pixmap_format; dri2dpy->base.copy_to_pixmap = native_display_copy_to_pixmap; dri2dpy->base.create_window_surface = dri2_display_create_window_surface; dri2dpy->base.create_pixmap_surface = dri2_display_create_pixmap_surface; #ifdef HAVE_WAYLAND_BACKEND dri2dpy->base.wayland_bufmgr = &dri2_display_wayland_bufmgr; #endif return &dri2dpy->base; }
struct native_display * x11_create_ximage_display(Display *dpy, const struct native_event_handler *event_handler) { struct ximage_display *xdpy; 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->xscr_number = DefaultScreen(xdpy->dpy); xdpy->xscr = x11_screen_create(xdpy->dpy, xdpy->xscr_number); if (!xdpy->xscr) { if (xdpy->own_dpy) XCloseDisplay(xdpy->dpy); FREE(xdpy); return NULL; } xdpy->base.init_screen = ximage_display_init_screen; xdpy->base.destroy = ximage_display_destroy; xdpy->base.get_param = ximage_display_get_param; xdpy->base.get_configs = ximage_display_get_configs; xdpy->base.get_pixmap_format = ximage_display_get_pixmap_format; xdpy->base.copy_to_pixmap = ximage_display_copy_to_pixmap; xdpy->base.create_window_surface = ximage_display_create_window_surface; xdpy->base.create_pixmap_surface = ximage_display_create_pixmap_surface; return &xdpy->base; }