mirror of
https://github.com/fish-shell/fish-shell.git
synced 2025-02-23 00:26:23 +08:00
Port env_dispatch dependencies to rust
Either add rust wrappers for C++ functions called via ffi or port some pure code from C++ to rust to provide support for the upcoming `env_dispatch` rewrite.
This commit is contained in:
parent
8a549cbb15
commit
c409b1a89c
@ -44,12 +44,14 @@ mod locale;
|
|||||||
mod nix;
|
mod nix;
|
||||||
mod null_terminated_array;
|
mod null_terminated_array;
|
||||||
mod operation_context;
|
mod operation_context;
|
||||||
|
mod output;
|
||||||
mod parse_constants;
|
mod parse_constants;
|
||||||
mod parse_tree;
|
mod parse_tree;
|
||||||
mod parse_util;
|
mod parse_util;
|
||||||
mod parser_keywords;
|
mod parser_keywords;
|
||||||
mod path;
|
mod path;
|
||||||
mod re;
|
mod re;
|
||||||
|
mod reader;
|
||||||
mod redirection;
|
mod redirection;
|
||||||
mod signal;
|
mod signal;
|
||||||
mod smoke;
|
mod smoke;
|
||||||
|
19
fish-rust/src/output.rs
Normal file
19
fish-rust/src/output.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
use bitflags::bitflags;
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
pub struct ColorSupport: u8 {
|
||||||
|
const NONE = 0;
|
||||||
|
const TERM_256COLOR = 1<<0;
|
||||||
|
const TERM_24BIT = 1<<1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn output_set_color_support(value: ColorSupport) {
|
||||||
|
extern "C" {
|
||||||
|
pub fn output_set_color_support(value: libc::c_int);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
output_set_color_support(value.bits() as i32);
|
||||||
|
}
|
||||||
|
}
|
15
fish-rust/src/reader.rs
Normal file
15
fish-rust/src/reader.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
use crate::env::Environment;
|
||||||
|
use crate::wchar::L;
|
||||||
|
|
||||||
|
#[repr(u8)]
|
||||||
|
pub enum CursorSelectionMode {
|
||||||
|
Exclusive = 0,
|
||||||
|
Inclusive = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn check_autosuggestion_enabled(vars: &dyn Environment) -> bool {
|
||||||
|
vars.get(L!("fish_autosuggestion_enabled"))
|
||||||
|
.map(|v| v.as_string())
|
||||||
|
.map(|v| v != L!("0"))
|
||||||
|
.unwrap_or(true)
|
||||||
|
}
|
@ -41,9 +41,10 @@ static bool term_supports_color_natively(unsigned int c) {
|
|||||||
return static_cast<unsigned>(max_colors) >= c + 1;
|
return static_cast<unsigned>(max_colors) >= c + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
color_support_t output_get_color_support() { return color_support; }
|
extern "C" {
|
||||||
|
void output_set_color_support(color_support_t val) { color_support = val; }
|
||||||
void output_set_color_support(color_support_t val) { color_support = val; }
|
color_support_t output_get_color_support() { return color_support; }
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char index_for_color(rgb_color_t c) {
|
unsigned char index_for_color(rgb_color_t c) {
|
||||||
if (c.is_named() || !(output_get_color_support() & color_support_term256)) {
|
if (c.is_named() || !(output_get_color_support() & color_support_term256)) {
|
||||||
|
@ -127,8 +127,10 @@ rgb_color_t parse_color(const env_var_t &var, bool is_background);
|
|||||||
/// Sets what colors are supported.
|
/// Sets what colors are supported.
|
||||||
enum { color_support_term256 = 1 << 0, color_support_term24bit = 1 << 1 };
|
enum { color_support_term256 = 1 << 0, color_support_term24bit = 1 << 1 };
|
||||||
using color_support_t = unsigned int;
|
using color_support_t = unsigned int;
|
||||||
color_support_t output_get_color_support();
|
extern "C" {
|
||||||
void output_set_color_support(color_support_t val);
|
color_support_t output_get_color_support();
|
||||||
|
void output_set_color_support(color_support_t val);
|
||||||
|
}
|
||||||
|
|
||||||
rgb_color_t best_color(const std::vector<rgb_color_t> &candidates, color_support_t support);
|
rgb_color_t best_color(const std::vector<rgb_color_t> &candidates, color_support_t support);
|
||||||
|
|
||||||
|
@ -2922,6 +2922,10 @@ void reader_change_cursor_selection_mode(cursor_selection_mode_t selection_mode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reader_change_cursor_selection_mode(uint8_t selection_mode) {
|
||||||
|
reader_change_cursor_selection_mode((cursor_selection_mode_t) selection_mode);
|
||||||
|
}
|
||||||
|
|
||||||
static bool check_autosuggestion_enabled(const env_stack_t &vars) {
|
static bool check_autosuggestion_enabled(const env_stack_t &vars) {
|
||||||
if (auto val = vars.get(L"fish_autosuggestion_enabled")) {
|
if (auto val = vars.get(L"fish_autosuggestion_enabled")) {
|
||||||
return val->as_string() != L"0";
|
return val->as_string() != L"0";
|
||||||
@ -2942,6 +2946,18 @@ void reader_set_autosuggestion_enabled(const env_stack_t &vars) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reader_set_autosuggestion_enabled_ffi(bool enable) {
|
||||||
|
// We don't need to _change_ if we're not initialized yet.
|
||||||
|
reader_data_t *data = current_data_or_null();
|
||||||
|
if (data) {
|
||||||
|
if (data->conf.autosuggest_ok != enable) {
|
||||||
|
data->conf.autosuggest_ok = enable;
|
||||||
|
data->force_exec_prompt_and_repaint = true;
|
||||||
|
data->inputter.queue_char(readline_cmd_t::repaint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Add a new reader to the reader stack.
|
/// Add a new reader to the reader stack.
|
||||||
/// \return a shared pointer to it.
|
/// \return a shared pointer to it.
|
||||||
static std::shared_ptr<reader_data_t> reader_push_ret(parser_t &parser,
|
static std::shared_ptr<reader_data_t> reader_push_ret(parser_t &parser,
|
||||||
|
@ -168,11 +168,17 @@ enum class cursor_selection_mode_t : uint8_t {
|
|||||||
inclusive,
|
inclusive,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if INCLUDE_RUST_HEADERS
|
||||||
void reader_change_cursor_selection_mode(cursor_selection_mode_t selection_mode);
|
void reader_change_cursor_selection_mode(cursor_selection_mode_t selection_mode);
|
||||||
|
#else
|
||||||
|
void reader_change_cursor_selection_mode(uint8_t selection_mode);
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Enable or disable autosuggestions based on the associated variable.
|
/// Enable or disable autosuggestions based on the associated variable.
|
||||||
void reader_set_autosuggestion_enabled(const env_stack_t &vars);
|
void reader_set_autosuggestion_enabled(const env_stack_t &vars);
|
||||||
|
|
||||||
|
void reader_set_autosuggestion_enabled_ffi(bool);
|
||||||
|
|
||||||
/// Write the title to the titlebar. This function is called just before a new application starts
|
/// Write the title to the titlebar. This function is called just before a new application starts
|
||||||
/// executing and just after it finishes.
|
/// executing and just after it finishes.
|
||||||
///
|
///
|
||||||
|
@ -63,6 +63,10 @@ class scoped_buffer_t : noncopyable_t, nonmovable_t {
|
|||||||
// Note this is deliberately exported so that init_curses can clear it.
|
// Note this is deliberately exported so that init_curses can clear it.
|
||||||
layout_cache_t layout_cache_t::shared;
|
layout_cache_t layout_cache_t::shared;
|
||||||
|
|
||||||
|
void screen_clear_layout_cache_ffi() {
|
||||||
|
layout_cache_t::shared.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/// Tests if the specified narrow character sequence is present at the specified position of the
|
/// Tests if the specified narrow character sequence is present at the specified position of the
|
||||||
/// specified wide character string. All of \c seq must match, but str may be longer than seq.
|
/// specified wide character string. All of \c seq must match, but str may be longer than seq.
|
||||||
static size_t try_sequence(const char *seq, const wchar_t *str) {
|
static size_t try_sequence(const char *seq, const wchar_t *str) {
|
||||||
|
@ -244,6 +244,8 @@ class screen_t {
|
|||||||
/// Issues an immediate clr_eos.
|
/// Issues an immediate clr_eos.
|
||||||
void screen_force_clear_to_end();
|
void screen_force_clear_to_end();
|
||||||
|
|
||||||
|
void screen_clear_layout_cache_ffi();
|
||||||
|
|
||||||
// Information about the layout of a prompt.
|
// Information about the layout of a prompt.
|
||||||
struct prompt_layout_t {
|
struct prompt_layout_t {
|
||||||
std::vector<size_t> line_breaks; // line breaks when rendering the prompt
|
std::vector<size_t> line_breaks; // line breaks when rendering the prompt
|
||||||
|
Loading…
x
Reference in New Issue
Block a user