mirror of https://github.com/helix-editor/helix
working terminal library
parent
a92f14709b
commit
ab62d83800
File diff suppressed because it is too large
Load Diff
|
@ -3,13 +3,13 @@ use std::{collections::HashMap, sync::Arc};
|
||||||
use helix_core::Position;
|
use helix_core::Position;
|
||||||
use helix_view::{
|
use helix_view::{
|
||||||
graphics::{Color, CursorKind, Rect, UnderlineStyle},
|
graphics::{Color, CursorKind, Rect, UnderlineStyle},
|
||||||
input::{Event, KeyEvent, MouseEvent},
|
input::{Event, KeyEvent, MouseButton, MouseEvent},
|
||||||
keyboard::{KeyCode, KeyModifiers},
|
keyboard::{KeyCode, KeyModifiers},
|
||||||
theme::Style,
|
theme::Style,
|
||||||
Editor,
|
Editor,
|
||||||
};
|
};
|
||||||
use steel::{
|
use steel::{
|
||||||
rvals::{Custom, FromSteelVal, IntoSteelVal, SteelString},
|
rvals::{as_underlying_type, Custom, FromSteelVal, IntoSteelVal, SteelString},
|
||||||
steel_vm::{builtin::BuiltInModule, engine::Engine, register_fn::RegisterFn},
|
steel_vm::{builtin::BuiltInModule, engine::Engine, register_fn::RegisterFn},
|
||||||
SteelVal,
|
SteelVal,
|
||||||
};
|
};
|
||||||
|
@ -300,24 +300,40 @@ pub fn helix_component_module() -> BuiltInModule {
|
||||||
matches!(event, Event::Mouse(_))
|
matches!(event, Event::Mouse(_))
|
||||||
})
|
})
|
||||||
.register_fn("event-mouse-kind", |event: Event| {
|
.register_fn("event-mouse-kind", |event: Event| {
|
||||||
if let Event::Mouse(MouseEvent { .. }) = event {
|
if let Event::Mouse(MouseEvent { kind, .. }) = event {
|
||||||
todo!()
|
match kind {
|
||||||
|
helix_view::input::MouseEventKind::Down(MouseButton::Left) => 0,
|
||||||
|
helix_view::input::MouseEventKind::Down(MouseButton::Right) => 1,
|
||||||
|
helix_view::input::MouseEventKind::Down(MouseButton::Middle) => 2,
|
||||||
|
helix_view::input::MouseEventKind::Up(MouseButton::Left) => 3,
|
||||||
|
helix_view::input::MouseEventKind::Up(MouseButton::Right) => 4,
|
||||||
|
helix_view::input::MouseEventKind::Up(MouseButton::Middle) => 5,
|
||||||
|
helix_view::input::MouseEventKind::Drag(MouseButton::Left) => 6,
|
||||||
|
helix_view::input::MouseEventKind::Drag(MouseButton::Right) => 7,
|
||||||
|
helix_view::input::MouseEventKind::Drag(MouseButton::Middle) => 8,
|
||||||
|
helix_view::input::MouseEventKind::Moved => 9,
|
||||||
|
helix_view::input::MouseEventKind::ScrollDown => 10,
|
||||||
|
helix_view::input::MouseEventKind::ScrollUp => 11,
|
||||||
|
helix_view::input::MouseEventKind::ScrollLeft => 12,
|
||||||
|
helix_view::input::MouseEventKind::ScrollRight => 13,
|
||||||
|
}
|
||||||
|
.into_steelval()
|
||||||
} else {
|
} else {
|
||||||
todo!()
|
false.into_steelval()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.register_fn("event-mouse-row", |event: Event| {
|
.register_fn("event-mouse-row", |event: Event| {
|
||||||
if let Event::Mouse(MouseEvent { .. }) = event {
|
if let Event::Mouse(MouseEvent { row, .. }) = event {
|
||||||
todo!()
|
row.into_steelval()
|
||||||
} else {
|
} else {
|
||||||
todo!()
|
false.into_steelval()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.register_fn("event-mouse-col", |event: Event| {
|
.register_fn("event-mouse-col", |event: Event| {
|
||||||
if let Event::Mouse(MouseEvent { .. }) = event {
|
if let Event::Mouse(MouseEvent { column, .. }) = event {
|
||||||
todo!()
|
column.into_steelval()
|
||||||
} else {
|
} else {
|
||||||
todo!()
|
false.into_steelval()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// Is this mouse event within the area provided
|
// Is this mouse event within the area provided
|
||||||
|
@ -377,14 +393,44 @@ pub fn helix_component_module() -> BuiltInModule {
|
||||||
module
|
module
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fn buffer_set_string(
|
||||||
|
// buffer: &mut tui::buffer::Buffer,
|
||||||
|
// x: u16,
|
||||||
|
// y: u16,
|
||||||
|
// string: steel::rvals::SteelString,
|
||||||
|
// style: Style,
|
||||||
|
// ) {
|
||||||
|
// buffer.set_string(x, y, string.as_str(), style)
|
||||||
|
// }
|
||||||
|
|
||||||
fn buffer_set_string(
|
fn buffer_set_string(
|
||||||
buffer: &mut tui::buffer::Buffer,
|
buffer: &mut tui::buffer::Buffer,
|
||||||
x: u16,
|
x: u16,
|
||||||
y: u16,
|
y: u16,
|
||||||
string: steel::rvals::SteelString,
|
string: SteelVal,
|
||||||
style: Style,
|
style: Style,
|
||||||
) {
|
) -> steel::rvals::Result<()> {
|
||||||
buffer.set_string(x, y, string.as_str(), style)
|
match string {
|
||||||
|
SteelVal::StringV(string) => {
|
||||||
|
buffer.set_string(x, y, string.as_str(), style);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
SteelVal::Custom(c) => {
|
||||||
|
if let Some(string) =
|
||||||
|
as_underlying_type::<steel::steel_vm::ffi::MutableString>(c.borrow().as_ref())
|
||||||
|
{
|
||||||
|
buffer.set_string(x, y, string.string.as_str(), style);
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
steel::stop!(TypeMismatch => "buffer-set-string! expected a string")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
steel::stop!(TypeMismatch => "buffer-set-string! expected a string")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// buffer.set_string(x, y, string.as_str(), style)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A dynamic component, used for rendering
|
/// A dynamic component, used for rendering
|
||||||
|
@ -579,10 +625,10 @@ impl Component for SteelDynamicComponent {
|
||||||
},
|
},
|
||||||
)));
|
)));
|
||||||
|
|
||||||
let event = match event {
|
// let event = match event {
|
||||||
Event::Key(event) => *event,
|
// Event::Key(event) => *event,
|
||||||
_ => return compositor::EventResult::Ignored(None),
|
// _ => return compositor::EventResult::Ignored(None),
|
||||||
};
|
// };
|
||||||
|
|
||||||
match ENGINE.with(|x| {
|
match ENGINE.with(|x| {
|
||||||
x.borrow_mut()
|
x.borrow_mut()
|
||||||
|
@ -602,7 +648,7 @@ impl Component for SteelDynamicComponent {
|
||||||
Ok(SteelEventResult::Consumed) => compositor::EventResult::Consumed(None),
|
Ok(SteelEventResult::Consumed) => compositor::EventResult::Consumed(None),
|
||||||
Ok(SteelEventResult::Ignored) => compositor::EventResult::Ignored(None),
|
Ok(SteelEventResult::Ignored) => compositor::EventResult::Ignored(None),
|
||||||
_ => match event {
|
_ => match event {
|
||||||
ctrl!('c') | key!(Esc) => close_fn,
|
// ctrl!('c') | key!(Esc) => close_fn,
|
||||||
_ => compositor::EventResult::Ignored(None),
|
_ => compositor::EventResult::Ignored(None),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -653,9 +699,9 @@ impl Component for SteelDynamicComponent {
|
||||||
// Pass the `state` object through - this can be used for storing the state of whatever plugin thing we're
|
// Pass the `state` object through - this can be used for storing the state of whatever plugin thing we're
|
||||||
// attempting to render
|
// attempting to render
|
||||||
let thunk = |engine: &mut Engine| {
|
let thunk = |engine: &mut Engine| {
|
||||||
engine.call_function_with_args(
|
engine.call_function_with_args_from_mut_slice(
|
||||||
cursor.clone(),
|
cursor.clone(),
|
||||||
vec![self.state.clone(), area.into_steelval().unwrap()],
|
&mut [self.state.clone(), area.into_steelval().unwrap()],
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -666,7 +712,10 @@ impl Component for SteelDynamicComponent {
|
||||||
match result {
|
match result {
|
||||||
Ok(v) => (v, CursorKind::Block),
|
Ok(v) => (v, CursorKind::Block),
|
||||||
// TODO: Figure out how to pop up an error message
|
// TODO: Figure out how to pop up an error message
|
||||||
Err(_e) => (None, CursorKind::Block),
|
Err(_e) => {
|
||||||
|
log::info!("Error: {:?}", _e);
|
||||||
|
(None, CursorKind::Block)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
(None, helix_view::graphics::CursorKind::Hidden)
|
(None, helix_view::graphics::CursorKind::Hidden)
|
||||||
|
@ -691,9 +740,9 @@ impl Component for SteelDynamicComponent {
|
||||||
// call the engine instance. Otherwise, all computation happens inside the engine.
|
// call the engine instance. Otherwise, all computation happens inside the engine.
|
||||||
match ENGINE
|
match ENGINE
|
||||||
.with(|x| {
|
.with(|x| {
|
||||||
x.borrow_mut().call_function_with_args(
|
x.borrow_mut().call_function_with_args_from_mut_slice(
|
||||||
required_size.clone(),
|
required_size.clone(),
|
||||||
vec![self.state.clone(), viewport.into_steelval().unwrap()],
|
&mut [self.state.clone(), viewport.into_steelval().unwrap()],
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.and_then(|x| Option::<(u16, u16)>::from_steelval(&x))
|
.and_then(|x| Option::<(u16, u16)>::from_steelval(&x))
|
||||||
|
|
|
@ -7,7 +7,10 @@ pub fn document_id_to_usize(doc_id: &DocumentId) -> usize {
|
||||||
#[cfg(feature = "steel")]
|
#[cfg(feature = "steel")]
|
||||||
mod steel_implementations {
|
mod steel_implementations {
|
||||||
|
|
||||||
use steel::{gc::unsafe_erased_pointers::CustomReference, rvals::Custom};
|
use steel::{
|
||||||
|
gc::unsafe_erased_pointers::CustomReference,
|
||||||
|
rvals::{as_underlying_type, Custom},
|
||||||
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
document::Mode,
|
document::Mode,
|
||||||
|
@ -39,7 +42,15 @@ mod steel_implementations {
|
||||||
impl Custom for UnderlineStyle {}
|
impl Custom for UnderlineStyle {}
|
||||||
|
|
||||||
impl CustomReference for Event {}
|
impl CustomReference for Event {}
|
||||||
impl Custom for Rect {}
|
impl Custom for Rect {
|
||||||
|
fn equality_hint(&self, other: &dyn steel::rvals::CustomType) -> bool {
|
||||||
|
if let Some(other) = as_underlying_type::<Rect>(other) {
|
||||||
|
self == other
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
impl Custom for crate::graphics::CursorKind {}
|
impl Custom for crate::graphics::CursorKind {}
|
||||||
impl Custom for DocumentId {}
|
impl Custom for DocumentId {}
|
||||||
impl Custom for ViewId {}
|
impl Custom for ViewId {}
|
||||||
|
|
Loading…
Reference in New Issue