gdk4/auto/
content_provider.rs

1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4
5use crate::{ffi, ContentFormats};
6use glib::{
7    object::ObjectType as _,
8    prelude::*,
9    signal::{connect_raw, SignalHandlerId},
10    translate::*,
11};
12use std::{boxed::Box as Box_, pin::Pin};
13
14glib::wrapper! {
15    #[doc(alias = "GdkContentProvider")]
16    pub struct ContentProvider(Object<ffi::GdkContentProvider, ffi::GdkContentProviderClass>);
17
18    match fn {
19        type_ => || ffi::gdk_content_provider_get_type(),
20    }
21}
22
23impl ContentProvider {
24    pub const NONE: Option<&'static ContentProvider> = None;
25
26    #[doc(alias = "gdk_content_provider_new_for_bytes")]
27    #[doc(alias = "new_for_bytes")]
28    pub fn for_bytes(mime_type: &str, bytes: &glib::Bytes) -> ContentProvider {
29        assert_initialized_main_thread!();
30        unsafe {
31            from_glib_full(ffi::gdk_content_provider_new_for_bytes(
32                mime_type.to_glib_none().0,
33                bytes.to_glib_none().0,
34            ))
35        }
36    }
37
38    #[doc(alias = "gdk_content_provider_new_for_value")]
39    #[doc(alias = "new_for_value")]
40    pub fn for_value(value: &glib::Value) -> ContentProvider {
41        assert_initialized_main_thread!();
42        unsafe {
43            from_glib_full(ffi::gdk_content_provider_new_for_value(
44                value.to_glib_none().0,
45            ))
46        }
47    }
48
49    #[doc(alias = "gdk_content_provider_new_union")]
50    pub fn new_union(providers: &[ContentProvider]) -> ContentProvider {
51        assert_initialized_main_thread!();
52        let n_providers = providers.len() as _;
53        unsafe {
54            from_glib_full(ffi::gdk_content_provider_new_union(
55                providers.to_glib_full(),
56                n_providers,
57            ))
58        }
59    }
60}
61
62mod sealed {
63    pub trait Sealed {}
64    impl<T: super::IsA<super::ContentProvider>> Sealed for T {}
65}
66
67pub trait ContentProviderExt: IsA<ContentProvider> + sealed::Sealed + 'static {
68    #[doc(alias = "gdk_content_provider_content_changed")]
69    fn content_changed(&self) {
70        unsafe {
71            ffi::gdk_content_provider_content_changed(self.as_ref().to_glib_none().0);
72        }
73    }
74
75    #[doc(alias = "gdk_content_provider_ref_formats")]
76    #[doc(alias = "ref_formats")]
77    fn formats(&self) -> ContentFormats {
78        unsafe {
79            from_glib_full(ffi::gdk_content_provider_ref_formats(
80                self.as_ref().to_glib_none().0,
81            ))
82        }
83    }
84
85    #[doc(alias = "gdk_content_provider_ref_storable_formats")]
86    #[doc(alias = "ref_storable_formats")]
87    #[doc(alias = "storable-formats")]
88    fn storable_formats(&self) -> ContentFormats {
89        unsafe {
90            from_glib_full(ffi::gdk_content_provider_ref_storable_formats(
91                self.as_ref().to_glib_none().0,
92            ))
93        }
94    }
95
96    #[doc(alias = "gdk_content_provider_write_mime_type_async")]
97    fn write_mime_type_async<P: FnOnce(Result<(), glib::Error>) + 'static>(
98        &self,
99        mime_type: &str,
100        stream: &impl IsA<gio::OutputStream>,
101        io_priority: glib::Priority,
102        cancellable: Option<&impl IsA<gio::Cancellable>>,
103        callback: P,
104    ) {
105        let main_context = glib::MainContext::ref_thread_default();
106        let is_main_context_owner = main_context.is_owner();
107        let has_acquired_main_context = (!is_main_context_owner)
108            .then(|| main_context.acquire().ok())
109            .flatten();
110        assert!(
111            is_main_context_owner || has_acquired_main_context.is_some(),
112            "Async operations only allowed if the thread is owning the MainContext"
113        );
114
115        let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
116            Box_::new(glib::thread_guard::ThreadGuard::new(callback));
117        unsafe extern "C" fn write_mime_type_async_trampoline<
118            P: FnOnce(Result<(), glib::Error>) + 'static,
119        >(
120            _source_object: *mut glib::gobject_ffi::GObject,
121            res: *mut gio::ffi::GAsyncResult,
122            user_data: glib::ffi::gpointer,
123        ) {
124            let mut error = std::ptr::null_mut();
125            let _ = ffi::gdk_content_provider_write_mime_type_finish(
126                _source_object as *mut _,
127                res,
128                &mut error,
129            );
130            let result = if error.is_null() {
131                Ok(())
132            } else {
133                Err(from_glib_full(error))
134            };
135            let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
136                Box_::from_raw(user_data as *mut _);
137            let callback: P = callback.into_inner();
138            callback(result);
139        }
140        let callback = write_mime_type_async_trampoline::<P>;
141        unsafe {
142            ffi::gdk_content_provider_write_mime_type_async(
143                self.as_ref().to_glib_none().0,
144                mime_type.to_glib_none().0,
145                stream.as_ref().to_glib_none().0,
146                io_priority.into_glib(),
147                cancellable.map(|p| p.as_ref()).to_glib_none().0,
148                Some(callback),
149                Box_::into_raw(user_data) as *mut _,
150            );
151        }
152    }
153
154    fn write_mime_type_future(
155        &self,
156        mime_type: &str,
157        stream: &(impl IsA<gio::OutputStream> + Clone + 'static),
158        io_priority: glib::Priority,
159    ) -> Pin<Box_<dyn std::future::Future<Output = Result<(), glib::Error>> + 'static>> {
160        let mime_type = String::from(mime_type);
161        let stream = stream.clone();
162        Box_::pin(gio::GioFuture::new(self, move |obj, cancellable, send| {
163            obj.write_mime_type_async(
164                &mime_type,
165                &stream,
166                io_priority,
167                Some(cancellable),
168                move |res| {
169                    send.resolve(res);
170                },
171            );
172        }))
173    }
174
175    #[doc(alias = "content-changed")]
176    fn connect_content_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
177        unsafe extern "C" fn content_changed_trampoline<
178            P: IsA<ContentProvider>,
179            F: Fn(&P) + 'static,
180        >(
181            this: *mut ffi::GdkContentProvider,
182            f: glib::ffi::gpointer,
183        ) {
184            let f: &F = &*(f as *const F);
185            f(ContentProvider::from_glib_borrow(this).unsafe_cast_ref())
186        }
187        unsafe {
188            let f: Box_<F> = Box_::new(f);
189            connect_raw(
190                self.as_ptr() as *mut _,
191                b"content-changed\0".as_ptr() as *const _,
192                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
193                    content_changed_trampoline::<Self, F> as *const (),
194                )),
195                Box_::into_raw(f),
196            )
197        }
198    }
199
200    #[doc(alias = "formats")]
201    fn connect_formats_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
202        unsafe extern "C" fn notify_formats_trampoline<
203            P: IsA<ContentProvider>,
204            F: Fn(&P) + 'static,
205        >(
206            this: *mut ffi::GdkContentProvider,
207            _param_spec: glib::ffi::gpointer,
208            f: glib::ffi::gpointer,
209        ) {
210            let f: &F = &*(f as *const F);
211            f(ContentProvider::from_glib_borrow(this).unsafe_cast_ref())
212        }
213        unsafe {
214            let f: Box_<F> = Box_::new(f);
215            connect_raw(
216                self.as_ptr() as *mut _,
217                b"notify::formats\0".as_ptr() as *const _,
218                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
219                    notify_formats_trampoline::<Self, F> as *const (),
220                )),
221                Box_::into_raw(f),
222            )
223        }
224    }
225
226    #[doc(alias = "storable-formats")]
227    fn connect_storable_formats_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
228        unsafe extern "C" fn notify_storable_formats_trampoline<
229            P: IsA<ContentProvider>,
230            F: Fn(&P) + 'static,
231        >(
232            this: *mut ffi::GdkContentProvider,
233            _param_spec: glib::ffi::gpointer,
234            f: glib::ffi::gpointer,
235        ) {
236            let f: &F = &*(f as *const F);
237            f(ContentProvider::from_glib_borrow(this).unsafe_cast_ref())
238        }
239        unsafe {
240            let f: Box_<F> = Box_::new(f);
241            connect_raw(
242                self.as_ptr() as *mut _,
243                b"notify::storable-formats\0".as_ptr() as *const _,
244                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
245                    notify_storable_formats_trampoline::<Self, F> as *const (),
246                )),
247                Box_::into_raw(f),
248            )
249        }
250    }
251}
252
253impl<O: IsA<ContentProvider>> ContentProviderExt for O {}