gstreamer_gl/auto/
gl_display.rs1use crate::{ffi, GLContext, GLDisplayType, GLWindow, GLAPI};
7use glib::{
8 object::ObjectType as _,
9 prelude::*,
10 signal::{connect_raw, SignalHandlerId},
11 translate::*,
12};
13use std::boxed::Box as Box_;
14
15glib::wrapper! {
16 #[doc(alias = "GstGLDisplay")]
17 pub struct GLDisplay(Object<ffi::GstGLDisplay, ffi::GstGLDisplayClass>) @extends gst::Object;
18
19 match fn {
20 type_ => || ffi::gst_gl_display_get_type(),
21 }
22}
23
24impl GLDisplay {
25 pub const NONE: Option<&'static GLDisplay> = None;
26
27 #[doc(alias = "gst_gl_display_new")]
28 pub fn new() -> GLDisplay {
29 assert_initialized_main_thread!();
30 unsafe { from_glib_full(ffi::gst_gl_display_new()) }
31 }
32
33 #[cfg(feature = "v1_20")]
34 #[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))]
35 #[doc(alias = "gst_gl_display_new_with_type")]
36 #[doc(alias = "new_with_type")]
37 pub fn with_type(type_: GLDisplayType) -> Option<GLDisplay> {
38 assert_initialized_main_thread!();
39 unsafe { from_glib_full(ffi::gst_gl_display_new_with_type(type_.into_glib())) }
40 }
41}
42
43impl Default for GLDisplay {
44 fn default() -> Self {
45 Self::new()
46 }
47}
48
49unsafe impl Send for GLDisplay {}
50unsafe impl Sync for GLDisplay {}
51
52pub trait GLDisplayExt: IsA<GLDisplay> + 'static {
53 #[doc(alias = "gst_gl_display_create_window")]
54 fn create_window(&self) -> Result<GLWindow, glib::BoolError> {
55 unsafe {
56 Option::<_>::from_glib_full(ffi::gst_gl_display_create_window(
57 self.as_ref().to_glib_none().0,
58 ))
59 .ok_or_else(|| glib::bool_error!("Failed to create window"))
60 }
61 }
62
63 #[doc(alias = "gst_gl_display_filter_gl_api")]
64 fn filter_gl_api(&self, gl_api: GLAPI) {
65 unsafe {
66 ffi::gst_gl_display_filter_gl_api(self.as_ref().to_glib_none().0, gl_api.into_glib());
67 }
68 }
69
70 #[doc(alias = "gst_gl_display_get_gl_api")]
71 #[doc(alias = "get_gl_api")]
72 fn gl_api(&self) -> GLAPI {
73 unsafe {
74 from_glib(ffi::gst_gl_display_get_gl_api(
75 self.as_ref().to_glib_none().0,
76 ))
77 }
78 }
79
80 #[doc(alias = "gst_gl_display_get_gl_api_unlocked")]
81 #[doc(alias = "get_gl_api_unlocked")]
82 fn gl_api_unlocked(&self) -> GLAPI {
83 unsafe {
84 from_glib(ffi::gst_gl_display_get_gl_api_unlocked(
85 self.as_ref().to_glib_none().0,
86 ))
87 }
88 }
89
90 #[doc(alias = "gst_gl_display_get_handle_type")]
91 #[doc(alias = "get_handle_type")]
92 fn handle_type(&self) -> GLDisplayType {
93 unsafe {
94 from_glib(ffi::gst_gl_display_get_handle_type(
95 self.as_ref().to_glib_none().0,
96 ))
97 }
98 }
99
100 #[doc(alias = "gst_gl_display_remove_window")]
101 fn remove_window(&self, window: &impl IsA<GLWindow>) -> Result<(), glib::error::BoolError> {
102 unsafe {
103 glib::result_from_gboolean!(
104 ffi::gst_gl_display_remove_window(
105 self.as_ref().to_glib_none().0,
106 window.as_ref().to_glib_none().0
107 ),
108 "Failed to remove window"
109 )
110 }
111 }
112
113 #[doc(alias = "create-context")]
121 fn connect_create_context<
122 F: Fn(&Self, &GLContext) -> Option<GLContext> + Send + Sync + 'static,
123 >(
124 &self,
125 f: F,
126 ) -> SignalHandlerId {
127 unsafe extern "C" fn create_context_trampoline<
128 P: IsA<GLDisplay>,
129 F: Fn(&P, &GLContext) -> Option<GLContext> + Send + Sync + 'static,
130 >(
131 this: *mut ffi::GstGLDisplay,
132 context: *mut ffi::GstGLContext,
133 f: glib::ffi::gpointer,
134 ) -> *mut ffi::GstGLContext {
135 let f: &F = &*(f as *const F);
136 f(
137 GLDisplay::from_glib_borrow(this).unsafe_cast_ref(),
138 &from_glib_borrow(context),
139 )
140 .to_glib_full()
141 }
142 unsafe {
143 let f: Box_<F> = Box_::new(f);
144 connect_raw(
145 self.as_ptr() as *mut _,
146 c"create-context".as_ptr() as *const _,
147 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
148 create_context_trampoline::<Self, F> as *const (),
149 )),
150 Box_::into_raw(f),
151 )
152 }
153 }
154}
155
156impl<O: IsA<GLDisplay>> GLDisplayExt for O {}