fix(minimize): cache captured data for minimized toplevels
This commit is contained in:
parent
456d052535
commit
f97dc5a31e
1 changed files with 35 additions and 35 deletions
|
|
@ -121,6 +121,7 @@ struct AppData {
|
||||||
toplevel_info_state: ToplevelInfoState,
|
toplevel_info_state: ToplevelInfoState,
|
||||||
toplevel_manager_state: ToplevelManagerState,
|
toplevel_manager_state: ToplevelManagerState,
|
||||||
seat_state: SeatState,
|
seat_state: SeatState,
|
||||||
|
captured_toplevels: std::collections::HashSet<ExtForeignToplevelHandleV1>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CaptureData {
|
struct CaptureData {
|
||||||
|
|
@ -351,6 +352,36 @@ impl AppData {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_toplevel(&mut self, toplevel: &ExtForeignToplevelHandleV1, is_new: bool) {
|
||||||
|
let Some(info) = self.toplevel_info_state.info(toplevel) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
if info
|
||||||
|
.state
|
||||||
|
.contains(&zcosmic_toplevel_handle_v1::State::Minimized)
|
||||||
|
{
|
||||||
|
// Capture a thumbnail once, on the transition into minimized.
|
||||||
|
if self.captured_toplevels.insert(toplevel.clone()) {
|
||||||
|
self.send_image(toplevel.clone());
|
||||||
|
}
|
||||||
|
let update = if is_new {
|
||||||
|
ToplevelUpdate::Add(info.clone())
|
||||||
|
} else {
|
||||||
|
ToplevelUpdate::Update(info.clone())
|
||||||
|
};
|
||||||
|
let _ = futures::executor::block_on(self.tx.send(WaylandUpdate::Toplevel(update)));
|
||||||
|
} else {
|
||||||
|
self.remove_toplevel(toplevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn remove_toplevel(&mut self, toplevel: &ExtForeignToplevelHandleV1) {
|
||||||
|
self.captured_toplevels.remove(toplevel);
|
||||||
|
let _ = futures::executor::block_on(self.tx.send(WaylandUpdate::Toplevel(
|
||||||
|
ToplevelUpdate::Remove(toplevel.clone()),
|
||||||
|
)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToplevelInfoHandler for AppData {
|
impl ToplevelInfoHandler for AppData {
|
||||||
|
|
@ -364,23 +395,7 @@ impl ToplevelInfoHandler for AppData {
|
||||||
_qh: &QueueHandle<Self>,
|
_qh: &QueueHandle<Self>,
|
||||||
toplevel: &ExtForeignToplevelHandleV1,
|
toplevel: &ExtForeignToplevelHandleV1,
|
||||||
) {
|
) {
|
||||||
if let Some(info) = self.toplevel_info_state.info(toplevel) {
|
self.handle_toplevel(toplevel, true);
|
||||||
if info
|
|
||||||
.state
|
|
||||||
.contains(&zcosmic_toplevel_handle_v1::State::Minimized)
|
|
||||||
{
|
|
||||||
// spawn thread for sending the image
|
|
||||||
self.send_image(toplevel.clone());
|
|
||||||
let _ = futures::executor::block_on(
|
|
||||||
self.tx
|
|
||||||
.send(WaylandUpdate::Toplevel(ToplevelUpdate::Add(info.clone()))),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
let _ = futures::executor::block_on(self.tx.send(WaylandUpdate::Toplevel(
|
|
||||||
ToplevelUpdate::Remove(toplevel.clone()),
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_toplevel(
|
fn update_toplevel(
|
||||||
|
|
@ -389,21 +404,7 @@ impl ToplevelInfoHandler for AppData {
|
||||||
_qh: &QueueHandle<Self>,
|
_qh: &QueueHandle<Self>,
|
||||||
toplevel: &ExtForeignToplevelHandleV1,
|
toplevel: &ExtForeignToplevelHandleV1,
|
||||||
) {
|
) {
|
||||||
if let Some(info) = self.toplevel_info_state.info(toplevel) {
|
self.handle_toplevel(toplevel, false);
|
||||||
if info
|
|
||||||
.state
|
|
||||||
.contains(&zcosmic_toplevel_handle_v1::State::Minimized)
|
|
||||||
{
|
|
||||||
self.send_image(toplevel.clone());
|
|
||||||
let _ = futures::executor::block_on(self.tx.send(WaylandUpdate::Toplevel(
|
|
||||||
ToplevelUpdate::Update(info.clone()),
|
|
||||||
)));
|
|
||||||
} else {
|
|
||||||
let _ = futures::executor::block_on(self.tx.send(WaylandUpdate::Toplevel(
|
|
||||||
ToplevelUpdate::Remove(toplevel.clone()),
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn toplevel_closed(
|
fn toplevel_closed(
|
||||||
|
|
@ -412,9 +413,7 @@ impl ToplevelInfoHandler for AppData {
|
||||||
_qh: &QueueHandle<Self>,
|
_qh: &QueueHandle<Self>,
|
||||||
toplevel: &ExtForeignToplevelHandleV1,
|
toplevel: &ExtForeignToplevelHandleV1,
|
||||||
) {
|
) {
|
||||||
let _ = futures::executor::block_on(self.tx.send(WaylandUpdate::Toplevel(
|
self.remove_toplevel(toplevel);
|
||||||
ToplevelUpdate::Remove(toplevel.clone()),
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -482,6 +481,7 @@ pub(crate) fn wayland_handler(
|
||||||
toplevel_manager_state: ToplevelManagerState::new(®istry_state, &qh),
|
toplevel_manager_state: ToplevelManagerState::new(®istry_state, &qh),
|
||||||
queue_handle: qh,
|
queue_handle: qh,
|
||||||
registry_state,
|
registry_state,
|
||||||
|
captured_toplevels: std::collections::HashSet::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue