diff --git a/.github/workflows/crossterm_test.yml b/.github/workflows/crossterm_test.yml index c5cbe95c..31123080 100644 --- a/.github/workflows/crossterm_test.yml +++ b/.github/workflows/crossterm_test.yml @@ -66,6 +66,10 @@ jobs: if: matrix.os != 'windows-2019' run: cargo test --no-default-features -- --nocapture --test-threads 1 continue-on-error: ${{ matrix.can-fail }} + - name: Test no default features with use-dev-tty feature enabled + if: matrix.os != 'windows-2019' + run: cargo test --no-default-features --features "use-dev-tty events" -- --nocapture --test-threads 1 + continue-on-error: ${{ matrix.can-fail }} - name: Test no default features with windows feature enabled if: matrix.os == 'windows-2019' run: cargo test --no-default-features --features "windows" -- --nocapture --test-threads 1 diff --git a/Cargo.toml b/Cargo.toml index 32006e52..2c53c14b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,18 +28,28 @@ all-features = true # [features] default = ["bracketed-paste", "windows", "events"] -windows = ["dep:winapi", "dep:crossterm_winapi"] # Disables winapi dependencies from being included into the binary (SHOULD NOT be disabled on windows). -bracketed-paste = [] # Enables triggering a `Event::Paste` when pasting text into the terminal. +windows = [ + "dep:winapi", + "dep:crossterm_winapi", +] # Disables winapi dependencies from being included into the binary (SHOULD NOT be disabled on windows). +bracketed-paste = [ +] # Enables triggering a `Event::Paste` when pasting text into the terminal. event-stream = ["dep:futures-core", "events"] # Enables async events -use-dev-tty = ["filedescriptor"] # Enables raw file descriptor polling / selecting instead of mio. -events = ["dep:mio", "dep:signal-hook", "dep:signal-hook-mio"] # Enables reading input/events from the system. +use-dev-tty = [ + "filedescriptor", +] # Enables raw file descriptor polling / selecting instead of mio. +events = [ + "dep:mio", + "dep:signal-hook", + "dep:signal-hook-mio", +] # Enables reading input/events from the system. serde = ["dep:serde", "bitflags/serde"] # Enables 'serde' for various types. # # Shared dependencies # [dependencies] -bitflags = {version = "2.3" } +bitflags = { version = "2.3" } parking_lot = "0.12" # optional deps only added when requested @@ -65,7 +75,9 @@ libc = "0.2" signal-hook = { version = "0.3.17", optional = true } filedescriptor = { version = "0.8", optional = true } mio = { version = "0.8", features = ["os-poll"], optional = true } -signal-hook-mio = { version = "0.2.3", features = ["support-v0_8"], optional = true } +signal-hook-mio = { version = "0.2.3", features = [ + "support-v0_8", +], optional = true } # # Dev dependencies (examples, ...) @@ -108,3 +120,7 @@ required-features = ["events"] [[example]] name = "stderr" required-features = ["events"] + +[[example]] +name = "key-display" +required-features = ["events"] diff --git a/src/cursor/sys.rs b/src/cursor/sys.rs index f85a95c6..1623740a 100644 --- a/src/cursor/sys.rs +++ b/src/cursor/sys.rs @@ -4,6 +4,7 @@ #[cfg(feature = "events")] pub use self::unix::position; #[cfg(windows)] +#[cfg(feature = "events")] pub use self::windows::position; #[cfg(windows)] pub(crate) use self::windows::{ diff --git a/src/event.rs b/src/event.rs index b3bf86a5..2a620e12 100644 --- a/src/event.rs +++ b/src/event.rs @@ -910,7 +910,7 @@ impl Display for ModifierKeyCode { /// /// # Platform-specific Notes /// - /// On macOS, the control, alt, and super keys is displayed as "Control", "Option", and + /// On macOS, the control, alt, and super keys are displayed as "Control", "Option", and /// "Command" respectively. See /// . /// @@ -920,7 +920,6 @@ impl Display for ModifierKeyCode { /// /// On other platforms, the super key is referred to as "Super". fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - #[cfg(target_os = "macos")] match self { ModifierKeyCode::LeftShift => write!(f, "Left Shift"), ModifierKeyCode::LeftHyper => write!(f, "Left Hyper"), diff --git a/src/event/source/unix/mio.rs b/src/event/source/unix/mio.rs index f9d595af..8372a1dd 100644 --- a/src/event/source/unix/mio.rs +++ b/src/event/source/unix/mio.rs @@ -120,23 +120,18 @@ impl EventSource for UnixInternalEventSource { } } SIGNAL_TOKEN => { - for signal in self.signals.pending() { - match signal { - signal_hook::consts::SIGWINCH => { - // TODO Should we remove tput? - // - // This can take a really long time, because terminal::size can - // launch new process (tput) and then it parses its output. It's - // not a really long time from the absolute time point of view, but - // it's a really long time from the mio, async-std/tokio executor, ... - // point of view. - let new_size = crate::terminal::size()?; - return Ok(Some(InternalEvent::Event(Event::Resize( - new_size.0, new_size.1, - )))); - } - _ => unreachable!("Synchronize signal registration & handling"), - }; + if self.signals.pending().next() == Some(signal_hook::consts::SIGWINCH) { + // TODO Should we remove tput? + // + // This can take a really long time, because terminal::size can + // launch new process (tput) and then it parses its output. It's + // not a really long time from the absolute time point of view, but + // it's a really long time from the mio, async-std/tokio executor, ... + // point of view. + let new_size = crate::terminal::size()?; + return Ok(Some(InternalEvent::Event(Event::Resize( + new_size.0, new_size.1, + )))); } } #[cfg(feature = "event-stream")] diff --git a/src/event/source/unix/tty.rs b/src/event/source/unix/tty.rs index 320a12ca..b8cbfeff 100644 --- a/src/event/source/unix/tty.rs +++ b/src/event/source/unix/tty.rs @@ -80,7 +80,7 @@ impl UnixInternalEventSource { /// only fills the given buffer and does not read beyond that. fn read_complete(fd: &FileDesc, buf: &mut [u8]) -> io::Result { loop { - match fd.read(buf, buf.len()) { + match fd.read(buf) { Ok(x) => return Ok(x), Err(e) => match e.kind() { io::ErrorKind::WouldBlock => return Ok(0), diff --git a/src/style/attributes.rs b/src/style/attributes.rs index aa481c3a..83dea3ed 100644 --- a/src/style/attributes.rs +++ b/src/style/attributes.rs @@ -140,8 +140,11 @@ mod tests { #[test] fn test_attributes_const() { - const ATTRIBUTES: Attributes = Attributes::none().with(Attribute::Bold).with(Attribute::Italic).without(Attribute::Bold); - assert!(!ATTRIBUTES.has(Attribute::Bold)); - assert!(ATTRIBUTES.has(Attribute::Italic)); + const ATTRIBUTES: Attributes = Attributes::none() + .with(Attribute::Bold) + .with(Attribute::Italic) + .without(Attribute::Bold); + assert!(!ATTRIBUTES.has(Attribute::Bold)); + assert!(ATTRIBUTES.has(Attribute::Italic)); } } diff --git a/src/style/types/color.rs b/src/style/types/color.rs index 026dc7ef..d4d52844 100644 --- a/src/style/types/color.rs +++ b/src/style/types/color.rs @@ -246,15 +246,11 @@ impl serde::ser::Serialize for Color { if str.is_empty() { match *self { - Color::AnsiValue(value) => { - serializer.serialize_str(&format!("ansi_({})", value)) - } + Color::AnsiValue(value) => serializer.serialize_str(&format!("ansi_({})", value)), Color::Rgb { r, g, b } => { serializer.serialize_str(&format!("rgb_({},{},{})", r, g, b)) } - _ => { - Err(serde::ser::Error::custom("Could not serialize enum type")) - } + _ => Err(serde::ser::Error::custom("Could not serialize enum type")), } } else { serializer.serialize_str(str)