Skip to content

Commit

Permalink
Simplify snapshots at call-site
Browse files Browse the repository at this point in the history
  • Loading branch information
Ottatop committed Jun 19, 2024
1 parent fe182fd commit 05b8196
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 281 deletions.
49 changes: 9 additions & 40 deletions src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ use crate::{
config::ConnectorSavedState,
input::{KeybindData, ModifierMask},
output::{OutputMode, OutputName},
render::util::snapshot::capture_snapshots_on_output,
state::{State, WithState},
tag::{Tag, TagId},
util::restore_nofile_rlimit,
Expand Down Expand Up @@ -803,9 +802,7 @@ impl tag_service_server::TagService for TagService {
return;
};

let snapshots = state.backend.with_renderer(|renderer| {
capture_snapshots_on_output(&mut state.pinnacle, renderer, &output, [])
});
state.capture_snapshots_on_output(&output, []);

match set_or_toggle {
SetOrToggle::Set => tag.set_active(true, &mut state.pinnacle),
Expand All @@ -816,17 +813,9 @@ impl tag_service_server::TagService for TagService {

state.pinnacle.fixup_xwayland_window_layering();

if let Some((fs_and_up_snapshots, under_fs_snapshots)) = snapshots {
output.with_state_mut(|op_state| {
op_state.new_wait_layout_transaction(
state.pinnacle.loop_handle.clone(),
fs_and_up_snapshots,
under_fs_snapshots,
)
});
}

state.pinnacle.begin_layout_transaction(&output);
state.pinnacle.request_layout(&output);

state.update_keyboard_focus(&output);
state.schedule_render(&output);
})
Expand All @@ -848,9 +837,7 @@ impl tag_service_server::TagService for TagService {
return;
};

let snapshots = state.backend.with_renderer(|renderer| {
capture_snapshots_on_output(&mut state.pinnacle, renderer, &output, [])
});
state.capture_snapshots_on_output(&output, []);

output.with_state(|op_state| {
for op_tag in op_state.tags.iter() {
Expand All @@ -861,17 +848,9 @@ impl tag_service_server::TagService for TagService {

state.pinnacle.fixup_xwayland_window_layering();

if let Some((fs_and_up_snapshots, under_fs_snapshots)) = snapshots {
output.with_state_mut(|op_state| {
op_state.new_wait_layout_transaction(
state.pinnacle.loop_handle.clone(),
fs_and_up_snapshots,
under_fs_snapshots,
)
});
}

state.pinnacle.begin_layout_transaction(&output);
state.pinnacle.request_layout(&output);

state.update_keyboard_focus(&output);
state.schedule_render(&output);
})
Expand Down Expand Up @@ -1218,9 +1197,7 @@ impl output_service_server::OutputService for OutputService {

current_scale = f64::max(current_scale, 0.25);

let snapshots = state.backend.with_renderer(|renderer| {
capture_snapshots_on_output(&mut state.pinnacle, renderer, &output, [])
});
state.capture_snapshots_on_output(&output, []);

state.pinnacle.change_output_state(
&mut state.backend,
Expand All @@ -1231,17 +1208,9 @@ impl output_service_server::OutputService for OutputService {
None,
);

if let Some((fs_and_up_snapshots, under_fs_snapshots)) = snapshots {
output.with_state_mut(|op_state| {
op_state.new_wait_layout_transaction(
state.pinnacle.loop_handle.clone(),
fs_and_up_snapshots,
under_fs_snapshots,
)
});
}

state.pinnacle.begin_layout_transaction(&output);
state.pinnacle.request_layout(&output);

state.schedule_render(&output);
state
.pinnacle
Expand Down
95 changes: 34 additions & 61 deletions src/api/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,7 @@ use smithay::{
use tonic::{Request, Response, Status};
use tracing::warn;

use crate::{
output::OutputName, render::util::snapshot::capture_snapshots_on_output, state::WithState,
tag::TagId, window::window_state::WindowId,
};
use crate::{output::OutputName, state::WithState, tag::TagId, window::window_state::WindowId};

use super::{run_unary, run_unary_no_response, StateFnSender};

Expand Down Expand Up @@ -220,16 +217,15 @@ impl window_service_server::WindowService for WindowService {
}

run_unary_no_response(&self.sender, move |state| {
let pinnacle = &mut state.pinnacle;
let Some(window) = window_id.window(pinnacle) else {
let Some(window) = window_id.window(&state.pinnacle) else {
return;
};

let snapshots = window.output(pinnacle).map(|output| {
state.backend.with_renderer(|renderer| {
capture_snapshots_on_output(pinnacle, renderer, &output, [window.clone()])
})
});
let output = window.output(&state.pinnacle);

if let Some(output) = output.as_ref() {
state.capture_snapshots_on_output(output, [window.clone()]);
}

match set_or_toggle {
SetOrToggle::Set => {
Expand All @@ -246,21 +242,13 @@ impl window_service_server::WindowService for WindowService {
SetOrToggle::Unspecified => unreachable!(),
}

let Some(output) = window.output(pinnacle) else {
let Some(output) = output else {
return;
};

if let Some((fs_and_up_snapshots, under_fs_snapshots)) = snapshots.flatten() {
output.with_state_mut(|op_state| {
op_state.new_wait_layout_transaction(
pinnacle.loop_handle.clone(),
fs_and_up_snapshots,
under_fs_snapshots,
)
});
}
state.pinnacle.begin_layout_transaction(&output);
state.pinnacle.request_layout(&output);

pinnacle.request_layout(&output);
state.schedule_render(&output);
})
.await
Expand Down Expand Up @@ -362,37 +350,29 @@ impl window_service_server::WindowService for WindowService {
);

run_unary_no_response(&self.sender, move |state| {
let pinnacle = &mut state.pinnacle;

let Some(window) = window_id.window(pinnacle) else {
let Some(window) = window_id.window(&state.pinnacle) else {
return;
};

let Some(tag) = tag_id.tag(pinnacle) else { return };
let Some(tag) = tag_id.tag(&state.pinnacle) else { return };

let snapshots = window.output(pinnacle).map(|output| {
state.backend.with_renderer(|renderer| {
capture_snapshots_on_output(pinnacle, renderer, &output, [window.clone()])
})
});
let output = window.output(&state.pinnacle);

if let Some(output) = output.as_ref() {
state.capture_snapshots_on_output(output, [window.clone()]);
}

window.with_state_mut(|state| {
state.tags = vec![tag.clone()];
});

let Some(output) = tag.output(pinnacle) else { return };
let Some(output) = tag.output(&state.pinnacle) else {
return;
};

if let Some((fs_and_up_snapshots, under_fs_snapshots)) = snapshots.flatten() {
output.with_state_mut(|op_state| {
op_state.new_wait_layout_transaction(
pinnacle.loop_handle.clone(),
fs_and_up_snapshots,
under_fs_snapshots,
)
});
}
state.pinnacle.begin_layout_transaction(&output);
state.pinnacle.request_layout(&output);

pinnacle.request_layout(&output);
state.schedule_render(&output);

state.pinnacle.fixup_xwayland_window_layering();
Expand Down Expand Up @@ -422,17 +402,16 @@ impl window_service_server::WindowService for WindowService {
}

run_unary_no_response(&self.sender, move |state| {
let pinnacle = &mut state.pinnacle;
let Some(window) = window_id.window(pinnacle) else {
let Some(window) = window_id.window(&state.pinnacle) else {
return;
};
let Some(tag) = tag_id.tag(pinnacle) else { return };
let Some(tag) = tag_id.tag(&state.pinnacle) else { return };

let snapshots = window.output(pinnacle).map(|output| {
state.backend.with_renderer(|renderer| {
capture_snapshots_on_output(pinnacle, renderer, &output, [window.clone()])
})
});
let output = window.output(&state.pinnacle);

if let Some(output) = output.as_ref() {
state.capture_snapshots_on_output(output, [window.clone()]);
}

// TODO: turn state.tags into a hashset
match set_or_toggle {
Expand All @@ -453,19 +432,13 @@ impl window_service_server::WindowService for WindowService {
SetOrToggle::Unspecified => unreachable!(),
}

let Some(output) = tag.output(pinnacle) else { return };
let Some(output) = tag.output(&state.pinnacle) else {
return;
};

if let Some((fs_and_up_snapshots, under_fs_snapshots)) = snapshots.flatten() {
output.with_state_mut(|op_state| {
op_state.new_wait_layout_transaction(
pinnacle.loop_handle.clone(),
fs_and_up_snapshots,
under_fs_snapshots,
)
});
}
state.pinnacle.begin_layout_transaction(&output);
state.pinnacle.request_layout(&output);

pinnacle.request_layout(&output);
state.schedule_render(&output);

state.pinnacle.fixup_xwayland_window_layering();
Expand Down
Loading

0 comments on commit 05b8196

Please sign in to comment.