Skip to content

Commit

Permalink
improve windows raw mode
Browse files Browse the repository at this point in the history
  • Loading branch information
Atrox committed Aug 27, 2023
1 parent 08762b3 commit 85d00f0
Showing 1 changed file with 20 additions and 10 deletions.
30 changes: 20 additions & 10 deletions src/terminal/sys/windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,28 @@ use std::fmt::{self, Write};
use std::io::{self};

use crossterm_winapi::{Console, ConsoleMode, Coord, Handle, ScreenBuffer, Size};
use winapi::{
shared::minwindef::DWORD,
um::wincon::{SetConsoleTitleW, ENABLE_ECHO_INPUT, ENABLE_LINE_INPUT, ENABLE_PROCESSED_INPUT},
use winapi::shared::minwindef::DWORD;
use winapi::um::wincon::{
SetConsoleTitleW, ENABLE_ECHO_INPUT, ENABLE_EXTENDED_FLAGS, ENABLE_INSERT_MODE,
ENABLE_LINE_INPUT, ENABLE_MOUSE_INPUT, ENABLE_PROCESSED_INPUT, ENABLE_QUICK_EDIT_MODE,
ENABLE_VIRTUAL_TERMINAL_INPUT, ENABLE_WINDOW_INPUT,
};

use crate::{
cursor,
terminal::{ClearType, WindowSize},
};
use crate::cursor;
use crate::terminal::{ClearType, WindowSize};

/// bits which must be set in raw mode
const RAW_MODE_MASK: DWORD = ENABLE_EXTENDED_FLAGS
| ENABLE_INSERT_MODE
| ENABLE_QUICK_EDIT_MODE
| ENABLE_VIRTUAL_TERMINAL_INPUT;

/// bits which can't be set in raw mode
const NOT_RAW_MODE_MASK: DWORD = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT;
const NOT_RAW_MODE_MASK: DWORD = ENABLE_LINE_INPUT
| ENABLE_ECHO_INPUT
| ENABLE_MOUSE_INPUT
| ENABLE_WINDOW_INPUT
| ENABLE_PROCESSED_INPUT;

pub(crate) fn is_raw_mode_enabled() -> std::io::Result<bool> {
let console_mode = ConsoleMode::from(Handle::current_in_handle()?);
Expand All @@ -33,7 +43,7 @@ pub(crate) fn enable_raw_mode() -> std::io::Result<()> {

let dw_mode = console_mode.mode()?;

let new_mode = dw_mode & !NOT_RAW_MODE_MASK;
let new_mode = dw_mode & !NOT_RAW_MODE_MASK | RAW_MODE_MASK;

console_mode.set_mode(new_mode)?;

Expand All @@ -45,7 +55,7 @@ pub(crate) fn disable_raw_mode() -> std::io::Result<()> {

let dw_mode = console_mode.mode()?;

let new_mode = dw_mode | NOT_RAW_MODE_MASK;
let new_mode = dw_mode & !RAW_MODE_MASK | NOT_RAW_MODE_MASK;

console_mode.set_mode(new_mode)?;

Expand Down

0 comments on commit 85d00f0

Please sign in to comment.