This should be useful for integrating cosmic-config into things using calloop, like cosmic-comp.
63 lines
1.8 KiB
Rust
63 lines
1.8 KiB
Rust
// TODO If possible, calloop could poll inotify/kqueue without a thread
|
|
|
|
use calloop::channel;
|
|
|
|
use crate::{Config, Error};
|
|
|
|
pub struct ConfigWatchSource {
|
|
channel: channel::Channel<(Config, Vec<String>)>,
|
|
_watcher: notify::RecommendedWatcher,
|
|
}
|
|
|
|
impl ConfigWatchSource {
|
|
pub fn new(config: &Config) -> Result<Self, Error> {
|
|
let (sender, channel) = channel::sync_channel(32);
|
|
let _watcher = config.watch(move |config, keys| {
|
|
let _ = sender.send((config.clone(), keys.to_owned()));
|
|
})?;
|
|
Ok(Self { channel, _watcher })
|
|
}
|
|
}
|
|
|
|
impl calloop::EventSource for ConfigWatchSource {
|
|
type Event = (Config, Vec<String>);
|
|
type Metadata = ();
|
|
type Ret = ();
|
|
type Error = calloop::channel::ChannelError;
|
|
|
|
fn process_events<F>(
|
|
&mut self,
|
|
readiness: calloop::Readiness,
|
|
token: calloop::Token,
|
|
mut cb: F,
|
|
) -> Result<calloop::PostAction, Self::Error>
|
|
where
|
|
F: FnMut(Self::Event, &mut Self::Metadata) -> Self::Ret,
|
|
{
|
|
self.channel
|
|
.process_events(readiness, token, |event, ()| match event {
|
|
calloop::channel::Event::Msg(msg) => cb(msg, &mut ()),
|
|
calloop::channel::Event::Closed => {}
|
|
})
|
|
}
|
|
|
|
fn register(
|
|
&mut self,
|
|
poll: &mut calloop::Poll,
|
|
token_factory: &mut calloop::TokenFactory,
|
|
) -> Result<(), calloop::Error> {
|
|
self.channel.register(poll, token_factory)
|
|
}
|
|
|
|
fn reregister(
|
|
&mut self,
|
|
poll: &mut calloop::Poll,
|
|
token_factory: &mut calloop::TokenFactory,
|
|
) -> Result<(), calloop::Error> {
|
|
self.channel.reregister(poll, token_factory)
|
|
}
|
|
|
|
fn unregister(&mut self, poll: &mut calloop::Poll) -> Result<(), calloop::Error> {
|
|
self.channel.unregister(poll)
|
|
}
|
|
}
|