mirror of
https://github.com/wez/wezterm.git
synced 2024-12-27 15:37:29 +03:00
doc and cleanup
This commit is contained in:
parent
6928415461
commit
8ee5c295f7
@ -5,7 +5,6 @@ use crate::tmux_commands::{ListAllPanes, TmuxCommand};
|
||||
use crate::window::WindowId;
|
||||
use crate::{Mux, MuxWindowBuilder};
|
||||
use async_trait::async_trait;
|
||||
use flume;
|
||||
use portable_pty::{CommandBuilder, PtySize};
|
||||
use std::cell::RefCell;
|
||||
use std::collections::{HashMap, HashSet, VecDeque};
|
||||
@ -40,6 +39,8 @@ pub(crate) struct TmuxRemotePane {
|
||||
|
||||
pub(crate) type RefTmuxRemotePane = Arc<Mutex<TmuxRemotePane>>;
|
||||
|
||||
/// As a remote TmuxTab, keeping the TmuxPanes ID
|
||||
/// within the remote tab.
|
||||
pub(crate) struct TmuxTab {
|
||||
pub tab_id: TabId, // local tab ID
|
||||
pub tmux_window_id: TmuxWindowId,
|
||||
@ -48,9 +49,8 @@ pub(crate) struct TmuxTab {
|
||||
|
||||
pub(crate) type TmuxCmdQueue = VecDeque<Box<dyn TmuxCommand>>;
|
||||
pub(crate) struct TmuxDomainState {
|
||||
pub pane_id: PaneId,
|
||||
pub domain_id: DomainId,
|
||||
// parser: RefCell<Parser>,
|
||||
pub pane_id: PaneId, // ID of the original pane
|
||||
pub domain_id: DomainId, // ID of TmuxDomain
|
||||
state: RefCell<State>,
|
||||
pub cmd_queue: Arc<Mutex<TmuxCmdQueue>>,
|
||||
pub gui_window: RefCell<Option<MuxWindowBuilder>>,
|
||||
@ -124,10 +124,12 @@ impl TmuxDomainState {
|
||||
// send pending commands to tmux
|
||||
let cmd_queue = self.cmd_queue.as_ref().lock().unwrap();
|
||||
if *self.state.borrow() == State::Idle && !cmd_queue.is_empty() {
|
||||
TmuxDomainState::kick_off(self.domain_id);
|
||||
TmuxDomainState::schedule_send_next_command(self.domain_id);
|
||||
}
|
||||
}
|
||||
|
||||
/// send next command at the front of cmd_queue.
|
||||
/// must be called inside main thread
|
||||
fn send_next_command(&self) {
|
||||
if *self.state.borrow() != State::Idle {
|
||||
return;
|
||||
@ -145,7 +147,8 @@ impl TmuxDomainState {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn kick_off(domain_id: usize) {
|
||||
/// schedule a `send_next_command` into main thread
|
||||
pub fn schedule_send_next_command(domain_id: usize) {
|
||||
promise::spawn::spawn_into_main_thread(async move {
|
||||
let mux = Mux::get().expect("to be called on main thread");
|
||||
if let Some(domain) = mux.get_domain(domain_id) {
|
||||
@ -157,6 +160,7 @@ impl TmuxDomainState {
|
||||
.detach();
|
||||
}
|
||||
|
||||
/// create a standalone window for tmux tabs
|
||||
pub fn create_gui_window(&self) {
|
||||
if self.gui_window.borrow().is_none() {
|
||||
let mux = Mux::get().expect("should be call at main thread");
|
||||
|
@ -35,6 +35,7 @@ pub(crate) struct PaneItem {
|
||||
}
|
||||
|
||||
impl TmuxDomainState {
|
||||
/// check if a PaneItem received from ListAllPanes has been attached
|
||||
fn check_pane_attached(&self, target: &PaneItem) -> bool {
|
||||
let pane_list = self.gui_tabs.borrow();
|
||||
let local_tab = match pane_list
|
||||
@ -56,6 +57,8 @@ impl TmuxDomainState {
|
||||
}
|
||||
}
|
||||
|
||||
/// after we create a tab for a remote pane, save its ID into the
|
||||
/// TmuxPane-TmuxPane tree, so we can ref it later.
|
||||
fn add_attached_pane(&self, target: &PaneItem, tab_id: &TabId) -> anyhow::Result<()> {
|
||||
let mut pane_list = self.gui_tabs.borrow_mut();
|
||||
let local_tab = match pane_list
|
||||
@ -295,7 +298,6 @@ impl TmuxCommand for SendKeys {
|
||||
write!(&mut s, "0x{:X} ", byte).expect("unable to write key");
|
||||
}
|
||||
format!("send-keys -t {} {}\r", self.pane, s)
|
||||
// FIXME: disable ESC k sequence
|
||||
}
|
||||
|
||||
fn process_result(&self, _domain_id: DomainId, _result: &Guarded) -> anyhow::Result<()> {
|
||||
|
@ -2,7 +2,6 @@ use crate::{
|
||||
tmux::{RefTmuxRemotePane, TmuxCmdQueue, TmuxDomainState},
|
||||
tmux_commands::SendKeys,
|
||||
};
|
||||
use flume;
|
||||
use portable_pty::{Child, ExitStatus, MasterPty};
|
||||
use std::{
|
||||
io::{Read, Write},
|
||||
@ -26,13 +25,15 @@ impl Read for TmuxReader {
|
||||
}
|
||||
}
|
||||
|
||||
// A local tmux pane(tab) based on a tmux pty
|
||||
/// A local tmux pane(tab) based on a tmux pty
|
||||
#[derive(Debug, Clone)]
|
||||
pub(crate) struct TmuxPty {
|
||||
pub domain_id: usize,
|
||||
pub master_pane: RefTmuxRemotePane,
|
||||
pub rx: flume::Receiver<String>,
|
||||
pub cmd_queue: Arc<Mutex<TmuxCmdQueue>>,
|
||||
|
||||
/// would be released by TmuxDomain when detatched
|
||||
pub active_lock: Arc<(Mutex<bool>, Condvar)>,
|
||||
}
|
||||
|
||||
@ -48,7 +49,7 @@ impl Write for TmuxPty {
|
||||
pane: pane_id,
|
||||
keys: buf.to_vec(),
|
||||
}));
|
||||
TmuxDomainState::kick_off(self.domain_id);
|
||||
TmuxDomainState::schedule_send_next_command(self.domain_id);
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
|
@ -84,8 +84,8 @@ impl Parser {
|
||||
}
|
||||
|
||||
pub fn parse<F: FnMut(Action)>(&mut self, bytes: &[u8], mut callback: F) {
|
||||
let tmux_state: bool = self.state.borrow().tmux_state.is_some();
|
||||
if tmux_state {
|
||||
let is_tmux_mode: bool = self.state.borrow().tmux_state.is_some();
|
||||
if is_tmux_mode {
|
||||
if let Some(unparsed_str) = {
|
||||
let parser_state = self.state.borrow();
|
||||
let tmux_state = parser_state.tmux_state.as_ref().unwrap();
|
||||
|
Loading…
Reference in New Issue
Block a user