Skip to content

Commit 1e7622c

Browse files
Add query_keyboard_enhancement_flags to read enabled flags (#958)
This is mostly a refactor of `supports_keyboard_enhancement` and its helper functions. We previously discarded the response to the `CSI ? u` query but this returns the currently active flags. This response value can be useful for a client to know which flags to emit to disable the keyboard enhancement protocol or to know which flags a terminal supports (after the client has pushed flags).
1 parent 6d6d3cb commit 1e7622c

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

src/terminal/sys/unix.rs

+19-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! UNIX related logic for terminal manipulation.
22
3+
#[cfg(feature = "events")]
4+
use crate::event::KeyboardEnhancementFlags;
35
use crate::terminal::{
46
sys::file_descriptor::{tty_fd, FileDesc},
57
WindowSize,
@@ -184,23 +186,32 @@ fn set_terminal_attr(fd: impl AsFd, termios: &Termios) -> io::Result<()> {
184186
/// [`crossterm::event::read`](crate::event::read) or [`crossterm::event::poll`](crate::event::poll) are being called.
185187
#[cfg(feature = "events")]
186188
pub fn supports_keyboard_enhancement() -> io::Result<bool> {
189+
query_keyboard_enhancement_flags().map(|flags| flags.is_some())
190+
}
191+
192+
/// Queries the terminal's currently active keyboard enhancement flags.
193+
///
194+
/// On unix systems, this function will block and possibly time out while
195+
/// [`crossterm::event::read`](crate::event::read) or [`crossterm::event::poll`](crate::event::poll) are being called.
196+
#[cfg(feature = "events")]
197+
pub fn query_keyboard_enhancement_flags() -> io::Result<Option<KeyboardEnhancementFlags>> {
187198
if is_raw_mode_enabled() {
188-
read_supports_keyboard_enhancement_raw()
199+
query_keyboard_enhancement_flags_raw()
189200
} else {
190-
read_supports_keyboard_enhancement_flags()
201+
query_keyboard_enhancement_flags_nonraw()
191202
}
192203
}
193204

194205
#[cfg(feature = "events")]
195-
fn read_supports_keyboard_enhancement_flags() -> io::Result<bool> {
206+
fn query_keyboard_enhancement_flags_nonraw() -> io::Result<Option<KeyboardEnhancementFlags>> {
196207
enable_raw_mode()?;
197-
let flags = read_supports_keyboard_enhancement_raw();
208+
let flags = query_keyboard_enhancement_flags_raw();
198209
disable_raw_mode()?;
199210
flags
200211
}
201212

202213
#[cfg(feature = "events")]
203-
fn read_supports_keyboard_enhancement_raw() -> io::Result<bool> {
214+
fn query_keyboard_enhancement_flags_raw() -> io::Result<Option<KeyboardEnhancementFlags>> {
204215
use crate::event::{
205216
filter::{KeyboardEnhancementFlagsFilter, PrimaryDeviceAttributesFilter},
206217
poll_internal, read_internal, InternalEvent,
@@ -236,12 +247,12 @@ fn read_supports_keyboard_enhancement_raw() -> io::Result<bool> {
236247
) {
237248
Ok(true) => {
238249
match read_internal(&KeyboardEnhancementFlagsFilter) {
239-
Ok(InternalEvent::KeyboardEnhancementFlags(_current_flags)) => {
250+
Ok(InternalEvent::KeyboardEnhancementFlags(current_flags)) => {
240251
// Flush the PrimaryDeviceAttributes out of the event queue.
241252
read_internal(&PrimaryDeviceAttributesFilter).ok();
242-
return Ok(true);
253+
return Ok(Some(current_flags));
243254
}
244-
_ => return Ok(false),
255+
_ => return Ok(None),
245256
}
246257
}
247258
Ok(false) => {

0 commit comments

Comments
 (0)