gtk4/subclass/
media_file.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3// rustdoc-stripper-ignore-next
4//! Traits intended for subclassing [`MediaFile`](crate::MediaFile).
5
6use glib::translate::*;
7
8use crate::{ffi, prelude::*, subclass::prelude::*, MediaFile};
9
10pub trait MediaFileImpl: MediaFileImplExt + MediaStreamImpl {
11    fn close(&self) {
12        self.parent_close()
13    }
14    fn open(&self) {
15        self.parent_open()
16    }
17}
18
19mod sealed {
20    pub trait Sealed {}
21    impl<T: super::MediaFileImplExt> Sealed for T {}
22}
23
24pub trait MediaFileImplExt: sealed::Sealed + ObjectSubclass {
25    fn parent_close(&self) {
26        unsafe {
27            let data = Self::type_data();
28            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaFileClass;
29            if let Some(f) = (*parent_class).close {
30                f(self.obj().unsafe_cast_ref::<MediaFile>().to_glib_none().0)
31            }
32        }
33    }
34
35    fn parent_open(&self) {
36        unsafe {
37            let data = Self::type_data();
38            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaFileClass;
39            if let Some(f) = (*parent_class).open {
40                f(self.obj().unsafe_cast_ref::<MediaFile>().to_glib_none().0)
41            }
42        }
43    }
44}
45
46impl<T: MediaFileImpl> MediaFileImplExt for T {}
47
48unsafe impl<T: MediaFileImpl> IsSubclassable<T> for MediaFile {
49    fn class_init(class: &mut glib::Class<Self>) {
50        Self::parent_class_init::<T>(class);
51
52        let klass = class.as_mut();
53        klass.close = Some(media_file_close::<T>);
54        klass.open = Some(media_file_open::<T>);
55    }
56}
57
58unsafe extern "C" fn media_file_close<T: MediaFileImpl>(ptr: *mut ffi::GtkMediaFile) {
59    let instance = &*(ptr as *mut T::Instance);
60    let imp = instance.imp();
61
62    imp.close()
63}
64
65unsafe extern "C" fn media_file_open<T: MediaFileImpl>(ptr: *mut ffi::GtkMediaFile) {
66    let instance = &*(ptr as *mut T::Instance);
67    let imp = instance.imp();
68
69    imp.open()
70}