Fix unused type warnings in i-slint-backend-linukxms build with default features

When no features are enabled, the TimerBasedAnimationDriver would be unused.
This commit is contained in:
Simon Hausmann 2024-07-01 10:50:31 +02:00 committed by Simon Hausmann
parent dbde3c2f9e
commit 6d14f5ca15
3 changed files with 61 additions and 57 deletions

View file

@ -1,9 +1,6 @@
// Copyright © SixtyFPS GmbH <info@slint.dev> // Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0 // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
use std::cell::Cell;
use std::rc::{Rc, Weak};
use i_slint_core::api::PhysicalSize; use i_slint_core::api::PhysicalSize;
use i_slint_core::platform::PlatformError; use i_slint_core::platform::PlatformError;
@ -101,58 +98,65 @@ impl RenderingRotation {
} }
} }
struct TimerBasedAnimationDriver { #[cfg(any(feature = "renderer-skia-vulkan", feature = "renderer-software"))]
timer: i_slint_core::timers::Timer, pub(crate) mod timeranimations {
next_animation_frame_callback: Cell<Option<Box<dyn FnOnce()>>>, use i_slint_core::platform::PlatformError;
} use std::cell::Cell;
use std::rc::{Rc, Weak};
impl TimerBasedAnimationDriver { pub(crate) struct TimerBasedAnimationDriver {
fn new() -> Rc<Self> { timer: i_slint_core::timers::Timer,
Rc::new_cyclic(|self_weak: &Weak<Self>| { next_animation_frame_callback: Cell<Option<Box<dyn FnOnce()>>>,
let self_weak = self_weak.clone(); }
let timer = i_slint_core::timers::Timer::default();
timer.start(
i_slint_core::timers::TimerMode::Repeated,
std::time::Duration::from_millis(16),
move || {
let Some(this) = self_weak.upgrade() else { return };
// Stop the timer and let the callback decide if we need to continue. It will set
// `needs_redraw` to true of animations should continue, render() will be called,
// present_with_next_frame_callback() will be called and then the timer restarted.
this.timer.stop();
if let Some(next_animation_frame_callback) =
this.next_animation_frame_callback.take()
{
next_animation_frame_callback();
}
},
);
// Activate it only when we present a frame.
timer.stop();
Self { timer, next_animation_frame_callback: Default::default() } impl TimerBasedAnimationDriver {
}) pub(crate) fn new() -> Rc<Self> {
} Rc::new_cyclic(|self_weak: &Weak<Self>| {
} let self_weak = self_weak.clone();
let timer = i_slint_core::timers::Timer::default();
impl crate::display::Presenter for TimerBasedAnimationDriver { timer.start(
fn is_ready_to_present(&self) -> bool { i_slint_core::timers::TimerMode::Repeated,
true std::time::Duration::from_millis(16),
} move || {
let Some(this) = self_weak.upgrade() else { return };
fn register_page_flip_handler( // Stop the timer and let the callback decide if we need to continue. It will set
&self, // `needs_redraw` to true of animations should continue, render() will be called,
_event_loop_handle: crate::calloop_backend::EventLoopHandle, // present_with_next_frame_callback() will be called and then the timer restarted.
) -> Result<(), PlatformError> { this.timer.stop();
Ok(()) if let Some(next_animation_frame_callback) =
} this.next_animation_frame_callback.take()
{
fn present_with_next_frame_callback( next_animation_frame_callback();
&self, }
ready_for_next_animation_frame: Box<dyn FnOnce()>, },
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> { );
self.next_animation_frame_callback.set(Some(ready_for_next_animation_frame)); // Activate it only when we present a frame.
self.timer.restart(); timer.stop();
Ok(())
Self { timer, next_animation_frame_callback: Default::default() }
})
}
}
impl crate::display::Presenter for TimerBasedAnimationDriver {
fn is_ready_to_present(&self) -> bool {
true
}
fn register_page_flip_handler(
&self,
_event_loop_handle: crate::calloop_backend::EventLoopHandle,
) -> Result<(), PlatformError> {
Ok(())
}
fn present_with_next_frame_callback(
&self,
ready_for_next_animation_frame: Box<dyn FnOnce()>,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
self.next_animation_frame_callback.set(Some(ready_for_next_animation_frame));
self.timer.restart();
Ok(())
}
} }
} }

View file

@ -12,7 +12,7 @@ pub struct LinuxFBDisplay {
back_buffer: RefCell<Box<[u8]>>, back_buffer: RefCell<Box<[u8]>>,
width: u32, width: u32,
height: u32, height: u32,
presenter: Rc<crate::display::TimerBasedAnimationDriver>, presenter: Rc<crate::display::timeranimations::TimerBasedAnimationDriver>,
first_frame: Cell<bool>, first_frame: Cell<bool>,
} }
@ -87,7 +87,7 @@ impl LinuxFBDisplay {
back_buffer, back_buffer,
width, width,
height, height,
presenter: crate::display::TimerBasedAnimationDriver::new(), presenter: crate::display::timeranimations::TimerBasedAnimationDriver::new(),
first_frame: Cell::new(true), first_frame: Cell::new(true),
})) }))
} }

View file

@ -173,6 +173,6 @@ pub fn create_vulkan_display() -> Result<VulkanDisplay, PlatformError> {
queue_family_index, queue_family_index,
surface: vulkan_surface, surface: vulkan_surface,
size, size,
presenter: crate::display::TimerBasedAnimationDriver::new(), presenter: crate::display::timeranimations::TimerBasedAnimationDriver::new(),
}) })
} }