// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
// DO NOT EDIT

use crate::{GLContext, GLSLProfile};
use glib::{prelude::*, translate::*};

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLConfigCaveat")]
pub enum GLConfigCaveat {
    #[doc(alias = "GST_GL_CONFIG_CAVEAT_NONE")]
    None,
    #[doc(alias = "GST_GL_CONFIG_CAVEAT_SLOW")]
    Slow,
    #[doc(alias = "GST_GL_CONFIG_CAVEAT_NON_CONFORMANT")]
    NonConformant,
    #[doc(hidden)]
    __Unknown(i32),
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
impl GLConfigCaveat {
    #[doc(alias = "gst_gl_config_caveat_to_string")]
    #[doc(alias = "to_string")]
    pub fn to_str(self) -> Option<glib::GString> {
        assert_initialized_main_thread!();
        unsafe { from_glib_none(ffi::gst_gl_config_caveat_to_string(self.into_glib())) }
    }
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
#[doc(hidden)]
impl IntoGlib for GLConfigCaveat {
    type GlibType = ffi::GstGLConfigCaveat;

    #[inline]
    fn into_glib(self) -> ffi::GstGLConfigCaveat {
        match self {
            Self::None => ffi::GST_GL_CONFIG_CAVEAT_NONE,
            Self::Slow => ffi::GST_GL_CONFIG_CAVEAT_SLOW,
            Self::NonConformant => ffi::GST_GL_CONFIG_CAVEAT_NON_CONFORMANT,
            Self::__Unknown(value) => value,
        }
    }
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
#[doc(hidden)]
impl FromGlib<ffi::GstGLConfigCaveat> for GLConfigCaveat {
    #[inline]
    unsafe fn from_glib(value: ffi::GstGLConfigCaveat) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GL_CONFIG_CAVEAT_NONE => Self::None,
            ffi::GST_GL_CONFIG_CAVEAT_SLOW => Self::Slow,
            ffi::GST_GL_CONFIG_CAVEAT_NON_CONFORMANT => Self::NonConformant,
            value => Self::__Unknown(value),
        }
    }
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
impl StaticType for GLConfigCaveat {
    #[inline]
    #[doc(alias = "gst_gl_config_caveat_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_gl_config_caveat_get_type()) }
    }
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
impl glib::HasParamSpec for GLConfigCaveat {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
impl glib::value::ValueType for GLConfigCaveat {
    type Type = Self;
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
unsafe impl<'a> glib::value::FromValue<'a> for GLConfigCaveat {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
impl ToValue for GLConfigCaveat {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

#[cfg(feature = "v1_20")]
#[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
impl From<GLConfigCaveat> for glib::Value {
    #[inline]
    fn from(v: GLConfigCaveat) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLContextError")]
pub enum GLContextError {
    #[doc(alias = "GST_GL_CONTEXT_ERROR_FAILED")]
    Failed,
    #[doc(alias = "GST_GL_CONTEXT_ERROR_WRONG_CONFIG")]
    WrongConfig,
    #[doc(alias = "GST_GL_CONTEXT_ERROR_WRONG_API")]
    WrongApi,
    #[doc(alias = "GST_GL_CONTEXT_ERROR_OLD_LIBS")]
    OldLibs,
    #[doc(alias = "GST_GL_CONTEXT_ERROR_CREATE_CONTEXT")]
    CreateContext,
    #[doc(alias = "GST_GL_CONTEXT_ERROR_RESOURCE_UNAVAILABLE")]
    ResourceUnavailable,
    #[doc(hidden)]
    __Unknown(i32),
}

#[doc(hidden)]
impl IntoGlib for GLContextError {
    type GlibType = ffi::GstGLContextError;

