Fix/linux skia crashes (#966)

* fix: run hooks before early returns in cluster and gallery views

* chore: upgrade freya to 0.5.0-beta.9

* chore: pin freya to 0.5.0-beta.10 branch for skia 0.103.2
This commit is contained in:
LynithDev 2026-10-10 00:58:42 +02:00 • committed by GitHub
parent c6361c7266
commit 2f5a64b97d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 115 additions and 78 deletions

126
Cargo.lock generated
View file

@ -2253,8 +2253,8 @@ dependencies = [
[[package]]
name = "freya"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"cfg-if",
"freya-android",
@ -2278,8 +2278,8 @@ dependencies = [
[[package]]
name = "freya-android"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-components",
"freya-core",
@ -2291,8 +2291,8 @@ dependencies = [
[[package]]
name = "freya-animation"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"easer",
"freya-core",
@ -2300,8 +2300,8 @@ dependencies = [
[[package]]
name = "freya-borderless-plugin"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-core",
"freya-engine",
@ -2311,8 +2311,8 @@ dependencies = [
[[package]]
name = "freya-clipboard"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"copypasta",
"freya-core",
@ -2320,8 +2320,8 @@ dependencies = [
[[package]]
name = "freya-components"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"accesskit",
"anyhow",
@ -2346,8 +2346,8 @@ dependencies = [
[[package]]
name = "freya-core"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"accesskit",
"async-io",
@ -2376,8 +2376,8 @@ dependencies = [
[[package]]
name = "freya-edit"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"bitflags 2.13.2",
"freya-clipboard",
@ -2390,16 +2390,16 @@ dependencies = [
[[package]]
name = "freya-engine"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-skia-safe",
]
[[package]]
name = "freya-markdown"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-components",
"freya-core",
@ -2409,8 +2409,8 @@ dependencies = [
[[package]]
name = "freya-metrics-plugin"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-core",
"freya-engine",
@ -2420,8 +2420,8 @@ dependencies = [
[[package]]
name = "freya-query"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-core",
"futures-util",
@ -2429,16 +2429,16 @@ dependencies = [
[[package]]
name = "freya-radio"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-core",
]
[[package]]
name = "freya-router"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-core",
"freya-router-macro",
@ -2449,8 +2449,8 @@ dependencies = [
[[package]]
name = "freya-router-macro"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"proc-macro2",
"quote",
@ -2460,8 +2460,8 @@ dependencies = [
[[package]]
name = "freya-sdk"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"freya-core",
"tokio",
@ -2469,9 +2469,9 @@ dependencies = [
[[package]]
name = "freya-skia-bindings"
version = "0.100.0-beta.1"
version = "0.103.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab63f601c617af7bd05abdf71f504577f77760ef12b281f5ab06078d301a6636"
checksum = "423c6e5119a363d09120729908d478b6d906dcd7ae76e6b2b2e437d708d42ddf"
dependencies = [
"bindgen",
"cc",
@ -2486,9 +2486,9 @@ dependencies = [
[[package]]
name = "freya-skia-safe"
version = "0.100.0-beta.1"
version = "0.103.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94035ce89b42c8c3b69a854904deea53b1a88d8e1654de270484767ba500cffc"
checksum = "76caec9c4cc139acd1d73016d63a782708693a54fffe6bc9a53112e2f710d22d"
dependencies = [
"base64 0.23.1",
"bitflags 2.13.2",
@ -2499,9 +2499,9 @@ dependencies = [
[[package]]
name = "freya-skia-svg-macros"
version = "0.100.0-beta.1"
version = "0.103.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b32021e23aabcfb098ad578b547569ebe246bb6658e94b0ae472ca0d5a50977"
checksum = "7f789a635e4ca6346ec08f71f02dd6778428887786f14267f7a3de1c98a44e18"
dependencies = [
"proc-macro2",
"quote",
@ -2510,8 +2510,8 @@ dependencies = [
[[package]]
name = "freya-testing"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"accesskit",
"freya-clipboard",
@ -2525,8 +2525,8 @@ dependencies = [
[[package]]
name = "freya-winit"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"accesskit",
"accesskit_winit",
@ -3965,6 +3965,25 @@ dependencies = [
"vcpkg",
]
[[package]]
name = "libxdo"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db"
dependencies = [
"libxdo-sys",
]
[[package]]
name = "libxdo-sys"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212"
dependencies = [
"libc",
"x11",
]
[[package]]
name = "linux-raw-sys"
version = "0.4.15"
@ -4199,6 +4218,7 @@ dependencies = [
"dpi",
"gtk",
"keyboard-types 0.7.0",
"libxdo",
"objc2 0.6.4",
"objc2-app-kit 0.3.2",
"objc2-core-foundation",
@ -5404,8 +5424,8 @@ checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec"
[[package]]
name = "pathgraph"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
[[package]]
name = "percent-encoding"
@ -5899,8 +5919,8 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "ragnarok"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"euclid",
"hotpath",
@ -7758,8 +7778,8 @@ checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
[[package]]
name = "torin"
version = "0.5.0-rc.8"
source = "git+https://github.com/Polyfrost/freya?rev=2e4a11ec569d72ef1a809e9365548daa3cc5f6b5#2e4a11ec569d72ef1a809e9365548daa3cc5f6b5"
version = "0.5.0-beta.10"
source = "git+https://github.com/marc2332/freya?rev=ed0a7c3e530e4e23334f2333c408198a3d79c42e#ed0a7c3e530e4e23334f2333c408198a3d79c42e"
dependencies = [
"euclid",
"itertools",
@ -9014,6 +9034,16 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
[[package]]
name = "x11"
version = "2.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e"
dependencies = [
"libc",
"pkg-config",
]
[[package]]
name = "x11-clipboard"
version = "0.9.3"

View file

@ -144,10 +144,10 @@ syn = {version = "=3.0.6"}
thiserror = {version = "=2.0.21"}
# ui
freya = {git = "https://github.com/Polyfrost/freya", rev = "2e4a11ec569d72ef1a809e9365548daa3cc5f6b5", features = ["engine", "winit", "router", "remote-asset", "sdk-tokio", "query", "radio", "borderless", "titlebar", "tray", "metrics"]}
freya-core = {git = "https://github.com/Polyfrost/freya", rev = "2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" }
freya-testing = {git = "https://github.com/Polyfrost/freya", rev = "2e4a11ec569d72ef1a809e9365548daa3cc5f6b5" }
freya-skia-safe = "=0.100.0-beta.1" # required for the SKSL player renderer
freya = {git = "https://github.com/marc2332/freya", rev = "ed0a7c3e530e4e23334f2333c408198a3d79c42e", features = ["engine", "winit", "router", "remote-asset", "sdk-tokio", "query", "radio", "borderless", "titlebar", "tray", "metrics"]}
freya-core = {git = "https://github.com/marc2332/freya", rev = "ed0a7c3e530e4e23334f2333c408198a3d79c42e"}
freya-testing = {git = "https://github.com/marc2332/freya", rev = "ed0a7c3e530e4e23334f2333c408198a3d79c42e"}
freya-skia-safe = "=0.103.2" # required for the SKSL player renderer
image = {version = "=0.25.10", default-features = false, features = ["png", "jpeg"]}
[profile.release]

View file

@ -258,6 +258,8 @@ impl LayoutExt for Button {
impl ContainerExt for Button {}
impl DecorationExt for Button {}
impl StyleExt for Button {
fn get_style(&mut self) -> &mut StyleState {
&mut self.style

View file

@ -93,7 +93,7 @@ impl Component for PieChart {
let values = self.values.clone();
let hit_values = self.values.clone();
let render_cb = RenderCallback::new(move |ctx: &mut CanvasContext| {
let render_cb = RenderCallback::new(move |ctx: &mut FillRenderContext| {
let (w, h) = (ctx.size.width, ctx.size.height);
if w <= 0.0 || h <= 0.0 {
return;
@ -182,8 +182,13 @@ impl Component for PieChart {
.height(Size::fill())
.position(Position::new_absolute())
.interactive(false)
// Childless canvas auto-sizes to 0x0 without an explicit size
.child(canvas(render_cb).width(Size::fill()).height(Size::fill())),
// Childless rect auto-sizes to 0x0 without an explicit size
.child(
rect()
.width(Size::fill())
.height(Size::fill())
.background(render_cb),
),
)
.child(
rect()

View file

@ -121,7 +121,7 @@ impl Component for PlayerModel {
let effect = player_effect();
let render_cb = RenderCallback::new(move |ctx: &mut CanvasContext| {
let render_cb = RenderCallback::new(move |ctx: &mut FillRenderContext| {
let (Some(effect), Some(skin)) = (&effect, &skin_shader) else {
return;
};
@ -155,18 +155,12 @@ impl Component for PlayerModel {
ctx.canvas.draw_rect(SkRect::new(0.0, 0.0, w, h), &paint);
});
// `canvas` carries no style data, so the cursor rides on a wrapper `rect` that
// covers exactly the same area
rect()
.key(src_ptr as u64)
.width(self.width.clone())
.height(self.height.clone())
.cursor(CursorIcon::Grab)
.child(
canvas(render_cb)
.key(src_ptr as u64)
.width(Size::fill())
.height(Size::fill()),
)
.background(render_cb)
.on_pointer_down(move |e: Event<PointerEventData>| {
let loc = e.global_location();
drag.set(Some((loc.x as f32, loc.y as f32, yaw(), pitch())));

View file

@ -45,6 +45,8 @@ impl Component for ScreenshotViewer {
move || start
});
let mut menu = use_state(|| None::<(f32, f32)>);
let action = use_screenshot_action();
let dispatch = use_dispatch();
if len == 0 {
return rect().into_element();
@ -52,9 +54,6 @@ impl Component for ScreenshotViewer {
let idx = (*index.read()).min(len - 1);
let info = shots[idx].clone();
let action = use_screenshot_action();
let dispatch = use_dispatch();
let close = self.on_close.clone();
let scrim_close = self.on_close.clone();
let delete_close = self.on_close.clone();

View file

@ -381,7 +381,7 @@ impl Component for ParallaxArt {
let parallax_enabled = self.parallax_enabled;
let fade_opacity = self.fade_opacity;
let render_cb = RenderCallback::new(move |ctx: &mut CanvasContext| {
let render_cb = RenderCallback::new(move |ctx: &mut FillRenderContext| {
let Some(image) = &image else {
return;
};
@ -479,10 +479,11 @@ impl Component for ParallaxArt {
.layer(Layer::Relative(0))
.opacity(fade_opacity)
.child(
canvas(render_cb)
rect()
.key(src_ptr as u64)
.width(Size::fill())
.height(Size::fill()),
.height(Size::fill())
.background(render_cb),
),
)
}

View file

@ -158,13 +158,13 @@ impl Component for GalleryViewer {
move || start
});
let idx = (*index.read()).min(len.saturating_sub(1));
let query = use_cached_image(self.images.get(idx).map(|i| i.url.clone()), FULL_EDGE);
if len == 0 {
return rect().into_element();
}
let idx = (*index.read()).min(len - 1);
let image = self.images[idx].clone();
let query = use_cached_image(Some(image.url.clone()), FULL_EDGE);
let loaded = loaded_image(Some(&image.url), &query);
let close = self.on_close.clone();

View file

@ -19,11 +19,12 @@ impl Component for ClusterOverview {
fn render(&self) -> impl IntoElement {
let cluster_id = self.cluster_id;
let query = use_cluster_analytics(cluster_id);
let Some(cluster) = use_cluster(cluster_id) else {
return cluster_content().child(cluster_not_found()).into_element();
};
let query = use_cluster_analytics(cluster_id);
let analytics = try_cluster_analytics(&query);
let body: Element = match &analytics {

View file

@ -36,10 +36,11 @@ pub struct ClusterScreenshots {
impl Component for ClusterScreenshots {
fn render(&self) -> impl IntoElement {
let Some(cluster) = use_cluster(self.cluster_id) else {
return cluster_not_found();
};
let folder = cluster.game_dir().ok().map(|d| d.join("screenshots"));
let cluster = use_cluster(self.cluster_id);
let folder = cluster
.as_ref()
.and_then(|c| c.game_dir().ok())
.map(|d| d.join("screenshots"));
let query = use_cluster_screenshots(self.cluster_id);
// Otherwise a screenshot taken in game only shows up on the next visit
@ -57,6 +58,10 @@ impl Component for ClusterScreenshots {
let grid_width = use_state(|| 0f32);
let mut menu = use_state(|| None::<(f32, f32, PathBuf)>);
if cluster.is_none() {
return cluster_not_found();
}
let order: Vec<PathBuf> = shots.iter().map(|s| s.path.clone()).collect();
let selected = selection.selected_in(&order);
let editing = selection.is_active();