From 5c912446a9eff8f15254ae376471253843645549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 10 Mar 2025 14:07:28 +0200 Subject: [PATCH] gtk4: Consider surface scale factor when proposing window dimensions Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/646 Part-of: --- video/gtk4/src/sink/render_widget/imp.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/video/gtk4/src/sink/render_widget/imp.rs b/video/gtk4/src/sink/render_widget/imp.rs index 1c8bf4bd..f31e7892 100644 --- a/video/gtk4/src/sink/render_widget/imp.rs +++ b/video/gtk4/src/sink/render_widget/imp.rs @@ -98,14 +98,31 @@ impl WidgetImpl for RenderWidget { fn snapshot(&self, snapshot: >k::Snapshot) { let window_width = self.obj().width() as u32; let window_height = self.obj().height() as u32; - let new_size = (window_width, window_height); + let scale = { + #[cfg(feature = "gtk_v4_12")] + { + if let Some(surface) = self.obj().native().and_then(|native| native.surface()) { + surface.scale() + } else { + self.obj().scale_factor() as f64 + } + } + #[cfg(not(feature = "gtk_v4_12"))] + { + self.obj().scale_factor() as f64 + } + }; + let new_size = ( + f64::ceil(window_width as f64 * scale) as u32, + f64::ceil(window_height as f64 * scale) as u32, + ); let updated = self.window_size.replace(new_size) != new_size; if updated { let element = self.element.borrow(); let element = element.as_ref().unwrap(); - element.set_property("window-width", window_width); - element.set_property("window-height", window_height); + element.set_property("window-width", new_size.0); + element.set_property("window-height", new_size.1); } self.parent_snapshot(snapshot)