    #[inline]
    fn into_glib(self) -> ffi::GstGLContextError {
        match self {
            Self::Failed => ffi::GST_GL_CONTEXT_ERROR_FAILED,
            Self::WrongConfig => ffi::GST_GL_CONTEXT_ERROR_WRONG_CONFIG,
            Self::WrongApi => ffi::GST_GL_CONTEXT_ERROR_WRONG_API,
            Self::OldLibs => ffi::GST_GL_CONTEXT_ERROR_OLD_LIBS,
            Self::CreateContext => ffi::GST_GL_CONTEXT_ERROR_CREATE_CONTEXT,
            Self::ResourceUnavailable => ffi::GST_GL_CONTEXT_ERROR_RESOURCE_UNAVAILABLE,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLContextError> for GLContextError {
    #[inline]
    unsafe fn from_glib(value: ffi::GstGLContextError) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GL_CONTEXT_ERROR_FAILED => Self::Failed,
            ffi::GST_GL_CONTEXT_ERROR_WRONG_CONFIG => Self::WrongConfig,
            ffi::GST_GL_CONTEXT_ERROR_WRONG_API => Self::WrongApi,
            ffi::GST_GL_CONTEXT_ERROR_OLD_LIBS => Self::OldLibs,
            ffi::GST_GL_CONTEXT_ERROR_CREATE_CONTEXT => Self::CreateContext,
            ffi::GST_GL_CONTEXT_ERROR_RESOURCE_UNAVAILABLE => Self::ResourceUnavailable,
            value => Self::__Unknown(value),
        }
    }
}

impl glib::error::ErrorDomain for GLContextError {
    #[inline]
    fn domain() -> glib::Quark {
        skip_assert_initialized!();

        unsafe { from_glib(ffi::gst_gl_context_error_quark()) }
    }

    #[inline]
    fn code(self) -> i32 {
        self.into_glib()
    }

    #[inline]
    #[allow(clippy::match_single_binding)]
    fn from(code: i32) -> Option<Self> {
        skip_assert_initialized!();
        match unsafe { from_glib(code) } {
            Self::__Unknown(_) => Some(Self::Failed),
            value => Some(value),
        }
    }
}

impl StaticType for GLContextError {
    #[inline]
    #[doc(alias = "gst_gl_context_error_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_gl_context_error_get_type()) }
    }
}

impl glib::HasParamSpec for GLContextError {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLContextError {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLContextError {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLContextError {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLContextError> for glib::Value {
    #[inline]
    fn from(v: GLContextError) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLFormat")]
pub enum GLFormat {
    #[doc(alias = "GST_GL_LUMINANCE")]
    Luminance,
    #[doc(alias = "GST_GL_ALPHA")]
    Alpha,
    #[doc(alias = "GST_GL_LUMINANCE_ALPHA")]
    LuminanceAlpha,
    #[doc(alias = "GST_GL_RED")]
    Red,
    #[doc(alias = "GST_GL_R8")]
    R8,
    #[doc(alias = "GST_GL_RG")]
    Rg,
    #[doc(alias = "GST_GL_RG8")]
    Rg8,
    #[doc(alias = "GST_GL_RGB")]
    Rgb,
    #[doc(alias = "GST_GL_RGB8")]
    Rgb8,
    #[doc(alias = "GST_GL_RGB565")]
    Rgb565,
    #[doc(alias = "GST_GL_RGB16")]
    Rgb16,
    #[doc(alias = "GST_GL_RGBA")]
    Rgba,
    #[doc(alias = "GST_GL_RGBA8")]
    Rgba8,
    #[doc(alias = "GST_GL_RGBA16")]
    Rgba16,
    #[doc(alias = "GST_GL_DEPTH_COMPONENT16")]
    DepthComponent16,
    #[doc(alias = "GST_GL_DEPTH24_STENCIL8")]
    Depth24Stencil8,
    #[doc(alias = "GST_GL_RGB10_A2")]
    Rgb10A2,
    #[doc(alias = "GST_GL_R16")]
    R16,
    #[doc(alias = "GST_GL_RG16")]
    Rg16,
    #[doc(hidden)]
    __Unknown(i32),
}

impl GLFormat {
    #[doc(alias = "gst_gl_format_from_video_info")]
    pub fn from_video_info(
        context: &impl IsA<GLContext>,
        vinfo: &gst_video::VideoInfo,
        plane: u32,
    ) -> GLFormat {
        skip_assert_initialized!();
        unsafe {
            from_glib(ffi::gst_gl_format_from_video_info(
                context.as_ref().to_glib_none().0,
                vinfo.to_glib_none().0,
                plane,
            ))
        }
    }

    #[cfg(feature = "v1_16")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
    #[doc(alias = "gst_gl_format_is_supported")]
    pub fn is_supported(context: &impl IsA<GLContext>, format: GLFormat) -> bool {
        skip_assert_initialized!();
        unsafe {
            from_glib(ffi::gst_gl_format_is_supported(
                context.as_ref().to_glib_none().0,
                format.into_glib(),
            ))
        }
    }

    #[cfg(feature = "v1_24")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v1_24")))]
    #[doc(alias = "gst_gl_format_n_components")]
    pub fn n_components(self) -> u32 {
        assert_initialized_main_thread!();
        unsafe { ffi::gst_gl_format_n_components(self.into_glib()) }
    }

