wip: helper functions for ServerInstruction
This commit is contained in:
parent
ea732166e3
commit
ee14d5f5dd
5 changed files with 176 additions and 54 deletions
|
|
@ -358,8 +358,8 @@ impl Tab {
|
||||||
// can query the screen as to how many panes it needs to create a layout
|
// can query the screen as to how many panes it needs to create a layout
|
||||||
// fixing this will require a bit of an architecture change
|
// fixing this will require a bit of an architecture change
|
||||||
self.os_api
|
self.os_api
|
||||||
.send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(
|
.send_to_server(ServerInstruction::pty_close_pane(PaneId::Terminal(
|
||||||
PaneId::Terminal(*unused_pid),
|
*unused_pid,
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
self.active_terminal = self.panes.iter().map(|(id, _)| id.to_owned()).next();
|
self.active_terminal = self.panes.iter().map(|(id, _)| id.to_owned()).next();
|
||||||
|
|
@ -406,7 +406,7 @@ impl Tab {
|
||||||
);
|
);
|
||||||
if terminal_id_to_split.is_none() {
|
if terminal_id_to_split.is_none() {
|
||||||
self.os_api
|
self.os_api
|
||||||
.send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(pid))); // we can't open this pane, close the pty
|
.send_to_server(ServerInstruction::pty_close_pane(pid)); // we can't open this pane, close the pty
|
||||||
return; // likely no terminal large enough to split
|
return; // likely no terminal large enough to split
|
||||||
}
|
}
|
||||||
let terminal_id_to_split = terminal_id_to_split.unwrap();
|
let terminal_id_to_split = terminal_id_to_split.unwrap();
|
||||||
|
|
@ -496,7 +496,7 @@ impl Tab {
|
||||||
let active_pane = self.panes.get_mut(active_pane_id).unwrap();
|
let active_pane = self.panes.get_mut(active_pane_id).unwrap();
|
||||||
if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 {
|
if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 {
|
||||||
self.os_api
|
self.os_api
|
||||||
.send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(pid))); // we can't open this pane, close the pty
|
.send_to_server(ServerInstruction::pty_close_pane(pid)); // we can't open this pane, close the pty
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let terminal_ws = PositionAndSize {
|
let terminal_ws = PositionAndSize {
|
||||||
|
|
@ -557,7 +557,7 @@ impl Tab {
|
||||||
let active_pane = self.panes.get_mut(active_pane_id).unwrap();
|
let active_pane = self.panes.get_mut(active_pane_id).unwrap();
|
||||||
if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 {
|
if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 {
|
||||||
self.os_api
|
self.os_api
|
||||||
.send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(pid))); // we can't open this pane, close the pty
|
.send_to_server(ServerInstruction::pty_close_pane(pid)); // we can't open this pane, close the pty
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let terminal_ws = PositionAndSize {
|
let terminal_ws = PositionAndSize {
|
||||||
|
|
@ -2145,7 +2145,7 @@ impl Tab {
|
||||||
let terminals = self.get_pane_ids();
|
let terminals = self.get_pane_ids();
|
||||||
for &pid in terminals.iter().skip(max_panes - 1) {
|
for &pid in terminals.iter().skip(max_panes - 1) {
|
||||||
self.os_api
|
self.os_api
|
||||||
.send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(pid)));
|
.send_to_server(ServerInstruction::pty_close_pane(pid));
|
||||||
self.close_pane_without_rerender(pid);
|
self.close_pane_without_rerender(pid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2256,9 +2256,7 @@ impl Tab {
|
||||||
if let Some(active_pane_id) = self.get_active_pane_id() {
|
if let Some(active_pane_id) = self.get_active_pane_id() {
|
||||||
self.close_pane(active_pane_id);
|
self.close_pane(active_pane_id);
|
||||||
self.os_api
|
self.os_api
|
||||||
.send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(
|
.send_to_server(ServerInstruction::pty_close_pane(active_pane_id));
|
||||||
active_pane_id,
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn scroll_active_terminal_up(&mut self) {
|
pub fn scroll_active_terminal_up(&mut self) {
|
||||||
|
|
|
||||||
|
|
@ -241,7 +241,7 @@ impl InputHandler {
|
||||||
Action::NewTab => {
|
Action::NewTab => {
|
||||||
self.command_is_executing.updating_tabs();
|
self.command_is_executing.updating_tabs();
|
||||||
self.os_input
|
self.os_input
|
||||||
.send_to_server(ServerInstruction::ToPty(PtyInstruction::NewTab));
|
.send_to_server(ServerInstruction::pty_new_tab());
|
||||||
self.command_is_executing.wait_until_tabs_are_updated();
|
self.command_is_executing.wait_until_tabs_are_updated();
|
||||||
}
|
}
|
||||||
Action::GoToNextTab => {
|
Action::GoToNextTab => {
|
||||||
|
|
|
||||||
|
|
@ -97,18 +97,12 @@ impl VteEventSender {
|
||||||
impl vte::Perform for VteEventSender {
|
impl vte::Perform for VteEventSender {
|
||||||
fn print(&mut self, c: char) {
|
fn print(&mut self, c: char) {
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Pty(
|
.send(ServerInstruction::pty(self.id, VteEvent::Print(c)))
|
||||||
self.id,
|
|
||||||
VteEvent::Print(c),
|
|
||||||
)))
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
fn execute(&mut self, byte: u8) {
|
fn execute(&mut self, byte: u8) {
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Pty(
|
.send(ServerInstruction::pty(self.id, VteEvent::Execute(byte)))
|
||||||
self.id,
|
|
||||||
VteEvent::Execute(byte),
|
|
||||||
)))
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -116,38 +110,32 @@ impl vte::Perform for VteEventSender {
|
||||||
let params = params.iter().copied().collect();
|
let params = params.iter().copied().collect();
|
||||||
let intermediates = intermediates.iter().copied().collect();
|
let intermediates = intermediates.iter().copied().collect();
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Pty(
|
.send(ServerInstruction::pty(
|
||||||
self.id,
|
self.id,
|
||||||
VteEvent::Hook(params, intermediates, ignore, c),
|
VteEvent::Hook(params, intermediates, ignore, c),
|
||||||
)))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn put(&mut self, byte: u8) {
|
fn put(&mut self, byte: u8) {
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Pty(
|
.send(ServerInstruction::pty(self.id, VteEvent::Put(byte)))
|
||||||
self.id,
|
|
||||||
VteEvent::Put(byte),
|
|
||||||
)))
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unhook(&mut self) {
|
fn unhook(&mut self) {
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Pty(
|
.send(ServerInstruction::pty(self.id, VteEvent::Unhook))
|
||||||
self.id,
|
|
||||||
VteEvent::Unhook,
|
|
||||||
)))
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) {
|
fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) {
|
||||||
let params = params.iter().map(|p| p.to_vec()).collect();
|
let params = params.iter().map(|p| p.to_vec()).collect();
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Pty(
|
.send(ServerInstruction::pty(
|
||||||
self.id,
|
self.id,
|
||||||
VteEvent::OscDispatch(params, bell_terminated),
|
VteEvent::OscDispatch(params, bell_terminated),
|
||||||
)))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -155,20 +143,20 @@ impl vte::Perform for VteEventSender {
|
||||||
let params = params.iter().copied().collect();
|
let params = params.iter().copied().collect();
|
||||||
let intermediates = intermediates.iter().copied().collect();
|
let intermediates = intermediates.iter().copied().collect();
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Pty(
|
.send(ServerInstruction::pty(
|
||||||
self.id,
|
self.id,
|
||||||
VteEvent::CsiDispatch(params, intermediates, ignore, c),
|
VteEvent::CsiDispatch(params, intermediates, ignore, c),
|
||||||
)))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) {
|
fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) {
|
||||||
let intermediates = intermediates.iter().copied().collect();
|
let intermediates = intermediates.iter().copied().collect();
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Pty(
|
.send(ServerInstruction::pty(
|
||||||
self.id,
|
self.id,
|
||||||
VteEvent::EscDispatch(intermediates, ignore, byte),
|
VteEvent::EscDispatch(intermediates, ignore, byte),
|
||||||
)))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -233,7 +221,7 @@ fn stream_terminal_bytes(
|
||||||
if receive_time.elapsed() > max_render_pause {
|
if receive_time.elapsed() > max_render_pause {
|
||||||
pending_render = false;
|
pending_render = false;
|
||||||
send_server_instructions
|
send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Render))
|
.send(ServerInstruction::render())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
last_byte_receive_time = Some(Instant::now());
|
last_byte_receive_time = Some(Instant::now());
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -249,7 +237,7 @@ fn stream_terminal_bytes(
|
||||||
if pending_render {
|
if pending_render {
|
||||||
pending_render = false;
|
pending_render = false;
|
||||||
send_server_instructions
|
send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Render))
|
.send(ServerInstruction::render())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
last_byte_receive_time = None;
|
last_byte_receive_time = None;
|
||||||
|
|
@ -257,16 +245,14 @@ fn stream_terminal_bytes(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
send_server_instructions
|
send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::Render))
|
.send(ServerInstruction::render())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
// this is a little hacky, and is because the tests end the file as soon as
|
// this is a little hacky, and is because the tests end the file as soon as
|
||||||
// we read everything, rather than hanging until there is new data
|
// we read everything, rather than hanging until there is new data
|
||||||
// a better solution would be to fix the test fakes, but this will do for now
|
// a better solution would be to fix the test fakes, but this will do for now
|
||||||
send_server_instructions
|
send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::ClosePane(
|
.send(ServerInstruction::screen_close_pane(PaneId::Terminal(pid)))
|
||||||
PaneId::Terminal(pid),
|
|
||||||
)))
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -311,8 +297,9 @@ impl PtyBus {
|
||||||
new_pane_pids.push(pid_primary);
|
new_pane_pids.push(pid_primary);
|
||||||
}
|
}
|
||||||
self.send_server_instructions
|
self.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::ApplyLayout(
|
.send(ServerInstruction::apply_layout((
|
||||||
(layout_path, new_pane_pids.clone()),
|
layout_path,
|
||||||
|
new_pane_pids.clone(),
|
||||||
)))
|
)))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
for id in new_pane_pids {
|
for id in new_pane_pids {
|
||||||
|
|
|
||||||
|
|
@ -212,7 +212,7 @@ impl Screen {
|
||||||
// because this might be happening when the app is closing, at which point the pty thread
|
// because this might be happening when the app is closing, at which point the pty thread
|
||||||
// has already closed and this would result in an error
|
// has already closed and this would result in an error
|
||||||
self.os_api
|
self.os_api
|
||||||
.send_to_server(ServerInstruction::ToPty(PtyInstruction::CloseTab(pane_ids)));
|
.send_to_server(ServerInstruction::pty_close_tab(pane_ids));
|
||||||
if self.tabs.is_empty() {
|
if self.tabs.is_empty() {
|
||||||
self.active_tab_index = None;
|
self.active_tab_index = None;
|
||||||
self.send_app_instructions
|
self.send_app_instructions
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
use crate::cli::CliArgs;
|
|
||||||
use crate::client::ClientInstruction;
|
use crate::client::ClientInstruction;
|
||||||
use crate::common::{ChannelWithContext, SenderType, SenderWithContext};
|
use crate::common::{ChannelWithContext, SenderType, SenderWithContext};
|
||||||
use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext, ServerContext};
|
use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext, ServerContext};
|
||||||
|
|
@ -6,10 +5,13 @@ use crate::os_input_output::{ServerOsApi, ServerOsApiInstruction};
|
||||||
use crate::panes::PaneId;
|
use crate::panes::PaneId;
|
||||||
use crate::pty_bus::{PtyBus, PtyInstruction};
|
use crate::pty_bus::{PtyBus, PtyInstruction};
|
||||||
use crate::screen::ScreenInstruction;
|
use crate::screen::ScreenInstruction;
|
||||||
|
use crate::{cli::CliArgs, common::pty_bus::VteEvent};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::os::unix::io::RawFd;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
use zellij_tile::prelude::InputMode;
|
||||||
|
|
||||||
/// Instructions related to server-side application including the
|
/// Instructions related to server-side application including the
|
||||||
/// ones sent by client to server
|
/// ones sent by client to server
|
||||||
|
|
@ -28,6 +30,147 @@ pub enum ServerInstruction {
|
||||||
ClientExit,
|
ClientExit,
|
||||||
Exit,
|
Exit,
|
||||||
}
|
}
|
||||||
|
impl ServerInstruction {
|
||||||
|
// ToPty
|
||||||
|
pub fn spawn_terminal(path: Option<PathBuf>) -> Self {
|
||||||
|
Self::ToPty(PtyInstruction::SpawnTerminal(path))
|
||||||
|
}
|
||||||
|
pub fn spawn_terminal_vertically(path: Option<PathBuf>) -> Self {
|
||||||
|
Self::ToPty(PtyInstruction::SpawnTerminalVertically(path))
|
||||||
|
}
|
||||||
|
pub fn spawn_terminal_horizontally(path: Option<PathBuf>) -> Self {
|
||||||
|
Self::ToPty(PtyInstruction::SpawnTerminalHorizontally(path))
|
||||||
|
}
|
||||||
|
pub fn pty_new_tab() -> Self {
|
||||||
|
Self::ToPty(PtyInstruction::NewTab)
|
||||||
|
}
|
||||||
|
pub fn pty_close_pane(id: PaneId) -> Self {
|
||||||
|
Self::ToPty(PtyInstruction::ClosePane(id))
|
||||||
|
}
|
||||||
|
pub fn pty_close_tab(ids: Vec<PaneId>) -> Self {
|
||||||
|
Self::ToPty(PtyInstruction::CloseTab(ids))
|
||||||
|
}
|
||||||
|
pub fn pty_exit() -> Self {
|
||||||
|
Self::ToPty(PtyInstruction::Exit)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToScreen
|
||||||
|
pub fn render() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::Render)
|
||||||
|
}
|
||||||
|
pub fn new_pane(id: PaneId) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::NewPane(id))
|
||||||
|
}
|
||||||
|
pub fn horizontal_split(id: PaneId) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::HorizontalSplit(id))
|
||||||
|
}
|
||||||
|
pub fn vertical_split(id: PaneId) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::VerticalSplit(id))
|
||||||
|
}
|
||||||
|
pub fn write_character(chars: Vec<u8>) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::WriteCharacter(chars))
|
||||||
|
}
|
||||||
|
pub fn resize_left() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ResizeLeft)
|
||||||
|
}
|
||||||
|
pub fn resize_right() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ResizeRight)
|
||||||
|
}
|
||||||
|
pub fn resize_down() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ResizeDown)
|
||||||
|
}
|
||||||
|
pub fn resize_up() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ResizeUp)
|
||||||
|
}
|
||||||
|
pub fn move_focus() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::MoveFocus)
|
||||||
|
}
|
||||||
|
pub fn move_focus_left() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::MoveFocusLeft)
|
||||||
|
}
|
||||||
|
pub fn move_focus_right() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::MoveFocusRight)
|
||||||
|
}
|
||||||
|
pub fn move_focus_down() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::MoveFocusDown)
|
||||||
|
}
|
||||||
|
pub fn move_focus_up() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::MoveFocusUp)
|
||||||
|
}
|
||||||
|
pub fn screen_exit() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::Exit)
|
||||||
|
}
|
||||||
|
pub fn scroll_up() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ScrollUp)
|
||||||
|
}
|
||||||
|
pub fn scroll_down() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ScrollDown)
|
||||||
|
}
|
||||||
|
pub fn clear_scroll() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ClearScroll)
|
||||||
|
}
|
||||||
|
pub fn close_focused_pane() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::CloseFocusedPane)
|
||||||
|
}
|
||||||
|
pub fn toggle_active_terminal_fullscreen() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ToggleActiveTerminalFullscreen)
|
||||||
|
}
|
||||||
|
pub fn set_selectable(pane_id: PaneId, value: bool) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::SetSelectable(pane_id, value))
|
||||||
|
}
|
||||||
|
pub fn set_max_height(pane_id: PaneId, max_height: usize) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::SetMaxHeight(pane_id, max_height))
|
||||||
|
}
|
||||||
|
pub fn set_invisible_borders(pane_id: PaneId, value: bool) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::SetInvisibleBorders(pane_id, value))
|
||||||
|
}
|
||||||
|
pub fn screen_close_pane(pane_id: PaneId) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ClosePane(pane_id))
|
||||||
|
}
|
||||||
|
pub fn apply_layout(layout: (PathBuf, Vec<RawFd>)) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ApplyLayout(layout))
|
||||||
|
}
|
||||||
|
pub fn screen_new_tab(fd: RawFd) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::NewTab(fd))
|
||||||
|
}
|
||||||
|
pub fn switch_tab_prev() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::SwitchTabPrev)
|
||||||
|
}
|
||||||
|
pub fn switch_tab_next() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::SwitchTabPrev)
|
||||||
|
}
|
||||||
|
pub fn screen_close_tab() -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::CloseTab)
|
||||||
|
}
|
||||||
|
pub fn go_to_tab(tab_id: u32) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::GoToTab(tab_id))
|
||||||
|
}
|
||||||
|
pub fn update_tab_name(tab_ids: Vec<u8>) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::UpdateTabName(tab_ids))
|
||||||
|
}
|
||||||
|
pub fn change_input_mode(input_mode: InputMode) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::ChangeInputMode(input_mode))
|
||||||
|
}
|
||||||
|
pub fn pty(fd: RawFd, event: VteEvent) -> Self {
|
||||||
|
Self::ToScreen(ScreenInstruction::Pty(fd, event))
|
||||||
|
}
|
||||||
|
|
||||||
|
// OsApi
|
||||||
|
pub fn set_terminal_size_using_fd(fd: RawFd, cols: u16, rows: u16) -> Self {
|
||||||
|
Self::OsApi(ServerOsApiInstruction::SetTerminalSizeUsingFd(
|
||||||
|
fd, cols, rows,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
pub fn write_to_tty_stdin(fd: RawFd, buf: Vec<u8>) -> Self {
|
||||||
|
Self::OsApi(ServerOsApiInstruction::WriteToTtyStdin(fd, buf))
|
||||||
|
}
|
||||||
|
pub fn tc_drain(fd: RawFd) -> Self {
|
||||||
|
Self::OsApi(ServerOsApiInstruction::TcDrain(fd))
|
||||||
|
}
|
||||||
|
pub fn os_exit() -> Self {
|
||||||
|
Self::OsApi(ServerOsApiInstruction::Exit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn start_server(mut os_input: Box<dyn ServerOsApi>, opts: CliArgs) -> thread::JoinHandle<()> {
|
pub fn start_server(mut os_input: Box<dyn ServerOsApi>, opts: CliArgs) -> thread::JoinHandle<()> {
|
||||||
let (send_pty_instructions, receive_pty_instructions): ChannelWithContext<PtyInstruction> =
|
let (send_pty_instructions, receive_pty_instructions): ChannelWithContext<PtyInstruction> =
|
||||||
|
|
@ -80,27 +223,21 @@ pub fn start_server(mut os_input: Box<dyn ServerOsApi>, opts: CliArgs) -> thread
|
||||||
let pid = pty_bus.spawn_terminal(file_to_open);
|
let pid = pty_bus.spawn_terminal(file_to_open);
|
||||||
pty_bus
|
pty_bus
|
||||||
.send_server_instructions
|
.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::NewPane(
|
.send(ServerInstruction::new_pane(PaneId::Terminal(pid)))
|
||||||
PaneId::Terminal(pid),
|
|
||||||
)))
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
PtyInstruction::SpawnTerminalVertically(file_to_open) => {
|
PtyInstruction::SpawnTerminalVertically(file_to_open) => {
|
||||||
let pid = pty_bus.spawn_terminal(file_to_open);
|
let pid = pty_bus.spawn_terminal(file_to_open);
|
||||||
pty_bus
|
pty_bus
|
||||||
.send_server_instructions
|
.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(
|
.send(ServerInstruction::vertical_split(PaneId::Terminal(pid)))
|
||||||
ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)),
|
|
||||||
))
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
PtyInstruction::SpawnTerminalHorizontally(file_to_open) => {
|
PtyInstruction::SpawnTerminalHorizontally(file_to_open) => {
|
||||||
let pid = pty_bus.spawn_terminal(file_to_open);
|
let pid = pty_bus.spawn_terminal(file_to_open);
|
||||||
pty_bus
|
pty_bus
|
||||||
.send_server_instructions
|
.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(
|
.send(ServerInstruction::horizontal_split(PaneId::Terminal(pid)))
|
||||||
ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)),
|
|
||||||
))
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
PtyInstruction::NewTab => {
|
PtyInstruction::NewTab => {
|
||||||
|
|
@ -110,7 +247,7 @@ pub fn start_server(mut os_input: Box<dyn ServerOsApi>, opts: CliArgs) -> thread
|
||||||
let pid = pty_bus.spawn_terminal(None);
|
let pid = pty_bus.spawn_terminal(None);
|
||||||
pty_bus
|
pty_bus
|
||||||
.send_server_instructions
|
.send_server_instructions
|
||||||
.send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid)))
|
.send(ServerInstruction::screen_new_tab(pid))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue