gtk4/subclass/
media_stream.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 [`MediaStream`].
5
6use gdk::Paintable;
7use glib::translate::*;
8
9use crate::{ffi, prelude::*, subclass::prelude::*, MediaStream};
10
11pub trait MediaStreamImpl:
12    ObjectImpl + ObjectSubclass<Type: IsA<MediaStream> + IsA<Paintable>>
13{
14    fn pause(&self) {
15        self.parent_pause()
16    }
17
18    fn play(&self) -> bool {
19        self.parent_play()
20    }
21
22    fn realize(&self, surface: gdk::Surface) {
23        self.parent_realize(surface)
24    }
25
26    fn seek(&self, timestamp: i64) {
27        self.parent_seek(timestamp)
28    }
29
30    fn unrealize(&self, surface: gdk::Surface) {
31        self.parent_unrealize(surface)
32    }
33
34    fn update_audio(&self, muted: bool, volume: f64) {
35        self.parent_update_audio(muted, volume)
36    }
37}
38
39pub trait MediaStreamImplExt: MediaStreamImpl {
40    fn parent_pause(&self) {
41        unsafe {
42            let data = Self::type_data();
43            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
44            let f = (*parent_class)
45                .pause
46                .expect("No parent class impl for \"pause\"");
47            f(self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0)
48        }
49    }
50
51    // Returns true if successfully started playing
52    fn parent_play(&self) -> bool {
53        unsafe {
54            let data = Self::type_data();
55            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
56            if let Some(f) = (*parent_class).play {
57                return from_glib(f(self
58                    .obj()
59                    .unsafe_cast_ref::<MediaStream>()
60                    .to_glib_none()
61                    .0));
62            }
63            false
64        }
65    }
66
67    fn parent_realize(&self, surface: gdk::Surface) {
68        unsafe {
69            let data = Self::type_data();
70            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
71            let f = (*parent_class)
72                .realize
73                .expect("No parent class impl for \"realize\"");
74            f(
75                self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0,
76                surface.to_glib_none().0,
77            )
78        }
79    }
80
81    fn parent_seek(&self, timestamp: i64) {
82        unsafe {
83            let data = Self::type_data();
84            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
85            let f = (*parent_class)
86                .seek
87                .expect("No parent class impl for \"realize\"");
88            f(
89                self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0,
90                timestamp,
91            )
92        }
93    }
94
95    fn parent_unrealize(&self, surface: gdk::Surface) {
96        unsafe {
97            let data = Self::type_data();
98            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
99            let f = (*parent_class)
100                .unrealize
101                .expect("No parent class impl for \"unrealize\"");
102            f(
103                self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0,
104                surface.to_glib_none().0,
105            )
106        }
107    }
108
109    fn parent_update_audio(&self, muted: bool, volume: f64) {
110        unsafe {
111            let data = Self::type_data();
112            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
113            let f = (*parent_class)
114                .update_audio
115                .expect("No parent class impl for \"update_audio\"");
116            f(
117                self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0,
118                muted.into_glib(),
119                volume,
120            )
121        }
122    }
123}
124
125impl<T: MediaStreamImpl> MediaStreamImplExt for T {}
126
127unsafe impl<T: MediaStreamImpl> IsSubclassable<T> for MediaStream {
128    fn class_init(class: &mut glib::Class<Self>) {
129        Self::parent_class_init::<T>(class);
130
131        assert_initialized_main_thread!();
132
133        let klass = class.as_mut();
134        klass.pause = Some(media_stream_pause::<T>);
135        klass.play = Some(media_stream_play::<T>);
136        klass.realize = Some(media_stream_realize::<T>);
137        klass.seek = Some(media_stream_seek::<T>);
138        klass.unrealize = Some(media_stream_unrealize::<T>);
139        klass.update_audio = Some(media_stream_update_audio::<T>);
140    }
141}
142
143unsafe extern "C" fn media_stream_pause<T: MediaStreamImpl>(ptr: *mut ffi::GtkMediaStream) {
144    let instance = &*(ptr as *mut T::Instance);
145    let imp = instance.imp();
146
147    imp.pause()
148}
149
150unsafe extern "C" fn media_stream_play<T: MediaStreamImpl>(
151    ptr: *mut ffi::GtkMediaStream,
152) -> glib::ffi::gboolean {
153    let instance = &*(ptr as *mut T::Instance);
154    let imp = instance.imp();
155
156    imp.play().into_glib()
157}
158
159unsafe extern "C" fn media_stream_realize<T: MediaStreamImpl>(
160    ptr: *mut ffi::GtkMediaStream,
161    surface: *mut gdk::ffi::GdkSurface,
162) {
163    let instance = &*(ptr as *mut T::Instance);
164    let imp = instance.imp();
165
166    imp.realize(from_glib_none(surface))
167}
168
169unsafe extern "C" fn media_stream_seek<T: MediaStreamImpl>(
170    ptr: *mut ffi::GtkMediaStream,
171    timestamp: i64,
172) {
173    let instance = &*(ptr as *mut T::Instance);
174    let imp = instance.imp();
175
176    imp.seek(timestamp)
177}
178
179unsafe extern "C" fn media_stream_unrealize<T: MediaStreamImpl>(
180    ptr: *mut ffi::GtkMediaStream,
181    surface: *mut gdk::ffi::GdkSurface,
182) {
183    let instance = &*(ptr as *mut T::Instance);
184    let imp = instance.imp();
185
186    imp.unrealize(from_glib_none(surface))
187}
188
189unsafe extern "C" fn media_stream_update_audio<T: MediaStreamImpl>(
190    ptr: *mut ffi::GtkMediaStream,
191    muted: glib::ffi::gboolean,
192    volume: f64,
193) {
194    let instance = &*(ptr as *mut T::Instance);
195    let imp = instance.imp();
196
197    imp.update_audio(from_glib(muted), volume)
198}