    #[cfg(feature = "v1_16")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
    #[doc(alias = "gst_gl_format_type_from_sized_gl_format")]
    pub fn type_from_sized_gl_format(self) -> (GLFormat, u32) {
        assert_initialized_main_thread!();
        unsafe {
            let mut unsized_format = std::mem::MaybeUninit::uninit();
            let mut gl_type = std::mem::MaybeUninit::uninit();
            ffi::gst_gl_format_type_from_sized_gl_format(
                self.into_glib(),
                unsized_format.as_mut_ptr(),
                gl_type.as_mut_ptr(),
            );
            (
                from_glib(unsized_format.assume_init()),
                gl_type.assume_init(),
            )
        }
    }

    #[doc(alias = "gst_gl_format_type_n_bytes")]
    pub fn type_n_bytes(format: u32, type_: u32) -> u32 {
        assert_initialized_main_thread!();
        unsafe { ffi::gst_gl_format_type_n_bytes(format, type_) }
    }
}

#[doc(hidden)]
impl IntoGlib for GLFormat {
    type GlibType = ffi::GstGLFormat;

    fn into_glib(self) -> ffi::GstGLFormat {
        match self {
            Self::Luminance => ffi::GST_GL_LUMINANCE,
            Self::Alpha => ffi::GST_GL_ALPHA,
            Self::LuminanceAlpha => ffi::GST_GL_LUMINANCE_ALPHA,
            Self::Red => ffi::GST_GL_RED,
            Self::R8 => ffi::GST_GL_R8,
            Self::Rg => ffi::GST_GL_RG,
            Self::Rg8 => ffi::GST_GL_RG8,
            Self::Rgb => ffi::GST_GL_RGB,
            Self::Rgb8 => ffi::GST_GL_RGB8,
            Self::Rgb565 => ffi::GST_GL_RGB565,
            Self::Rgb16 => ffi::GST_GL_RGB16,
            Self::Rgba => ffi::GST_GL_RGBA,
            Self::Rgba8 => ffi::GST_GL_RGBA8,
            Self::Rgba16 => ffi::GST_GL_RGBA16,
            Self::DepthComponent16 => ffi::GST_GL_DEPTH_COMPONENT16,
            Self::Depth24Stencil8 => ffi::GST_GL_DEPTH24_STENCIL8,
            Self::Rgb10A2 => ffi::GST_GL_RGB10_A2,
            Self::R16 => ffi::GST_GL_R16,
            Self::Rg16 => ffi::GST_GL_RG16,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLFormat> for GLFormat {
    unsafe fn from_glib(value: ffi::GstGLFormat) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GL_LUMINANCE => Self::Luminance,
            ffi::GST_GL_ALPHA => Self::Alpha,
            ffi::GST_GL_LUMINANCE_ALPHA => Self::LuminanceAlpha,
            ffi::GST_GL_RED => Self::Red,
            ffi::GST_GL_R8 => Self::R8,
            ffi::GST_GL_RG => Self::Rg,
            ffi::GST_GL_RG8 => Self::Rg8,
            ffi::GST_GL_RGB => Self::Rgb,
            ffi::GST_GL_RGB8 => Self::Rgb8,
            ffi::GST_GL_RGB565 => Self::Rgb565,
            ffi::GST_GL_RGB16 => Self::Rgb16,
            ffi::GST_GL_RGBA => Self::Rgba,
            ffi::GST_GL_RGBA8 => Self::Rgba8,
            ffi::GST_GL_RGBA16 => Self::Rgba16,
            ffi::GST_GL_DEPTH_COMPONENT16 => Self::DepthComponent16,
            ffi::GST_GL_DEPTH24_STENCIL8 => Self::Depth24Stencil8,
            ffi::GST_GL_RGB10_A2 => Self::Rgb10A2,
            ffi::GST_GL_R16 => Self::R16,
            ffi::GST_GL_RG16 => Self::Rg16,
            value => Self::__Unknown(value),
        }
    }
}

impl StaticType for GLFormat {
    #[inline]
    #[doc(alias = "gst_gl_format_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_gl_format_get_type()) }
    }
}

impl glib::HasParamSpec for GLFormat {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLFormat {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLFormat {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLFormat {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLFormat> for glib::Value {
    #[inline]
    fn from(v: GLFormat) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLQueryType")]
pub enum GLQueryType {
    #[doc(alias = "GST_GL_QUERY_NONE")]
    None,
    #[doc(alias = "GST_GL_QUERY_TIME_ELAPSED")]
    TimeElapsed,
    #[doc(alias = "GST_GL_QUERY_TIMESTAMP")]
    Timestamp,
    #[doc(hidden)]
    __Unknown(i32),
}

#[doc(hidden)]
impl IntoGlib for GLQueryType {
    type GlibType = ffi::GstGLQueryType;

