diff --git a/src/event.rs b/src/event.rs
index 34644676..a3e33e3a 100644
--- a/src/event.rs
+++ b/src/event.rs
@@ -947,6 +947,9 @@ pub(crate) enum InternalEvent {
/// A cursor position (`col`, `row`).
#[cfg(unix)]
CursorPosition(u16, u16),
+ /// Terminal window size in pixels (`width`, `height`).
+ #[cfg(unix)]
+ WindowSize(u16, u16),
/// The progressive keyboard enhancement flags enabled by the terminal.
#[cfg(unix)]
KeyboardEnhancementFlags(KeyboardEnhancementFlags),
diff --git a/src/event/filter.rs b/src/event/filter.rs
index f78730dc..4b41605b 100644
--- a/src/event/filter.rs
+++ b/src/event/filter.rs
@@ -17,6 +17,17 @@ impl Filter for CursorPositionFilter {
}
}
+#[cfg(unix)]
+#[derive(Debug, Clone)]
+pub(crate) struct WindowSizeFilter;
+
+#[cfg(unix)]
+impl Filter for WindowSizeFilter {
+ fn eval(&self, event: &InternalEvent) -> bool {
+ matches!(*event, InternalEvent::WindowSize(_, _))
+ }
+}
+
#[cfg(unix)]
#[derive(Debug, Clone)]
pub(crate) struct KeyboardEnhancementFlagsFilter;
@@ -76,6 +87,7 @@ mod tests {
use super::{
super::Event, CursorPositionFilter, EventFilter, Filter, InternalEvent,
InternalEventFilter, KeyboardEnhancementFlagsFilter, PrimaryDeviceAttributesFilter,
+ WindowSizeFilter,
};
#[test]
@@ -84,6 +96,12 @@ mod tests {
assert!(CursorPositionFilter.eval(&InternalEvent::CursorPosition(0, 0)));
}
+ #[test]
+ fn test_window_size_filter_filters_window_size() {
+ assert!(!WindowSizeFilter.eval(&InternalEvent::Event(Event::Resize(10, 10))));
+ assert!(WindowSizeFilter.eval(&InternalEvent::WindowSize(0, 0)));
+ }
+
#[test]
fn test_keyboard_enhancement_status_filter_filters_keyboard_enhancement_status() {
assert!(!KeyboardEnhancementFlagsFilter.eval(&InternalEvent::Event(Event::Resize(10, 10))));
@@ -105,11 +123,13 @@ mod tests {
fn test_event_filter_filters_events() {
assert!(EventFilter.eval(&InternalEvent::Event(Event::Resize(10, 10))));
assert!(!EventFilter.eval(&InternalEvent::CursorPosition(0, 0)));
+ assert!(!EventFilter.eval(&InternalEvent::WindowSize(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)));
+ assert!(InternalEventFilter.eval(&InternalEvent::WindowSize(0, 0)));
}
}
diff --git a/src/event/sys/unix/parse.rs b/src/event/sys/unix/parse.rs
index 2019b5f2..333cf84c 100644
--- a/src/event/sys/unix/parse.rs
+++ b/src/event/sys/unix/parse.rs
@@ -202,6 +202,7 @@ pub(crate) fn parse_csi(buffer: &[u8]) -> io::Result