Introduce the EnableMouseCapture and DisableMouseCapture commands (#296)
This commit is contained in:
parent
3ab5b170aa
commit
fe6ddb90f1
@ -2,6 +2,7 @@
|
||||
|
||||
- `input` module
|
||||
- Derive 'Copy' for 'KeyEvent'
|
||||
- Add the `EnableMouseCapture` and `EnableMouseCapture` commands
|
||||
- `cursor` module
|
||||
- Remove `TerminalCursor`, `cursor`, `Crossterm::cursor()`
|
||||
- Introduce static function `crossterm::cursor::position` in place of `TerminalCursor::pos`
|
||||
|
40
src/input.rs
40
src/input.rs
@ -38,7 +38,7 @@
|
||||
#[cfg(feature = "serde")]
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::utils::Result;
|
||||
use crate::utils::{Command, Result};
|
||||
|
||||
#[cfg(unix)]
|
||||
use self::input::unix::UnixInput;
|
||||
@ -47,6 +47,7 @@ use self::input::windows::WindowsInput;
|
||||
use self::input::Input;
|
||||
pub use self::input::{AsyncReader, SyncReader};
|
||||
|
||||
mod ansi;
|
||||
mod input;
|
||||
mod sys;
|
||||
|
||||
@ -423,3 +424,40 @@ impl TerminalInput {
|
||||
pub fn input() -> TerminalInput {
|
||||
TerminalInput::new()
|
||||
}
|
||||
|
||||
/// A command that enables mouse mode
|
||||
///
|
||||
pub struct EnableMouseCapture;
|
||||
|
||||
impl Command for EnableMouseCapture {
|
||||
type AnsiType = String;
|
||||
|
||||
fn ansi_code(&self) -> Self::AnsiType {
|
||||
ansi::enable_mouse_mode_csi_sequence()
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
fn execute_winapi(&self) -> Result<()> {
|
||||
input().enable_mouse_mode()
|
||||
}
|
||||
}
|
||||
|
||||
/// A command that disables mouse event monitoring.
|
||||
///
|
||||
/// Mouse events will be produced by the
|
||||
/// [`AsyncReader`](struct.AsyncReader.html)/[`SyncReader`](struct.SyncReader.html).
|
||||
///
|
||||
pub struct DisableMouseCapture;
|
||||
|
||||
impl Command for DisableMouseCapture {
|
||||
type AnsiType = String;
|
||||
|
||||
fn ansi_code(&self) -> Self::AnsiType {
|
||||
ansi::disable_mouse_mode_csi_sequence()
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
fn execute_winapi(&self) -> Result<()> {
|
||||
input().disable_mouse_mode()
|
||||
}
|
||||
}
|
||||
|
23
src/input/ansi.rs
Normal file
23
src/input/ansi.rs
Normal file
@ -0,0 +1,23 @@
|
||||
//! This module provides input related ANSI escape codes.
|
||||
|
||||
use crate::csi;
|
||||
|
||||
pub(crate) fn enable_mouse_mode_csi_sequence() -> String {
|
||||
format!(
|
||||
"{}h{}h{}h{}h",
|
||||
csi!("?1000"),
|
||||
csi!("?1002"),
|
||||
csi!("?1015"),
|
||||
csi!("?1006")
|
||||
)
|
||||
}
|
||||
|
||||
pub(crate) fn disable_mouse_mode_csi_sequence() -> String {
|
||||
format!(
|
||||
"{}l{}l{}l{}l",
|
||||
csi!("?1006"),
|
||||
csi!("?1015"),
|
||||
csi!("?1002"),
|
||||
csi!("?1000")
|
||||
)
|
||||
}
|
@ -4,10 +4,14 @@ use std::sync::mpsc::Receiver;
|
||||
use std::{char, sync::mpsc};
|
||||
|
||||
use crate::utils::Result;
|
||||
use crate::{csi, write_cout};
|
||||
use crate::write_cout;
|
||||
|
||||
use super::{
|
||||
super::{sys::unix::internal_event_receiver, InputEvent, InternalEvent, KeyEvent},
|
||||
super::{
|
||||
ansi::{disable_mouse_mode_csi_sequence, enable_mouse_mode_csi_sequence},
|
||||
sys::unix::internal_event_receiver,
|
||||
InputEvent, InternalEvent, KeyEvent,
|
||||
},
|
||||
Input,
|
||||
};
|
||||
|
||||
@ -50,24 +54,12 @@ impl Input for UnixInput {
|
||||
}
|
||||
|
||||
fn enable_mouse_mode(&self) -> Result<()> {
|
||||
write_cout!(&format!(
|
||||
"{}h{}h{}h{}h",
|
||||
csi!("?1000"),
|
||||
csi!("?1002"),
|
||||
csi!("?1015"),
|
||||
csi!("?1006")
|
||||
))?;
|
||||
write_cout!(enable_mouse_mode_csi_sequence())?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn disable_mouse_mode(&self) -> Result<()> {
|
||||
write_cout!(&format!(
|
||||
"{}l{}l{}l{}l",
|
||||
csi!("?1006"),
|
||||
csi!("?1015"),
|
||||
csi!("?1002"),
|
||||
csi!("?1000")
|
||||
))?;
|
||||
write_cout!(disable_mouse_mode_csi_sequence())?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
@ -169,7 +169,8 @@
|
||||
|
||||
#[cfg(feature = "input")]
|
||||
pub use input::{
|
||||
input, AsyncReader, InputEvent, KeyEvent, MouseButton, MouseEvent, SyncReader, TerminalInput,
|
||||
input, AsyncReader, DisableMouseCapture, EnableMouseCapture, InputEvent, KeyEvent, MouseButton,
|
||||
MouseEvent, SyncReader, TerminalInput,
|
||||
};
|
||||
#[cfg(feature = "screen")]
|
||||
pub use screen::{
|
||||
|
Loading…
Reference in New Issue
Block a user