    #[inline]
    fn into_glib(self) -> ffi::GstGLQueryType {
        match self {
            Self::None => ffi::GST_GL_QUERY_NONE,
            Self::TimeElapsed => ffi::GST_GL_QUERY_TIME_ELAPSED,
            Self::Timestamp => ffi::GST_GL_QUERY_TIMESTAMP,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLQueryType> for GLQueryType {
    #[inline]
    unsafe fn from_glib(value: ffi::GstGLQueryType) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GL_QUERY_NONE => Self::None,
            ffi::GST_GL_QUERY_TIME_ELAPSED => Self::TimeElapsed,
            ffi::GST_GL_QUERY_TIMESTAMP => Self::Timestamp,
            value => Self::__Unknown(value),
        }
    }
}

impl StaticType for GLQueryType {
    #[inline]
    #[doc(alias = "gst_gl_query_type_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_gl_query_type_get_type()) }
    }
}

impl glib::HasParamSpec for GLQueryType {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLQueryType {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLQueryType {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLQueryType {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLQueryType> for glib::Value {
    #[inline]
    fn from(v: GLQueryType) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLSLError")]
pub enum GLSLError {
    #[doc(alias = "GST_GLSL_ERROR_COMPILE")]
    Compile,
    #[doc(alias = "GST_GLSL_ERROR_LINK")]
    Link,
    #[doc(alias = "GST_GLSL_ERROR_PROGRAM")]
    Program,
    #[doc(hidden)]
    __Unknown(i32),
}

#[doc(hidden)]
impl IntoGlib for GLSLError {
    type GlibType = ffi::GstGLSLError;

    #[inline]
    fn into_glib(self) -> ffi::GstGLSLError {
        match self {
            Self::Compile => ffi::GST_GLSL_ERROR_COMPILE,
            Self::Link => ffi::GST_GLSL_ERROR_LINK,
            Self::Program => ffi::GST_GLSL_ERROR_PROGRAM,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLSLError> for GLSLError {
    #[inline]
    unsafe fn from_glib(value: ffi::GstGLSLError) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GLSL_ERROR_COMPILE => Self::Compile,
            ffi::GST_GLSL_ERROR_LINK => Self::Link,
            ffi::GST_GLSL_ERROR_PROGRAM => Self::Program,
            value => Self::__Unknown(value),
        }
    }
}

impl glib::error::ErrorDomain for GLSLError {
    #[inline]
    fn domain() -> glib::Quark {
        skip_assert_initialized!();

        unsafe { from_glib(ffi::gst_glsl_error_quark()) }
    }

    #[inline]
    fn code(self) -> i32 {
        self.into_glib()
    }

    #[inline]
    #[allow(clippy::match_single_binding)]
    fn from(code: i32) -> Option<Self> {
        skip_assert_initialized!();
        match unsafe { from_glib(code) } {
            value => Some(value),
        }
    }
}

impl StaticType for GLSLError {
    #[inline]
    #[doc(alias = "gst_glsl_error_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_glsl_error_get_type()) }
    }
}

impl glib::HasParamSpec for GLSLError {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLSLError {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLSLError {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLSLError {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLSLError> for glib::Value {
    #[inline]
    fn from(v: GLSLError) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLSLVersion")]
pub enum GLSLVersion {
    #[doc(alias = "GST_GLSL_VERSION_NONE")]
    None,
    #[doc(alias = "GST_GLSL_VERSION_100")]
    _100,
    #[doc(alias = "GST_GLSL_VERSION_110")]
    _110,
    #[doc(alias = "GST_GLSL_VERSION_120")]
    _120,
    #[doc(alias = "GST_GLSL_VERSION_130")]
    _130,
    #[doc(alias = "GST_GLSL_VERSION_140")]
    _140,
    #[doc(alias = "GST_GLSL_VERSION_150")]
    _150,
    #[doc(alias = "GST_GLSL_VERSION_300")]
    _300,
    #[doc(alias = "GST_GLSL_VERSION_310")]
    _310,
    #[doc(alias = "GST_GLSL_VERSION_320")]
    _320,
    #[doc(alias = "GST_GLSL_VERSION_330")]
    _330,
    #[doc(alias = "GST_GLSL_VERSION_400")]
    _400,
    #[doc(alias = "GST_GLSL_VERSION_410")]
    _410,
    #[doc(alias = "GST_GLSL_VERSION_420")]
    _420,
    #[doc(alias = "GST_GLSL_VERSION_430")]
    _430,
    #[doc(alias = "GST_GLSL_VERSION_440")]
    _440,
    #[doc(alias = "GST_GLSL_VERSION_450")]
    _450,
    #[doc(hidden)]
    __Unknown(i32),
}

impl GLSLVersion {
    #[doc(alias = "gst_glsl_version_from_string")]
    pub fn from_string(string: &str) -> GLSLVersion {
        assert_initialized_main_thread!();
        unsafe { from_glib(ffi::gst_glsl_version_from_string(string.to_glib_none().0)) }
    }

