popover: Use thread-safe reference

This reference will be modified from the screensaver thread.
This commit is contained in:
Dorota Czaplejewicz
2022-12-07 15:05:20 +00:00
parent e88410d412
commit 3366090454
2 changed files with 23 additions and 8 deletions

View File

@ -11,16 +11,21 @@ but it cannot get the user-selected overlay, because it's stored in state.
To solve this, overlay will be cached in the popover actor,
and updated by main state every time it changes.
*/
use crate::logging;
use std::borrow::BorrowMut;
use super::Destination;
pub mod c {
use super::*;
use crate::util::c::Wrapped;
/// The mutable instance of state
pub type Actor = Wrapped<State>;
use crate::util::c::ArcWrapped;
/// The mutable instance of state.
/// Thread-safe because this actor does not get its own event loop,
/// and therefore can't have a channel to receive messages,
/// so instead messages will be passed directly to the mutexed actor.
pub type Actor = ArcWrapped<State>;
/// It's the same because the state is a simple mutex-protected type.
/// There are no channels involved.
pub type Destination = Wrapped<State>;
pub type Destination = ArcWrapped<State>;
}
pub enum Event {
@ -32,8 +37,18 @@ impl Destination for c::Destination {
type Event = Event;
fn send(&self, event: Self::Event) {
let actor = self.clone_ref();
let mut actor = actor.borrow_mut();
*actor = actor.clone().handle_event(event);
let actor = actor.lock();
match actor {
Ok(mut actor) => {
let actor = actor.borrow_mut();
**actor = actor.clone().handle_event(event);
},
Err(e) => log_print!(
logging::Level::Bug,
"Cannot lock popover state: {:?}",
e,
),
}
}
}

View File

@ -30,7 +30,7 @@ mod c {
use crate::outputs::Outputs;
use crate::state;
use crate::submission::Submission;
use crate::util::c::Wrapped;
use crate::util::c::{ArcWrapped, Wrapped};
use crate::vkeyboard::c::ZwpVirtualKeyboardV1;
/// DbusHandler*
@ -132,7 +132,7 @@ mod c {
state_manager: Wrapped::new(state_manager),
receiver: Wrapped::new(receiver),
wayland: Box::into_raw(wayland),
popover: Wrapped::new(actors::popover::State::new(true)),
popover: ArcWrapped::new(actors::popover::State::new(true)),
}
}