Skip to content

Commit 006fe2d

Browse files
committed
Add gsk::RenderReplay bindings manually
Generated by temporarily adding glib:get-type to the gir file, moving he generated file to src and replacing the glib::wrapper macro with `struct` and `impl Drop`. We also replace `mut self` with `self` in function arguments.
1 parent 5ba4629 commit 006fe2d

File tree

3 files changed

+270
-0
lines changed

3 files changed

+270
-0
lines changed

gsk4/Gir.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,10 @@ status = "generate"
230230
name = "cr"
231231
const = true
232232

233+
[[object]]
234+
name = "Gsk.RenderReplay"
235+
status = "manual"
236+
233237
[[object]]
234238
name = "Gsk.RoundedRect"
235239
status = "manual"

gsk4/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ mod path_builder;
8484
#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
8585
mod path_point;
8686
mod radial_gradient_node;
87+
#[cfg(feature = "v4_22")]
88+
#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
89+
mod render_replay;
8790
mod repeat_node;
8891
mod repeating_linear_gradient_node;
8992
mod repeating_radial_gradient_node;
@@ -109,5 +112,8 @@ pub use color_stop::ColorStop;
109112
#[cfg_attr(feature = "v4_4", deprecated = "Since 4.4")]
110113
pub use ngl_renderer::NglRenderer;
111114
pub use parse_location::ParseLocation;
115+
#[cfg(feature = "v4_22")]
116+
#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
117+
pub use render_replay::RenderReplay;
112118
pub use rounded_rect::RoundedRect;
113119
pub use shadow::Shadow;

gsk4/src/render_replay.rs

Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
// Take a look at the license at the top of the repository in the LICENSE file.
2+
3+
use crate::{ffi, RenderNode};
4+
use glib::{prelude::*, translate::*};
5+
use std::boxed::Box as Box_;
6+
7+
#[repr(C)]
8+
#[doc(alias = "GskRenderReplay")]
9+
pub struct RenderReplay(std::ptr::NonNull<ffi::GskRenderReplay>);
10+
11+
impl Drop for RenderReplay {
12+
fn drop(&mut self) {
13+
unsafe {
14+
ffi::gsk_render_replay_free(self.ptr.as_ptr());
15+
}
16+
}
17+
}
18+
19+
impl RenderReplay {
20+
#[doc(alias = "gsk_render_replay_default")]
21+
#[allow(clippy::should_implement_trait)]
22+
pub fn default(&self, node: impl AsRef<RenderNode>) -> Option<RenderNode> {
23+
unsafe {
24+
from_glib_full(ffi::gsk_render_replay_default(
25+
self.to_glib_none_mut().0,
26+
node.as_ref().to_glib_none().0,
27+
))
28+
}
29+
}
30+
31+
#[doc(alias = "gsk_render_replay_filter_font")]
32+
pub fn filter_font(&self, font: &impl IsA<pango::Font>) -> pango::Font {
33+
unsafe {
34+
from_glib_full(ffi::gsk_render_replay_filter_font(
35+
self.to_glib_none_mut().0,
36+
font.as_ref().to_glib_none().0,
37+
))
38+
}
39+
}
40+
41+
#[doc(alias = "gsk_render_replay_filter_node")]
42+
pub fn filter_node(&self, node: impl AsRef<RenderNode>) -> Option<RenderNode> {
43+
unsafe {
44+
from_glib_full(ffi::gsk_render_replay_filter_node(
45+
self.to_glib_none_mut().0,
46+
node.as_ref().to_glib_none().0,
47+
))
48+
}
49+
}
50+
51+
#[doc(alias = "gsk_render_replay_filter_texture")]
52+
pub fn filter_texture(&self, texture: &impl IsA<gdk::Texture>) -> gdk::Texture {
53+
unsafe {
54+
from_glib_full(ffi::gsk_render_replay_filter_texture(
55+
self.to_glib_none_mut().0,
56+
texture.as_ref().to_glib_none().0,
57+
))
58+
}
59+
}
60+
61+
#[doc(alias = "gsk_render_replay_foreach_node")]
62+
pub fn foreach_node(&self, node: impl AsRef<RenderNode>) {
63+
unsafe {
64+
ffi::gsk_render_replay_foreach_node(
65+
self.to_glib_none_mut().0,
66+
node.as_ref().to_glib_none().0,
67+
);
68+
}
69+
}
70+
71+
#[doc(alias = "gsk_render_replay_set_font_filter")]
72+
pub fn set_font_filter(
73+
&self,
74+
filter: Option<Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>>,
75+
) {
76+
let filter_data: Box_<
77+
Option<Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>>,
78+
> = Box_::new(filter);
79+
unsafe extern "C" fn filter_func(
80+
replay: *mut ffi::GskRenderReplay,
81+
font: *mut pango::ffi::PangoFont,
82+
user_data: glib::ffi::gpointer,
83+
) -> *mut pango::ffi::PangoFont {
84+
let replay = from_glib_borrow(replay);
85+
let font = from_glib_borrow(font);
86+
let callback = &*(user_data
87+
as *mut Option<Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>>);
88+
if let Some(ref callback) = *callback {
89+
callback(&replay, &font)
90+
} else {
91+
panic!("cannot get closure...")
92+
}
93+
.to_glib_full()
94+
}
95+
let filter = if filter_data.is_some() {
96+
Some(filter_func as _)
97+
} else {
98+
None
99+
};
100+
unsafe extern "C" fn user_destroy_func(data: glib::ffi::gpointer) {
101+
let _callback = Box_::from_raw(
102+
data as *mut Option<
103+
Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>,
104+
>,
105+
);
106+
}
107+
let destroy_call3 = Some(user_destroy_func as _);
108+
let super_callback0: Box_<
109+
Option<Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>>,
110+
> = filter_data;
111+
unsafe {
112+
ffi::gsk_render_replay_set_font_filter(
113+
self.to_glib_none_mut().0,
114+
filter,
115+
Box_::into_raw(super_callback0) as *mut _,
116+
destroy_call3,
117+
);
118+
}
119+
}
120+
121+
#[doc(alias = "gsk_render_replay_set_node_filter")]
122+
pub fn set_node_filter<P: Fn(&RenderReplay, &RenderNode) -> Option<RenderNode> + 'static>(
123+
&self,
124+
filter: P,
125+
) {
126+
let filter_data: Box_<P> = Box_::new(filter);
127+
unsafe extern "C" fn filter_func<
128+
P: Fn(&RenderReplay, &RenderNode) -> Option<RenderNode> + 'static,
129+
>(
130+
replay: *mut ffi::GskRenderReplay,
131+
node: *mut ffi::GskRenderNode,
132+
user_data: glib::ffi::gpointer,
133+
) -> *mut ffi::GskRenderNode {
134+
let replay = from_glib_borrow(replay);
135+
let node = from_glib_borrow(node);
136+
let callback = &*(user_data as *mut P);
137+
(*callback)(&replay, &node).to_glib_full()
138+
}
139+
let filter = Some(filter_func::<P> as _);
140+
unsafe extern "C" fn user_destroy_func<
141+
P: Fn(&RenderReplay, &RenderNode) -> Option<RenderNode> + 'static,
142+
>(
143+
data: glib::ffi::gpointer,
144+
) {
145+
let _callback = Box_::from_raw(data as *mut P);
146+
}
147+
let destroy_call3 = Some(user_destroy_func::<P> as _);
148+
let super_callback0: Box_<P> = filter_data;
149+
unsafe {
150+
ffi::gsk_render_replay_set_node_filter(
151+
self.to_glib_none_mut().0,
152+
filter,
153+
Box_::into_raw(super_callback0) as *mut _,
154+
destroy_call3,
155+
);
156+
}
157+
}
158+
159+
#[doc(alias = "gsk_render_replay_set_node_foreach")]
160+
pub fn set_node_foreach<P: Fn(&RenderReplay, &RenderNode) -> bool + 'static>(
161+
&self,
162+
foreach: P,
163+
) {
164+
let foreach_data: Box_<P> = Box_::new(foreach);
165+
unsafe extern "C" fn foreach_func<P: Fn(&RenderReplay, &RenderNode) -> bool + 'static>(
166+
replay: *mut ffi::GskRenderReplay,
167+
node: *mut ffi::GskRenderNode,
168+
user_data: glib::ffi::gpointer,
169+
) -> glib::ffi::gboolean {
170+
let replay = from_glib_borrow(replay);
171+
let node = from_glib_borrow(node);
172+
let callback = &*(user_data as *mut P);
173+
(*callback)(&replay, &node).into_glib()
174+
}
175+
let foreach = Some(foreach_func::<P> as _);
176+
unsafe extern "C" fn user_destroy_func<
177+
P: Fn(&RenderReplay, &RenderNode) -> bool + 'static,
178+
>(
179+
data: glib::ffi::gpointer,
180+
) {
181+
let _callback = Box_::from_raw(data as *mut P);
182+
}
183+
let destroy_call3 = Some(user_destroy_func::<P> as _);
184+
let super_callback0: Box_<P> = foreach_data;
185+
unsafe {
186+
ffi::gsk_render_replay_set_node_foreach(
187+
self.to_glib_none_mut().0,
188+
foreach,
189+
Box_::into_raw(super_callback0) as *mut _,
190+
destroy_call3,
191+
);
192+
}
193+
}
194+
195+
#[doc(alias = "gsk_render_replay_set_texture_filter")]
196+
pub fn set_texture_filter(
197+
&self,
198+
filter: Option<Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>>,
199+
) {
200+
let filter_data: Box_<
201+
Option<Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>>,
202+
> = Box_::new(filter);
203+
unsafe extern "C" fn filter_func(
204+
replay: *mut ffi::GskRenderReplay,
205+
texture: *mut gdk::ffi::GdkTexture,
206+
user_data: glib::ffi::gpointer,
207+
) -> *mut gdk::ffi::GdkTexture {
208+
let replay = from_glib_borrow(replay);
209+
let texture = from_glib_borrow(texture);
210+
let callback = &*(user_data
211+
as *mut Option<
212+
Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>,
213+
>);
214+
if let Some(ref callback) = *callback {
215+
callback(&replay, &texture)
216+
} else {
217+
panic!("cannot get closure...")
218+
}
219+
.to_glib_full()
220+
}
221+
let filter = if filter_data.is_some() {
222+
Some(filter_func as _)
223+
} else {
224+
None
225+
};
226+
unsafe extern "C" fn user_destroy_func(data: glib::ffi::gpointer) {
227+
let _callback = Box_::from_raw(
228+
data as *mut Option<
229+
Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>,
230+
>,
231+
);
232+
}
233+
let destroy_call3 = Some(user_destroy_func as _);
234+
let super_callback0: Box_<
235+
Option<Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>>,
236+
> = filter_data;
237+
unsafe {
238+
ffi::gsk_render_replay_set_texture_filter(
239+
self.to_glib_none_mut().0,
240+
filter,
241+
Box_::into_raw(super_callback0) as *mut _,
242+
destroy_call3,
243+
);
244+
}
245+
}
246+
247+
#[doc(alias = "gsk_render_replay_new")]
248+
pub fn new() -> RenderReplay {
249+
assert_initialized_main_thread!();
250+
unsafe { from_glib_none(ffi::gsk_render_replay_new()) }
251+
}
252+
}
253+
254+
#[cfg(feature = "v4_22")]
255+
#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
256+
impl Default for RenderReplay {
257+
fn default() -> Self {
258+
Self::new()
259+
}
260+
}

0 commit comments

Comments
 (0)