    #[doc(alias = "gst_glsl_version_profile_from_string")]
    pub fn profile_from_string(string: &str) -> Option<(GLSLVersion, GLSLProfile)> {
        assert_initialized_main_thread!();
        unsafe {
            let mut version_ret = std::mem::MaybeUninit::uninit();
            let mut profile_ret = std::mem::MaybeUninit::uninit();
            let ret = from_glib(ffi::gst_glsl_version_profile_from_string(
                string.to_glib_none().0,
                version_ret.as_mut_ptr(),
                profile_ret.as_mut_ptr(),
            ));
            if ret {
                Some((
                    from_glib(version_ret.assume_init()),
                    from_glib(profile_ret.assume_init()),
                ))
            } else {
                None
            }
        }
    }

    #[doc(alias = "gst_glsl_version_profile_to_string")]
    pub fn profile_to_string(self, profile: GLSLProfile) -> Option<glib::GString> {
        assert_initialized_main_thread!();
        unsafe {
            from_glib_full(ffi::gst_glsl_version_profile_to_string(
                self.into_glib(),
                profile.into_glib(),
            ))
        }
    }

    #[doc(alias = "gst_glsl_version_to_string")]
    #[doc(alias = "to_string")]
    pub fn to_str(self) -> Option<glib::GString> {
        assert_initialized_main_thread!();
        unsafe { from_glib_none(ffi::gst_glsl_version_to_string(self.into_glib())) }
    }
}

#[doc(hidden)]
impl IntoGlib for GLSLVersion {
    type GlibType = ffi::GstGLSLVersion;

