2019-11-19 07:50:57 +11:00
|
|
|
use crate::event::InternalEvent;
|
|
|
|
|
|
|
|
/// Interface for filtering an `InternalEvent`.
|
|
|
|
pub(crate) trait Filter: Send + Sync + 'static {
|
|
|
|
/// Returns whether the given event fulfills the filter.
|
|
|
|
fn eval(&self, event: &InternalEvent) -> bool;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(unix)]
|
2020-01-29 06:20:26 +11:00
|
|
|
#[derive(Debug, Clone)]
|
2019-11-19 07:50:57 +11:00
|
|
|
pub(crate) struct CursorPositionFilter;
|
|
|
|
|
|
|
|
#[cfg(unix)]
|
|
|
|
impl Filter for CursorPositionFilter {
|
|
|
|
fn eval(&self, event: &InternalEvent) -> bool {
|
|
|
|
if let InternalEvent::CursorPosition(_, _) = *event {
|
|
|
|
true
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-29 06:20:26 +11:00
|
|
|
#[derive(Debug, Clone)]
|
2019-11-19 07:50:57 +11:00
|
|
|
pub(crate) struct EventFilter;
|
|
|
|
|
|
|
|
impl Filter for EventFilter {
|
|
|
|
#[cfg(unix)]
|
|
|
|
fn eval(&self, event: &InternalEvent) -> bool {
|
|
|
|
if let InternalEvent::Event(_) = *event {
|
|
|
|
true
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(windows)]
|
|
|
|
fn eval(&self, _: &InternalEvent) -> bool {
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-29 06:20:26 +11:00
|
|
|
#[derive(Debug, Clone)]
|
2019-11-19 07:50:57 +11:00
|
|
|
pub(crate) struct InternalEventFilter;
|
|
|
|
|
|
|
|
impl Filter for InternalEventFilter {
|
|
|
|
fn eval(&self, _: &InternalEvent) -> bool {
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
#[cfg(unix)]
|
|
|
|
mod tests {
|
|
|
|
use super::{
|
|
|
|
super::Event, CursorPositionFilter, EventFilter, Filter, InternalEvent, InternalEventFilter,
|
|
|
|
};
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_cursor_position_filter_filters_cursor_position() {
|
|
|
|
assert!(!CursorPositionFilter.eval(&InternalEvent::Event(Event::Resize(10, 10))));
|
|
|
|
assert!(CursorPositionFilter.eval(&InternalEvent::CursorPosition(0, 0)));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_event_filter_filters_events() {
|
|
|
|
assert!(EventFilter.eval(&InternalEvent::Event(Event::Resize(10, 10))));
|
|
|
|
assert!(!EventFilter.eval(&InternalEvent::CursorPosition(0, 0)));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_event_filter_filters_internal_events() {
|
|
|
|
assert!(InternalEventFilter.eval(&InternalEvent::Event(Event::Resize(10, 10))));
|
|
|
|
assert!(InternalEventFilter.eval(&InternalEvent::CursorPosition(0, 0)));
|
|
|
|
}
|
|
|
|
}
|