jay-compositor 1.15.0

The Jay compositor
use crate::state::State;
use crate::utils::errorfmt::ErrorFmt;
use futures_util::FutureExt;
use futures_util::select;
use std::rc::Rc;

pub async fn handle_hardware_cursor_tick(state: Rc<State>) {
    loop {
        let Some(cursor) = state.hardware_tick_cursor.pop().await else {
            continue;
        };
        if !cursor.needs_tick() {
            continue;
        }
        loop {
            let tick = cursor.time_until_tick().as_nanos().div_ceil(1_000_000);
            if tick > 0 {
                let res = select! {
                    _ = state.hardware_tick_cursor.non_empty().fuse() => break,
                    res = state.wheel.timeout(tick as _).fuse() => res,
                };
                if let Err(e) = res {
                    log::error!("Could not wait for cursor tick: {}", ErrorFmt(e));
                    break;
                }
            } else {
                if state.hardware_tick_cursor.is_not_empty() {
                    break;
                }
            }
            cursor.tick();
            state.damage_hardware_cursors(true);
        }
    }
}