    fn into_glib(self) -> ffi::GstGLSLVersion {
        match self {
            Self::None => ffi::GST_GLSL_VERSION_NONE,
            Self::_100 => ffi::GST_GLSL_VERSION_100,
            Self::_110 => ffi::GST_GLSL_VERSION_110,
            Self::_120 => ffi::GST_GLSL_VERSION_120,
            Self::_130 => ffi::GST_GLSL_VERSION_130,
            Self::_140 => ffi::GST_GLSL_VERSION_140,
            Self::_150 => ffi::GST_GLSL_VERSION_150,
            Self::_300 => ffi::GST_GLSL_VERSION_300,
            Self::_310 => ffi::GST_GLSL_VERSION_310,
            Self::_320 => ffi::GST_GLSL_VERSION_320,
            Self::_330 => ffi::GST_GLSL_VERSION_330,
            Self::_400 => ffi::GST_GLSL_VERSION_400,
            Self::_410 => ffi::GST_GLSL_VERSION_410,
            Self::_420 => ffi::GST_GLSL_VERSION_420,
            Self::_430 => ffi::GST_GLSL_VERSION_430,
            Self::_440 => ffi::GST_GLSL_VERSION_440,
            Self::_450 => ffi::GST_GLSL_VERSION_450,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLSLVersion> for GLSLVersion {
    unsafe fn from_glib(value: ffi::GstGLSLVersion) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GLSL_VERSION_NONE => Self::None,
            ffi::GST_GLSL_VERSION_100 => Self::_100,
            ffi::GST_GLSL_VERSION_110 => Self::_110,
            ffi::GST_GLSL_VERSION_120 => Self::_120,
            ffi::GST_GLSL_VERSION_130 => Self::_130,
            ffi::GST_GLSL_VERSION_140 => Self::_140,
            ffi::GST_GLSL_VERSION_150 => Self::_150,
            ffi::GST_GLSL_VERSION_300 => Self::_300,
            ffi::GST_GLSL_VERSION_310 => Self::_310,
            ffi::GST_GLSL_VERSION_320 => Self::_320,
            ffi::GST_GLSL_VERSION_330 => Self::_330,
            ffi::GST_GLSL_VERSION_400 => Self::_400,
            ffi::GST_GLSL_VERSION_410 => Self::_410,
            ffi::GST_GLSL_VERSION_420 => Self::_420,
            ffi::GST_GLSL_VERSION_430 => Self::_430,
            ffi::GST_GLSL_VERSION_440 => Self::_440,
            ffi::GST_GLSL_VERSION_450 => Self::_450,
            value => Self::__Unknown(value),
        }
    }
}

impl StaticType for GLSLVersion {
    #[inline]
    #[doc(alias = "gst_glsl_version_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_glsl_version_get_type()) }
    }
}

impl glib::HasParamSpec for GLSLVersion {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLSLVersion {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLSLVersion {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLSLVersion {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLSLVersion> for glib::Value {
    #[inline]
    fn from(v: GLSLVersion) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLStereoDownmix")]
pub enum GLStereoDownmix {
    #[doc(alias = "GST_GL_STEREO_DOWNMIX_ANAGLYPH_GREEN_MAGENTA_DUBOIS")]
    GreenMagentaDubois,
    #[doc(alias = "GST_GL_STEREO_DOWNMIX_ANAGLYPH_RED_CYAN_DUBOIS")]
    RedCyanDubois,
    #[doc(alias = "GST_GL_STEREO_DOWNMIX_ANAGLYPH_AMBER_BLUE_DUBOIS")]
    AmberBlueDubois,
    #[doc(hidden)]
    __Unknown(i32),
}

#[doc(hidden)]
impl IntoGlib for GLStereoDownmix {
    type GlibType = ffi::GstGLStereoDownmix;

    #[inline]
    fn into_glib(self) -> ffi::GstGLStereoDownmix {
        match self {
            Self::GreenMagentaDubois => ffi::GST_GL_STEREO_DOWNMIX_ANAGLYPH_GREEN_MAGENTA_DUBOIS,
            Self::RedCyanDubois => ffi::GST_GL_STEREO_DOWNMIX_ANAGLYPH_RED_CYAN_DUBOIS,
            Self::AmberBlueDubois => ffi::GST_GL_STEREO_DOWNMIX_ANAGLYPH_AMBER_BLUE_DUBOIS,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLStereoDownmix> for GLStereoDownmix {
    #[inline]
    unsafe fn from_glib(value: ffi::GstGLStereoDownmix) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GL_STEREO_DOWNMIX_ANAGLYPH_GREEN_MAGENTA_DUBOIS => Self::GreenMagentaDubois,
            ffi::GST_GL_STEREO_DOWNMIX_ANAGLYPH_RED_CYAN_DUBOIS => Self::RedCyanDubois,
            ffi::GST_GL_STEREO_DOWNMIX_ANAGLYPH_AMBER_BLUE_DUBOIS => Self::AmberBlueDubois,
            value => Self::__Unknown(value),
        }
    }
}

impl StaticType for GLStereoDownmix {
    #[inline]
    #[doc(alias = "gst_gl_stereo_downmix_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_gl_stereo_downmix_get_type()) }
    }
}

impl glib::HasParamSpec for GLStereoDownmix {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLStereoDownmix {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLStereoDownmix {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLStereoDownmix {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLStereoDownmix> for glib::Value {
    #[inline]
    fn from(v: GLStereoDownmix) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLTextureTarget")]
pub enum GLTextureTarget {
    #[doc(alias = "GST_GL_TEXTURE_TARGET_NONE")]
    None,
    #[doc(alias = "GST_GL_TEXTURE_TARGET_2D")]
    _2d,
    #[doc(alias = "GST_GL_TEXTURE_TARGET_RECTANGLE")]
    Rectangle,
    #[doc(alias = "GST_GL_TEXTURE_TARGET_EXTERNAL_OES")]
    ExternalOes,
    #[doc(hidden)]
    __Unknown(i32),
}

impl GLTextureTarget {
    #[doc(alias = "gst_gl_texture_target_from_gl")]
    pub fn from_gl(target: u32) -> GLTextureTarget {
        assert_initialized_main_thread!();
        unsafe { from_glib(ffi::gst_gl_texture_target_from_gl(target)) }
    }

