gtk4/subclass/
media_stream.rs1use 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 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}