void
gst_vaapi_window_egl_class_init (GstVaapiWindowEGLClass * klass)
{
  GstVaapiObjectClass *const object_class = GST_VAAPI_OBJECT_CLASS (klass);
  GstVaapiWindowClass *const window_class = GST_VAAPI_WINDOW_CLASS (klass);

  object_class->finalize = (GstVaapiObjectFinalizeFunc)
      gst_vaapi_window_egl_destroy;

  window_class->create = (GstVaapiWindowCreateFunc)
      gst_vaapi_window_egl_create;
  window_class->show = (GstVaapiWindowShowFunc)
      gst_vaapi_window_egl_show;
  window_class->hide = (GstVaapiWindowHideFunc)
      gst_vaapi_window_egl_hide;
  window_class->get_geometry = (GstVaapiWindowGetGeometryFunc)
      gst_vaapi_window_egl_get_geometry;
  window_class->set_fullscreen = (GstVaapiWindowSetFullscreenFunc)
      gst_vaapi_window_egl_set_fullscreen;
  window_class->resize = (GstVaapiWindowResizeFunc)
      gst_vaapi_window_egl_resize;
  window_class->render = (GstVaapiWindowRenderFunc)
      gst_vaapi_window_egl_render;
  window_class->render_pixmap = (GstVaapiWindowRenderPixmapFunc)
      gst_vaapi_window_egl_render_pixmap;
}
static void
gst_vaapi_window_drm_class_init (GstVaapiWindowDRMClass * klass)
{
  GstVaapiWindowClass *const window_class = GST_VAAPI_WINDOW_CLASS (klass);

  window_class->create = gst_vaapi_window_drm_create;
  window_class->show = gst_vaapi_window_drm_show;
  window_class->hide = gst_vaapi_window_drm_hide;
  window_class->resize = gst_vaapi_window_drm_resize;
  window_class->render = gst_vaapi_window_drm_render;
}
/**
 * gst_vaapi_window_wayland_new:
 * @display: a #GstVaapiDisplay
 * @width: the requested window width, in pixels
 * @height: the requested windo height, in pixels
 *
 * Creates a window with the specified @width and @height. The window
 * will be attached to the @display and remains invisible to the user
 * until gst_vaapi_window_show() is called.
 *
 * Return value: the newly allocated #GstVaapiWindow object
 */
GstVaapiWindow *
gst_vaapi_window_wayland_new (GstVaapiDisplay * display,
                              guint width, guint height)
{
    GST_DEBUG ("new window, size %ux%u", width, height);

    g_return_val_if_fail (GST_VAAPI_IS_DISPLAY_WAYLAND (display), NULL);

    return gst_vaapi_window_new_internal (GST_VAAPI_WINDOW_CLASS
                                          (gst_vaapi_window_wayland_class ()), display, GST_VAAPI_ID_INVALID, width,
                                          height);
}
static void
gst_vaapi_window_glx_class_init (GstVaapiWindowGLXClass * klass)
{
  GObjectClass *const object_class = G_OBJECT_CLASS (klass);
  GstVaapiWindowClass *const window_class = GST_VAAPI_WINDOW_CLASS (klass);

  object_class->finalize = gst_vaapi_window_glx_finalize;

  window_class->resize = gst_vaapi_window_glx_resize;
  window_class->get_visual_id = gst_vaapi_window_glx_get_visual_id;
  window_class->get_colormap = gst_vaapi_window_glx_get_colormap;
}
static void
gst_vaapi_window_wayland_class_init (GstVaapiWindowWaylandClass * klass)
{
    GstVaapiObjectClass *const object_class = GST_VAAPI_OBJECT_CLASS (klass);
    GstVaapiWindowClass *const window_class = GST_VAAPI_WINDOW_CLASS (klass);

    object_class->finalize = (GstVaapiObjectFinalizeFunc)
                             gst_vaapi_window_wayland_destroy;

    window_class->create = gst_vaapi_window_wayland_create;
    window_class->show = gst_vaapi_window_wayland_show;
    window_class->hide = gst_vaapi_window_wayland_hide;
    window_class->render = gst_vaapi_window_wayland_render;
    window_class->resize = gst_vaapi_window_wayland_resize;
    window_class->set_fullscreen = gst_vaapi_window_wayland_set_fullscreen;
    window_class->unblock = gst_vaapi_window_wayland_unblock;
    window_class->unblock_cancel = gst_vaapi_window_wayland_unblock_cancel;
}
static void
gst_vaapi_window_wayland_class_init(GstVaapiWindowWaylandClass * klass)
{
    GObjectClass * const object_class = G_OBJECT_CLASS(klass);
    GstVaapiWindowClass * const window_class = GST_VAAPI_WINDOW_CLASS(klass);

    g_type_class_add_private(klass, sizeof(GstVaapiWindowWaylandPrivate));

    object_class->finalize      = gst_vaapi_window_wayland_finalize;
    object_class->constructed   = gst_vaapi_window_wayland_constructed;

    window_class->create        = gst_vaapi_window_wayland_create;
    window_class->destroy       = gst_vaapi_window_wayland_destroy;
    window_class->show          = gst_vaapi_window_wayland_show;
    window_class->hide          = gst_vaapi_window_wayland_hide;
    window_class->render        = gst_vaapi_window_wayland_render;
    window_class->resize        = gst_vaapi_window_wayland_resize;
}
static gboolean
gst_vaapi_window_glx_resize (GstVaapiWindow * window, guint width, guint height)
{
  GstVaapiWindowGLXPrivate *const priv =
      GST_VAAPI_WINDOW_GLX_GET_PRIVATE (window);
  const GstVaapiWindowClass *const parent_klass =
      GST_VAAPI_WINDOW_CLASS (gst_vaapi_window_glx_parent_class);
  Display *const dpy = GST_VAAPI_WINDOW_NATIVE_DISPLAY (window);
  GLContextState old_cs;

  if (!parent_klass->resize (window, width, height))
    return FALSE;

  GST_VAAPI_WINDOW_LOCK_DISPLAY (window);
  XSync (dpy, False);           /* make sure resize completed */
  if (gl_set_current_context (priv->gl_context, &old_cs)) {
    gl_resize (width, height);
    gl_set_current_context (&old_cs, NULL);
  }
  GST_VAAPI_WINDOW_UNLOCK_DISPLAY (window);
  return TRUE;
}