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);
}
示例#3
0
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);
}
示例#4
0
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);
}