fix warnings & format
This commit is contained in:
parent
bf8a949cdd
commit
411b773ab5
61 changed files with 2759 additions and 2741 deletions
shell/src
|
@ -1,39 +1,41 @@
|
|||
use {
|
||||
std::{
|
||||
sync::Arc,
|
||||
process::Command,
|
||||
os::unix::io::{FromRawFd, AsRawFd},
|
||||
},
|
||||
std::sync::RwLock,
|
||||
termion::event::{Key, Event},
|
||||
cgmath::Point2,
|
||||
crate::pty::{PTYStatus, PTY},
|
||||
nested::{
|
||||
core::{ViewPort, OuterViewPort, InnerViewPort, Observer},
|
||||
singleton::{SingletonView, SingletonBuffer},
|
||||
core::{OuterViewPort, ViewPort},
|
||||
list::{sexpr::ListDecoration, ListCursorMode, ListEditor, ListEditorStyle},
|
||||
sequence::{SequenceView, SequenceViewExt},
|
||||
index::buffer::IndexBuffer,
|
||||
vec::VecBuffer,
|
||||
terminal::{TerminalAtom, TerminalStyle, TerminalView, TerminalEvent, TerminalEditor, TerminalEditorResult, make_label},
|
||||
tree_nav::{TreeNav, TreeNavResult, TerminalTreeEditor, TreeCursor},
|
||||
list::{ListCursorMode, ListEditor, ListEditorStyle, sexpr::ListDecoration},
|
||||
singleton::SingletonView,
|
||||
string_editor::CharEditor,
|
||||
terminal::{
|
||||
TerminalAtom, TerminalEditor, TerminalEditorResult, TerminalEvent, TerminalStyle,
|
||||
TerminalView,
|
||||
},
|
||||
tree_nav::{TerminalTreeEditor, TreeCursor, TreeNav, TreeNavResult},
|
||||
},
|
||||
crate::pty::{PTY, PTYStatus}
|
||||
std::sync::Arc,
|
||||
std::sync::RwLock,
|
||||
termion::event::{Event, Key},
|
||||
};
|
||||
|
||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||
|
||||
pub struct ProcessArg {
|
||||
editor: ListEditor< CharEditor,
|
||||
Box<dyn Fn() -> Arc<RwLock<CharEditor>> + Send + Sync + 'static> >
|
||||
editor:
|
||||
ListEditor<CharEditor, Box<dyn Fn() -> Arc<RwLock<CharEditor>> + Send + Sync + 'static>>,
|
||||
}
|
||||
|
||||
impl ProcessArg {
|
||||
pub fn get_data_port(&self) -> OuterViewPort<dyn SequenceView<Item = char>> {
|
||||
self.editor.get_data_port()
|
||||
.map(
|
||||
|char_editor| char_editor.read().unwrap().get_data_port().get_view().unwrap().get().unwrap()
|
||||
)
|
||||
self.editor.get_data_port().map(|char_editor| {
|
||||
char_editor
|
||||
.read()
|
||||
.unwrap()
|
||||
.get_data_port()
|
||||
.get_view()
|
||||
.unwrap()
|
||||
.get()
|
||||
.unwrap()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,41 +49,56 @@ impl TerminalEditor for ProcessArg {
|
|||
|
||||
fn handle_terminal_event(&mut self, event: &TerminalEvent) -> TerminalEditorResult {
|
||||
match event {
|
||||
TerminalEvent::Input(Event::Key(Key::Char(' '))) |
|
||||
TerminalEvent::Input(Event::Key(Key::Char('\n'))) => {
|
||||
TerminalEvent::Input(Event::Key(Key::Char(' ')))
|
||||
| TerminalEvent::Input(Event::Key(Key::Char('\n'))) => {
|
||||
self.editor.up();
|
||||
TerminalEditorResult::Exit
|
||||
}
|
||||
|
||||
event => self.editor.handle_terminal_event(event)
|
||||
event => self.editor.handle_terminal_event(event),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TreeNav for ProcessArg {
|
||||
fn get_cursor(&self) -> TreeCursor { self.editor.get_cursor() }
|
||||
fn goto(&mut self, cur: TreeCursor) -> TreeNavResult { self.editor.goto(cur) }
|
||||
fn goto_home(&mut self) -> TreeNavResult { self.editor.goto_home() }
|
||||
fn goto_end(&mut self) -> TreeNavResult { self.editor.goto_end() }
|
||||
fn pxev(&mut self) -> TreeNavResult { self.editor.pxev() }
|
||||
fn nexd(&mut self) -> TreeNavResult { self.editor.nexd() }
|
||||
fn up(&mut self) -> TreeNavResult { self.editor.up() }
|
||||
fn dn(&mut self) -> TreeNavResult { self.editor.dn() }
|
||||
fn get_cursor(&self) -> TreeCursor {
|
||||
self.editor.get_cursor()
|
||||
}
|
||||
fn goto(&mut self, cur: TreeCursor) -> TreeNavResult {
|
||||
self.editor.goto(cur)
|
||||
}
|
||||
fn goto_home(&mut self) -> TreeNavResult {
|
||||
self.editor.goto_home()
|
||||
}
|
||||
fn goto_end(&mut self) -> TreeNavResult {
|
||||
self.editor.goto_end()
|
||||
}
|
||||
fn pxev(&mut self) -> TreeNavResult {
|
||||
self.editor.pxev()
|
||||
}
|
||||
fn nexd(&mut self) -> TreeNavResult {
|
||||
self.editor.nexd()
|
||||
}
|
||||
fn up(&mut self) -> TreeNavResult {
|
||||
self.editor.up()
|
||||
}
|
||||
fn dn(&mut self) -> TreeNavResult {
|
||||
self.editor.dn()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ProcessLauncher {
|
||||
cmd_editor: ListEditor<
|
||||
ProcessArg, Box<dyn Fn() -> Arc<RwLock<ProcessArg>> + Send + Sync + 'static>
|
||||
>,
|
||||
cmd_editor:
|
||||
ListEditor<ProcessArg, Box<dyn Fn() -> Arc<RwLock<ProcessArg>> + Send + Sync + 'static>>,
|
||||
pty: Option<crate::pty::PTY>,
|
||||
ptybox: Arc<RwLock<crate::ascii_box::AsciiBox>>,
|
||||
_ptybox: Arc<RwLock<crate::ascii_box::AsciiBox>>,
|
||||
suspended: bool,
|
||||
|
||||
pty_port: ViewPort<dyn TerminalView>,
|
||||
status_port: ViewPort<dyn SingletonView<Item = PTYStatus>>,
|
||||
|
||||
comp_port: ViewPort<dyn TerminalView>,
|
||||
compositor: Arc<RwLock<nested::terminal::TerminalCompositor>>
|
||||
_compositor: Arc<RwLock<nested::terminal::TerminalCompositor>>,
|
||||
}
|
||||
|
||||
impl ProcessLauncher {
|
||||
|
@ -93,50 +110,45 @@ impl ProcessLauncher {
|
|||
let compositor = nested::terminal::TerminalCompositor::new(comp_port.inner());
|
||||
|
||||
let cmd_editor = ListEditor::new(
|
||||
Box::new(
|
||||
|| {
|
||||
Arc::new(RwLock::new(ProcessArg {
|
||||
editor: ListEditor::new(
|
||||
Box::new(
|
||||
|| {
|
||||
Arc::new(RwLock::new(CharEditor::new()))
|
||||
}
|
||||
),
|
||||
ListEditorStyle::Plain)
|
||||
}))
|
||||
}
|
||||
) as Box::<dyn Fn() -> Arc<RwLock<ProcessArg>> + Send + Sync>,
|
||||
ListEditorStyle::Plain
|
||||
Box::new(|| {
|
||||
Arc::new(RwLock::new(ProcessArg {
|
||||
editor: ListEditor::new(
|
||||
Box::new(|| Arc::new(RwLock::new(CharEditor::new()))),
|
||||
ListEditorStyle::Plain,
|
||||
),
|
||||
}))
|
||||
}) as Box<dyn Fn() -> Arc<RwLock<ProcessArg>> + Send + Sync>,
|
||||
ListEditorStyle::Plain,
|
||||
);
|
||||
|
||||
|
||||
|
||||
compositor.write().unwrap().push(
|
||||
box_port.outer()
|
||||
.map_item(|_idx, x| x.add_style_back(TerminalStyle::fg_color((90, 120, 100))))
|
||||
box_port
|
||||
.outer()
|
||||
.map_item(|_idx, x| x.add_style_back(TerminalStyle::fg_color((90, 120, 100)))),
|
||||
);
|
||||
compositor.write().unwrap().push(
|
||||
cmd_editor
|
||||
.get_seg_seq_view()
|
||||
.decorate("$(", ")", " ", 0)
|
||||
.to_grid_horizontal()
|
||||
.flatten()
|
||||
.flatten(),
|
||||
);
|
||||
|
||||
ProcessLauncher {
|
||||
cmd_editor,
|
||||
pty: None,
|
||||
ptybox: crate::ascii_box::AsciiBox::new(
|
||||
cgmath::Vector2::new(0, 0),
|
||||
pty_port.outer()
|
||||
.map_item(|_,a:&TerminalAtom| a.add_style_back(TerminalStyle::fg_color((230, 230, 230)))),
|
||||
box_port.inner()
|
||||
_ptybox: crate::ascii_box::AsciiBox::new(
|
||||
cgmath::Vector2::new(0, 0),
|
||||
pty_port.outer().map_item(|_, a: &TerminalAtom| {
|
||||
a.add_style_back(TerminalStyle::fg_color((230, 230, 230)))
|
||||
}),
|
||||
box_port.inner(),
|
||||
),
|
||||
suspended: false,
|
||||
pty_port,
|
||||
status_port,
|
||||
comp_port,
|
||||
compositor
|
||||
_compositor: compositor,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -144,8 +156,15 @@ impl ProcessLauncher {
|
|||
let mut strings = Vec::new();
|
||||
|
||||
let v = self.cmd_editor.get_data_port().get_view().unwrap();
|
||||
for i in 0 .. v.len().unwrap_or(0) {
|
||||
let arg_view = v.get(&i).unwrap().read().unwrap().get_data_port().get_view().unwrap();
|
||||
for i in 0..v.len().unwrap_or(0) {
|
||||
let arg_view = v
|
||||
.get(&i)
|
||||
.unwrap()
|
||||
.read()
|
||||
.unwrap()
|
||||
.get_data_port()
|
||||
.get_view()
|
||||
.unwrap();
|
||||
strings.push(arg_view.iter().collect::<String>());
|
||||
}
|
||||
|
||||
|
@ -157,10 +176,15 @@ impl ProcessLauncher {
|
|||
|
||||
self.cmd_editor.goto(TreeCursor {
|
||||
leaf_mode: ListCursorMode::Insert,
|
||||
tree_addr: vec![]
|
||||
tree_addr: vec![],
|
||||
});
|
||||
|
||||
self.pty = PTY::new(cmd, cgmath::Vector2::new(120, 40), self.pty_port.inner(), self.status_port.inner());
|
||||
|
||||
self.pty = PTY::new(
|
||||
cmd,
|
||||
cgmath::Vector2::new(120, 40),
|
||||
self.pty_port.inner(),
|
||||
self.status_port.inner(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -175,9 +199,8 @@ impl TerminalEditor for ProcessLauncher {
|
|||
}
|
||||
|
||||
fn handle_terminal_event(&mut self, event: &TerminalEvent) -> TerminalEditorResult {
|
||||
|
||||
// todo: move to observer of status view
|
||||
if let PTYStatus::Done{ status } = self.status_port.outer().get_view().get() {
|
||||
if let PTYStatus::Done { status: _ } = self.status_port.outer().get_view().get() {
|
||||
self.pty = None;
|
||||
self.suspended = false;
|
||||
}
|
||||
|
@ -185,7 +208,7 @@ impl TerminalEditor for ProcessLauncher {
|
|||
match event {
|
||||
TerminalEvent::Input(Event::Key(Key::Ctrl('c'))) => {
|
||||
// todo: sigterm instead of kill?
|
||||
if let Some(mut pty) = self.pty.as_mut() {
|
||||
if let Some(pty) = self.pty.as_mut() {
|
||||
pty.kill();
|
||||
}
|
||||
|
||||
|
@ -193,15 +216,15 @@ impl TerminalEditor for ProcessLauncher {
|
|||
self.suspended = false;
|
||||
self.cmd_editor.goto(TreeCursor {
|
||||
leaf_mode: ListCursorMode::Insert,
|
||||
tree_addr: vec![]
|
||||
});
|
||||
tree_addr: vec![],
|
||||
});
|
||||
TerminalEditorResult::Exit
|
||||
},
|
||||
}
|
||||
TerminalEvent::Input(Event::Key(Key::Ctrl('z'))) => {
|
||||
self.suspended = true;
|
||||
self.cmd_editor.goto(TreeCursor {
|
||||
leaf_mode: ListCursorMode::Insert,
|
||||
tree_addr: vec![]
|
||||
tree_addr: vec![],
|
||||
});
|
||||
TerminalEditorResult::Exit
|
||||
}
|
||||
|
@ -216,12 +239,12 @@ impl TerminalEditor for ProcessLauncher {
|
|||
self.launch_pty();
|
||||
TerminalEditorResult::Continue
|
||||
}
|
||||
event => self.cmd_editor.handle_terminal_event(event)
|
||||
event => self.cmd_editor.handle_terminal_event(event),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TreeNav for ProcessLauncher {
|
||||
|
@ -231,7 +254,7 @@ impl TreeNav for ProcessLauncher {
|
|||
|
||||
fn goto(&mut self, cur: TreeCursor) -> TreeNavResult {
|
||||
self.suspended = false;
|
||||
if let PTYStatus::Done{status} = self.status_port.outer().get_view().get() {
|
||||
if let PTYStatus::Done { status: _ } = self.status_port.outer().get_view().get() {
|
||||
self.pty = None;
|
||||
}
|
||||
|
||||
|
@ -240,7 +263,7 @@ impl TreeNav for ProcessLauncher {
|
|||
} else {
|
||||
self.cmd_editor.goto(TreeCursor {
|
||||
leaf_mode: ListCursorMode::Select,
|
||||
tree_addr: vec![]
|
||||
tree_addr: vec![],
|
||||
});
|
||||
TreeNavResult::Continue
|
||||
}
|
||||
|
@ -270,4 +293,3 @@ impl TreeNav for ProcessLauncher {
|
|||
self.cmd_editor.dn()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue