mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-28 13:53:10 +00:00
Remove tparm0
Per code review, we think that tparm does nothing when there are no parameters, and it is safe to remove it, even though this is a break from C++. This simplifies some code.
This commit is contained in:
parent
a09947cd99
commit
51a971bf16
3 changed files with 24 additions and 40 deletions
|
@ -6,22 +6,13 @@ use super::shared::{
|
||||||
};
|
};
|
||||||
use crate::color::RgbColor;
|
use crate::color::RgbColor;
|
||||||
use crate::common::str2wcstring;
|
use crate::common::str2wcstring;
|
||||||
use crate::curses::{self, tparm0, Term};
|
use crate::curses::{self, Term};
|
||||||
use crate::ffi::parser_t;
|
use crate::ffi::parser_t;
|
||||||
use crate::output::{self, writembs_nofail, Outputter};
|
use crate::output::{self, writembs_nofail, Outputter};
|
||||||
use crate::wchar::{wstr, L};
|
use crate::wchar::{wstr, L};
|
||||||
use crate::wgetopt::{wgetopter_t, wopt, woption, woption_argument_t};
|
use crate::wgetopt::{wgetopter_t, wopt, woption, woption_argument_t};
|
||||||
use crate::wutil::wgettext_fmt;
|
use crate::wutil::wgettext_fmt;
|
||||||
use libc::c_int;
|
use libc::c_int;
|
||||||
use std::ffi::CString;
|
|
||||||
|
|
||||||
// Helper to make curses::tparm0 more convenient.
|
|
||||||
fn tparm(s: &Option<CString>) -> Option<CString> {
|
|
||||||
match s {
|
|
||||||
None => None,
|
|
||||||
Some(s) => tparm0(s),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn print_modifiers(
|
fn print_modifiers(
|
||||||
|
@ -45,7 +36,7 @@ fn print_modifiers(
|
||||||
..
|
..
|
||||||
} = term;
|
} = term;
|
||||||
if bold && enter_bold_mode.is_some() {
|
if bold && enter_bold_mode.is_some() {
|
||||||
writembs_nofail!(outp, tparm(enter_bold_mode));
|
writembs_nofail!(outp, enter_bold_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if underline && enter_underline_mode.is_some() {
|
if underline && enter_underline_mode.is_some() {
|
||||||
|
@ -66,7 +57,7 @@ fn print_modifiers(
|
||||||
writembs_nofail!(outp, enter_standout_mode);
|
writembs_nofail!(outp, enter_standout_mode);
|
||||||
}
|
}
|
||||||
if !bg.is_none() && bg.is_normal() {
|
if !bg.is_none() && bg.is_normal() {
|
||||||
writembs_nofail!(outp, tparm(exit_attribute_mode));
|
writembs_nofail!(outp, exit_attribute_mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +101,7 @@ fn print_colors(
|
||||||
// If we have a background, stop it after the color
|
// If we have a background, stop it after the color
|
||||||
// or it goes to the end of the line and looks ugly.
|
// or it goes to the end of the line and looks ugly.
|
||||||
if let Some(term) = term.as_ref() {
|
if let Some(term) = term.as_ref() {
|
||||||
writembs_nofail!(outp, tparm(&term.exit_attribute_mode));
|
writembs_nofail!(outp, &term.exit_attribute_mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
outp.writech('\n');
|
outp.writech('\n');
|
||||||
|
@ -241,18 +232,20 @@ pub fn set_color(
|
||||||
let Some(term) = curses::term() else {
|
let Some(term) = curses::term() else {
|
||||||
return STATUS_CMD_ERROR;
|
return STATUS_CMD_ERROR;
|
||||||
};
|
};
|
||||||
let Some(exit_attribute_mode) = term.exit_attribute_mode.as_ref() else {
|
let exit_attribute_mode = &term.exit_attribute_mode;
|
||||||
|
if exit_attribute_mode.is_none() {
|
||||||
return STATUS_CMD_ERROR;
|
return STATUS_CMD_ERROR;
|
||||||
};
|
}
|
||||||
|
|
||||||
let outp = &mut output::Outputter::new_buffering();
|
let outp = &mut output::Outputter::new_buffering();
|
||||||
print_modifiers(outp, &term, bold, underline, italics, dim, reverse, bg);
|
print_modifiers(outp, &term, bold, underline, italics, dim, reverse, bg);
|
||||||
if bgcolor.is_some() && bg.is_normal() {
|
if bgcolor.is_some() && bg.is_normal() {
|
||||||
writembs_nofail!(outp, tparm0(exit_attribute_mode));
|
writembs_nofail!(outp, exit_attribute_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if !fg.is_none() {
|
if !fg.is_none() {
|
||||||
if fg.is_normal() || fg.is_reset() {
|
if fg.is_normal() || fg.is_reset() {
|
||||||
writembs_nofail!(outp, tparm0(exit_attribute_mode));
|
writembs_nofail!(outp, exit_attribute_mode);
|
||||||
} else if !outp.write_color(fg, true /* is_fg */) {
|
} else if !outp.write_color(fg, true /* is_fg */) {
|
||||||
// We need to do *something* or the lack of any output messes up
|
// We need to do *something* or the lack of any output messes up
|
||||||
// when the cartesian product here would make "foo" disappear:
|
// when the cartesian product here would make "foo" disappear:
|
||||||
|
|
|
@ -319,18 +319,6 @@ impl FlagCap {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Covers over tparm().
|
/// Covers over tparm().
|
||||||
pub fn tparm0(cap: &CStr) -> Option<CString> {
|
|
||||||
// Take the lock because tparm races with del_curterm, etc.
|
|
||||||
let _term = TERM.lock().unwrap();
|
|
||||||
let cap_ptr = cap.as_ptr() as *mut libc::c_char;
|
|
||||||
// Safety: we're trusting tparm here.
|
|
||||||
unsafe {
|
|
||||||
// Check for non-null and non-empty string.
|
|
||||||
assert!(!cap_ptr.is_null() && cap_ptr.read() != 0);
|
|
||||||
try_ptr_to_cstr(tparm(cap_ptr))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn tparm1(cap: &CStr, param1: i32) -> Option<CString> {
|
pub fn tparm1(cap: &CStr, param1: i32) -> Option<CString> {
|
||||||
// Take the lock because tparm races with del_curterm, etc.
|
// Take the lock because tparm races with del_curterm, etc.
|
||||||
let _term: std::sync::MutexGuard<Option<Arc<Term>>> = TERM.lock().unwrap();
|
let _term: std::sync::MutexGuard<Option<Arc<Term>>> = TERM.lock().unwrap();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Generic output functions.
|
// Generic output functions.
|
||||||
use crate::color::RgbColor;
|
use crate::color::RgbColor;
|
||||||
use crate::common::{self, assert_is_locked, wcs2string_appending};
|
use crate::common::{self, assert_is_locked, wcs2string_appending};
|
||||||
use crate::curses::{self, tparm0, tparm1, Term};
|
use crate::curses::{self, tparm1, Term};
|
||||||
use crate::env::EnvVar;
|
use crate::env::EnvVar;
|
||||||
use crate::flog::FLOG;
|
use crate::flog::FLOG;
|
||||||
use crate::wchar::{wstr, WString, L};
|
use crate::wchar::{wstr, WString, L};
|
||||||
|
@ -131,6 +131,11 @@ fn write_color_escape(
|
||||||
/// Helper to allow more convenient usage of Option<CString>.
|
/// Helper to allow more convenient usage of Option<CString>.
|
||||||
/// This is similar to C++ checks like `set_a_foreground && set_a_foreground[0]`
|
/// This is similar to C++ checks like `set_a_foreground && set_a_foreground[0]`
|
||||||
trait CStringIsSomeNonempty {
|
trait CStringIsSomeNonempty {
|
||||||
|
/// Returns whether this string is Some and non-empty.
|
||||||
|
fn is_nonempty(&self) -> bool {
|
||||||
|
self.if_nonempty().is_some()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns Some if we contain a non-empty CString.
|
/// Returns Some if we contain a non-empty CString.
|
||||||
fn if_nonempty(&self) -> Option<&CString>;
|
fn if_nonempty(&self) -> Option<&CString>;
|
||||||
}
|
}
|
||||||
|
@ -336,7 +341,7 @@ impl Outputter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if term.enter_bold_mode.if_nonempty().is_some() {
|
if term.enter_bold_mode.is_nonempty() {
|
||||||
if bg_set && !last_bg_set {
|
if bg_set && !last_bg_set {
|
||||||
// Background color changed and is set, so we enter bold mode to make reading easier.
|
// Background color changed and is set, so we enter bold mode to make reading easier.
|
||||||
// This means bold mode is _always_ on when the background color is set.
|
// This means bold mode is _always_ on when the background color is set.
|
||||||
|
@ -383,10 +388,8 @@ impl Outputter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lastly, we set bold, underline, italics, dim, and reverse modes correctly.
|
// Lastly, we set bold, underline, italics, dim, and reverse modes correctly.
|
||||||
let enter_bold_mode = term.enter_bold_mode.if_nonempty();
|
if is_bold && !self.was_bold && term.enter_bold_mode.is_nonempty() && !bg_set {
|
||||||
if is_bold && !self.was_bold && enter_bold_mode.is_some() && !bg_set {
|
writembs_nofail!(self, &term.enter_bold_mode);
|
||||||
// TODO: rationalize why only this one has the tparm0 call.
|
|
||||||
writembs_nofail!(self, tparm0(enter_bold_mode.unwrap()));
|
|
||||||
self.was_bold = is_bold;
|
self.was_bold = is_bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,16 +401,16 @@ impl Outputter {
|
||||||
}
|
}
|
||||||
self.was_underline = is_underline;
|
self.was_underline = is_underline;
|
||||||
|
|
||||||
if self.was_italics && !is_italics && term.exit_italics_mode.if_nonempty().is_some() {
|
if self.was_italics && !is_italics && term.exit_italics_mode.is_nonempty() {
|
||||||
writembs_nofail!(self, &term.exit_italics_mode);
|
writembs_nofail!(self, &term.exit_italics_mode);
|
||||||
self.was_italics = is_italics;
|
self.was_italics = is_italics;
|
||||||
}
|
}
|
||||||
if !self.was_italics && is_italics && term.enter_italics_mode.if_nonempty().is_some() {
|
if !self.was_italics && is_italics && term.enter_italics_mode.is_nonempty() {
|
||||||
writembs_nofail!(self, &term.enter_italics_mode);
|
writembs_nofail!(self, &term.enter_italics_mode);
|
||||||
self.was_italics = is_italics;
|
self.was_italics = is_italics;
|
||||||
}
|
}
|
||||||
|
|
||||||
if is_dim && !self.was_dim && term.enter_dim_mode.if_nonempty().is_some() {
|
if is_dim && !self.was_dim && term.enter_dim_mode.is_nonempty() {
|
||||||
writembs_nofail!(self, &term.enter_dim_mode);
|
writembs_nofail!(self, &term.enter_dim_mode);
|
||||||
self.was_dim = is_dim;
|
self.was_dim = is_dim;
|
||||||
}
|
}
|
||||||
|
@ -415,10 +418,10 @@ impl Outputter {
|
||||||
|
|
||||||
if is_reverse && !self.was_reverse {
|
if is_reverse && !self.was_reverse {
|
||||||
// Some terms do not have a reverse mode set, so standout mode is a fallback.
|
// Some terms do not have a reverse mode set, so standout mode is a fallback.
|
||||||
if term.enter_reverse_mode.if_nonempty().is_some() {
|
if term.enter_reverse_mode.is_nonempty() {
|
||||||
writembs_nofail!(self, &term.enter_reverse_mode);
|
writembs_nofail!(self, &term.enter_reverse_mode);
|
||||||
self.was_reverse = is_reverse;
|
self.was_reverse = is_reverse;
|
||||||
} else if term.enter_standout_mode.if_nonempty().is_some() {
|
} else if term.enter_standout_mode.is_nonempty() {
|
||||||
writembs_nofail!(self, &term.enter_standout_mode);
|
writembs_nofail!(self, &term.enter_standout_mode);
|
||||||
self.was_reverse = is_reverse;
|
self.was_reverse = is_reverse;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue