mirror of
https://github.com/fish-shell/fish-shell
synced 2024-11-10 15:14:44 +00:00
Port shell_modes
The C++ one is still there but it's only used in dead code.
This commit is contained in:
parent
6a64ba6638
commit
c758765503
6 changed files with 26 additions and 33 deletions
|
@ -30,7 +30,7 @@ use std::ops::{Deref, DerefMut};
|
|||
use std::os::unix::prelude::*;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::sync::atomic::{AtomicI32, AtomicU32, Ordering};
|
||||
use std::sync::{Arc, Mutex, TryLockError};
|
||||
use std::sync::{Arc, Mutex, MutexGuard, TryLockError};
|
||||
use std::time;
|
||||
|
||||
// Highest legal ASCII value.
|
||||
|
@ -1011,14 +1011,8 @@ pub fn exit_without_destructors(code: libc::c_int) -> ! {
|
|||
unsafe { libc::_exit(code) };
|
||||
}
|
||||
|
||||
pub fn shell_modes() -> &'static libc::termios {
|
||||
let modes = crate::ffi::shell_modes_ffi() as *const libc::termios;
|
||||
unsafe { &*modes }
|
||||
}
|
||||
|
||||
pub fn shell_modes_mut() -> &'static mut libc::termios {
|
||||
let modes = crate::ffi::shell_modes_ffi() as *mut libc::termios;
|
||||
unsafe { &mut *modes }
|
||||
pub fn shell_modes() -> MutexGuard<'static, libc::termios> {
|
||||
crate::reader::SHELL_MODES.lock().unwrap()
|
||||
}
|
||||
|
||||
/// The character to use where the text has been truncated. Is an ellipsis on unicode system and a $
|
||||
|
|
|
@ -46,8 +46,6 @@ include_cpp! {
|
|||
generate!("flog_setlinebuf_ffi")
|
||||
generate!("activate_flog_categories_by_pattern")
|
||||
|
||||
generate!("shell_modes_ffi")
|
||||
|
||||
generate!("log_extra_to_flog_file")
|
||||
|
||||
generate!("wgettext_ptr")
|
||||
|
|
|
@ -44,13 +44,14 @@ fn should_exit(recent_chars: &mut Vec<u8>, c: char) -> bool {
|
|||
recent_chars.push(c);
|
||||
|
||||
for evt in [VINTR, VEOF] {
|
||||
if c == shell_modes().c_cc[evt] {
|
||||
if recent_chars.iter().rev().nth(1) == Some(&shell_modes().c_cc[evt]) {
|
||||
let modes = shell_modes();
|
||||
if c == modes.c_cc[evt] {
|
||||
if recent_chars.iter().rev().nth(1) == Some(&modes.c_cc[evt]) {
|
||||
return true;
|
||||
}
|
||||
eprintf!(
|
||||
"Press [ctrl-%c] again to exit\n",
|
||||
char::from(shell_modes().c_cc[evt] + 0x40)
|
||||
char::from(modes.c_cc[evt] + 0x40)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
@ -286,15 +287,16 @@ fn setup_and_process_keys(continuous_mode: bool, verbose: bool) -> ! {
|
|||
signal_set_handlers(true);
|
||||
// We need to set the shell-modes for ICRNL,
|
||||
// in fish-proper this is done once a command is run.
|
||||
unsafe { libc::tcsetattr(STDIN_FILENO, TCSANOW, shell_modes()) };
|
||||
unsafe { libc::tcsetattr(STDIN_FILENO, TCSANOW, &*shell_modes()) };
|
||||
|
||||
if continuous_mode {
|
||||
eprintf!("\n");
|
||||
eprintf!("To terminate this program type \"exit\" or \"quit\" in this window,\n");
|
||||
let modes = shell_modes();
|
||||
eprintf!(
|
||||
"or press [ctrl-%c] or [ctrl-%c] twice in a row.\n",
|
||||
char::from(shell_modes().c_cc[VINTR] + 0x40),
|
||||
char::from(shell_modes().c_cc[VEOF] + 0x40)
|
||||
char::from(modes.c_cc[VINTR] + 0x40),
|
||||
char::from(modes.c_cc[VEOF] + 0x40)
|
||||
);
|
||||
eprintf!("\n");
|
||||
}
|
||||
|
|
|
@ -39,8 +39,8 @@ use crate::color::RgbColor;
|
|||
use crate::common::{
|
||||
escape, escape_string, exit_without_destructors, fish_reserved_codepoint, get_ellipsis_char,
|
||||
get_obfuscation_read_char, redirect_tty_output, scoped_push_replacer, scoped_push_replacer_ctx,
|
||||
shell_modes, shell_modes_mut, str2wcstring, wcs2string, write_loop, EscapeFlags,
|
||||
EscapeStringStyle, ScopeGuard, PROGRAM_NAME, UTF8_BOM_WCHAR,
|
||||
shell_modes, str2wcstring, wcs2string, write_loop, EscapeFlags, EscapeStringStyle, ScopeGuard,
|
||||
PROGRAM_NAME, UTF8_BOM_WCHAR,
|
||||
};
|
||||
use crate::compat::MB_CUR_MAX;
|
||||
use crate::complete::{
|
||||
|
@ -126,6 +126,9 @@ enum ExitState {
|
|||
|
||||
static EXIT_STATE: AtomicU8 = AtomicU8::new(ExitState::None as u8);
|
||||
|
||||
pub static SHELL_MODES: Lazy<Mutex<libc::termios>> =
|
||||
Lazy::new(|| Mutex::new(unsafe { std::mem::zeroed() }));
|
||||
|
||||
/// Mode on startup, which we restore on exit.
|
||||
static TERMINAL_MODE_ON_STARTUP: Lazy<Mutex<libc::termios>> =
|
||||
Lazy::new(|| Mutex::new(unsafe { std::mem::zeroed() }));
|
||||
|
@ -756,9 +759,9 @@ pub fn reader_init() {
|
|||
tty_modes_for_external_cmds.c_iflag &= !IXOFF;
|
||||
|
||||
// Set the mode used for the terminal, initialized to the current mode.
|
||||
*shell_modes_mut() = *tty_modes_for_external_cmds;
|
||||
*shell_modes() = *tty_modes_for_external_cmds;
|
||||
|
||||
term_fix_modes(shell_modes_mut());
|
||||
term_fix_modes(&mut shell_modes());
|
||||
|
||||
drop(terminal_mode_on_startup);
|
||||
drop(tty_modes_for_external_cmds);
|
||||
|
@ -1695,7 +1698,7 @@ impl ReaderData {
|
|||
}
|
||||
|
||||
// Set the new modes.
|
||||
if unsafe { libc::tcsetattr(zelf.conf.inputfd, TCSANOW, shell_modes()) } == -1 {
|
||||
if unsafe { libc::tcsetattr(zelf.conf.inputfd, TCSANOW, &*shell_modes()) } == -1 {
|
||||
let err = errno().0;
|
||||
if err == EIO {
|
||||
redirect_tty_output();
|
||||
|
@ -1926,7 +1929,7 @@ impl ReaderData {
|
|||
// tty alone, run the commands in shell mode, and then restore shell modes.
|
||||
let mut res;
|
||||
loop {
|
||||
res = unsafe { libc::tcsetattr(STDIN_FILENO, TCSANOW, shell_modes_mut()) };
|
||||
res = unsafe { libc::tcsetattr(STDIN_FILENO, TCSANOW, &*shell_modes()) };
|
||||
if res >= 0 || errno().0 != EINTR {
|
||||
break;
|
||||
}
|
||||
|
@ -3323,21 +3326,21 @@ pub fn term_copy_modes() {
|
|||
|
||||
// Copy flow control settings to shell modes.
|
||||
if (tty_modes_for_external_cmds.c_iflag & IXON) != 0 {
|
||||
shell_modes_mut().c_iflag |= IXON;
|
||||
shell_modes().c_iflag |= IXON;
|
||||
} else {
|
||||
shell_modes_mut().c_iflag &= !IXON;
|
||||
shell_modes().c_iflag &= !IXON;
|
||||
}
|
||||
if (tty_modes_for_external_cmds.c_iflag & IXOFF) != 0 {
|
||||
shell_modes_mut().c_iflag |= IXOFF;
|
||||
shell_modes().c_iflag |= IXOFF;
|
||||
} else {
|
||||
shell_modes_mut().c_iflag &= !IXOFF;
|
||||
shell_modes().c_iflag &= !IXOFF;
|
||||
}
|
||||
}
|
||||
|
||||
/// Grab control of terminal.
|
||||
fn term_steal() {
|
||||
term_copy_modes();
|
||||
while unsafe { libc::tcsetattr(STDIN_FILENO, TCSANOW, shell_modes()) } == -1 {
|
||||
while unsafe { libc::tcsetattr(STDIN_FILENO, TCSANOW, &*shell_modes()) } == -1 {
|
||||
if errno().0 == EIO {
|
||||
redirect_tty_output();
|
||||
}
|
||||
|
@ -3484,7 +3487,7 @@ fn reader_interactive_init(parser: &Parser) {
|
|||
}
|
||||
|
||||
// Configure terminal attributes
|
||||
if unsafe { libc::tcsetattr(STDIN_FILENO, TCSANOW, shell_modes_mut()) } == -1 {
|
||||
if unsafe { libc::tcsetattr(STDIN_FILENO, TCSANOW, &*shell_modes()) } == -1 {
|
||||
if errno().0 == EIO {
|
||||
redirect_tty_output();
|
||||
}
|
||||
|
|
|
@ -58,8 +58,6 @@
|
|||
|
||||
struct termios shell_modes;
|
||||
|
||||
struct termios *shell_modes_ffi() { return &shell_modes; }
|
||||
|
||||
const wcstring g_empty_string{};
|
||||
const std::vector<wcstring> g_empty_string_list{};
|
||||
|
||||
|
|
|
@ -652,6 +652,4 @@ __attribute__((always_inline)) bool inline iswdigit(const wchar_t c) {
|
|||
#include "common.rs.h"
|
||||
#endif
|
||||
|
||||
struct termios *shell_modes_ffi();
|
||||
|
||||
#endif // FISH_COMMON_H
|
||||
|
|
Loading…
Reference in a new issue