    #[doc(alias = "gst_gl_texture_target_from_string")]
    pub fn from_string(str: &str) -> GLTextureTarget {
        assert_initialized_main_thread!();
        unsafe { from_glib(ffi::gst_gl_texture_target_from_string(str.to_glib_none().0)) }
    }

    #[doc(alias = "gst_gl_texture_target_to_buffer_pool_option")]
    pub fn to_buffer_pool_option(self) -> Option<glib::GString> {
        assert_initialized_main_thread!();
        unsafe {
            from_glib_none(ffi::gst_gl_texture_target_to_buffer_pool_option(
                self.into_glib(),
            ))
        }
    }

    #[doc(alias = "gst_gl_texture_target_to_gl")]
    pub fn to_gl(self) -> u32 {
        assert_initialized_main_thread!();
        unsafe { ffi::gst_gl_texture_target_to_gl(self.into_glib()) }
    }

    #[doc(alias = "gst_gl_texture_target_to_string")]
    #[doc(alias = "to_string")]
    pub fn to_str(self) -> Option<glib::GString> {
        assert_initialized_main_thread!();
        unsafe { from_glib_none(ffi::gst_gl_texture_target_to_string(self.into_glib())) }
    }
}

#[doc(hidden)]
impl IntoGlib for GLTextureTarget {
    type GlibType = ffi::GstGLTextureTarget;

    #[inline]
    fn into_glib(self) -> ffi::GstGLTextureTarget {
        match self {
            Self::None => ffi::GST_GL_TEXTURE_TARGET_NONE,
            Self::_2d => ffi::GST_GL_TEXTURE_TARGET_2D,
            Self::Rectangle => ffi::GST_GL_TEXTURE_TARGET_RECTANGLE,
            Self::ExternalOes => ffi::GST_GL_TEXTURE_TARGET_EXTERNAL_OES,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLTextureTarget> for GLTextureTarget {
    #[inline]
    unsafe fn from_glib(value: ffi::GstGLTextureTarget) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GL_TEXTURE_TARGET_NONE => Self::None,
            ffi::GST_GL_TEXTURE_TARGET_2D => Self::_2d,
            ffi::GST_GL_TEXTURE_TARGET_RECTANGLE => Self::Rectangle,
            ffi::GST_GL_TEXTURE_TARGET_EXTERNAL_OES => Self::ExternalOes,
            value => Self::__Unknown(value),
        }
    }
}

impl StaticType for GLTextureTarget {
    #[inline]
    #[doc(alias = "gst_gl_texture_target_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_gl_texture_target_get_type()) }
    }
}

impl glib::HasParamSpec for GLTextureTarget {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLTextureTarget {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLTextureTarget {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLTextureTarget {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLTextureTarget> for glib::Value {
    #[inline]
    fn from(v: GLTextureTarget) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLUploadReturn")]
pub enum GLUploadReturn {
    #[doc(alias = "GST_GL_UPLOAD_DONE")]
    Done,
    #[doc(alias = "GST_GL_UPLOAD_ERROR")]
    Error,
    #[doc(alias = "GST_GL_UPLOAD_UNSUPPORTED")]
    Unsupported,
    #[doc(alias = "GST_GL_UPLOAD_RECONFIGURE")]
    Reconfigure,
    #[doc(alias = "GST_GL_UPLOAD_UNSHARED_GL_CONTEXT")]
    UnsharedGlContext,
    #[doc(hidden)]
    __Unknown(i32),
}

#[doc(hidden)]
impl IntoGlib for GLUploadReturn {
    type GlibType = ffi::GstGLUploadReturn;

