espanso/src/event/manager.rs
2020-05-10 18:01:04 +02:00

76 lines
2.6 KiB
Rust

/*
* This file is part of espanso.
*
* Copyright (C) 2019 Federico Terzi
*
* espanso is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* espanso is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
*/
use crate::event::{ActionEventReceiver, Event, KeyEventReceiver, SystemEventReceiver};
use std::sync::mpsc::Receiver;
pub trait EventManager {
fn eventloop(&self);
}
pub struct DefaultEventManager<'a> {
receive_channel: Receiver<Event>,
key_receivers: Vec<&'a dyn KeyEventReceiver>,
action_receivers: Vec<&'a dyn ActionEventReceiver>,
system_receivers: Vec<&'a dyn SystemEventReceiver>,
}
impl<'a> DefaultEventManager<'a> {
pub fn new(
receive_channel: Receiver<Event>,
key_receivers: Vec<&'a dyn KeyEventReceiver>,
action_receivers: Vec<&'a dyn ActionEventReceiver>,
system_receivers: Vec<&'a dyn SystemEventReceiver>,
) -> DefaultEventManager<'a> {
DefaultEventManager {
receive_channel,
key_receivers,
action_receivers,
system_receivers,
}
}
}
impl<'a> EventManager for DefaultEventManager<'a> {
fn eventloop(&self) {
loop {
match self.receive_channel.recv() {
Ok(event) => match event {
Event::Key(key_event) => {
self.key_receivers
.iter()
.for_each(move |&receiver| receiver.on_key_event(key_event.clone()));
}
Event::Action(action_event) => {
self.action_receivers
.iter()
.for_each(|&receiver| receiver.on_action_event(action_event.clone()));
}
Event::System(system_event) => {
self.system_receivers.iter().for_each(move |&receiver| {
receiver.on_system_event(system_event.clone())
});
}
},
Err(e) => panic!("Broken event channel {}", e),
}
}
}
}