mirror of
https://github.com/pinnacle-comp/pinnacle.git
synced 2025-02-05 20:46:27 +01:00
Send frame callbacks when not rendering
This commit is contained in:
parent
866f9eec5d
commit
3b65ba5c1d
4 changed files with 36 additions and 8 deletions
|
@ -12,7 +12,10 @@ use smithay::{
|
||||||
},
|
},
|
||||||
winit::{WinitError, WinitEvent, WinitGraphicsBackend},
|
winit::{WinitError, WinitEvent, WinitGraphicsBackend},
|
||||||
},
|
},
|
||||||
desktop::{layer_map_for_output, utils::send_frames_surface_tree},
|
desktop::{
|
||||||
|
layer_map_for_output,
|
||||||
|
utils::{send_frames_surface_tree, surface_primary_scanout_output},
|
||||||
|
},
|
||||||
input::pointer::CursorImageStatus,
|
input::pointer::CursorImageStatus,
|
||||||
output::{Output, Subpixel},
|
output::{Output, Subpixel},
|
||||||
reexports::{
|
reexports::{
|
||||||
|
@ -32,7 +35,7 @@ use smithay::{
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
render::pointer::PointerElement,
|
render::pointer::PointerElement,
|
||||||
state::{take_presentation_feedback, Backend, CalloopData, State},
|
state::{take_presentation_feedback, Backend, CalloopData, State, WithState},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::BackendData;
|
use super::BackendData;
|
||||||
|
@ -232,16 +235,42 @@ pub fn run_winit() -> anyhow::Result<()> {
|
||||||
|
|
||||||
pointer_element.set_status(state.cursor_status.clone());
|
pointer_element.set_status(state.cursor_status.clone());
|
||||||
|
|
||||||
if state.pause_rendering {
|
// TODO: make a pending_windows state, when pending_windows increases,
|
||||||
|
// | pause rendering.
|
||||||
|
// | If it goes down, push a frame, then repeat until no pending_windows are left.
|
||||||
|
|
||||||
|
let pending_win_count = state
|
||||||
|
.windows
|
||||||
|
.iter()
|
||||||
|
.filter(|win| win.alive())
|
||||||
|
.filter(|win| win.with_state(|state| !state.loc_request_state.is_idle()))
|
||||||
|
.count() as u32;
|
||||||
|
|
||||||
|
if pending_win_count > 0 {
|
||||||
|
for win in state.windows.iter() {
|
||||||
|
win.send_frame(
|
||||||
|
&output,
|
||||||
|
state.clock.now(),
|
||||||
|
Some(Duration::ZERO),
|
||||||
|
surface_primary_scanout_output,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
state.space.refresh();
|
state.space.refresh();
|
||||||
state.popup_manager.cleanup();
|
state.popup_manager.cleanup();
|
||||||
display
|
display
|
||||||
.flush_clients()
|
.flush_clients()
|
||||||
.expect("failed to flush client buffers");
|
.expect("failed to flush client buffers");
|
||||||
|
|
||||||
|
state.prev_pending_win_count = pending_win_count;
|
||||||
|
|
||||||
|
// TODO: still draw the cursor here
|
||||||
|
|
||||||
return TimeoutAction::ToDuration(Duration::from_millis(1));
|
return TimeoutAction::ToDuration(Duration::from_millis(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state.prev_pending_win_count = pending_win_count;
|
||||||
|
|
||||||
let Backend::Winit(backend) = &mut state.backend else { unreachable!() };
|
let Backend::Winit(backend) = &mut state.backend else { unreachable!() };
|
||||||
let full_redraw = &mut backend.full_redraw;
|
let full_redraw = &mut backend.full_redraw;
|
||||||
*full_redraw = full_redraw.saturating_sub(1);
|
*full_redraw = full_redraw.saturating_sub(1);
|
||||||
|
|
|
@ -20,7 +20,6 @@ use smithay::{
|
||||||
input::{
|
input::{
|
||||||
keyboard::{keysyms, FilterResult},
|
keyboard::{keysyms, FilterResult},
|
||||||
pointer::{AxisFrame, ButtonEvent, MotionEvent},
|
pointer::{AxisFrame, ButtonEvent, MotionEvent},
|
||||||
SeatHandler,
|
|
||||||
},
|
},
|
||||||
reexports::wayland_protocols::xdg::shell::server::xdg_toplevel::ResizeEdge,
|
reexports::wayland_protocols::xdg::shell::server::xdg_toplevel::ResizeEdge,
|
||||||
utils::{Logical, Point, SERIAL_COUNTER},
|
utils::{Logical, Point, SERIAL_COUNTER},
|
||||||
|
|
|
@ -161,7 +161,7 @@ impl State {
|
||||||
//
|
//
|
||||||
// This *will* cause everything to freeze for a few frames, but it shouldn't impact
|
// This *will* cause everything to freeze for a few frames, but it shouldn't impact
|
||||||
// anything meaningfully.
|
// anything meaningfully.
|
||||||
self.pause_rendering = true;
|
// self.pause_rendering = true;
|
||||||
|
|
||||||
// schedule on all idle
|
// schedule on all idle
|
||||||
self.schedule(
|
self.schedule(
|
||||||
|
@ -186,7 +186,7 @@ impl State {
|
||||||
for (loc, win) in non_pending_wins {
|
for (loc, win) in non_pending_wins {
|
||||||
dt.state.space.map_element(win, loc, false);
|
dt.state.space.map_element(win, loc, false);
|
||||||
}
|
}
|
||||||
dt.state.pause_rendering = false;
|
// dt.state.pause_rendering = false;
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@ pub struct State {
|
||||||
pub xwm: Option<X11Wm>,
|
pub xwm: Option<X11Wm>,
|
||||||
pub xdisplay: Option<u32>,
|
pub xdisplay: Option<u32>,
|
||||||
|
|
||||||
pub pause_rendering: bool,
|
pub prev_pending_win_count: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
|
@ -360,7 +360,7 @@ impl State {
|
||||||
xwm: None,
|
xwm: None,
|
||||||
xdisplay: None,
|
xdisplay: None,
|
||||||
|
|
||||||
pause_rendering: false,
|
prev_pending_win_count: 0,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue