gtk4/subclass/
media_stream.rs1use gdk::Paintable;
7use glib::translate::*;
8
9use crate::{MediaStream, ffi, prelude::*, subclass::prelude::*};
10
11pub trait MediaStreamImpl:
12 ObjectImpl + ObjectSubclass<Type: IsA<MediaStream> + IsA<Paintable>>
13{
14 fn pause(&self) {
18 self.parent_pause()
19 }
20
21 fn play(&self) -> bool {
22 self.parent_play()
23 }
24
25 fn realize(&self, surface: gdk::Surface) {
44 self.parent_realize(surface)
45 }
46
47 fn seek(&self, timestamp: i64) {
61 self.parent_seek(timestamp)
62 }
63
64 fn unrealize(&self, surface: gdk::Surface) {
71 self.parent_unrealize(surface)
72 }
73
74 fn update_audio(&self, muted: bool, volume: f64) {
75 self.parent_update_audio(muted, volume)
76 }
77}
78
79pub trait MediaStreamImplExt: MediaStreamImpl {
80 fn parent_pause(&self) {
81 unsafe {
82 let data = Self::type_data();
83 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
84 let f = (*parent_class)
85 .pause
86 .expect("No parent class impl for \"pause\"");
87 f(self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0)
88 }
89 }
90
91 fn parent_play(&self) -> bool {
93 unsafe {
94 let data = Self::type_data();
95 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
96 if let Some(f) = (*parent_class).play {
97 return from_glib(f(self
98 .obj()
99 .unsafe_cast_ref::<MediaStream>()
100 .to_glib_none()
101 .0));
102 }
103 false
104 }
105 }
106
107 fn parent_realize(&self, surface: gdk::Surface) {
108 unsafe {
109 let data = Self::type_data();
110 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
111 let f = (*parent_class)
112 .realize
113 .expect("No parent class impl for \"realize\"");
114 f(
115 self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0,
116 surface.to_glib_none().0,
117 )
118 }
119 }
120
121 fn parent_seek(&self, timestamp: i64) {
122 unsafe {
123 let data = Self::type_data();
124 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
125 let f = (*parent_class)
126 .seek
127 .expect("No parent class impl for \"realize\"");
128 f(
129 self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0,
130 timestamp,
131 )
132 }
133 }
134
135 fn parent_unrealize(&self, surface: gdk::Surface) {
136 unsafe {
137 let data = Self::type_data();
138 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
139 let f = (*parent_class)
140 .unrealize
141 .expect("No parent class impl for \"unrealize\"");
142 f(
143 self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0,
144 surface.to_glib_none().0,
145 )
146 }
147 }
148
149 fn parent_update_audio(&self, muted: bool, volume: f64) {
150 unsafe {
151 let data = Self::type_data();
152 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkMediaStreamClass;
153 let f = (*parent_class)
154 .update_audio
155 .expect("No parent class impl for \"update_audio\"");
156 f(
157 self.obj().unsafe_cast_ref::<MediaStream>().to_glib_none().0,
158 muted.into_glib(),
159 volume,
160 )
161 }
162 }
163}
164
165impl<T: MediaStreamImpl> MediaStreamImplExt for T {}
166
167unsafe impl<T: MediaStreamImpl> IsSubclassable<T> for MediaStream {
168 fn class_init(class: &mut glib::Class<Self>) {
169 Self::parent_class_init::<T>(class);
170
171 assert_initialized_main_thread!();
172
173 let klass = class.as_mut();
174 klass.pause = Some(media_stream_pause::<T>);
175 klass.play = Some(media_stream_play::<T>);
176 klass.realize = Some(media_stream_realize::<T>);
177 klass.seek = Some(media_stream_seek::<T>);
178 klass.unrealize = Some(media_stream_unrealize::<T>);
179 klass.update_audio = Some(media_stream_update_audio::<T>);
180 }
181}
182
183unsafe extern "C" fn media_stream_pause<T: MediaStreamImpl>(ptr: *mut ffi::GtkMediaStream) {
184 unsafe {
185 let instance = &*(ptr as *mut T::Instance);
186 let imp = instance.imp();
187
188 imp.pause()
189 }
190}
191
192unsafe extern "C" fn media_stream_play<T: MediaStreamImpl>(
193 ptr: *mut ffi::GtkMediaStream,
194) -> glib::ffi::gboolean {
195 unsafe {
196 let instance = &*(ptr as *mut T::Instance);
197 let imp = instance.imp();
198
199 imp.play().into_glib()
200 }
201}
202
203unsafe extern "C" fn media_stream_realize<T: MediaStreamImpl>(
204 ptr: *mut ffi::GtkMediaStream,
205 surface: *mut gdk::ffi::GdkSurface,
206) {
207 unsafe {
208 let instance = &*(ptr as *mut T::Instance);
209 let imp = instance.imp();
210
211 imp.realize(from_glib_none(surface))
212 }
213}
214
215unsafe extern "C" fn media_stream_seek<T: MediaStreamImpl>(
216 ptr: *mut ffi::GtkMediaStream,
217 timestamp: i64,
218) {
219 unsafe {
220 let instance = &*(ptr as *mut T::Instance);
221 let imp = instance.imp();
222
223 imp.seek(timestamp)
224 }
225}
226
227unsafe extern "C" fn media_stream_unrealize<T: MediaStreamImpl>(
228 ptr: *mut ffi::GtkMediaStream,
229 surface: *mut gdk::ffi::GdkSurface,
230) {
231 unsafe {
232 let instance = &*(ptr as *mut T::Instance);
233 let imp = instance.imp();
234
235 imp.unrealize(from_glib_none(surface))
236 }
237}
238
239unsafe extern "C" fn media_stream_update_audio<T: MediaStreamImpl>(
240 ptr: *mut ffi::GtkMediaStream,
241 muted: glib::ffi::gboolean,
242 volume: f64,
243) {
244 unsafe {
245 let instance = &*(ptr as *mut T::Instance);
246 let imp = instance.imp();
247
248 imp.update_audio(from_glib(muted), volume)
249 }
250}