tree: batch output render data updates
This commit is contained in:
parent
5a4e48e54a
commit
1bdfa4c85e
4 changed files with 47 additions and 21 deletions
|
|
@ -59,9 +59,22 @@ pub struct OutputNode {
|
|||
pub lock_surface: CloneCell<Option<Rc<ExtSessionLockSurfaceV1>>>,
|
||||
pub preferred_scale: Cell<Fixed>,
|
||||
pub hardware_cursor: CloneCell<Option<Rc<dyn HardwareCursor>>>,
|
||||
pub update_render_data_scheduled: Cell<bool>,
|
||||
pub screencasts: CopyHashMap<(ClientId, JayScreencastId), Rc<JayScreencast>>,
|
||||
}
|
||||
|
||||
pub async fn output_render_data(state: Rc<State>) {
|
||||
loop {
|
||||
let container = state.pending_output_render_data.pop().await;
|
||||
if container.global.destroyed.get() {
|
||||
continue;
|
||||
}
|
||||
if container.update_render_data_scheduled.get() {
|
||||
container.update_render_data();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl OutputNode {
|
||||
pub fn perform_screencopies(&self, fb: &Framebuffer, tex: &Texture) {
|
||||
self.global.perform_screencopies(fb, tex);
|
||||
|
|
@ -83,13 +96,13 @@ impl OutputNode {
|
|||
}
|
||||
|
||||
pub fn on_spaces_changed(self: &Rc<Self>) {
|
||||
self.update_render_data();
|
||||
self.schedule_update_render_data();
|
||||
if let Some(c) = self.workspace.get() {
|
||||
c.change_extents(&self.workspace_rect());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_preferred_scale(&self, scale: Fixed) {
|
||||
pub fn set_preferred_scale(self: &Rc<Self>, scale: Fixed) {
|
||||
let old_scale = self.preferred_scale.replace(scale);
|
||||
if scale == old_scale {
|
||||
return;
|
||||
|
|
@ -109,10 +122,17 @@ impl OutputNode {
|
|||
stacked.deref().clone().node_visit(&mut visitor);
|
||||
}
|
||||
}
|
||||
self.update_render_data();
|
||||
self.schedule_update_render_data();
|
||||
}
|
||||
|
||||
pub fn update_render_data(&self) {
|
||||
pub fn schedule_update_render_data(self: &Rc<Self>) {
|
||||
if !self.update_render_data_scheduled.replace(true) {
|
||||
self.state.pending_output_render_data.push(self.clone());
|
||||
}
|
||||
}
|
||||
|
||||
fn update_render_data(&self) {
|
||||
self.update_render_data_scheduled.set(false);
|
||||
let mut rd = self.render_data.borrow_mut();
|
||||
rd.titles.clear();
|
||||
rd.inactive_workspaces.clear();
|
||||
|
|
@ -254,7 +274,7 @@ impl OutputNode {
|
|||
.output_link
|
||||
.set(Some(self.workspaces.add_last(workspace.clone())));
|
||||
self.show_workspace(&workspace);
|
||||
self.update_render_data();
|
||||
self.schedule_update_render_data();
|
||||
workspace
|
||||
}
|
||||
|
||||
|
|
@ -320,7 +340,7 @@ impl OutputNode {
|
|||
for (client, e) in clients_to_kill.values() {
|
||||
client.error(e);
|
||||
}
|
||||
self.update_render_data();
|
||||
self.schedule_update_render_data();
|
||||
ws
|
||||
}
|
||||
|
||||
|
|
@ -336,7 +356,7 @@ impl OutputNode {
|
|||
.unwrap()
|
||||
}
|
||||
|
||||
pub fn set_position(&self, x: i32, y: i32) {
|
||||
pub fn set_position(self: &Rc<Self>, x: i32, y: i32) {
|
||||
let pos = self.global.pos.get();
|
||||
if (pos.x1(), pos.y1()) == (x, y) {
|
||||
return;
|
||||
|
|
@ -345,7 +365,7 @@ impl OutputNode {
|
|||
self.change_extents_(&rect);
|
||||
}
|
||||
|
||||
pub fn update_mode(&self, mode: Mode) {
|
||||
pub fn update_mode(self: &Rc<Self>, mode: Mode) {
|
||||
let old_mode = self.global.mode.get();
|
||||
if old_mode == mode {
|
||||
return;
|
||||
|
|
@ -387,10 +407,10 @@ impl OutputNode {
|
|||
pos.with_size(width, height).unwrap()
|
||||
}
|
||||
|
||||
fn change_extents_(&self, rect: &Rect) {
|
||||
fn change_extents_(self: &Rc<Self>, rect: &Rect) {
|
||||
self.global.pos.set(*rect);
|
||||
self.state.root.update_extents();
|
||||
self.update_render_data();
|
||||
self.schedule_update_render_data();
|
||||
if let Some(ls) = self.lock_surface.get() {
|
||||
ls.change_extents(*rect);
|
||||
}
|
||||
|
|
@ -431,9 +451,9 @@ impl OutputNode {
|
|||
FindTreeResult::Other
|
||||
}
|
||||
|
||||
pub fn set_status(&self, status: &Rc<String>) {
|
||||
pub fn set_status(self: &Rc<Self>, status: &Rc<String>) {
|
||||
self.status.set(status.clone());
|
||||
self.update_render_data();
|
||||
self.schedule_update_render_data();
|
||||
}
|
||||
|
||||
fn pointer_move(self: &Rc<Self>, seat: &Rc<WlSeatGlobal>, x: i32, y: i32) {
|
||||
|
|
@ -628,7 +648,7 @@ impl Node for OutputNode {
|
|||
};
|
||||
self.show_workspace(&ws);
|
||||
ws.flush_jay_workspaces();
|
||||
self.update_render_data();
|
||||
self.schedule_update_render_data();
|
||||
self.state.tree_changed();
|
||||
}
|
||||
|
||||
|
|
@ -666,7 +686,7 @@ impl Node for OutputNode {
|
|||
ws.deref()
|
||||
.clone()
|
||||
.node_do_focus(seat, Direction::Unspecified);
|
||||
self.update_render_data();
|
||||
self.schedule_update_render_data();
|
||||
self.state.tree_changed();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue