diff options
Diffstat (limited to 'alsa/src/communication.rs')
| -rw-r--r-- | alsa/src/communication.rs | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/alsa/src/communication.rs b/alsa/src/communication.rs index b55a786..3caf4cf 100644 --- a/alsa/src/communication.rs +++ b/alsa/src/communication.rs @@ -1,6 +1,7 @@ -use std::sync::mpsc::*; use swaystatus_plugin::*; +use self::pipe_chan::{Sender, Receiver, SendError, ReceiveError, create_pipe_chan}; + pub(crate) mod pipe_chan; #[repr(C)] @@ -9,12 +10,46 @@ pub enum MessagesFromMain { Refresh } +pub(crate) struct MessagesFromMainReceiver{ + receiver : Receiver +} + +pub(crate) struct MessagesFromMainSender{ + sender: Sender +} + +pub(crate) fn make_sender_for_main() -> Result<(MessagesFromMainSender, MessagesFromMainReceiver),()>{ + create_pipe_chan().map(|(sender,receiver)| (MessagesFromMainSender{sender}, MessagesFromMainReceiver{receiver})) +} + +impl MessagesFromMainSender { + pub(crate) fn send(&self, message : MessagesFromMain) -> Result<(), SendError>{ + self.sender.send_byte(match message { + MessagesFromMain::Quit => 0, + MessagesFromMain::Refresh => 1, + }) + } +} + +impl MessagesFromMainReceiver { + pub(crate) fn receive(&self) -> Result<Option<MessagesFromMain>, ReceiveError> { + self.receiver.read_byte().map(|o| o.map(|b| match b { + 0 => MessagesFromMain::Quit, + 1 => MessagesFromMain::Refresh, + _ => unreachable!() + })) + } + pub(crate) fn file_handle(&self) -> &pipe_chan::FileHandle{ + self.receiver.file_handle() + } +} + pub struct SenderForMain { - sender : Sender<MessagesFromMain>, + sender : MessagesFromMainSender, } impl<'p> SenderForMain { - pub fn new(sender : Sender<MessagesFromMain>) -> Self { + pub fn new(sender : MessagesFromMainSender) -> Self { Self { sender } } |