    #[inline]
    fn into_glib(self) -> ffi::GstGLUploadReturn {
        match self {
            Self::Done => ffi::GST_GL_UPLOAD_DONE,
            Self::Error => ffi::GST_GL_UPLOAD_ERROR,
            Self::Unsupported => ffi::GST_GL_UPLOAD_UNSUPPORTED,
            Self::Reconfigure => ffi::GST_GL_UPLOAD_RECONFIGURE,
            Self::UnsharedGlContext => ffi::GST_GL_UPLOAD_UNSHARED_GL_CONTEXT,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLUploadReturn> for GLUploadReturn {
    #[inline]
    unsafe fn from_glib(value: ffi::GstGLUploadReturn) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GL_UPLOAD_DONE => Self::Done,
            ffi::GST_GL_UPLOAD_ERROR => Self::Error,
            ffi::GST_GL_UPLOAD_UNSUPPORTED => Self::Unsupported,
            ffi::GST_GL_UPLOAD_RECONFIGURE => Self::Reconfigure,
            ffi::GST_GL_UPLOAD_UNSHARED_GL_CONTEXT => Self::UnsharedGlContext,
            value => Self::__Unknown(value),
        }
    }
}

impl StaticType for GLUploadReturn {
    #[inline]
    #[doc(alias = "gst_gl_upload_return_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_gl_upload_return_get_type()) }
    }
}

impl glib::HasParamSpec for GLUploadReturn {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLUploadReturn {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLUploadReturn {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLUploadReturn {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLUploadReturn> for glib::Value {
    #[inline]
    fn from(v: GLUploadReturn) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
#[non_exhaustive]
#[doc(alias = "GstGLWindowError")]
pub enum GLWindowError {
    #[doc(alias = "GST_GL_WINDOW_ERROR_FAILED")]
    Failed,
    #[doc(alias = "GST_GL_WINDOW_ERROR_OLD_LIBS")]
    OldLibs,
    #[doc(alias = "GST_GL_WINDOW_ERROR_RESOURCE_UNAVAILABLE")]
    ResourceUnavailable,
    #[doc(hidden)]
    __Unknown(i32),
}

#[doc(hidden)]
impl IntoGlib for GLWindowError {
    type GlibType = ffi::GstGLWindowError;

    #[inline]
    fn into_glib(self) -> ffi::GstGLWindowError {
        match self {
            Self::Failed => ffi::GST_GL_WINDOW_ERROR_FAILED,
            Self::OldLibs => ffi::GST_GL_WINDOW_ERROR_OLD_LIBS,
            Self::ResourceUnavailable => ffi::GST_GL_WINDOW_ERROR_RESOURCE_UNAVAILABLE,
            Self::__Unknown(value) => value,
        }
    }
}

#[doc(hidden)]
impl FromGlib<ffi::GstGLWindowError> for GLWindowError {
    #[inline]
    unsafe fn from_glib(value: ffi::GstGLWindowError) -> Self {
        skip_assert_initialized!();

        match value {
            ffi::GST_GL_WINDOW_ERROR_FAILED => Self::Failed,
            ffi::GST_GL_WINDOW_ERROR_OLD_LIBS => Self::OldLibs,
            ffi::GST_GL_WINDOW_ERROR_RESOURCE_UNAVAILABLE => Self::ResourceUnavailable,
            value => Self::__Unknown(value),
        }
    }
}

impl glib::error::ErrorDomain for GLWindowError {
    #[inline]
    fn domain() -> glib::Quark {
        skip_assert_initialized!();

        unsafe { from_glib(ffi::gst_gl_window_error_quark()) }
    }

    #[inline]
    fn code(self) -> i32 {
        self.into_glib()
    }

    #[inline]
    #[allow(clippy::match_single_binding)]
    fn from(code: i32) -> Option<Self> {
        skip_assert_initialized!();
        match unsafe { from_glib(code) } {
            Self::__Unknown(_) => Some(Self::Failed),
            value => Some(value),
        }
    }
}

impl StaticType for GLWindowError {
    #[inline]
    #[doc(alias = "gst_gl_window_error_get_type")]
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gst_gl_window_error_get_type()) }
    }
}

impl glib::HasParamSpec for GLWindowError {
    type ParamSpec = glib::ParamSpecEnum;
    type SetValue = Self;
    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;

    fn param_spec_builder() -> Self::BuilderFn {
        Self::ParamSpec::builder_with_default
    }
}

impl glib::value::ValueType for GLWindowError {
    type Type = Self;
}

unsafe impl<'a> glib::value::FromValue<'a> for GLWindowError {
    type Checker = glib::value::GenericValueTypeChecker<Self>;

    #[inline]
    unsafe fn from_value(value: &'a glib::Value) -> Self {
        skip_assert_initialized!();
        from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
    }
}

impl ToValue for GLWindowError {
    #[inline]
    fn to_value(&self) -> glib::Value {
        let mut value = glib::Value::for_value_type::<Self>();
        unsafe {
            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
        }
        value
    }

    #[inline]
    fn value_type(&self) -> glib::Type {
        Self::static_type()
    }
}

impl From<GLWindowError> for glib::Value {
    #[inline]
    fn from(v: GLWindowError) -> Self {
        skip_assert_initialized!();
        ToValue::to_value(&v)
    }
}
