From 588cdaa00894a9ae46e6a293f73ba62d5b1df18f Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 11 Feb 2021 21:15:38 +0530 Subject: [PATCH 01/64] isolate pty thread --- src/cli.rs | 2 +- src/client/panes/terminal_pane.rs | 4 +- src/client/tab.rs | 99 ++++++------ src/common/errors.rs | 21 ++- src/common/input/handler.rs | 60 +++---- src/common/mod.rs | 253 ++++++++---------------------- src/common/pty_bus.rs | 217 +++++++++++++++++++------ src/common/screen.rs | 13 +- src/common/wasm_vm.rs | 14 +- src/main.rs | 22 +-- src/server/mod.rs | 201 +++++++++++++++++++++++- 11 files changed, 557 insertions(+), 349 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index bc4e4a9e..d4c1c704 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -2,7 +2,7 @@ use super::common::utils::consts::{ZELLIJ_CONFIG_DIR_ENV, ZELLIJ_CONFIG_FILE_ENV use std::path::PathBuf; use structopt::StructOpt; -#[derive(StructOpt, Default, Debug)] +#[derive(StructOpt, Debug, Default, Clone)] #[structopt(name = "zellij")] pub struct CliArgs { /// Send "split (direction h == horizontal / v == vertical)" to active zellij session diff --git a/src/client/panes/terminal_pane.rs b/src/client/panes/terminal_pane.rs index a5a957e6..1834e722 100644 --- a/src/client/panes/terminal_pane.rs +++ b/src/client/panes/terminal_pane.rs @@ -1,6 +1,8 @@ use crate::tab::Pane; use ::nix::pty::Winsize; use ::std::os::unix::io::RawFd; +use ::vte::Perform; +use serde::{Deserialize, Serialize}; use std::fmt::Debug; use std::time::Instant; @@ -10,7 +12,7 @@ use crate::panes::terminal_character::{ }; use crate::pty_bus::VteBytes; -#[derive(PartialEq, Eq, Ord, PartialOrd, Hash, Clone, Copy, Debug)] +#[derive(PartialEq, Eq, Ord, PartialOrd, Hash, Clone, Copy, Debug, Serialize, Deserialize)] pub enum PaneId { Terminal(RawFd), Plugin(u32), // FIXME: Drop the trait object, make this a wrapper for the struct? diff --git a/src/client/tab.rs b/src/client/tab.rs index b01e04e5..b87926b7 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -69,7 +69,6 @@ pub struct Tab { fullscreen_is_active: bool, synchronize_is_active: bool, os_api: Box, - pub send_pty_instructions: SenderWithContext, pub send_plugin_instructions: SenderWithContext, pub send_app_instructions: SenderWithContext, should_clear_display_before_rendering: bool, @@ -226,7 +225,6 @@ impl Tab { name: String, full_screen_ws: &PositionAndSize, mut os_api: Box, - send_pty_instructions: SenderWithContext, send_plugin_instructions: SenderWithContext, send_app_instructions: SenderWithContext, max_panes: Option, @@ -261,7 +259,6 @@ impl Tab { synchronize_is_active: false, os_api, send_app_instructions, - send_pty_instructions, send_plugin_instructions, should_clear_display_before_rendering: false, mode_info, @@ -354,8 +351,10 @@ impl Tab { // this is a bit of a hack and happens because we don't have any central location that // 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 - self.send_pty_instructions - .send(PtyInstruction::ClosePane(PaneId::Terminal(*unused_pid))) + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::ClosePane( + PaneId::Terminal(*unused_pid), + ))) .unwrap(); } self.active_terminal = self.panes.iter().map(|(id, _)| id.to_owned()).next(); @@ -399,8 +398,8 @@ impl Tab { }, ); if terminal_id_to_split.is_none() { - self.send_pty_instructions - .send(PtyInstruction::ClosePane(pid)) // we can't open this pane, close the pty + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty .unwrap(); return; // likely no terminal large enough to split } @@ -475,24 +474,25 @@ impl Tab { self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } - } else if let PaneId::Terminal(term_pid) = pid { - // TODO: check minimum size of active terminal - let active_pane_id = &self.get_active_pane_id().unwrap(); - let active_pane = self.panes.get_mut(active_pane_id).unwrap(); - if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 { - self.send_pty_instructions - .send(PtyInstruction::ClosePane(pid)) // we can't open this pane, close the pty - .unwrap(); - return; - } - let terminal_ws = PositionAndSize { - x: active_pane.x(), - y: active_pane.y(), - rows: active_pane.rows(), - columns: active_pane.columns(), - ..Default::default() - }; - let (top_winsize, bottom_winsize) = split_horizontally_with_gap(&terminal_ws); + } else { + // FIXME: This could use a second look + if let PaneId::Terminal(term_pid) = pid { + // TODO: check minimum size of active terminal + let active_pane_id = &self.get_active_pane_id().unwrap(); + let active_pane = self.panes.get_mut(active_pane_id).unwrap(); + if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 { + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty + .unwrap(); + return; + } + let terminal_ws = PositionAndSize { + x: active_pane.x(), + y: active_pane.y(), + rows: active_pane.rows(), + columns: active_pane.columns(), + }; + let (top_winsize, bottom_winsize) = split_horizontally_with_gap(&terminal_ws); active_pane.change_pos_and_size(&top_winsize); @@ -532,26 +532,25 @@ impl Tab { self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } - } else if let PaneId::Terminal(term_pid) = pid { - // TODO: check minimum size of active terminal - let active_pane_id = &self.get_active_pane_id().unwrap(); - let active_pane = self.panes.get_mut(active_pane_id).unwrap(); - if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 { - self.send_pty_instructions - .send(PtyInstruction::ClosePane(pid)) // we can't open this pane, close the pty - .unwrap(); - return; - } - let terminal_ws = PositionAndSize { - x: active_pane.x(), - y: active_pane.y(), - rows: active_pane.rows(), - columns: active_pane.columns(), - ..Default::default() - }; - let (left_winsize, right_winsize) = split_vertically_with_gap(&terminal_ws); - - active_pane.change_pos_and_size(&left_winsize); + } else { + // FIXME: This could use a second look + if let PaneId::Terminal(term_pid) = pid { + // TODO: check minimum size of active terminal + let active_pane_id = &self.get_active_pane_id().unwrap(); + let active_pane = self.panes.get_mut(active_pane_id).unwrap(); + if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 { + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty + .unwrap(); + return; + } + let terminal_ws = PositionAndSize { + x: active_pane.x(), + y: active_pane.y(), + rows: active_pane.rows(), + columns: active_pane.columns(), + }; + let (left_winsize, right_winsize) = split_vertically_with_gap(&terminal_ws); let new_terminal = TerminalPane::new(term_pid, right_winsize); self.os_api.set_terminal_size_using_fd( @@ -2105,8 +2104,8 @@ impl Tab { if let Some(max_panes) = self.max_panes { let terminals = self.get_pane_ids(); for &pid in terminals.iter().skip(max_panes - 1) { - self.send_pty_instructions - .send(PtyInstruction::ClosePane(pid)) + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) .unwrap(); self.close_pane_without_rerender(pid); } @@ -2217,8 +2216,10 @@ impl Tab { pub fn close_focused_pane(&mut self) { if let Some(active_pane_id) = self.get_active_pane_id() { self.close_pane(active_pane_id); - self.send_pty_instructions - .send(PtyInstruction::ClosePane(active_pane_id)) + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::ClosePane( + active_pane_id, + ))) .unwrap(); } } diff --git a/src/common/errors.rs b/src/common/errors.rs index c1c6753f..a9156ae6 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -4,6 +4,7 @@ use super::{AppInstruction, ASYNCOPENCALLS, OPENCALLS}; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; +use serde::{Deserialize, Serialize}; use std::fmt::{Display, Error, Formatter}; @@ -79,7 +80,7 @@ pub fn get_current_ctx() -> ErrorContext { } /// A representation of the call stack. -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Serialize, Deserialize)] pub struct ErrorContext { calls: [ContextType; MAX_THREAD_CALL_STACK], } @@ -131,7 +132,7 @@ impl Display for ErrorContext { /// Complex variants store a variant of a related enum, whose variants can be built from /// the corresponding Zellij MSPC instruction enum variants ([`ScreenInstruction`], /// [`PtyInstruction`], [`AppInstruction`], etc). -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, Serialize, Deserialize)] pub enum ContextType { /// A screen-related call. Screen(ScreenContext), @@ -141,7 +142,7 @@ pub enum ContextType { Plugin(PluginContext), /// An app-related call. App(AppContext), - IpcServer, + IPCServer, // Fix: Create a separate ServerContext when sessions are introduced StdinHandler, AsyncTask, /// An empty, placeholder call. This should be thought of as representing no call at all. @@ -174,7 +175,7 @@ impl Display for ContextType { // FIXME: Just deriving EnumDiscriminants from strum will remove the need for any of this!!! /// Stack call representations corresponding to the different types of [`ScreenInstruction`]s. -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum ScreenContext { HandlePtyBytes, Render, @@ -267,7 +268,7 @@ impl From<&ScreenInstruction> for ScreenContext { } /// Stack call representations corresponding to the different types of [`PtyInstruction`]s. -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum PtyContext { SpawnTerminal, SpawnTerminalVertically, @@ -297,7 +298,7 @@ impl From<&PtyInstruction> for PtyContext { use crate::wasm_vm::PluginInstruction; /// Stack call representations corresponding to the different types of [`PluginInstruction`]s. -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum PluginContext { Load, Update, @@ -319,10 +320,13 @@ impl From<&PluginInstruction> for PluginContext { } /// Stack call representations corresponding to the different types of [`AppInstruction`]s. -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum AppContext { Exit, Error, + ToPty, + ToPlugin, + ToScreen, } impl From<&AppInstruction> for AppContext { @@ -330,6 +334,9 @@ impl From<&AppInstruction> for AppContext { match *app_instruction { AppInstruction::Exit => AppContext::Exit, AppInstruction::Error(_) => AppContext::Error, + AppInstruction::ToPty(_) => AppContext::ToPty, + AppInstruction::ToPlugin(_) => AppContext::ToPlugin, + AppInstruction::ToScreen(_) => AppContext::ToScreen, } } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 7304225c..f8f07f53 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -23,7 +23,6 @@ struct InputHandler { config: Config, command_is_executing: CommandIsExecuting, send_screen_instructions: SenderWithContext, - send_pty_instructions: SenderWithContext, send_plugin_instructions: SenderWithContext, send_app_instructions: SenderWithContext, should_exit: bool, @@ -36,7 +35,6 @@ impl InputHandler { command_is_executing: CommandIsExecuting, config: Config, send_screen_instructions: SenderWithContext, - send_pty_instructions: SenderWithContext, send_plugin_instructions: SenderWithContext, send_app_instructions: SenderWithContext, ) -> Self { @@ -46,7 +44,6 @@ impl InputHandler { config, command_is_executing, send_screen_instructions, - send_pty_instructions, send_plugin_instructions, send_app_instructions, should_exit: false, @@ -58,25 +55,34 @@ impl InputHandler { fn handle_input(&mut self) { let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); err_ctx.add_call(ContextType::StdinHandler); - let alt_left_bracket = vec![27, 91]; - loop { - if self.should_exit { - break; - } - let stdin_buffer = self.os_input.read_from_stdin(); - for key_result in stdin_buffer.events_and_raw() { - match key_result { - Ok((event, raw_bytes)) => match event { - termion::event::Event::Key(key) => { - let key = cast_termion_key(key); - self.handle_key(&key, raw_bytes); - } - termion::event::Event::Unsupported(unsupported_key) => { - // we have to do this because of a bug in termion - // this should be a key event and not an unsupported event - if unsupported_key == alt_left_bracket { - let key = Key::Alt('['); - self.handle_key(&key, raw_bytes); + self.send_app_instructions.update(err_ctx); + self.send_screen_instructions.update(err_ctx); + if let Ok(keybinds) = get_default_keybinds() { + 'input_loop: loop { + //@@@ I think this should actually just iterate over stdin directly + let stdin_buffer = self.os_input.read_from_stdin(); + for key_result in stdin_buffer.events_and_raw() { + match key_result { + Ok((event, raw_bytes)) => match event { + termion::event::Event::Key(key) => { + let key = cast_termion_key(key); + // FIXME this explicit break is needed because the current test + // framework relies on it to not create dead threads that loop + // and eat up CPUs. Do not remove until the test framework has + // been revised. Sorry about this (@categorille) + let mut should_break = false; + for action in key_to_actions(&key, raw_bytes, &self.mode, &keybinds) + { + should_break |= self.dispatch_action(action); + } + if should_break { + break 'input_loop; + } + } + termion::event::Event::Mouse(_) + | termion::event::Event::Unsupported(_) => { + // Mouse and unsupported events aren't implemented yet, + // use a NoOp untill then. } } termion::event::Event::Mouse(_) => { @@ -220,7 +226,9 @@ impl InputHandler { None => PtyInstruction::SpawnTerminal(None), }; self.command_is_executing.opening_new_pane(); - self.send_pty_instructions.send(pty_instr).unwrap(); + self.send_app_instructions + .send(AppInstruction::ToPty(pty_instr)) + .unwrap(); self.command_is_executing.wait_until_new_pane_is_opened(); } Action::CloseFocus => { @@ -232,8 +240,8 @@ impl InputHandler { } Action::NewTab => { self.command_is_executing.opening_new_pane(); - self.send_pty_instructions - .send(PtyInstruction::NewTab) + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::NewTab)) .unwrap(); self.command_is_executing.wait_until_new_pane_is_opened(); } @@ -332,7 +340,6 @@ pub fn input_loop( config: Config, command_is_executing: CommandIsExecuting, send_screen_instructions: SenderWithContext, - send_pty_instructions: SenderWithContext, send_plugin_instructions: SenderWithContext, send_app_instructions: SenderWithContext, ) { @@ -341,7 +348,6 @@ pub fn input_loop( command_is_executing, config, send_screen_instructions, - send_pty_instructions, send_plugin_instructions, send_app_instructions, ) diff --git a/src/common/mod.rs b/src/common/mod.rs index 17c1f4cb..61897df0 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -9,8 +9,9 @@ pub mod setup; pub mod utils; pub mod wasm_vm; -use std::cell::RefCell; -use std::path::PathBuf; +use std::io::Write; +use std::os::unix::net::UnixStream; +use std::path::{Path, PathBuf}; use std::sync::mpsc; use std::thread; use std::{collections::HashMap, fs}; @@ -23,19 +24,12 @@ use std::{ }; use crate::cli::CliArgs; -use crate::common::input::config::Config; -use crate::layout::Layout; -use crate::panes::PaneId; -use async_std::task_local; +use crate::server::start_server; use command_is_executing::CommandIsExecuting; -use directories_next::ProjectDirs; -use errors::{ - get_current_ctx, AppContext, ContextType, ErrorContext, PluginContext, PtyContext, - ScreenContext, -}; +use errors::{AppContext, ContextType, ErrorContext, PluginContext, ScreenContext}; use input::handler::input_loop; use os_input_output::OsApi; -use pty_bus::{PtyBus, PtyInstruction}; +use pty_bus::PtyInstruction; use screen::{Screen, ScreenInstruction}; use serde::{Deserialize, Serialize}; use setup::install; @@ -45,12 +39,36 @@ use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; use zellij_tile::data::{EventType, InputMode, ModeInfo}; -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] pub enum ApiCommand { OpenFile(PathBuf), SplitHorizontally, SplitVertically, MoveFocus, + ToPty(PtyInstruction), + ToScreen(ScreenInstruction), + ClosePluginPane(u32), + Quit, +} + +// FIXME: It would be good to add some more things to this over time +#[derive(Debug, Clone, Default)] +pub struct AppState { + pub input_mode: InputMode, +} + +// FIXME: Make this a method on the big `Communication` struct, so that app_tx can be extracted +// from self instead of being explicitly passed here +pub fn update_state( + app_tx: &SenderWithContext, + update_fn: impl FnOnce(AppState) -> AppState, +) { + let (state_tx, state_rx) = mpsc::channel(); + + drop(app_tx.send(AppInstruction::GetState(state_tx))); + let state = state_rx.recv().unwrap(); + + drop(app_tx.send(AppInstruction::SetState(update_fn(state)))) } /// An [MPSC](mpsc) asynchronous channel with added error context. @@ -66,7 +84,7 @@ pub type SyncChannelWithContext = ( /// Wrappers around the two standard [MPSC](mpsc) sender types, [`mpsc::Sender`] and [`mpsc::SyncSender`], with an additional [`ErrorContext`]. #[derive(Clone)] -enum SenderType { +pub enum SenderType { /// A wrapper around an [`mpsc::Sender`], adding an [`ErrorContext`]. Sender(mpsc::Sender<(T, ErrorContext)>), /// A wrapper around an [`mpsc::SyncSender`], adding an [`ErrorContext`]. @@ -81,8 +99,8 @@ pub struct SenderWithContext { } impl SenderWithContext { - fn new(sender: SenderType) -> Self { - Self { sender } + pub fn new(err_ctx: ErrorContext, sender: SenderType) -> Self { + Self { err_ctx, sender } } /// Sends an event, along with the current [`ErrorContext`], on this @@ -116,6 +134,9 @@ task_local! { pub enum AppInstruction { Exit, Error(String), + ToPty(PtyInstruction), + ToScreen(ScreenInstruction), + ToPlugin(PluginInstruction), } /// Start Zellij with the specified [`OsApi`] and command-line arguments. @@ -140,10 +161,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let send_screen_instructions = SenderWithContext::new(SenderType::Sender(send_screen_instructions)); - let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = - mpsc::channel(); - let send_pty_instructions = SenderWithContext::new(SenderType::Sender(send_pty_instructions)); - let (send_plugin_instructions, receive_plugin_instructions): ChannelWithContext< PluginInstruction, > = mpsc::channel(); @@ -155,31 +172,13 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let send_app_instructions = SenderWithContext::new(SenderType::SyncSender(send_app_instructions)); - let mut pty_bus = PtyBus::new( - receive_pty_instructions, - send_screen_instructions.clone(), - send_plugin_instructions.clone(), + let ipc_thread = start_server( os_input.clone(), - opts.debug, + opts.clone(), + command_is_executing.clone(), + send_app_instructions.clone(), ); - // Determine and initialize the data directory - let project_dirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); - let data_dir = opts - .data_dir - .unwrap_or_else(|| project_dirs.data_dir().to_path_buf()); - install::populate_data_dir(&data_dir); - - // Don't use default layouts in tests, but do everywhere else - #[cfg(not(test))] - let default_layout = Some(PathBuf::from("default")); - #[cfg(test)] - let default_layout = None; - let maybe_layout = opts - .layout - .map(|p| Layout::new(&p, &data_dir)) - .or_else(|| default_layout.map(|p| Layout::from_defaults(&p, &data_dir))); - #[cfg(not(test))] std::panic::set_hook({ use crate::errors::handle_panic; @@ -189,72 +188,11 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { }) }); - let pty_thread = thread::Builder::new() - .name("pty".to_string()) - .spawn({ - let mut command_is_executing = command_is_executing.clone(); - send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); - move || loop { - let (event, mut err_ctx) = pty_bus - .receive_pty_instructions - .recv() - .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); - match event { - PtyInstruction::SpawnTerminal(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_screen_instructions - .send(ScreenInstruction::NewPane(PaneId::Terminal(pid))) - .unwrap(); - } - PtyInstruction::SpawnTerminalVertically(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_screen_instructions - .send(ScreenInstruction::VerticalSplit(PaneId::Terminal(pid))) - .unwrap(); - } - PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_screen_instructions - .send(ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid))) - .unwrap(); - } - PtyInstruction::NewTab => { - if let Some(layout) = maybe_layout.clone() { - pty_bus.spawn_terminals_for_layout(layout); - } else { - let pid = pty_bus.spawn_terminal(None); - pty_bus - .send_screen_instructions - .send(ScreenInstruction::NewTab(pid)) - .unwrap(); - } - } - PtyInstruction::ClosePane(id) => { - pty_bus.close_pane(id); - command_is_executing.done_closing_pane(); - } - PtyInstruction::CloseTab(ids) => { - pty_bus.close_tab(ids); - command_is_executing.done_closing_pane(); - } - PtyInstruction::Quit => { - break; - } - } - } - }) - .unwrap(); - let screen_thread = thread::Builder::new() .name("screen".to_string()) .spawn({ let mut command_is_executing = command_is_executing.clone(); let os_input = os_input.clone(); - let send_pty_instructions = send_pty_instructions.clone(); let send_plugin_instructions = send_plugin_instructions.clone(); let send_app_instructions = send_app_instructions.clone(); let max_panes = opts.max_panes; @@ -262,7 +200,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { move || { let mut screen = Screen::new( receive_screen_instructions, - send_pty_instructions, send_plugin_instructions, send_app_instructions, &full_screen_ws, @@ -281,6 +218,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { .recv() .expect("failed to receive event on channel"); err_ctx.add_call(ContextType::Screen(ScreenContext::from(&event))); + screen.send_app_instructions.update(err_ctx); match event { ScreenInstruction::PtyBytes(pid, vte_bytes) => { let active_tab = screen.get_active_tab_mut().unwrap(); @@ -460,10 +398,8 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let wasm_thread = thread::Builder::new() .name("wasm".to_string()) .spawn({ - let send_pty_instructions = send_pty_instructions.clone(); - let send_screen_instructions = send_screen_instructions.clone(); - let send_app_instructions = send_app_instructions.clone(); - let send_plugin_instructions = send_plugin_instructions.clone(); + let mut send_screen_instructions = send_screen_instructions.clone(); + let mut send_app_instructions = send_app_instructions.clone(); let store = Store::default(); let mut plugin_id = 0; @@ -473,6 +409,8 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { .recv() .expect("failed to receive event on channel"); err_ctx.add_call(ContextType::Plugin(PluginContext::from(&event))); + send_screen_instructions.update(err_ctx); + send_app_instructions.update(err_ctx); match event { PluginInstruction::Load(pid_tx, path) => { let plugin_dir = data_dir.join("plugins/"); @@ -505,7 +443,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let plugin_env = PluginEnv { plugin_id, - send_pty_instructions: send_pty_instructions.clone(), send_screen_instructions: send_screen_instructions.clone(), send_app_instructions: send_app_instructions.clone(), send_plugin_instructions: send_plugin_instructions.clone(), @@ -556,83 +493,10 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { }) .unwrap(); - let _signal_thread = thread::Builder::new() - .name("signal_listener".to_string()) - .spawn({ - let os_input = os_input.clone(); - let send_screen_instructions = send_screen_instructions.clone(); - move || { - os_input.receive_sigwinch(Box::new(move || { - let _ = send_screen_instructions.send(ScreenInstruction::TerminalResize); - })); - } - }) - .unwrap(); - - // TODO: currently we don't wait for this to quit - // because otherwise the app will hang. Need to fix this so it both - // listens to the ipc-bus and is able to quit cleanly - #[cfg(not(test))] - let _ipc_thread = thread::Builder::new() - .name("ipc_server".to_string()) - .spawn({ - use std::io::Read; - let send_pty_instructions = send_pty_instructions.clone(); - let send_screen_instructions = send_screen_instructions.clone(); - move || { - std::fs::remove_file(ZELLIJ_IPC_PIPE).ok(); - let listener = std::os::unix::net::UnixListener::bind(ZELLIJ_IPC_PIPE) - .expect("could not listen on ipc socket"); - let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); - err_ctx.add_call(ContextType::IpcServer); - - for stream in listener.incoming() { - match stream { - Ok(mut stream) => { - let mut buffer = [0; 65535]; // TODO: more accurate - let _ = stream - .read(&mut buffer) - .expect("failed to parse ipc message"); - let decoded: ApiCommand = bincode::deserialize(&buffer) - .expect("failed to deserialize ipc message"); - match &decoded { - ApiCommand::OpenFile(file_name) => { - let path = PathBuf::from(file_name); - send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(path))) - .unwrap(); - } - ApiCommand::SplitHorizontally => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalHorizontally(None)) - .unwrap(); - } - ApiCommand::SplitVertically => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalVertically(None)) - .unwrap(); - } - ApiCommand::MoveFocus => { - send_screen_instructions - .send(ScreenInstruction::FocusNextPane) - .unwrap(); - } - } - } - Err(err) => { - panic!("err {:?}", err); - } - } - } - } - }) - .unwrap(); - let _stdin_thread = thread::Builder::new() .name("stdin_handler".to_string()) .spawn({ let send_screen_instructions = send_screen_instructions.clone(); - let send_pty_instructions = send_pty_instructions.clone(); let send_plugin_instructions = send_plugin_instructions.clone(); let os_input = os_input.clone(); let config = config; @@ -642,13 +506,14 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { config, command_is_executing, send_screen_instructions, - send_pty_instructions, send_plugin_instructions, send_app_instructions, ) } }); + let mut server_stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); + #[warn(clippy::never_loop)] loop { let (app_instruction, mut err_ctx) = receive_app_instructions @@ -656,15 +521,17 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { .expect("failed to receive app instruction on channel"); err_ctx.add_call(ContextType::App(AppContext::from(&app_instruction))); + send_screen_instructions.update(err_ctx); match app_instruction { AppInstruction::Exit => { break; } AppInstruction::Error(backtrace) => { + let api_command = bincode::serialize(&(err_ctx, ApiCommand::Quit)).unwrap(); + server_stream.write_all(&api_command).unwrap(); + let _ = ipc_thread.join(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); - let _ = send_pty_instructions.send(PtyInstruction::Quit); - let _ = pty_thread.join(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); let _ = wasm_thread.join(); os_input.unset_raw_mode(0); @@ -680,11 +547,23 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { .unwrap(); std::process::exit(1); } + AppInstruction::ToScreen(instruction) => { + send_screen_instructions.send(instruction).unwrap(); + } + AppInstruction::ToPlugin(instruction) => { + send_plugin_instructions.send(instruction).unwrap(); + } + AppInstruction::ToPty(instruction) => { + let api_command = + bincode::serialize(&(err_ctx, ApiCommand::ToPty(instruction))).unwrap(); + server_stream.write_all(&api_command).unwrap(); + } } } - let _ = send_pty_instructions.send(PtyInstruction::Quit); - pty_thread.join().unwrap(); + let api_command = bincode::serialize(&(err_ctx, ApiCommand::Quit)).unwrap(); + server_stream.write_all(&api_command).unwrap(); + let _ = ipc_thread.join().unwrap(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 2c132228..108c04fd 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -6,16 +6,21 @@ use ::std::os::unix::io::RawFd; use ::std::pin::*; use ::std::sync::mpsc::Receiver; use ::std::time::{Duration, Instant}; +use ::vte; +use serde::{Deserialize, Serialize}; +use std::io::Write; +use std::os::unix::net::UnixStream; use std::path::PathBuf; -use super::{ScreenInstruction, SenderWithContext}; +use super::{ScreenInstruction, OPENCALLS}; +use crate::layout::Layout; use crate::os_input_output::OsApi; -use crate::utils::logging::debug_to_file; +use crate::utils::{consts::ZELLIJ_IPC_PIPE, logging::debug_to_file}; use crate::{ - errors::{get_current_ctx, ContextType, ErrorContext}, + common::ApiCommand, + errors::{ContextType, ErrorContext}, panes::PaneId, }; -use crate::{layout::Layout, wasm_vm::PluginInstruction}; pub struct ReadFromPid { pid: RawFd, @@ -63,10 +68,114 @@ impl Stream for ReadFromPid { } } -pub type VteBytes = Vec; +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum VteEvent { + // TODO: try not to allocate Vecs + Print(char), + Execute(u8), // byte + Hook(Vec, Vec, bool, char), // params, intermediates, ignore, char + Put(u8), // byte + Unhook, + OscDispatch(Vec>, bool), // params, bell_terminated + CsiDispatch(Vec, Vec, bool, char), // params, intermediates, ignore, char + EscDispatch(Vec, bool, u8), // intermediates, ignore, byte +} + +struct VteEventSender { + id: RawFd, + err_ctx: ErrorContext, + server_stream: UnixStream, +} + +impl VteEventSender { + pub fn new(id: RawFd, err_ctx: ErrorContext) -> Self { + VteEventSender { + id, + err_ctx, + server_stream: UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(), + } + } +} + +impl vte::Perform for VteEventSender { + fn print(&mut self, c: char) { + let api_command = bincode::serialize(&( + self.err_ctx, + ApiCommand::ToScreen(ScreenInstruction::Pty(self.id, VteEvent::Print(c))), + )) + .unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } + fn execute(&mut self, byte: u8) { + let api_command = bincode::serialize(&( + self.err_ctx, + ApiCommand::ToScreen(ScreenInstruction::Pty(self.id, VteEvent::Execute(byte))), + )) + .unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } + + fn hook(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { + let params = params.iter().copied().collect(); + let intermediates = intermediates.iter().copied().collect(); + let instruction = + ScreenInstruction::Pty(self.id, VteEvent::Hook(params, intermediates, ignore, c)); + let api_command = + bincode::serialize(&(self.err_ctx, ApiCommand::ToScreen(instruction))).unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } + + fn put(&mut self, byte: u8) { + let api_command = bincode::serialize(&( + self.err_ctx, + ApiCommand::ToScreen(ScreenInstruction::Pty(self.id, VteEvent::Put(byte))), + )) + .unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } + + fn unhook(&mut self) { + let api_command = bincode::serialize(&( + self.err_ctx, + ApiCommand::ToScreen(ScreenInstruction::Pty(self.id, VteEvent::Unhook)), + )) + .unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } + + fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { + let params = params.iter().map(|p| p.to_vec()).collect(); + let instruction = + ScreenInstruction::Pty(self.id, VteEvent::OscDispatch(params, bell_terminated)); + let api_command = + bincode::serialize(&(self.err_ctx, ApiCommand::ToScreen(instruction))).unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } + + fn csi_dispatch(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { + let params = params.iter().copied().collect(); + let intermediates = intermediates.iter().copied().collect(); + let instruction = ScreenInstruction::Pty( + self.id, + VteEvent::CsiDispatch(params, intermediates, ignore, c), + ); + let api_command = + bincode::serialize(&(self.err_ctx, ApiCommand::ToScreen(instruction))).unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } + + fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) { + let intermediates = intermediates.iter().copied().collect(); + let instruction = + ScreenInstruction::Pty(self.id, VteEvent::EscDispatch(intermediates, ignore, byte)); + let api_command = + bincode::serialize(&(self.err_ctx, ApiCommand::ToScreen(instruction))).unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } +} /// Instructions related to PTYs (pseudoterminals). -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub enum PtyInstruction { SpawnTerminal(Option), SpawnTerminalVertically(Option), @@ -78,25 +187,22 @@ pub enum PtyInstruction { } pub struct PtyBus { - pub send_screen_instructions: SenderWithContext, - pub send_plugin_instructions: SenderWithContext, pub receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, pub id_to_child_pid: HashMap, os_input: Box, debug_to_file: bool, task_handles: HashMap>, + pub server_stream: UnixStream, } -fn stream_terminal_bytes( - pid: RawFd, - send_screen_instructions: SenderWithContext, - os_input: Box, - debug: bool, -) -> JoinHandle<()> { - let mut err_ctx = get_current_ctx(); +fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> JoinHandle<()> { + let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); task::spawn({ async move { err_ctx.add_call(ContextType::AsyncTask); + let mut server_stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); + let mut vte_parser = vte::Parser::new(); + let mut vte_event_sender = VteEventSender::new(pid, err_ctx); let mut terminal_bytes = ReadFromPid::new(&pid, os_input); let mut last_byte_receive_time: Option = None; @@ -122,7 +228,12 @@ fn stream_terminal_bytes( Some(receive_time) => { if receive_time.elapsed() > max_render_pause { pending_render = false; - let _ = send_screen_instructions.send(ScreenInstruction::Render); + let api_command = bincode::serialize(&( + err_ctx, + ApiCommand::ToScreen(ScreenInstruction::Render), + )) + .unwrap(); + server_stream.write_all(&api_command).unwrap(); last_byte_receive_time = Some(Instant::now()); } else { pending_render = true; @@ -136,22 +247,31 @@ fn stream_terminal_bytes( } else { if pending_render { pending_render = false; - let _ = send_screen_instructions.send(ScreenInstruction::Render); + let api_command = bincode::serialize(&( + err_ctx, + ApiCommand::ToScreen(ScreenInstruction::Render), + )) + .unwrap(); + server_stream.write_all(&api_command).unwrap(); } last_byte_receive_time = None; task::sleep(::std::time::Duration::from_millis(10)).await; } } - send_screen_instructions - .send(ScreenInstruction::Render) - .unwrap(); + let api_command = + bincode::serialize(&(err_ctx, ApiCommand::ToScreen(ScreenInstruction::Render))) + .unwrap(); + server_stream.write_all(&api_command).unwrap(); #[cfg(not(test))] // 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 // a better solution would be to fix the test fakes, but this will do for now - send_screen_instructions - .send(ScreenInstruction::ClosePane(PaneId::Terminal(pid))) - .unwrap(); + let api_command = bincode::serialize(&( + err_ctx, + ApiCommand::ToScreen(ScreenInstruction::ClosePane(PaneId::Terminal(pid))), + )) + .unwrap(); + server_stream.write_all(&api_command).unwrap(); } }) } @@ -159,35 +279,29 @@ fn stream_terminal_bytes( impl PtyBus { pub fn new( receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, - send_screen_instructions: SenderWithContext, - send_plugin_instructions: SenderWithContext, os_input: Box, + server_stream: UnixStream, debug_to_file: bool, ) -> Self { PtyBus { - send_screen_instructions, - send_plugin_instructions, receive_pty_instructions, os_input, id_to_child_pid: HashMap::new(), debug_to_file, task_handles: HashMap::new(), + server_stream, } } pub fn spawn_terminal(&mut self, file_to_open: Option) -> RawFd { let (pid_primary, pid_secondary): (RawFd, RawFd) = self.os_input.spawn_terminal(file_to_open); - let task_handle = stream_terminal_bytes( - pid_primary, - self.send_screen_instructions.clone(), - self.os_input.clone(), - self.debug_to_file, - ); + let task_handle = + stream_terminal_bytes(pid_primary, self.os_input.clone(), self.debug_to_file); self.task_handles.insert(pid_primary, task_handle); self.id_to_child_pid.insert(pid_primary, pid_secondary); pid_primary } - pub fn spawn_terminals_for_layout(&mut self, layout: Layout) { + pub fn spawn_terminals_for_layout(&mut self, layout: Layout, err_ctx: ErrorContext) { let total_panes = layout.total_terminal_panes(); let mut new_pane_pids = vec![]; for _ in 0..total_panes { @@ -195,23 +309,21 @@ impl PtyBus { self.id_to_child_pid.insert(pid_primary, pid_secondary); new_pane_pids.push(pid_primary); } - self.send_screen_instructions - .send(ScreenInstruction::ApplyLayout(( + let api_command = bincode::serialize(&( + err_ctx, + ApiCommand::ToScreen(ScreenInstruction::ApplyLayout(( layout, new_pane_pids.clone(), - ))) - .unwrap(); + ))), + )) + .unwrap(); + self.server_stream.write_all(&api_command).unwrap(); for id in new_pane_pids { - let task_handle = stream_terminal_bytes( - id, - self.send_screen_instructions.clone(), - self.os_input.clone(), - self.debug_to_file, - ); + let task_handle = stream_terminal_bytes(id, self.os_input.clone(), self.debug_to_file); self.task_handles.insert(id, task_handle); } } - pub fn close_pane(&mut self, id: PaneId) { + pub fn close_pane(&mut self, id: PaneId, err_ctx: ErrorContext) { match id { PaneId::Terminal(id) => { let child_pid = self.id_to_child_pid.remove(&id).unwrap(); @@ -221,15 +333,16 @@ impl PtyBus { handle.cancel().await; }); } - PaneId::Plugin(pid) => drop( - self.send_plugin_instructions - .send(PluginInstruction::Unload(pid)), - ), + PaneId::Plugin(pid) => { + let api_command = + bincode::serialize(&(err_ctx, ApiCommand::ClosePluginPane(pid))).unwrap(); + self.server_stream.write_all(&api_command).unwrap(); + } } } - pub fn close_tab(&mut self, ids: Vec) { + pub fn close_tab(&mut self, ids: Vec, err_ctx: ErrorContext) { ids.iter().for_each(|&id| { - self.close_pane(id); + self.close_pane(id, err_ctx); }); } } @@ -238,7 +351,7 @@ impl Drop for PtyBus { fn drop(&mut self) { let child_ids: Vec = self.id_to_child_pid.keys().copied().collect(); for id in child_ids { - self.close_pane(PaneId::Terminal(id)); + self.close_pane(PaneId::Terminal(id), ErrorContext::new()); } } } diff --git a/src/common/screen.rs b/src/common/screen.rs index e6cf73f5..b6b8e7f2 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -1,5 +1,6 @@ //! Things related to [`Screen`]s. +use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::os::unix::io::RawFd; use std::str; @@ -16,7 +17,7 @@ use crate::{layout::Layout, panes::PaneId}; use zellij_tile::data::{Event, InputMode, ModeInfo, Palette, TabInfo}; /// Instructions that can be sent to the [`Screen`]. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub enum ScreenInstruction { PtyBytes(RawFd, VteBytes), Render, @@ -68,8 +69,6 @@ pub struct Screen { max_panes: Option, /// A map between this [`Screen`]'s tabs and their ID/key. tabs: BTreeMap, - /// A [`PtyInstruction`] and [`ErrorContext`] sender. - pub send_pty_instructions: SenderWithContext, /// A [`PluginInstruction`] and [`ErrorContext`] sender. pub send_plugin_instructions: SenderWithContext, /// An [`AppInstruction`] and [`ErrorContext`] sender. @@ -91,7 +90,6 @@ impl Screen { #[allow(clippy::too_many_arguments)] pub fn new( receive_screen_instructions: Receiver<(ScreenInstruction, ErrorContext)>, - send_pty_instructions: SenderWithContext, send_plugin_instructions: SenderWithContext, send_app_instructions: SenderWithContext, full_screen_ws: &PositionAndSize, @@ -104,7 +102,6 @@ impl Screen { Screen { receiver: receive_screen_instructions, max_panes, - send_pty_instructions, send_plugin_instructions, send_app_instructions, full_screen_ws: *full_screen_ws, @@ -128,7 +125,6 @@ impl Screen { String::new(), &self.full_screen_ws, self.os_api.clone(), - self.send_pty_instructions.clone(), self.send_plugin_instructions.clone(), self.send_app_instructions.clone(), self.max_panes, @@ -215,8 +211,8 @@ impl Screen { // 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 let _ = self - .send_pty_instructions - .send(PtyInstruction::CloseTab(pane_ids)); + .send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::CloseTab(pane_ids))); if self.tabs.is_empty() { self.active_tab_index = None; self.send_app_instructions @@ -285,7 +281,6 @@ impl Screen { String::new(), &self.full_screen_ws, self.os_api.clone(), - self.send_pty_instructions.clone(), self.send_plugin_instructions.clone(), self.send_app_instructions.clone(), self.max_panes, diff --git a/src/common/wasm_vm.rs b/src/common/wasm_vm.rs index bd98a85b..ddb7deaf 100644 --- a/src/common/wasm_vm.rs +++ b/src/common/wasm_vm.rs @@ -29,9 +29,7 @@ pub struct PluginEnv { pub plugin_id: u32, // FIXME: This should be a big bundle of all of the channels pub send_screen_instructions: SenderWithContext, - pub send_app_instructions: SenderWithContext, - pub send_pty_instructions: SenderWithContext, - pub send_plugin_instructions: SenderWithContext, + pub send_app_instructions: SenderWithContext, // FIXME: This should be a big bundle of all of the channels pub wasi_env: WasiEnv, pub subscriptions: Arc>>, } @@ -74,6 +72,16 @@ fn host_unsubscribe(plugin_env: &PluginEnv) { subscriptions.retain(|k| !old.contains(k)); } +fn host_open_file(plugin_env: &PluginEnv) { + let path = PathBuf::from(wasi_stdout(&plugin_env.wasi_env).lines().next().unwrap()); + plugin_env + .send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::SpawnTerminal(Some( + path, + )))) + .unwrap(); +} + fn host_set_selectable(plugin_env: &PluginEnv, selectable: i32) { let selectable = selectable != 0; plugin_env diff --git a/src/main.rs b/src/main.rs index ece55fa2..5fa9317e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,11 @@ mod cli; -mod common; -#[cfg(test)] -mod tests; -// TODO mod server; mod client; +mod common; +mod server; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::common::input::config::Config; +use crate::errors::ErrorContext; use crate::os_input_output::get_os_input; use crate::utils::{ consts::{ZELLIJ_IPC_PIPE, ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, @@ -36,23 +34,29 @@ pub fn main() { match split_dir { 'h' => { let mut stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); - let api_command = bincode::serialize(&ApiCommand::SplitHorizontally).unwrap(); + let api_command = + bincode::serialize(&(ErrorContext::new(), ApiCommand::SplitHorizontally)) + .unwrap(); stream.write_all(&api_command).unwrap(); } 'v' => { let mut stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); - let api_command = bincode::serialize(&ApiCommand::SplitVertically).unwrap(); + let api_command = + bincode::serialize(&(ErrorContext::new(), ApiCommand::SplitVertically)) + .unwrap(); stream.write_all(&api_command).unwrap(); } _ => {} }; } else if opts.move_focus { let mut stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); - let api_command = bincode::serialize(&ApiCommand::MoveFocus).unwrap(); + let api_command = + bincode::serialize(&(ErrorContext::new(), ApiCommand::MoveFocus)).unwrap(); stream.write_all(&api_command).unwrap(); } else if let Some(file_to_open) = opts.open_file { let mut stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); - let api_command = bincode::serialize(&ApiCommand::OpenFile(file_to_open)).unwrap(); + let api_command = + bincode::serialize(&(ErrorContext::new(), ApiCommand::OpenFile(file_to_open))).unwrap(); stream.write_all(&api_command).unwrap(); } else if let Some(crate::cli::ConfigCli::GenerateCompletion { shell }) = opts.option { let shell = match shell.as_ref() { diff --git a/src/server/mod.rs b/src/server/mod.rs index 626b4e6b..3db2ab52 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,5 +1,198 @@ -use super::super::common::{screen}; +use crate::cli::CliArgs; +use crate::command_is_executing::CommandIsExecuting; +use crate::common::{ + ApiCommand, AppInstruction, ChannelWithContext, SenderType, SenderWithContext, +}; +use crate::errors::{ContextType, ErrorContext, PtyContext}; +use crate::layout::Layout; +use crate::os_input_output::OsApi; +use crate::panes::PaneId; +use crate::pty_bus::{PtyBus, PtyInstruction}; +use crate::screen::ScreenInstruction; +use crate::utils::consts::ZELLIJ_IPC_PIPE; +use crate::wasm_vm::PluginInstruction; +use std::io::{Read, Write}; +use std::os::unix::net::UnixStream; +use std::path::PathBuf; +use std::sync::mpsc::channel; +use std::thread; -pub fn start_server() { - // TODO -} \ No newline at end of file +pub fn start_server( + os_input: Box, + opts: CliArgs, + command_is_executing: CommandIsExecuting, + mut send_app_instructions: SenderWithContext, +) -> thread::JoinHandle<()> { + let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = + channel(); + let mut send_pty_instructions = SenderWithContext::new( + ErrorContext::new(), + SenderType::Sender(send_pty_instructions), + ); + + std::fs::remove_file(ZELLIJ_IPC_PIPE).ok(); + let listener = std::os::unix::net::UnixListener::bind(ZELLIJ_IPC_PIPE) + .expect("could not listen on ipc socket"); + + // Don't use default layouts in tests, but do everywhere else + #[cfg(not(test))] + let default_layout = Some(PathBuf::from("default")); + #[cfg(test)] + let default_layout = None; + let maybe_layout = opts.layout.or(default_layout).map(Layout::new); + + let server_stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); + let mut pty_bus = PtyBus::new( + receive_pty_instructions, + os_input.clone(), + server_stream, + opts.debug, + ); + + let pty_thread = thread::Builder::new() + .name("pty".to_string()) + .spawn({ + let mut command_is_executing = command_is_executing.clone(); + send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); + move || loop { + let (event, mut err_ctx) = pty_bus + .receive_pty_instructions + .recv() + .expect("failed to receive event on channel"); + err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); + match event { + PtyInstruction::SpawnTerminal(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + let api_command = bincode::serialize(&( + err_ctx, + ApiCommand::ToScreen(ScreenInstruction::NewPane(PaneId::Terminal(pid))), + )) + .unwrap(); + pty_bus.server_stream.write_all(&api_command).unwrap(); + } + PtyInstruction::SpawnTerminalVertically(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + let api_command = bincode::serialize(&( + err_ctx, + ApiCommand::ToScreen(ScreenInstruction::VerticalSplit( + PaneId::Terminal(pid), + )), + )) + .unwrap(); + pty_bus.server_stream.write_all(&api_command).unwrap(); + } + PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + let api_command = bincode::serialize(&( + err_ctx, + ApiCommand::ToScreen(ScreenInstruction::HorizontalSplit( + PaneId::Terminal(pid), + )), + )) + .unwrap(); + pty_bus.server_stream.write_all(&api_command).unwrap(); + } + PtyInstruction::NewTab => { + if let Some(layout) = maybe_layout.clone() { + pty_bus.spawn_terminals_for_layout(layout, err_ctx); + } else { + let pid = pty_bus.spawn_terminal(None); + let api_command = bincode::serialize(&( + err_ctx, + ApiCommand::ToScreen(ScreenInstruction::NewTab(pid)), + )) + .unwrap(); + pty_bus.server_stream.write_all(&api_command).unwrap(); + } + } + PtyInstruction::ClosePane(id) => { + pty_bus.close_pane(id, err_ctx); + command_is_executing.done_closing_pane(); + } + PtyInstruction::CloseTab(ids) => { + pty_bus.close_tab(ids, err_ctx); + command_is_executing.done_closing_pane(); + } + PtyInstruction::Quit => { + break; + } + } + } + }) + .unwrap(); + + thread::Builder::new() + .name("ipc_server".to_string()) + .spawn({ + move || { + for stream in listener.incoming() { + match stream { + Ok(mut stream) => { + let mut buffer = [0; 65535]; // TODO: more accurate + let bytes = stream + .read(&mut buffer) + .expect("failed to parse ipc message"); + println!("{}\n\n", bytes); + let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = + bincode::deserialize(&buffer[0..bytes]) + .expect("failed to deserialize ipc message"); + err_ctx.add_call(ContextType::IPCServer); + send_pty_instructions.update(err_ctx); + send_app_instructions.update(err_ctx); + + match decoded { + ApiCommand::OpenFile(file_name) => { + let path = PathBuf::from(file_name); + send_pty_instructions + .send(PtyInstruction::SpawnTerminal(Some(path))) + .unwrap(); + } + ApiCommand::SplitHorizontally => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalHorizontally(None)) + .unwrap(); + } + ApiCommand::SplitVertically => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalVertically(None)) + .unwrap(); + } + ApiCommand::MoveFocus => { + send_app_instructions + .send(AppInstruction::ToScreen( + ScreenInstruction::MoveFocus, + )) + .unwrap(); + } + ApiCommand::ToPty(instruction) => { + send_pty_instructions.send(instruction).unwrap(); + } + ApiCommand::ToScreen(instruction) => { + send_app_instructions + .send(AppInstruction::ToScreen(instruction)) + .unwrap(); + } + ApiCommand::ClosePluginPane(pid) => { + send_app_instructions + .send(AppInstruction::ToPlugin(PluginInstruction::Unload( + pid, + ))) + .unwrap(); + } + ApiCommand::Quit => { + send_pty_instructions.send(PtyInstruction::Quit).unwrap(); + break; + } + } + } + Err(err) => { + panic!("err {:?}", err); + } + } + } + + let _ = pty_thread.join(); + } + }) + .unwrap() +} From 715e5f9785404e4545747c4c9c944f0051f85358 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 11 Feb 2021 21:29:53 +0530 Subject: [PATCH 02/64] remove debug logs --- src/server/mod.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 3db2ab52..e385c9ea 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -129,12 +129,11 @@ pub fn start_server( match stream { Ok(mut stream) => { let mut buffer = [0; 65535]; // TODO: more accurate - let bytes = stream + let _ = stream .read(&mut buffer) .expect("failed to parse ipc message"); - println!("{}\n\n", bytes); let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = - bincode::deserialize(&buffer[0..bytes]) + bincode::deserialize(&buffer) .expect("failed to deserialize ipc message"); err_ctx.add_call(ContextType::IPCServer); send_pty_instructions.update(err_ctx); From 685e2eef0ca340f48f5125a13918ca30656aabd5 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 11 Feb 2021 23:07:54 +0530 Subject: [PATCH 03/64] Introduce IpcSenderWithContext --- src/common/mod.rs | 44 +++++++++-- src/common/pty_bus.rs | 175 +++++++++++++++++++----------------------- src/main.rs | 84 +++++++++++--------- src/server/mod.rs | 57 +++++++------- 4 files changed, 190 insertions(+), 170 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 61897df0..c1b14a0d 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -122,6 +122,37 @@ thread_local!( /// stack in the form of an [`ErrorContext`]. static OPENCALLS: RefCell = RefCell::default() ); +pub struct IpcSenderWithContext { + err_ctx: ErrorContext, + sender: UnixStream, +} + +impl IpcSenderWithContext { + pub fn new() -> Self { + Self { + err_ctx: ErrorContext::new(), + sender: UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(), + } + } + + pub fn update(&mut self, ctx: ErrorContext) { + self.err_ctx = ctx; + } + + pub fn send(&mut self, msg: ApiCommand) -> std::io::Result<()> { + let command = bincode::serialize(&(self.err_ctx, msg)).unwrap(); + self.sender.write_all(&command) + } +} + +impl std::clone::Clone for IpcSenderWithContext { + fn clone(&self) -> Self { + Self { + err_ctx: self.err_ctx, + sender: UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(), + } + } +} task_local! { /// A key to some task local storage that holds a representation of the task's call @@ -512,7 +543,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } }); - let mut server_stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); + let mut send_server_instructions = IpcSenderWithContext::new(); #[warn(clippy::never_loop)] loop { @@ -522,13 +553,13 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { err_ctx.add_call(ContextType::App(AppContext::from(&app_instruction))); send_screen_instructions.update(err_ctx); + send_server_instructions.update(err_ctx); match app_instruction { AppInstruction::Exit => { break; } AppInstruction::Error(backtrace) => { - let api_command = bincode::serialize(&(err_ctx, ApiCommand::Quit)).unwrap(); - server_stream.write_all(&api_command).unwrap(); + let _ = send_server_instructions.send(ApiCommand::Quit); let _ = ipc_thread.join(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); @@ -554,15 +585,12 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { send_plugin_instructions.send(instruction).unwrap(); } AppInstruction::ToPty(instruction) => { - let api_command = - bincode::serialize(&(err_ctx, ApiCommand::ToPty(instruction))).unwrap(); - server_stream.write_all(&api_command).unwrap(); + let _ = send_server_instructions.send(ApiCommand::ToPty(instruction)); } } } - let api_command = bincode::serialize(&(err_ctx, ApiCommand::Quit)).unwrap(); - server_stream.write_all(&api_command).unwrap(); + let _ = send_server_instructions.send(ApiCommand::Quit); let _ = ipc_thread.join().unwrap(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 108c04fd..63162356 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -8,14 +8,12 @@ use ::std::sync::mpsc::Receiver; use ::std::time::{Duration, Instant}; use ::vte; use serde::{Deserialize, Serialize}; -use std::io::Write; -use std::os::unix::net::UnixStream; use std::path::PathBuf; -use super::{ScreenInstruction, OPENCALLS}; +use super::{IpcSenderWithContext, ScreenInstruction, OPENCALLS}; use crate::layout::Layout; use crate::os_input_output::OsApi; -use crate::utils::{consts::ZELLIJ_IPC_PIPE, logging::debug_to_file}; +use crate::utils::logging::debug_to_file; use crate::{ common::ApiCommand, errors::{ContextType, ErrorContext}, @@ -83,94 +81,94 @@ pub enum VteEvent { struct VteEventSender { id: RawFd, - err_ctx: ErrorContext, - server_stream: UnixStream, + send_server_instructions: IpcSenderWithContext, } impl VteEventSender { - pub fn new(id: RawFd, err_ctx: ErrorContext) -> Self { + pub fn new(id: RawFd, send_server_instructions: IpcSenderWithContext) -> Self { VteEventSender { id, - err_ctx, - server_stream: UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(), + send_server_instructions, } } } impl vte::Perform for VteEventSender { fn print(&mut self, c: char) { - let api_command = bincode::serialize(&( - self.err_ctx, - ApiCommand::ToScreen(ScreenInstruction::Pty(self.id, VteEvent::Print(c))), - )) - .unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + self.id, + VteEvent::Print(c), + ))) + .unwrap(); } fn execute(&mut self, byte: u8) { - let api_command = bincode::serialize(&( - self.err_ctx, - ApiCommand::ToScreen(ScreenInstruction::Pty(self.id, VteEvent::Execute(byte))), - )) - .unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + self.id, + VteEvent::Execute(byte), + ))) + .unwrap(); } fn hook(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); - let instruction = - ScreenInstruction::Pty(self.id, VteEvent::Hook(params, intermediates, ignore, c)); - let api_command = - bincode::serialize(&(self.err_ctx, ApiCommand::ToScreen(instruction))).unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + self.id, + VteEvent::Hook(params, intermediates, ignore, c), + ))) + .unwrap(); } fn put(&mut self, byte: u8) { - let api_command = bincode::serialize(&( - self.err_ctx, - ApiCommand::ToScreen(ScreenInstruction::Pty(self.id, VteEvent::Put(byte))), - )) - .unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + self.id, + VteEvent::Put(byte), + ))) + .unwrap(); } fn unhook(&mut self) { - let api_command = bincode::serialize(&( - self.err_ctx, - ApiCommand::ToScreen(ScreenInstruction::Pty(self.id, VteEvent::Unhook)), - )) - .unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + self.id, + VteEvent::Unhook, + ))) + .unwrap(); } fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { let params = params.iter().map(|p| p.to_vec()).collect(); - let instruction = - ScreenInstruction::Pty(self.id, VteEvent::OscDispatch(params, bell_terminated)); - let api_command = - bincode::serialize(&(self.err_ctx, ApiCommand::ToScreen(instruction))).unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + self.id, + VteEvent::OscDispatch(params, bell_terminated), + ))) + .unwrap(); } fn csi_dispatch(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); - let instruction = ScreenInstruction::Pty( - self.id, - VteEvent::CsiDispatch(params, intermediates, ignore, c), - ); - let api_command = - bincode::serialize(&(self.err_ctx, ApiCommand::ToScreen(instruction))).unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + self.id, + VteEvent::CsiDispatch(params, intermediates, ignore, c), + ))) + .unwrap(); } fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) { let intermediates = intermediates.iter().copied().collect(); - let instruction = - ScreenInstruction::Pty(self.id, VteEvent::EscDispatch(intermediates, ignore, byte)); - let api_command = - bincode::serialize(&(self.err_ctx, ApiCommand::ToScreen(instruction))).unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + self.id, + VteEvent::EscDispatch(intermediates, ignore, byte), + ))) + .unwrap(); } } @@ -192,7 +190,7 @@ pub struct PtyBus { os_input: Box, debug_to_file: bool, task_handles: HashMap>, - pub server_stream: UnixStream, + pub send_server_instructions: IpcSenderWithContext, } fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> JoinHandle<()> { @@ -200,9 +198,10 @@ fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> J task::spawn({ async move { err_ctx.add_call(ContextType::AsyncTask); - let mut server_stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); + let mut send_server_instructions = IpcSenderWithContext::new(); + send_server_instructions.update(err_ctx); let mut vte_parser = vte::Parser::new(); - let mut vte_event_sender = VteEventSender::new(pid, err_ctx); + let mut vte_event_sender = VteEventSender::new(pid, send_server_instructions.clone()); let mut terminal_bytes = ReadFromPid::new(&pid, os_input); let mut last_byte_receive_time: Option = None; @@ -228,12 +227,9 @@ fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> J Some(receive_time) => { if receive_time.elapsed() > max_render_pause { pending_render = false; - let api_command = bincode::serialize(&( - err_ctx, - ApiCommand::ToScreen(ScreenInstruction::Render), - )) - .unwrap(); - server_stream.write_all(&api_command).unwrap(); + send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Render)) + .unwrap(); last_byte_receive_time = Some(Instant::now()); } else { pending_render = true; @@ -247,31 +243,26 @@ fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> J } else { if pending_render { pending_render = false; - let api_command = bincode::serialize(&( - err_ctx, - ApiCommand::ToScreen(ScreenInstruction::Render), - )) - .unwrap(); - server_stream.write_all(&api_command).unwrap(); + send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Render)) + .unwrap(); } last_byte_receive_time = None; task::sleep(::std::time::Duration::from_millis(10)).await; } } - let api_command = - bincode::serialize(&(err_ctx, ApiCommand::ToScreen(ScreenInstruction::Render))) - .unwrap(); - server_stream.write_all(&api_command).unwrap(); + send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::Render)) + .unwrap(); #[cfg(not(test))] // 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 // a better solution would be to fix the test fakes, but this will do for now - let api_command = bincode::serialize(&( - err_ctx, - ApiCommand::ToScreen(ScreenInstruction::ClosePane(PaneId::Terminal(pid))), - )) - .unwrap(); - server_stream.write_all(&api_command).unwrap(); + send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::ClosePane( + PaneId::Terminal(pid), + ))) + .unwrap(); } }) } @@ -280,7 +271,7 @@ impl PtyBus { pub fn new( receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, os_input: Box, - server_stream: UnixStream, + send_server_instructions: IpcSenderWithContext, debug_to_file: bool, ) -> Self { PtyBus { @@ -289,7 +280,7 @@ impl PtyBus { id_to_child_pid: HashMap::new(), debug_to_file, task_handles: HashMap::new(), - server_stream, + send_server_instructions, } } pub fn spawn_terminal(&mut self, file_to_open: Option) -> RawFd { @@ -309,15 +300,12 @@ impl PtyBus { self.id_to_child_pid.insert(pid_primary, pid_secondary); new_pane_pids.push(pid_primary); } - let api_command = bincode::serialize(&( - err_ctx, - ApiCommand::ToScreen(ScreenInstruction::ApplyLayout(( + self.send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::ApplyLayout(( layout, new_pane_pids.clone(), - ))), - )) - .unwrap(); - self.server_stream.write_all(&api_command).unwrap(); + )))) + .unwrap(); for id in new_pane_pids { let task_handle = stream_terminal_bytes(id, self.os_input.clone(), self.debug_to_file); self.task_handles.insert(id, task_handle); @@ -333,11 +321,10 @@ impl PtyBus { handle.cancel().await; }); } - PaneId::Plugin(pid) => { - let api_command = - bincode::serialize(&(err_ctx, ApiCommand::ClosePluginPane(pid))).unwrap(); - self.server_stream.write_all(&api_command).unwrap(); - } + PaneId::Plugin(pid) => self + .send_server_instructions + .send(ApiCommand::ClosePluginPane(pid)) + .unwrap(), } } pub fn close_tab(&mut self, ids: Vec, err_ctx: ErrorContext) { diff --git a/src/main.rs b/src/main.rs index 5fa9317e..11355fbb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,12 +3,20 @@ mod client; mod common; mod server; +use client::{boundaries, layout, panes, tab}; +use common::{ + command_is_executing, errors, ipc, os_input_output, pty_bus, screen, start, utils, wasm_vm, + ApiCommand, IpcSenderWithContext, +}; +use directories_next::ProjectDirs; + +use structopt::StructOpt; + use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::errors::ErrorContext; use crate::os_input_output::get_os_input; use crate::utils::{ - consts::{ZELLIJ_IPC_PIPE, ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, + consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, logging::*, }; use client::{boundaries, layout, panes, tab}; @@ -22,6 +30,27 @@ use std::os::unix::net::UnixStream; use structopt::StructOpt; pub fn main() { + // First run installation of default plugins & layouts + let project_dirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); + let data_dir = project_dirs.data_dir(); + let mut assets = asset_map! { + "assets/layouts/default.yaml" => "layouts/default.yaml", + "assets/layouts/strider.yaml" => "layouts/strider.yaml", + }; + assets.extend(asset_map! { + "assets/plugins/status-bar.wasm" => "plugins/status-bar.wasm", + "assets/plugins/tab-bar.wasm" => "plugins/tab-bar.wasm", + "assets/plugins/strider.wasm" => "plugins/strider.wasm", + }); + + for (path, bytes) in assets { + let path = data_dir.join(path); + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + if !path.exists() { + std::fs::write(path, bytes).expect("Failed to install default assets!"); + } + } + let opts = CliArgs::from_args(); let config = match Config::try_from(&opts) { Ok(config) => config, @@ -33,48 +62,29 @@ pub fn main() { if let Some(split_dir) = opts.split { match split_dir { 'h' => { - let mut stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); - let api_command = - bincode::serialize(&(ErrorContext::new(), ApiCommand::SplitHorizontally)) - .unwrap(); - stream.write_all(&api_command).unwrap(); + let mut send_server_instructions = IpcSenderWithContext::new(); + send_server_instructions + .send(ApiCommand::SplitHorizontally) + .unwrap(); } 'v' => { - let mut stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); - let api_command = - bincode::serialize(&(ErrorContext::new(), ApiCommand::SplitVertically)) - .unwrap(); - stream.write_all(&api_command).unwrap(); + let mut send_server_instructions = IpcSenderWithContext::new(); + send_server_instructions + .send(ApiCommand::SplitVertically) + .unwrap(); } _ => {} }; } else if opts.move_focus { - let mut stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); - let api_command = - bincode::serialize(&(ErrorContext::new(), ApiCommand::MoveFocus)).unwrap(); - stream.write_all(&api_command).unwrap(); + let mut send_server_instructions = IpcSenderWithContext::new(); + send_server_instructions + .send(ApiCommand::MoveFocus) + .unwrap(); } else if let Some(file_to_open) = opts.open_file { - let mut stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); - let api_command = - bincode::serialize(&(ErrorContext::new(), ApiCommand::OpenFile(file_to_open))).unwrap(); - stream.write_all(&api_command).unwrap(); - } else if let Some(crate::cli::ConfigCli::GenerateCompletion { shell }) = opts.option { - let shell = match shell.as_ref() { - "bash" => structopt::clap::Shell::Bash, - "fish" => structopt::clap::Shell::Fish, - "zsh" => structopt::clap::Shell::Zsh, - "powerShell" => structopt::clap::Shell::PowerShell, - "elvish" => structopt::clap::Shell::Elvish, - other => { - eprintln!("Unsupported shell: {}", other); - std::process::exit(1); - } - }; - let mut out = std::io::stdout(); - CliArgs::clap().gen_completions_to("zellij", shell, &mut out); - } else if let Some(crate::cli::ConfigCli::Setup { .. }) = opts.option { - setup::dump_default_config().expect("Failed to print to stdout"); - std::process::exit(1); + let mut send_server_instructions = IpcSenderWithContext::new(); + send_server_instructions + .send(ApiCommand::OpenFile(file_to_open)) + .unwrap(); } else { let os_input = get_os_input(); atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); diff --git a/src/server/mod.rs b/src/server/mod.rs index e385c9ea..ada8826e 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,7 +1,8 @@ use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; use crate::common::{ - ApiCommand, AppInstruction, ChannelWithContext, SenderType, SenderWithContext, + ApiCommand, AppInstruction, ChannelWithContext, IpcSenderWithContext, SenderType, + SenderWithContext, }; use crate::errors::{ContextType, ErrorContext, PtyContext}; use crate::layout::Layout; @@ -11,8 +12,7 @@ use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; use crate::utils::consts::ZELLIJ_IPC_PIPE; use crate::wasm_vm::PluginInstruction; -use std::io::{Read, Write}; -use std::os::unix::net::UnixStream; +use std::io::Read; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; @@ -41,11 +41,12 @@ pub fn start_server( let default_layout = None; let maybe_layout = opts.layout.or(default_layout).map(Layout::new); - let server_stream = UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(); + let send_server_instructions = IpcSenderWithContext::new(); + let mut pty_bus = PtyBus::new( receive_pty_instructions, os_input.clone(), - server_stream, + send_server_instructions, opts.debug, ); @@ -63,46 +64,40 @@ pub fn start_server( match event { PtyInstruction::SpawnTerminal(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - let api_command = bincode::serialize(&( - err_ctx, - ApiCommand::ToScreen(ScreenInstruction::NewPane(PaneId::Terminal(pid))), - )) - .unwrap(); - pty_bus.server_stream.write_all(&api_command).unwrap(); + pty_bus + .send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::NewPane( + PaneId::Terminal(pid), + ))) + .unwrap(); } PtyInstruction::SpawnTerminalVertically(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - let api_command = bincode::serialize(&( - err_ctx, - ApiCommand::ToScreen(ScreenInstruction::VerticalSplit( + pty_bus + .send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::VerticalSplit( PaneId::Terminal(pid), - )), - )) - .unwrap(); - pty_bus.server_stream.write_all(&api_command).unwrap(); + ))) + .unwrap(); } PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - let api_command = bincode::serialize(&( - err_ctx, - ApiCommand::ToScreen(ScreenInstruction::HorizontalSplit( + pty_bus + .send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::HorizontalSplit( PaneId::Terminal(pid), - )), - )) - .unwrap(); - pty_bus.server_stream.write_all(&api_command).unwrap(); + ))) + .unwrap(); } PtyInstruction::NewTab => { if let Some(layout) = maybe_layout.clone() { pty_bus.spawn_terminals_for_layout(layout, err_ctx); } else { let pid = pty_bus.spawn_terminal(None); - let api_command = bincode::serialize(&( - err_ctx, - ApiCommand::ToScreen(ScreenInstruction::NewTab(pid)), - )) - .unwrap(); - pty_bus.server_stream.write_all(&api_command).unwrap(); + pty_bus + .send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid))) + .unwrap(); } } PtyInstruction::ClosePane(id) => { From 7beb24625015b9713b617b2070cca495707edcee Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 12 Feb 2021 11:39:02 +0530 Subject: [PATCH 04/64] try fixes --- abc.txt | 12228 ++++++++++++++++++++++++++++++++++++++++ src/common/errors.rs | 2 +- src/common/mod.rs | 29 +- src/common/pty_bus.rs | 5 +- src/common/screen.rs | 4 +- src/server/mod.rs | 149 +- 6 files changed, 12333 insertions(+), 84 deletions(-) create mode 100644 abc.txt diff --git a/abc.txt b/abc.txt new file mode 100644 index 00000000..a762fc0d --- /dev/null +++ b/abc.txt @@ -0,0 +1,12228 @@ +warning: unused variable: `release` + --> build.rs:32:9 + | +32 | let release = if var("PROFILE").unwrap() == "release" { + | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_release` + | + = note: `#[warn(unused_variables)]` on by default + +warning: unused `std::result::Result` that must be used + --> build.rs:41:9 + | +41 | set_current_dir(&path); + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(unused_must_use)]` on by default + = note: this `Result` may be an `Err` variant, which should be handled + +warning: unused `std::result::Result` that must be used + --> build.rs:61:5 + | +61 | set_current_dir(&starting_dir); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this `Result` may be an `Err` variant, which should be handled + +warning: 3 warnings emitted + +warning: unused import: `crate::utils::logging::debug_log_to_file` + --> src/common/wasm_vm.rs:8:5 + | +8 | use crate::utils::logging::debug_log_to_file; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(unused_imports)]` on by default + +warning: unused import: `crate::layout::Layout` + --> src/server/mod.rs:8:5 + | +8 | use crate::layout::Layout; + | ^^^^^^^^^^^^^^^^^^^^^ + +warning: unused import: `ipc` + --> src/main.rs:11:35 + | +11 | command_is_executing, errors, ipc, os_input_output, pty_bus, screen, start, utils, wasm_vm, + | ^^^ + +warning: unused variable: `ipc_thread` + --> src/common/mod.rs:194:9 + | +194 | let ipc_thread = start_server( + | ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_ipc_thread` + | + = note: `#[warn(unused_variables)]` on by default + +warning: unused variable: `err_ctx` + --> src/common/pty_bus.rs:294:72 + | +294 | pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { + | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_err_ctx` + +warning: unused variable: `err_ctx` + --> src/common/pty_bus.rs:314:46 + | +314 | pub fn close_pane(&mut self, id: PaneId, err_ctx: ErrorContext) { + | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_err_ctx` + +warning: unused variable: `maybe_layout` + --> src/server/mod.rs:42:9 + | +42 | let maybe_layout = opts.layout.or(default_layout); + | ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_maybe_layout` + | + = note: `#[warn(unused_variables)]` on by default + +warning: unused variable: `bytes` + --> src/server/mod.rs:156:13 + | +156 | let bytes = stream + | ^^^^^ help: if this is intentional, prefix it with an underscore: `_bytes` + +warning: variable does not need to be mutable + --> src/server/mod.rs:24:5 + | +24 | mut send_app_instructions: SenderWithContext, + | ----^^^^^^^^^^^^^^^^^^^^^ + | | + | help: remove this `mut` + | + = note: `#[warn(unused_mut)]` on by default + +warning: variable does not need to be mutable + --> src/server/mod.rs:28:9 + | +28 | let mut send_pty_instructions = SenderWithContext::new( + | ----^^^^^^^^^^^^^^^^^^^^^ + | | + | help: remove this `mut` + +warning: associated function is never used: `total_terminal_panes` + --> src/client/layout.rs:203:12 + | +203 | pub fn total_terminal_panes(&self) -> usize { + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(dead_code)]` on by default + +warning: function is never used: `start_client` + --> src/client/mod.rs:6:8 + | +6 | pub fn start_client() {} + | ^^^^^^^^^^^^ + +warning: enum is never used: `ServerToClientMsg` + --> src/common/ipc.rs:41:10 + | +41 | pub enum ServerToClientMsg { + | ^^^^^^^^^^^^^^^^^ + +warning: associated function is never used: `spawn_terminals_for_layout` + --> src/common/pty_bus.rs:294:12 + | +294 | pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +warning: field is never read: `sender` + --> src/common/mod.rs:117:5 + | +117 | sender: UnixStream, + | ^^^^^^^^^^^^^^^^^^ + +warning: unused `std::result::Result` that must be used + --> src/client/tab.rs:1904:9 + | +1904 | / debug_log_to_file(format!( +1905 | | "set_pane_invisible_borders: {:?}", +1906 | | invisible_borders +1907 | | )); + | |___________^ + | + = note: `#[warn(unused_must_use)]` on by default + = note: this `Result` may be an `Err` variant, which should be handled + +warning: unused `std::result::Result` that must be used + --> src/server/mod.rs:141:21 + | +141 | t.join(); + | ^^^^^^^^^ + | + = note: `#[warn(unused_must_use)]` on by default + = note: this `Result` may be an `Err` variant, which should be handled + +warning: 17 warnings emitted + + Finished dev [unoptimized + debuginfo] target(s) in 0.96s + Running `target/debug/zellij` +Ipcsender sending ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('k'))) +Ipcsender sending ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('k'))) +Ipcsender sending ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('k'))) +Ipcsender sending ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Ipcsender sending ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Ipcsender sending ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Render) +Server received ToScreen(Render) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Render) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Render) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('C'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('4'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('E'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('7'))) +Server received ToScreen(Pty(5, Print('N'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('6'))) +Server received ToScreen(Pty(5, Print('0'))) +Server received ToScreen(Pty(5, Print('U'))) +Server received ToScreen(Pty(5, Print(':'))) +Server received ToScreen(Pty(5, Print('1'))) +Server received ToScreen(Pty(5, Print('5'))) +Server received ToScreen(Pty(5, Print('R'))) +Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) +Server received ToScreen(Pty(5, Print('X'))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('-'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('@'))) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('u'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(NewTab(5)) +Server received ToScreen(Pty(5, Print('a'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Execute(0))) +Server received ToScreen(Pty(5, Print(' '))) +Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Render) +Server received ToScreen(Pty(5, Print('$'))) +Server received ToScreen(Pty(5, Print('i'))) +Server received ToScreen(Pty(5, Print('j'))) +Server received ToScreen(Pty(5, Print('z'))) +Server received ToScreen(Pty(5, Print('l'))) +Server received ToScreen(Pty(5, Print('k'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) +Server received ToScreen(Pty(5, Print('p'))) +Server received ToScreen(Pty(5, Print('t'))) +Server received ToScreen(Pty(5, Print('s'))) +Server received ToScreen(Pty(5, Print('v'))) +Server received ToScreen(Pty(5, Print('n'))) +Server received ToScreen(Pty(5, Print('m'))) +Server received ToScreen(Pty(5, Print('d'))) +Server received ToScreen(Pty(5, Print('D'))) +Server received ToScreen(Pty(5, Print('c'))) +Server received ToScreen(Pty(5, Print('e'))) +Server received ToScreen(Pty(5, Print('/'))) +Server received ToScreen(Pty(5, Print('2'))) +Server received ToScreen(Pty(5, Print('o'))) +Server received ToScreen(Pty(5, Print('e'))) +Ipcsender sending Quit +Server received Quit diff --git a/src/common/errors.rs b/src/common/errors.rs index a9156ae6..94682ebc 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -64,7 +64,7 @@ pub fn handle_panic( }; if thread == "main" { - println!("{}", backtrace); + eprintln!("{}", backtrace); process::exit(1); } else { send_app_instructions diff --git a/src/common/mod.rs b/src/common/mod.rs index c1b14a0d..4c8ab4c0 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -24,6 +24,7 @@ use std::{ }; use crate::cli::CliArgs; +use crate::layout::Layout; use crate::server::start_server; use command_is_executing::CommandIsExecuting; use errors::{AppContext, ContextType, ErrorContext, PluginContext, ScreenContext}; @@ -140,8 +141,11 @@ impl IpcSenderWithContext { } pub fn send(&mut self, msg: ApiCommand) -> std::io::Result<()> { + eprintln!("Ipcsender sending {:?}", msg); let command = bincode::serialize(&(self.err_ctx, msg)).unwrap(); - self.sender.write_all(&command) + UnixStream::connect(MOSAIC_IPC_PIPE) + .unwrap() + .write_all(&command) } } @@ -395,7 +399,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { ScreenInstruction::SwitchTabPrev => screen.switch_tab_prev(), ScreenInstruction::CloseTab => screen.close_tab(), ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => { - screen.apply_layout(layout, new_pane_pids); + screen.apply_layout(Layout::new(layout), new_pane_pids); command_is_executing.done_opening_new_pane(); } ScreenInstruction::GoToTab(tab_index) => { @@ -560,22 +564,20 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } AppInstruction::Error(backtrace) => { let _ = send_server_instructions.send(ApiCommand::Quit); - let _ = ipc_thread.join(); + //let _ = ipc_thread.join(); + //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); let _ = wasm_thread.join(); os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); - let restore_snapshot = "\u{1b}[?1049l"; - let error = format!( - "{}\n{}{}", - goto_start_of_last_line, restore_snapshot, backtrace - ); - let _ = os_input - .get_stdout_writer() - .write(error.as_bytes()) - .unwrap(); + let error = format!("{}\n{}", goto_start_of_last_line, backtrace); + //let _ = os_input + // .get_stdout_writer() + // .write(error.as_bytes()) + // .unwrap(); + eprintln!("{}", error); std::process::exit(1); } AppInstruction::ToScreen(instruction) => { @@ -591,7 +593,8 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } let _ = send_server_instructions.send(ApiCommand::Quit); - let _ = ipc_thread.join().unwrap(); + //let _ = ipc_thread.join().unwrap(); + //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 63162356..5fa3d048 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -292,7 +292,8 @@ impl PtyBus { self.id_to_child_pid.insert(pid_primary, pid_secondary); pid_primary } - pub fn spawn_terminals_for_layout(&mut self, layout: Layout, err_ctx: ErrorContext) { + pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { + let layout = Layout::new(layout_path.clone()); let total_panes = layout.total_terminal_panes(); let mut new_pane_pids = vec![]; for _ in 0..total_panes { @@ -302,7 +303,7 @@ impl PtyBus { } self.send_server_instructions .send(ApiCommand::ToScreen(ScreenInstruction::ApplyLayout(( - layout, + layout_path, new_pane_pids.clone(), )))) .unwrap(); diff --git a/src/common/screen.rs b/src/common/screen.rs index b6b8e7f2..dc628a4b 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::os::unix::io::RawFd; -use std::str; +use std::path::PathBuf; use std::sync::mpsc::Receiver; use super::{AppInstruction, SenderWithContext}; @@ -48,7 +48,7 @@ pub enum ScreenInstruction { SetMaxHeight(PaneId, usize), SetInvisibleBorders(PaneId, bool), ClosePane(PaneId), - ApplyLayout((Layout, Vec)), + ApplyLayout((PathBuf, Vec)), NewTab(RawFd), SwitchTabNext, SwitchTabPrev, diff --git a/src/server/mod.rs b/src/server/mod.rs index ada8826e..0ba19568 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -39,7 +39,7 @@ pub fn start_server( let default_layout = Some(PathBuf::from("default")); #[cfg(test)] let default_layout = None; - let maybe_layout = opts.layout.or(default_layout).map(Layout::new); + let maybe_layout = opts.layout.or(default_layout); let send_server_instructions = IpcSenderWithContext::new(); @@ -90,15 +90,15 @@ pub fn start_server( .unwrap(); } PtyInstruction::NewTab => { - if let Some(layout) = maybe_layout.clone() { - pty_bus.spawn_terminals_for_layout(layout, err_ctx); - } else { - let pid = pty_bus.spawn_terminal(None); - pty_bus - .send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid))) - .unwrap(); - } + //if let Some(layout) = maybe_layout.clone() { + // pty_bus.spawn_terminals_for_layout(layout, err_ctx); + //} else { + let pid = pty_bus.spawn_terminal(None); + pty_bus + .send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid))) + .unwrap(); + //} } PtyInstruction::ClosePane(id) => { pty_bus.close_pane(id, err_ctx); @@ -120,64 +120,15 @@ pub fn start_server( .name("ipc_server".to_string()) .spawn({ move || { + let mut threads = vec![]; for stream in listener.incoming() { match stream { - Ok(mut stream) => { - let mut buffer = [0; 65535]; // TODO: more accurate - let _ = stream - .read(&mut buffer) - .expect("failed to parse ipc message"); - let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = - bincode::deserialize(&buffer) - .expect("failed to deserialize ipc message"); - err_ctx.add_call(ContextType::IPCServer); - send_pty_instructions.update(err_ctx); - send_app_instructions.update(err_ctx); - - match decoded { - ApiCommand::OpenFile(file_name) => { - let path = PathBuf::from(file_name); - send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(path))) - .unwrap(); - } - ApiCommand::SplitHorizontally => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalHorizontally(None)) - .unwrap(); - } - ApiCommand::SplitVertically => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalVertically(None)) - .unwrap(); - } - ApiCommand::MoveFocus => { - send_app_instructions - .send(AppInstruction::ToScreen( - ScreenInstruction::MoveFocus, - )) - .unwrap(); - } - ApiCommand::ToPty(instruction) => { - send_pty_instructions.send(instruction).unwrap(); - } - ApiCommand::ToScreen(instruction) => { - send_app_instructions - .send(AppInstruction::ToScreen(instruction)) - .unwrap(); - } - ApiCommand::ClosePluginPane(pid) => { - send_app_instructions - .send(AppInstruction::ToPlugin(PluginInstruction::Unload( - pid, - ))) - .unwrap(); - } - ApiCommand::Quit => { - send_pty_instructions.send(PtyInstruction::Quit).unwrap(); - break; - } - } + Ok(stream) => { + let send_app_instructions = send_app_instructions.clone(); + let send_pty_instructions = send_pty_instructions.clone(); + threads.push(thread::spawn(move || { + handle_stream(send_pty_instructions, send_app_instructions, stream); + })); } Err(err) => { panic!("err {:?}", err); @@ -186,7 +137,73 @@ pub fn start_server( } let _ = pty_thread.join(); + for t in threads { + t.join(); + } } }) .unwrap() } + +fn handle_stream( + mut send_pty_instructions: SenderWithContext, + mut send_app_instructions: SenderWithContext, + mut stream: std::os::unix::net::UnixStream, +) { + //let mut buffer = [0; 65535]; // TODO: more accurate + let mut buffer = String::new(); + loop { + let bytes = stream + .read_to_string(&mut buffer) + .expect("failed to parse ipc message"); + //let astream = stream.try_clone().unwrap(); + let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = + bincode::deserialize(buffer.as_bytes()).expect("failed to deserialize ipc message"); + err_ctx.add_call(ContextType::IPCServer); + send_pty_instructions.update(err_ctx); + send_app_instructions.update(err_ctx); + + eprintln!("Server received {:?}", decoded); + + match decoded { + ApiCommand::OpenFile(file_name) => { + let path = PathBuf::from(file_name); + send_pty_instructions + .send(PtyInstruction::SpawnTerminal(Some(path))) + .unwrap(); + } + ApiCommand::SplitHorizontally => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalHorizontally(None)) + .unwrap(); + } + ApiCommand::SplitVertically => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalVertically(None)) + .unwrap(); + } + ApiCommand::MoveFocus => { + send_app_instructions + .send(AppInstruction::ToScreen(ScreenInstruction::MoveFocus)) + .unwrap(); + } + ApiCommand::ToPty(instruction) => { + send_pty_instructions.send(instruction).unwrap(); + } + ApiCommand::ToScreen(instruction) => { + send_app_instructions + .send(AppInstruction::ToScreen(instruction)) + .unwrap(); + } + ApiCommand::ClosePluginPane(pid) => { + send_app_instructions + .send(AppInstruction::ToPlugin(PluginInstruction::Unload(pid))) + .unwrap(); + } + ApiCommand::Quit => { + let _ = send_pty_instructions.send(PtyInstruction::Quit); + break; + } + } + } +} From 50a6c08b1b4842fae643a45daa2cec380e447a71 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 12 Feb 2021 11:39:28 +0530 Subject: [PATCH 05/64] remove debug log file --- abc.txt | 12228 ------------------------------------------------------ 1 file changed, 12228 deletions(-) delete mode 100644 abc.txt diff --git a/abc.txt b/abc.txt deleted file mode 100644 index a762fc0d..00000000 --- a/abc.txt +++ /dev/null @@ -1,12228 +0,0 @@ -warning: unused variable: `release` - --> build.rs:32:9 - | -32 | let release = if var("PROFILE").unwrap() == "release" { - | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_release` - | - = note: `#[warn(unused_variables)]` on by default - -warning: unused `std::result::Result` that must be used - --> build.rs:41:9 - | -41 | set_current_dir(&path); - | ^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_must_use)]` on by default - = note: this `Result` may be an `Err` variant, which should be handled - -warning: unused `std::result::Result` that must be used - --> build.rs:61:5 - | -61 | set_current_dir(&starting_dir); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: this `Result` may be an `Err` variant, which should be handled - -warning: 3 warnings emitted - -warning: unused import: `crate::utils::logging::debug_log_to_file` - --> src/common/wasm_vm.rs:8:5 - | -8 | use crate::utils::logging::debug_log_to_file; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default - -warning: unused import: `crate::layout::Layout` - --> src/server/mod.rs:8:5 - | -8 | use crate::layout::Layout; - | ^^^^^^^^^^^^^^^^^^^^^ - -warning: unused import: `ipc` - --> src/main.rs:11:35 - | -11 | command_is_executing, errors, ipc, os_input_output, pty_bus, screen, start, utils, wasm_vm, - | ^^^ - -warning: unused variable: `ipc_thread` - --> src/common/mod.rs:194:9 - | -194 | let ipc_thread = start_server( - | ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_ipc_thread` - | - = note: `#[warn(unused_variables)]` on by default - -warning: unused variable: `err_ctx` - --> src/common/pty_bus.rs:294:72 - | -294 | pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { - | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_err_ctx` - -warning: unused variable: `err_ctx` - --> src/common/pty_bus.rs:314:46 - | -314 | pub fn close_pane(&mut self, id: PaneId, err_ctx: ErrorContext) { - | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_err_ctx` - -warning: unused variable: `maybe_layout` - --> src/server/mod.rs:42:9 - | -42 | let maybe_layout = opts.layout.or(default_layout); - | ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_maybe_layout` - | - = note: `#[warn(unused_variables)]` on by default - -warning: unused variable: `bytes` - --> src/server/mod.rs:156:13 - | -156 | let bytes = stream - | ^^^^^ help: if this is intentional, prefix it with an underscore: `_bytes` - -warning: variable does not need to be mutable - --> src/server/mod.rs:24:5 - | -24 | mut send_app_instructions: SenderWithContext, - | ----^^^^^^^^^^^^^^^^^^^^^ - | | - | help: remove this `mut` - | - = note: `#[warn(unused_mut)]` on by default - -warning: variable does not need to be mutable - --> src/server/mod.rs:28:9 - | -28 | let mut send_pty_instructions = SenderWithContext::new( - | ----^^^^^^^^^^^^^^^^^^^^^ - | | - | help: remove this `mut` - -warning: associated function is never used: `total_terminal_panes` - --> src/client/layout.rs:203:12 - | -203 | pub fn total_terminal_panes(&self) -> usize { - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(dead_code)]` on by default - -warning: function is never used: `start_client` - --> src/client/mod.rs:6:8 - | -6 | pub fn start_client() {} - | ^^^^^^^^^^^^ - -warning: enum is never used: `ServerToClientMsg` - --> src/common/ipc.rs:41:10 - | -41 | pub enum ServerToClientMsg { - | ^^^^^^^^^^^^^^^^^ - -warning: associated function is never used: `spawn_terminals_for_layout` - --> src/common/pty_bus.rs:294:12 - | -294 | pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - -warning: field is never read: `sender` - --> src/common/mod.rs:117:5 - | -117 | sender: UnixStream, - | ^^^^^^^^^^^^^^^^^^ - -warning: unused `std::result::Result` that must be used - --> src/client/tab.rs:1904:9 - | -1904 | / debug_log_to_file(format!( -1905 | | "set_pane_invisible_borders: {:?}", -1906 | | invisible_borders -1907 | | )); - | |___________^ - | - = note: `#[warn(unused_must_use)]` on by default - = note: this `Result` may be an `Err` variant, which should be handled - -warning: unused `std::result::Result` that must be used - --> src/server/mod.rs:141:21 - | -141 | t.join(); - | ^^^^^^^^^ - | - = note: `#[warn(unused_must_use)]` on by default - = note: this `Result` may be an `Err` variant, which should be handled - -warning: 17 warnings emitted - - Finished dev [unoptimized + debuginfo] target(s) in 0.96s - Running `target/debug/zellij` -Ipcsender sending ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('k'))) -Ipcsender sending ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('k'))) -Ipcsender sending ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('k'))) -Ipcsender sending ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Ipcsender sending ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Ipcsender sending ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Render) -Server received ToScreen(Render) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Render) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Render) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('C'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('4'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('E'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('7'))) -Server received ToScreen(Pty(5, Print('N'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 34], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('6'))) -Server received ToScreen(Pty(5, Print('0'))) -Server received ToScreen(Pty(5, Print('U'))) -Server received ToScreen(Pty(5, Print(':'))) -Server received ToScreen(Pty(5, Print('1'))) -Server received ToScreen(Pty(5, Print('5'))) -Server received ToScreen(Pty(5, Print('R'))) -Server received ToScreen(Pty(5, OscDispatch([[48], [107, 117, 110, 97, 108, 64, 107, 117, 110, 97, 108, 45, 88, 53, 49, 48, 85, 78, 82, 58, 32, 47, 109, 110, 116, 47, 68, 69, 55, 50, 53, 54, 54, 69, 55, 50, 53, 54, 52, 67, 48, 49, 47, 68, 111, 99, 117, 109, 101, 110, 116, 115, 47, 100, 101, 118, 112, 47, 122, 101, 108, 108, 105, 106]], true))) -Server received ToScreen(Pty(5, Print('X'))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('-'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('@'))) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('u'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(NewTab(5)) -Server received ToScreen(Pty(5, Print('a'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Execute(0))) -Server received ToScreen(Pty(5, Print(' '))) -Server received ToScreen(Pty(5, CsiDispatch([0], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Render) -Server received ToScreen(Pty(5, Print('$'))) -Server received ToScreen(Pty(5, Print('i'))) -Server received ToScreen(Pty(5, Print('j'))) -Server received ToScreen(Pty(5, Print('z'))) -Server received ToScreen(Pty(5, Print('l'))) -Server received ToScreen(Pty(5, Print('k'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, CsiDispatch([1, 32], [], false, 'm'))) -Server received ToScreen(Pty(5, Print('p'))) -Server received ToScreen(Pty(5, Print('t'))) -Server received ToScreen(Pty(5, Print('s'))) -Server received ToScreen(Pty(5, Print('v'))) -Server received ToScreen(Pty(5, Print('n'))) -Server received ToScreen(Pty(5, Print('m'))) -Server received ToScreen(Pty(5, Print('d'))) -Server received ToScreen(Pty(5, Print('D'))) -Server received ToScreen(Pty(5, Print('c'))) -Server received ToScreen(Pty(5, Print('e'))) -Server received ToScreen(Pty(5, Print('/'))) -Server received ToScreen(Pty(5, Print('2'))) -Server received ToScreen(Pty(5, Print('o'))) -Server received ToScreen(Pty(5, Print('e'))) -Ipcsender sending Quit -Server received Quit From 6fc1a5bf921fa14209ce579348e4f1208ace81d7 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 12 Feb 2021 12:59:48 +0530 Subject: [PATCH 06/64] another try --- abc.txt | 133 +++++++++++++++++++++++++++++++++++++++++++ src/common/errors.rs | 2 +- src/common/mod.rs | 14 ++--- src/server/mod.rs | 36 +++++------- 4 files changed, 153 insertions(+), 32 deletions(-) create mode 100644 abc.txt diff --git a/abc.txt b/abc.txt new file mode 100644 index 00000000..2bab52d8 --- /dev/null +++ b/abc.txt @@ -0,0 +1,133 @@ +warning: unused variable: `release` + --> build.rs:32:9 + | +32 | let release = if var("PROFILE").unwrap() == "release" { + | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_release` + | + = note: `#[warn(unused_variables)]` on by default + +warning: unused `std::result::Result` that must be used + --> build.rs:41:9 + | +41 | set_current_dir(&path); + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(unused_must_use)]` on by default + = note: this `Result` may be an `Err` variant, which should be handled + +warning: unused `std::result::Result` that must be used + --> build.rs:61:5 + | +61 | set_current_dir(&starting_dir); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this `Result` may be an `Err` variant, which should be handled + +warning: 3 warnings emitted + +warning: unused import: `crate::utils::logging::debug_log_to_file` + --> src/common/wasm_vm.rs:8:5 + | +8 | use crate::utils::logging::debug_log_to_file; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(unused_imports)]` on by default + +warning: unused import: `crate::layout::Layout` + --> src/server/mod.rs:8:5 + | +8 | use crate::layout::Layout; + | ^^^^^^^^^^^^^^^^^^^^^ + +warning: unused import: `ipc` + --> src/main.rs:11:35 + | +11 | command_is_executing, errors, ipc, os_input_output, pty_bus, screen, start, utils, wasm_vm, + | ^^^ + +warning: unused variable: `ipc_thread` + --> src/common/mod.rs:191:9 + | +191 | let ipc_thread = start_server( + | ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_ipc_thread` + | + = note: `#[warn(unused_variables)]` on by default + +warning: unused variable: `err_ctx` + --> src/common/pty_bus.rs:294:72 + | +294 | pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { + | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_err_ctx` + +warning: unused variable: `err_ctx` + --> src/common/pty_bus.rs:314:46 + | +314 | pub fn close_pane(&mut self, id: PaneId, err_ctx: ErrorContext) { + | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_err_ctx` + +warning: unused variable: `maybe_layout` + --> src/server/mod.rs:42:9 + | +42 | let maybe_layout = opts.layout.or(default_layout); + | ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_maybe_layout` + +warning: variable does not need to be mutable + --> src/server/mod.rs:24:5 + | +24 | mut send_app_instructions: SenderWithContext, + | ----^^^^^^^^^^^^^^^^^^^^^ + | | + | help: remove this `mut` + | + = note: `#[warn(unused_mut)]` on by default + +warning: variable does not need to be mutable + --> src/server/mod.rs:28:9 + | +28 | let mut send_pty_instructions = SenderWithContext::new( + | ----^^^^^^^^^^^^^^^^^^^^^ + | | + | help: remove this `mut` + +warning: associated function is never used: `total_terminal_panes` + --> src/client/layout.rs:203:12 + | +203 | pub fn total_terminal_panes(&self) -> usize { + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(dead_code)]` on by default + +warning: function is never used: `start_client` + --> src/client/mod.rs:6:8 + | +6 | pub fn start_client() {} + | ^^^^^^^^^^^^ + +warning: enum is never used: `ServerToClientMsg` + --> src/common/ipc.rs:41:10 + | +41 | pub enum ServerToClientMsg { + | ^^^^^^^^^^^^^^^^^ + +warning: associated function is never used: `spawn_terminals_for_layout` + --> src/common/pty_bus.rs:294:12 + | +294 | pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +warning: unused `std::result::Result` that must be used + --> src/client/tab.rs:1904:9 + | +1904 | / debug_log_to_file(format!( +1905 | | "set_pane_invisible_borders: {:?}", +1906 | | invisible_borders +1907 | | )); + | |___________^ + | + = note: `#[warn(unused_must_use)]` on by default + = note: this `Result` may be an `Err` variant, which should be handled + +warning: 14 warnings emitted + + Finished dev [unoptimized + debuginfo] target(s) in 0.17s + Running `target/debug/zellij` diff --git a/src/common/errors.rs b/src/common/errors.rs index 94682ebc..a9156ae6 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -64,7 +64,7 @@ pub fn handle_panic( }; if thread == "main" { - eprintln!("{}", backtrace); + println!("{}", backtrace); process::exit(1); } else { send_app_instructions diff --git a/src/common/mod.rs b/src/common/mod.rs index 4c8ab4c0..c737a788 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -141,11 +141,8 @@ impl IpcSenderWithContext { } pub fn send(&mut self, msg: ApiCommand) -> std::io::Result<()> { - eprintln!("Ipcsender sending {:?}", msg); let command = bincode::serialize(&(self.err_ctx, msg)).unwrap(); - UnixStream::connect(MOSAIC_IPC_PIPE) - .unwrap() - .write_all(&command) + self.sender.write_all(&command) } } @@ -573,11 +570,10 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); let error = format!("{}\n{}", goto_start_of_last_line, backtrace); - //let _ = os_input - // .get_stdout_writer() - // .write(error.as_bytes()) - // .unwrap(); - eprintln!("{}", error); + let _ = os_input + .get_stdout_writer() + .write(error.as_bytes()) + .unwrap(); std::process::exit(1); } AppInstruction::ToScreen(instruction) => { diff --git a/src/server/mod.rs b/src/server/mod.rs index 0ba19568..1da079eb 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -90,15 +90,15 @@ pub fn start_server( .unwrap(); } PtyInstruction::NewTab => { - //if let Some(layout) = maybe_layout.clone() { - // pty_bus.spawn_terminals_for_layout(layout, err_ctx); - //} else { - let pid = pty_bus.spawn_terminal(None); - pty_bus - .send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid))) - .unwrap(); - //} + if let Some(layout) = maybe_layout.clone() { + pty_bus.spawn_terminals_for_layout(layout, err_ctx); + } else { + let pid = pty_bus.spawn_terminal(None); + pty_bus + .send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid))) + .unwrap(); + } } PtyInstruction::ClosePane(id) => { pty_bus.close_pane(id, err_ctx); @@ -120,15 +120,14 @@ pub fn start_server( .name("ipc_server".to_string()) .spawn({ move || { - let mut threads = vec![]; for stream in listener.incoming() { match stream { Ok(stream) => { let send_app_instructions = send_app_instructions.clone(); let send_pty_instructions = send_pty_instructions.clone(); - threads.push(thread::spawn(move || { + thread::spawn(move || { handle_stream(send_pty_instructions, send_app_instructions, stream); - })); + }); } Err(err) => { panic!("err {:?}", err); @@ -137,9 +136,6 @@ pub fn start_server( } let _ = pty_thread.join(); - for t in threads { - t.join(); - } } }) .unwrap() @@ -150,21 +146,17 @@ fn handle_stream( mut send_app_instructions: SenderWithContext, mut stream: std::os::unix::net::UnixStream, ) { - //let mut buffer = [0; 65535]; // TODO: more accurate - let mut buffer = String::new(); + let mut buffer = [0; 65535]; // TODO: more accurate loop { let bytes = stream - .read_to_string(&mut buffer) + .read(&mut buffer) .expect("failed to parse ipc message"); - //let astream = stream.try_clone().unwrap(); let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = - bincode::deserialize(buffer.as_bytes()).expect("failed to deserialize ipc message"); + bincode::deserialize(&buffer[..bytes]).expect("failed to deserialize ipc message"); err_ctx.add_call(ContextType::IPCServer); send_pty_instructions.update(err_ctx); send_app_instructions.update(err_ctx); - eprintln!("Server received {:?}", decoded); - match decoded { ApiCommand::OpenFile(file_name) => { let path = PathBuf::from(file_name); From d80a5f2ced6c74c3643fc673b2abaee629d8cb4c Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 12 Feb 2021 13:00:07 +0530 Subject: [PATCH 07/64] remove logs --- abc.txt | 133 -------------------------------------------------------- 1 file changed, 133 deletions(-) delete mode 100644 abc.txt diff --git a/abc.txt b/abc.txt deleted file mode 100644 index 2bab52d8..00000000 --- a/abc.txt +++ /dev/null @@ -1,133 +0,0 @@ -warning: unused variable: `release` - --> build.rs:32:9 - | -32 | let release = if var("PROFILE").unwrap() == "release" { - | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_release` - | - = note: `#[warn(unused_variables)]` on by default - -warning: unused `std::result::Result` that must be used - --> build.rs:41:9 - | -41 | set_current_dir(&path); - | ^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_must_use)]` on by default - = note: this `Result` may be an `Err` variant, which should be handled - -warning: unused `std::result::Result` that must be used - --> build.rs:61:5 - | -61 | set_current_dir(&starting_dir); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: this `Result` may be an `Err` variant, which should be handled - -warning: 3 warnings emitted - -warning: unused import: `crate::utils::logging::debug_log_to_file` - --> src/common/wasm_vm.rs:8:5 - | -8 | use crate::utils::logging::debug_log_to_file; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default - -warning: unused import: `crate::layout::Layout` - --> src/server/mod.rs:8:5 - | -8 | use crate::layout::Layout; - | ^^^^^^^^^^^^^^^^^^^^^ - -warning: unused import: `ipc` - --> src/main.rs:11:35 - | -11 | command_is_executing, errors, ipc, os_input_output, pty_bus, screen, start, utils, wasm_vm, - | ^^^ - -warning: unused variable: `ipc_thread` - --> src/common/mod.rs:191:9 - | -191 | let ipc_thread = start_server( - | ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_ipc_thread` - | - = note: `#[warn(unused_variables)]` on by default - -warning: unused variable: `err_ctx` - --> src/common/pty_bus.rs:294:72 - | -294 | pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { - | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_err_ctx` - -warning: unused variable: `err_ctx` - --> src/common/pty_bus.rs:314:46 - | -314 | pub fn close_pane(&mut self, id: PaneId, err_ctx: ErrorContext) { - | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_err_ctx` - -warning: unused variable: `maybe_layout` - --> src/server/mod.rs:42:9 - | -42 | let maybe_layout = opts.layout.or(default_layout); - | ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_maybe_layout` - -warning: variable does not need to be mutable - --> src/server/mod.rs:24:5 - | -24 | mut send_app_instructions: SenderWithContext, - | ----^^^^^^^^^^^^^^^^^^^^^ - | | - | help: remove this `mut` - | - = note: `#[warn(unused_mut)]` on by default - -warning: variable does not need to be mutable - --> src/server/mod.rs:28:9 - | -28 | let mut send_pty_instructions = SenderWithContext::new( - | ----^^^^^^^^^^^^^^^^^^^^^ - | | - | help: remove this `mut` - -warning: associated function is never used: `total_terminal_panes` - --> src/client/layout.rs:203:12 - | -203 | pub fn total_terminal_panes(&self) -> usize { - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(dead_code)]` on by default - -warning: function is never used: `start_client` - --> src/client/mod.rs:6:8 - | -6 | pub fn start_client() {} - | ^^^^^^^^^^^^ - -warning: enum is never used: `ServerToClientMsg` - --> src/common/ipc.rs:41:10 - | -41 | pub enum ServerToClientMsg { - | ^^^^^^^^^^^^^^^^^ - -warning: associated function is never used: `spawn_terminals_for_layout` - --> src/common/pty_bus.rs:294:12 - | -294 | pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - -warning: unused `std::result::Result` that must be used - --> src/client/tab.rs:1904:9 - | -1904 | / debug_log_to_file(format!( -1905 | | "set_pane_invisible_borders: {:?}", -1906 | | invisible_borders -1907 | | )); - | |___________^ - | - = note: `#[warn(unused_must_use)]` on by default - = note: this `Result` may be an `Err` variant, which should be handled - -warning: 14 warnings emitted - - Finished dev [unoptimized + debuginfo] target(s) in 0.17s - Running `target/debug/zellij` From d1a17ef3568938c4bdb28b3d90e465bed4e00962 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 12 Feb 2021 13:21:33 +0530 Subject: [PATCH 08/64] undo some changes --- src/common/pty_bus.rs | 10 +++++----- src/server/mod.rs | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 5fa3d048..3c5183e9 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -292,7 +292,7 @@ impl PtyBus { self.id_to_child_pid.insert(pid_primary, pid_secondary); pid_primary } - pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf, err_ctx: ErrorContext) { + pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf) { let layout = Layout::new(layout_path.clone()); let total_panes = layout.total_terminal_panes(); let mut new_pane_pids = vec![]; @@ -312,7 +312,7 @@ impl PtyBus { self.task_handles.insert(id, task_handle); } } - pub fn close_pane(&mut self, id: PaneId, err_ctx: ErrorContext) { + pub fn close_pane(&mut self, id: PaneId) { match id { PaneId::Terminal(id) => { let child_pid = self.id_to_child_pid.remove(&id).unwrap(); @@ -328,9 +328,9 @@ impl PtyBus { .unwrap(), } } - pub fn close_tab(&mut self, ids: Vec, err_ctx: ErrorContext) { + pub fn close_tab(&mut self, ids: Vec) { ids.iter().for_each(|&id| { - self.close_pane(id, err_ctx); + self.close_pane(id); }); } } @@ -339,7 +339,7 @@ impl Drop for PtyBus { fn drop(&mut self) { let child_ids: Vec = self.id_to_child_pid.keys().copied().collect(); for id in child_ids { - self.close_pane(PaneId::Terminal(id), ErrorContext::new()); + self.close_pane(PaneId::Terminal(id)); } } } diff --git a/src/server/mod.rs b/src/server/mod.rs index 1da079eb..f739d0bc 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -91,7 +91,7 @@ pub fn start_server( } PtyInstruction::NewTab => { if let Some(layout) = maybe_layout.clone() { - pty_bus.spawn_terminals_for_layout(layout, err_ctx); + pty_bus.spawn_terminals_for_layout(layout); } else { let pid = pty_bus.spawn_terminal(None); pty_bus @@ -101,11 +101,11 @@ pub fn start_server( } } PtyInstruction::ClosePane(id) => { - pty_bus.close_pane(id, err_ctx); + pty_bus.close_pane(id); command_is_executing.done_closing_pane(); } PtyInstruction::CloseTab(ids) => { - pty_bus.close_tab(ids, err_ctx); + pty_bus.close_tab(ids); command_is_executing.done_closing_pane(); } PtyInstruction::Quit => { From 2943dc7b3bf138b94a9b2685fc1b80ee9d2d1ec4 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 13 Feb 2021 13:33:32 +0530 Subject: [PATCH 09/64] Got things working! But we are loosing data in transmission :( PS: There are debug logs in there --- src/common/mod.rs | 14 ++++++++------ src/common/pty_bus.rs | 1 + src/server/mod.rs | 27 ++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index c737a788..62d7e702 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -141,6 +141,7 @@ impl IpcSenderWithContext { } pub fn send(&mut self, msg: ApiCommand) -> std::io::Result<()> { + eprintln!("IpcSender sent {:?}", msg); let command = bincode::serialize(&(self.err_ctx, msg)).unwrap(); self.sender.write_all(&command) } @@ -200,7 +201,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { SenderWithContext::new(SenderType::Sender(send_plugin_instructions)); let (send_app_instructions, receive_app_instructions): SyncChannelWithContext = - mpsc::sync_channel(0); + mpsc::sync_channel(500); let send_app_instructions = SenderWithContext::new(SenderType::SyncSender(send_app_instructions)); @@ -560,7 +561,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { break; } AppInstruction::Error(backtrace) => { - let _ = send_server_instructions.send(ApiCommand::Quit); + //let _ = send_server_instructions.send(ApiCommand::Quit); //let _ = ipc_thread.join(); //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); @@ -570,10 +571,11 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); let error = format!("{}\n{}", goto_start_of_last_line, backtrace); - let _ = os_input - .get_stdout_writer() - .write(error.as_bytes()) - .unwrap(); + //let _ = os_input + // .get_stdout_writer() + // .write(error.as_bytes()) + // .unwrap(); + eprintln!("{}", error); std::process::exit(1); } AppInstruction::ToScreen(instruction) => { diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 3c5183e9..840d11e4 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -197,6 +197,7 @@ fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> J let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); task::spawn({ async move { + eprintln!("New task spawned"); err_ctx.add_call(ContextType::AsyncTask); let mut send_server_instructions = IpcSenderWithContext::new(); send_server_instructions.update(err_ctx); diff --git a/src/server/mod.rs b/src/server/mod.rs index f739d0bc..aa8aad8d 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -109,7 +109,7 @@ pub fn start_server( command_is_executing.done_closing_pane(); } PtyInstruction::Quit => { - break; + //break; } } } @@ -120,14 +120,25 @@ pub fn start_server( .name("ipc_server".to_string()) .spawn({ move || { + let mut km = 0; for stream in listener.incoming() { match stream { Ok(stream) => { let send_app_instructions = send_app_instructions.clone(); let send_pty_instructions = send_pty_instructions.clone(); - thread::spawn(move || { - handle_stream(send_pty_instructions, send_app_instructions, stream); - }); + let nm = format!("{}", km); + thread::Builder::new() + .name(nm) + .spawn(move || { + handle_stream( + send_pty_instructions, + send_app_instructions, + stream, + km, + ); + }) + .unwrap(); + km += 1; } Err(err) => { panic!("err {:?}", err); @@ -145,6 +156,7 @@ fn handle_stream( mut send_pty_instructions: SenderWithContext, mut send_app_instructions: SenderWithContext, mut stream: std::os::unix::net::UnixStream, + km: u32, ) { let mut buffer = [0; 65535]; // TODO: more accurate loop { @@ -152,11 +164,16 @@ fn handle_stream( .read(&mut buffer) .expect("failed to parse ipc message"); let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = - bincode::deserialize(&buffer[..bytes]).expect("failed to deserialize ipc message"); + match bincode::deserialize(&buffer[..bytes]) { + Ok(d) => d, + Err(e) => break, + }; err_ctx.add_call(ContextType::IPCServer); send_pty_instructions.update(err_ctx); send_app_instructions.update(err_ctx); + eprintln!("Server {} Received {:?}", km, decoded); + match decoded { ApiCommand::OpenFile(file_name) => { let path = PathBuf::from(file_name); From aef52b06907e9ce7a933b33112ec69ecc4def507 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 13 Feb 2021 15:50:56 +0530 Subject: [PATCH 10/64] Use interprocess crate, BufReader and BufWriter --- src/common/mod.rs | 36 ++++++++++++++++++++---------------- src/server/mod.rs | 15 +++++++++------ 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 62d7e702..4e0eeec1 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -9,19 +9,21 @@ pub mod setup; pub mod utils; pub mod wasm_vm; -use std::io::Write; -use std::os::unix::net::UnixStream; +use std::io::{BufWriter, Write}; use std::path::{Path, PathBuf}; use std::sync::mpsc; use std::thread; use std::{collections::HashMap, fs}; -use std::{ - collections::HashSet, - env, - io::Write, - str::FromStr, - sync::{Arc, Mutex}, -}; + +use crate::panes::PaneId; +use directories_next::ProjectDirs; +use input::handler::InputMode; +use interprocess::local_socket::LocalSocketStream; +use serde::{Deserialize, Serialize}; +use termion::input::TermRead; +use wasm_vm::PluginEnv; +use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; +use wasmer_wasi::{Pipe, WasiState}; use crate::cli::CliArgs; use crate::layout::Layout; @@ -125,14 +127,14 @@ thread_local!( ); pub struct IpcSenderWithContext { err_ctx: ErrorContext, - sender: UnixStream, + sender: BufWriter, } impl IpcSenderWithContext { pub fn new() -> Self { Self { err_ctx: ErrorContext::new(), - sender: UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(), + sender: BufWriter::new(LocalSocketStream::connect(ZELLIJ_IPC_PIPE).unwrap()), } } @@ -143,7 +145,9 @@ impl IpcSenderWithContext { pub fn send(&mut self, msg: ApiCommand) -> std::io::Result<()> { eprintln!("IpcSender sent {:?}", msg); let command = bincode::serialize(&(self.err_ctx, msg)).unwrap(); - self.sender.write_all(&command) + let x = self.sender.write_all(&command); + self.sender.flush(); + x } } @@ -151,7 +155,7 @@ impl std::clone::Clone for IpcSenderWithContext { fn clone(&self) -> Self { Self { err_ctx: self.err_ctx, - sender: UnixStream::connect(ZELLIJ_IPC_PIPE).unwrap(), + sender: BufWriter::new(LocalSocketStream::connect(ZELLIJ_IPC_PIPE).unwrap()), } } } @@ -561,8 +565,8 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { break; } AppInstruction::Error(backtrace) => { - //let _ = send_server_instructions.send(ApiCommand::Quit); - //let _ = ipc_thread.join(); + let _ = send_server_instructions.send(ApiCommand::Quit); + let _ = ipc_thread.join(); //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); @@ -591,7 +595,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } let _ = send_server_instructions.send(ApiCommand::Quit); - //let _ = ipc_thread.join().unwrap(); + let _ = ipc_thread.join().unwrap(); //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); diff --git a/src/server/mod.rs b/src/server/mod.rs index aa8aad8d..eb87753c 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -12,7 +12,8 @@ use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; use crate::utils::consts::ZELLIJ_IPC_PIPE; use crate::wasm_vm::PluginInstruction; -use std::io::Read; +use interprocess::local_socket::{LocalSocketListener, LocalSocketStream}; +use std::io::{BufReader, Read}; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; @@ -31,8 +32,8 @@ pub fn start_server( ); std::fs::remove_file(ZELLIJ_IPC_PIPE).ok(); - let listener = std::os::unix::net::UnixListener::bind(ZELLIJ_IPC_PIPE) - .expect("could not listen on ipc socket"); + let listener = + LocalSocketListener::bind(ZELLIJ_IPC_PIPE).expect("could not listen on ipc socket"); // Don't use default layouts in tests, but do everywhere else #[cfg(not(test))] @@ -146,18 +147,20 @@ pub fn start_server( } } - let _ = pty_thread.join(); + //let _ = pty_thread.join(); } }) - .unwrap() + .unwrap(); + pty_thread } fn handle_stream( mut send_pty_instructions: SenderWithContext, mut send_app_instructions: SenderWithContext, - mut stream: std::os::unix::net::UnixStream, + mut stream: LocalSocketStream, km: u32, ) { + //let mut reader = BufReader::new(stream); let mut buffer = [0; 65535]; // TODO: more accurate loop { let bytes = stream From 75b07cc6c8639ec1ecd13d51938c91da3d76ac42 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 13 Feb 2021 15:57:31 +0530 Subject: [PATCH 11/64] Undo some changes --- src/common/mod.rs | 6 +++--- src/server/mod.rs | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 4e0eeec1..7ed80562 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -209,7 +209,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let send_app_instructions = SenderWithContext::new(SenderType::SyncSender(send_app_instructions)); - let ipc_thread = start_server( + let pty_thread = start_server( os_input.clone(), opts.clone(), command_is_executing.clone(), @@ -566,7 +566,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } AppInstruction::Error(backtrace) => { let _ = send_server_instructions.send(ApiCommand::Quit); - let _ = ipc_thread.join(); + let _ = pty_thread.join(); //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); @@ -595,7 +595,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } let _ = send_server_instructions.send(ApiCommand::Quit); - let _ = ipc_thread.join().unwrap(); + let _ = pty_thread.join().unwrap(); //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); diff --git a/src/server/mod.rs b/src/server/mod.rs index eb87753c..95fcd715 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -110,7 +110,7 @@ pub fn start_server( command_is_executing.done_closing_pane(); } PtyInstruction::Quit => { - //break; + break; } } } @@ -146,8 +146,6 @@ pub fn start_server( } } } - - //let _ = pty_thread.join(); } }) .unwrap(); @@ -160,10 +158,10 @@ fn handle_stream( mut stream: LocalSocketStream, km: u32, ) { - //let mut reader = BufReader::new(stream); + let mut reader = BufReader::new(stream); let mut buffer = [0; 65535]; // TODO: more accurate loop { - let bytes = stream + let bytes = reader .read(&mut buffer) .expect("failed to parse ipc message"); let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = From c0e87df14ccde9c375e60d1d35f7704c978c7312 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 13 Feb 2021 15:59:04 +0530 Subject: [PATCH 12/64] remove logs --- src/common/mod.rs | 12 ++++-------- src/common/pty_bus.rs | 1 - src/server/mod.rs | 2 -- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 7ed80562..674c3ac3 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -143,7 +143,6 @@ impl IpcSenderWithContext { } pub fn send(&mut self, msg: ApiCommand) -> std::io::Result<()> { - eprintln!("IpcSender sent {:?}", msg); let command = bincode::serialize(&(self.err_ctx, msg)).unwrap(); let x = self.sender.write_all(&command); self.sender.flush(); @@ -567,7 +566,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { AppInstruction::Error(backtrace) => { let _ = send_server_instructions.send(ApiCommand::Quit); let _ = pty_thread.join(); - //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); @@ -575,11 +573,10 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); let error = format!("{}\n{}", goto_start_of_last_line, backtrace); - //let _ = os_input - // .get_stdout_writer() - // .write(error.as_bytes()) - // .unwrap(); - eprintln!("{}", error); + let _ = os_input + .get_stdout_writer() + .write(error.as_bytes()) + .unwrap(); std::process::exit(1); } AppInstruction::ToScreen(instruction) => { @@ -596,7 +593,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let _ = send_server_instructions.send(ApiCommand::Quit); let _ = pty_thread.join().unwrap(); - //IpcSenderWithContext::new().send(ApiCommand::Quit); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 840d11e4..3c5183e9 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -197,7 +197,6 @@ fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> J let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); task::spawn({ async move { - eprintln!("New task spawned"); err_ctx.add_call(ContextType::AsyncTask); let mut send_server_instructions = IpcSenderWithContext::new(); send_server_instructions.update(err_ctx); diff --git a/src/server/mod.rs b/src/server/mod.rs index 95fcd715..cd294c85 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -173,8 +173,6 @@ fn handle_stream( send_pty_instructions.update(err_ctx); send_app_instructions.update(err_ctx); - eprintln!("Server {} Received {:?}", km, decoded); - match decoded { ApiCommand::OpenFile(file_name) => { let path = PathBuf::from(file_name); From 858e48c6aa0a97b9a4cb8265e0ac56e79f0ae261 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 13 Feb 2021 21:02:02 +0530 Subject: [PATCH 13/64] do not hang on exit --- src/common/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 674c3ac3..38aba171 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -565,7 +565,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } AppInstruction::Error(backtrace) => { let _ = send_server_instructions.send(ApiCommand::Quit); - let _ = pty_thread.join(); + //let _ = pty_thread.join(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); @@ -592,7 +592,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } let _ = send_server_instructions.send(ApiCommand::Quit); - let _ = pty_thread.join().unwrap(); + //let _ = pty_thread.join().unwrap(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); From 1ee86f9a77fc93475a73e314f18ba870527246a2 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 18 Feb 2021 10:17:01 +0530 Subject: [PATCH 14/64] Introduce serlializable ClientInstruction and Rename ApiCommand --- src/common/mod.rs | 17 ++++++++++++----- src/common/pty_bus.rs | 35 +++++++++++++++++------------------ src/main.rs | 10 +++++----- src/server/mod.rs | 40 ++++++++++++++++++++-------------------- 4 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 38aba171..0bf235f1 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -43,7 +43,7 @@ use wasmer_wasi::{Pipe, WasiState}; use zellij_tile::data::{EventType, InputMode, ModeInfo}; #[derive(Serialize, Deserialize, Debug, Clone)] -pub enum ApiCommand { +pub enum ServerInstruction { OpenFile(PathBuf), SplitHorizontally, SplitVertically, @@ -54,6 +54,13 @@ pub enum ApiCommand { Quit, } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ClientInstruction { + ToScreen(ScreenInstruction), + ClosePluginPane(u32), + Error(String), +} + // FIXME: It would be good to add some more things to this over time #[derive(Debug, Clone, Default)] pub struct AppState { @@ -142,7 +149,7 @@ impl IpcSenderWithContext { self.err_ctx = ctx; } - pub fn send(&mut self, msg: ApiCommand) -> std::io::Result<()> { + pub fn send(&mut self, msg: ServerInstruction) -> std::io::Result<()> { let command = bincode::serialize(&(self.err_ctx, msg)).unwrap(); let x = self.sender.write_all(&command); self.sender.flush(); @@ -564,7 +571,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { break; } AppInstruction::Error(backtrace) => { - let _ = send_server_instructions.send(ApiCommand::Quit); + let _ = send_server_instructions.send(ServerInstruction::Quit); //let _ = pty_thread.join(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); @@ -586,12 +593,12 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { send_plugin_instructions.send(instruction).unwrap(); } AppInstruction::ToPty(instruction) => { - let _ = send_server_instructions.send(ApiCommand::ToPty(instruction)); + let _ = send_server_instructions.send(ServerInstruction::ToPty(instruction)); } } } - let _ = send_server_instructions.send(ApiCommand::Quit); + let _ = send_server_instructions.send(ServerInstruction::Quit); //let _ = pty_thread.join().unwrap(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 3c5183e9..4cbd5675 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -15,7 +15,7 @@ use crate::layout::Layout; use crate::os_input_output::OsApi; use crate::utils::logging::debug_to_file; use crate::{ - common::ApiCommand, + common::ServerInstruction, errors::{ContextType, ErrorContext}, panes::PaneId, }; @@ -96,7 +96,7 @@ impl VteEventSender { impl vte::Perform for VteEventSender { fn print(&mut self, c: char) { self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Print(c), ))) @@ -104,7 +104,7 @@ impl vte::Perform for VteEventSender { } fn execute(&mut self, byte: u8) { self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Execute(byte), ))) @@ -115,7 +115,7 @@ impl vte::Perform for VteEventSender { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Hook(params, intermediates, ignore, c), ))) @@ -124,7 +124,7 @@ impl vte::Perform for VteEventSender { fn put(&mut self, byte: u8) { self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Put(byte), ))) @@ -133,7 +133,7 @@ impl vte::Perform for VteEventSender { fn unhook(&mut self) { self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Unhook, ))) @@ -143,7 +143,7 @@ impl vte::Perform for VteEventSender { fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { let params = params.iter().map(|p| p.to_vec()).collect(); self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::OscDispatch(params, bell_terminated), ))) @@ -154,7 +154,7 @@ impl vte::Perform for VteEventSender { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::CsiDispatch(params, intermediates, ignore, c), ))) @@ -164,7 +164,7 @@ impl vte::Perform for VteEventSender { fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) { let intermediates = intermediates.iter().copied().collect(); self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::EscDispatch(intermediates, ignore, byte), ))) @@ -228,7 +228,7 @@ fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> J if receive_time.elapsed() > max_render_pause { pending_render = false; send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Render)) + .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) .unwrap(); last_byte_receive_time = Some(Instant::now()); } else { @@ -244,7 +244,7 @@ fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> J if pending_render { pending_render = false; send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Render)) + .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) .unwrap(); } last_byte_receive_time = None; @@ -252,14 +252,14 @@ fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> J } } send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::Render)) + .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) .unwrap(); #[cfg(not(test))] // 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 // a better solution would be to fix the test fakes, but this will do for now send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::ClosePane( + .send(ServerInstruction::ToScreen(ScreenInstruction::ClosePane( PaneId::Terminal(pid), ))) .unwrap(); @@ -302,10 +302,9 @@ impl PtyBus { new_pane_pids.push(pid_primary); } self.send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::ApplyLayout(( - layout_path, - new_pane_pids.clone(), - )))) + .send(ServerInstruction::ToScreen(ScreenInstruction::ApplyLayout( + (layout_path, new_pane_pids.clone()), + ))) .unwrap(); for id in new_pane_pids { let task_handle = stream_terminal_bytes(id, self.os_input.clone(), self.debug_to_file); @@ -324,7 +323,7 @@ impl PtyBus { } PaneId::Plugin(pid) => self .send_server_instructions - .send(ApiCommand::ClosePluginPane(pid)) + .send(ServerInstruction::ClosePluginPane(pid)) .unwrap(), } } diff --git a/src/main.rs b/src/main.rs index 11355fbb..78696a8d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ mod server; use client::{boundaries, layout, panes, tab}; use common::{ command_is_executing, errors, ipc, os_input_output, pty_bus, screen, start, utils, wasm_vm, - ApiCommand, IpcSenderWithContext, + IpcSenderWithContext, ServerInstruction, }; use directories_next::ProjectDirs; @@ -64,13 +64,13 @@ pub fn main() { 'h' => { let mut send_server_instructions = IpcSenderWithContext::new(); send_server_instructions - .send(ApiCommand::SplitHorizontally) + .send(ServerInstruction::SplitHorizontally) .unwrap(); } 'v' => { let mut send_server_instructions = IpcSenderWithContext::new(); send_server_instructions - .send(ApiCommand::SplitVertically) + .send(ServerInstruction::SplitVertically) .unwrap(); } _ => {} @@ -78,12 +78,12 @@ pub fn main() { } else if opts.move_focus { let mut send_server_instructions = IpcSenderWithContext::new(); send_server_instructions - .send(ApiCommand::MoveFocus) + .send(ServerInstruction::MoveFocus) .unwrap(); } else if let Some(file_to_open) = opts.open_file { let mut send_server_instructions = IpcSenderWithContext::new(); send_server_instructions - .send(ApiCommand::OpenFile(file_to_open)) + .send(ServerInstruction::OpenFile(file_to_open)) .unwrap(); } else { let os_input = get_os_input(); diff --git a/src/server/mod.rs b/src/server/mod.rs index cd294c85..dd65e81f 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,8 +1,8 @@ use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; use crate::common::{ - ApiCommand, AppInstruction, ChannelWithContext, IpcSenderWithContext, SenderType, - SenderWithContext, + AppInstruction, ChannelWithContext, IpcSenderWithContext, SenderType, SenderWithContext, + ServerInstruction, }; use crate::errors::{ContextType, ErrorContext, PtyContext}; use crate::layout::Layout; @@ -67,7 +67,7 @@ pub fn start_server( let pid = pty_bus.spawn_terminal(file_to_open); pty_bus .send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::NewPane( + .send(ServerInstruction::ToScreen(ScreenInstruction::NewPane( PaneId::Terminal(pid), ))) .unwrap(); @@ -76,18 +76,18 @@ pub fn start_server( let pid = pty_bus.spawn_terminal(file_to_open); pty_bus .send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::VerticalSplit( - PaneId::Terminal(pid), - ))) + .send(ServerInstruction::ToScreen( + ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), + )) .unwrap(); } PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); pty_bus .send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::HorizontalSplit( - PaneId::Terminal(pid), - ))) + .send(ServerInstruction::ToScreen( + ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), + )) .unwrap(); } PtyInstruction::NewTab => { @@ -97,7 +97,7 @@ pub fn start_server( let pid = pty_bus.spawn_terminal(None); pty_bus .send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid))) + .send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid))) .unwrap(); } } @@ -164,51 +164,51 @@ fn handle_stream( let bytes = reader .read(&mut buffer) .expect("failed to parse ipc message"); - let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = + let (mut err_ctx, decoded): (ErrorContext, ServerInstruction) = match bincode::deserialize(&buffer[..bytes]) { Ok(d) => d, - Err(e) => break, + Err(_) => break, }; err_ctx.add_call(ContextType::IPCServer); send_pty_instructions.update(err_ctx); send_app_instructions.update(err_ctx); match decoded { - ApiCommand::OpenFile(file_name) => { + ServerInstruction::OpenFile(file_name) => { let path = PathBuf::from(file_name); send_pty_instructions .send(PtyInstruction::SpawnTerminal(Some(path))) .unwrap(); } - ApiCommand::SplitHorizontally => { + ServerInstruction::SplitHorizontally => { send_pty_instructions .send(PtyInstruction::SpawnTerminalHorizontally(None)) .unwrap(); } - ApiCommand::SplitVertically => { + ServerInstruction::SplitVertically => { send_pty_instructions .send(PtyInstruction::SpawnTerminalVertically(None)) .unwrap(); } - ApiCommand::MoveFocus => { + ServerInstruction::MoveFocus => { send_app_instructions .send(AppInstruction::ToScreen(ScreenInstruction::MoveFocus)) .unwrap(); } - ApiCommand::ToPty(instruction) => { + ServerInstruction::ToPty(instruction) => { send_pty_instructions.send(instruction).unwrap(); } - ApiCommand::ToScreen(instruction) => { + ServerInstruction::ToScreen(instruction) => { send_app_instructions .send(AppInstruction::ToScreen(instruction)) .unwrap(); } - ApiCommand::ClosePluginPane(pid) => { + ServerInstruction::ClosePluginPane(pid) => { send_app_instructions .send(AppInstruction::ToPlugin(PluginInstruction::Unload(pid))) .unwrap(); } - ApiCommand::Quit => { + ServerInstruction::Quit => { let _ = send_pty_instructions.send(PtyInstruction::Quit); break; } From 77682d9ab51d45a1ab765bfd7eb0b527d41782e7 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 18 Feb 2021 11:27:19 +0530 Subject: [PATCH 15/64] Use ipmpsc crate for IPC --- Cargo.lock | 237 +++++++++++++++++++++++++++++++++--------- Cargo.toml | 5 +- src/common/mod.rs | 39 +++---- src/common/pty_bus.rs | 23 +++- src/main.rs | 8 +- src/server/mod.rs | 145 +++++++++----------------- 6 files changed, 276 insertions(+), 181 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac4a40a5..b66f3f28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -234,6 +234,15 @@ dependencies = [ "wyz", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "blocking" version = "1.0.2" @@ -284,6 +293,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + [[package]] name = "clap" version = "2.33.3" @@ -338,6 +360,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "const_fn" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" + +[[package]] +name = "cpuid-bool" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" + [[package]] name = "cranelift-bforest" version = "0.68.0" @@ -502,6 +536,15 @@ dependencies = [ "syn", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "directories-next" version = "2.0.0" @@ -721,6 +764,16 @@ dependencies = [ "serde", ] +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getopts" version = "0.2.21" @@ -806,6 +859,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" + [[package]] name = "ident_case" version = "1.0.1" @@ -847,29 +906,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "interprocess" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c58ec7fbda1df9a93f587b780659db3c99f61f4be27f9c82c9b37684ffd0366" -dependencies = [ - "blocking", - "cfg-if 1.0.0", - "futures", - "intmap", - "libc", - "once_cell", - "spinning", - "thiserror", - "winapi", -] - -[[package]] -name = "intmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e50930385956f6c4a0b99f3dd654adcc40788456c36e17c5b20e1d1ceb523ec6" - [[package]] name = "inventory" version = "0.1.10" @@ -892,6 +928,24 @@ dependencies = [ "syn", ] +[[package]] +name = "ipmpsc" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36cf1ebb87bae3dbbf0a91b80463831de213b2921f28c325b22026f318f17a3" +dependencies = [ + "bincode", + "hex", + "libc", + "memmap", + "serde", + "sha2", + "tempfile", + "thiserror", + "vergen", + "winapi", +] + [[package]] name = "itoa" version = "0.4.7" @@ -963,15 +1017,6 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" -[[package]] -name = "lock_api" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.14" @@ -997,6 +1042,16 @@ version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "memmap2" version = "0.2.2" @@ -1056,6 +1111,25 @@ dependencies = [ "version_check", ] +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.13.0" @@ -1094,12 +1168,27 @@ version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "parking" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + [[package]] name = "pin-project-lite" version = "0.2.6" @@ -1338,6 +1427,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver", +] + [[package]] name = "ryu" version = "1.0.5" @@ -1350,6 +1448,24 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + [[package]] name = "serde" version = "1.0.125" @@ -1402,6 +1518,19 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "sha2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de" +dependencies = [ + "block-buffer", + "cfg-if 1.0.0", + "cpuid-bool", + "digest", + "opaque-debug", +] + [[package]] name = "signal-hook" version = "0.3.8" @@ -1439,25 +1568,6 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" -[[package]] -name = "socket2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "spinning" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d4f0e86297cad2658d92a707320d87bf4e6ae1050287f51d19b67ef3f153a7b" -dependencies = [ - "lock_api", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1702,6 +1812,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "typenum" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" + [[package]] name = "typetag" version = "0.1.7" @@ -1726,6 +1842,12 @@ dependencies = [ "syn", ] +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + [[package]] name = "unicode-segmentation" version = "1.7.1" @@ -1792,6 +1914,17 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +[[package]] +name = "vergen" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" +dependencies = [ + "bitflags", + "chrono", + "rustc_version", +] + [[package]] name = "version_check" version = "0.9.3" @@ -2202,7 +2335,7 @@ dependencies = [ "directories-next", "futures", "insta", - "interprocess", + "ipmpsc", "lazy_static", "libc", "nix", diff --git a/Cargo.toml b/Cargo.toml index b9375f59..f55396ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ backtrace = "0.3.55" bincode = "1.3.1" directories-next = "2.0" futures = "0.3.5" +ipmpsc = "0.5.0" libc = "0.2" nix = "0.19.1" nom = "6.0.1" @@ -35,10 +36,6 @@ strum = "0.20.0" lazy_static = "1.4.0" wasmer = "1.0.0" wasmer-wasi = "1.0.0" -interprocess = "1.0.1" -colors-transform = "0.2.5" -zellij-tile = { path = "zellij-tile/", version = "1.1.0" } -zellij-tile-extra = { path = "zellij-tile-extra/", version="1.0.0" } [dependencies.async-std] version = "1.3.0" diff --git a/src/common/mod.rs b/src/common/mod.rs index 0bf235f1..34249f86 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -18,7 +18,7 @@ use std::{collections::HashMap, fs}; use crate::panes::PaneId; use directories_next::ProjectDirs; use input::handler::InputMode; -use interprocess::local_socket::LocalSocketStream; +use ipmpsc::{Sender as IpcSender, SharedRingBuffer}; use serde::{Deserialize, Serialize}; use termion::input::TermRead; use wasm_vm::PluginEnv; @@ -132,37 +132,32 @@ thread_local!( /// stack in the form of an [`ErrorContext`]. static OPENCALLS: RefCell = RefCell::default() ); +#[derive(Clone)] pub struct IpcSenderWithContext { err_ctx: ErrorContext, - sender: BufWriter, + sender: IpcSender, } impl IpcSenderWithContext { - pub fn new() -> Self { + pub fn new(buffer: SharedRingBuffer) -> Self { Self { err_ctx: ErrorContext::new(), - sender: BufWriter::new(LocalSocketStream::connect(ZELLIJ_IPC_PIPE).unwrap()), + sender: IpcSender::new(buffer), } } + // This is expensive. Use this only if a buffer is not available. + // Otherwise clone the buffer and use `new()` + pub fn to_server() -> Self { + Self::new(SharedRingBuffer::open(ZELLIJ_IPC_PIPE).unwrap()) + } + pub fn update(&mut self, ctx: ErrorContext) { self.err_ctx = ctx; } - pub fn send(&mut self, msg: ServerInstruction) -> std::io::Result<()> { - let command = bincode::serialize(&(self.err_ctx, msg)).unwrap(); - let x = self.sender.write_all(&command); - self.sender.flush(); - x - } -} - -impl std::clone::Clone for IpcSenderWithContext { - fn clone(&self) -> Self { - Self { - err_ctx: self.err_ctx, - sender: BufWriter::new(LocalSocketStream::connect(ZELLIJ_IPC_PIPE).unwrap()), - } + pub fn send(&mut self, msg: T) -> ipmpsc::Result<()> { + self.sender.send(&(self.err_ctx, msg)) } } @@ -215,7 +210,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let send_app_instructions = SenderWithContext::new(SenderType::SyncSender(send_app_instructions)); - let pty_thread = start_server( + let ipc_thread = start_server( os_input.clone(), opts.clone(), command_is_executing.clone(), @@ -555,7 +550,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } }); - let mut send_server_instructions = IpcSenderWithContext::new(); + let mut send_server_instructions = IpcSenderWithContext::to_server(); #[warn(clippy::never_loop)] loop { @@ -572,7 +567,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } AppInstruction::Error(backtrace) => { let _ = send_server_instructions.send(ServerInstruction::Quit); - //let _ = pty_thread.join(); + //let _ = ipc_thread.join(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); let _ = screen_thread.join(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); @@ -599,7 +594,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } let _ = send_server_instructions.send(ServerInstruction::Quit); - //let _ = pty_thread.join().unwrap(); + //let _ = ipc_thread.join().unwrap(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); screen_thread.join().unwrap(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 4cbd5675..52144454 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -193,12 +193,16 @@ pub struct PtyBus { pub send_server_instructions: IpcSenderWithContext, } -fn stream_terminal_bytes(pid: RawFd, os_input: Box, debug: bool) -> JoinHandle<()> { +fn stream_terminal_bytes( + pid: RawFd, + os_input: Box, + mut send_server_instructions: IpcSenderWithContext, + debug: bool, +) -> JoinHandle<()> { let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); task::spawn({ async move { err_ctx.add_call(ContextType::AsyncTask); - let mut send_server_instructions = IpcSenderWithContext::new(); send_server_instructions.update(err_ctx); let mut vte_parser = vte::Parser::new(); let mut vte_event_sender = VteEventSender::new(pid, send_server_instructions.clone()); @@ -286,8 +290,12 @@ impl PtyBus { pub fn spawn_terminal(&mut self, file_to_open: Option) -> RawFd { let (pid_primary, pid_secondary): (RawFd, RawFd) = self.os_input.spawn_terminal(file_to_open); - let task_handle = - stream_terminal_bytes(pid_primary, self.os_input.clone(), self.debug_to_file); + let task_handle = stream_terminal_bytes( + pid_primary, + self.os_input.clone(), + self.send_server_instructions.clone(), + self.debug_to_file, + ); self.task_handles.insert(pid_primary, task_handle); self.id_to_child_pid.insert(pid_primary, pid_secondary); pid_primary @@ -307,7 +315,12 @@ impl PtyBus { ))) .unwrap(); for id in new_pane_pids { - let task_handle = stream_terminal_bytes(id, self.os_input.clone(), self.debug_to_file); + let task_handle = stream_terminal_bytes( + id, + self.os_input.clone(), + self.send_server_instructions.clone(), + self.debug_to_file, + ); self.task_handles.insert(id, task_handle); } } diff --git a/src/main.rs b/src/main.rs index 78696a8d..2ad38135 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,13 +62,13 @@ pub fn main() { if let Some(split_dir) = opts.split { match split_dir { 'h' => { - let mut send_server_instructions = IpcSenderWithContext::new(); + let mut send_server_instructions = IpcSenderWithContext::to_server(); send_server_instructions .send(ServerInstruction::SplitHorizontally) .unwrap(); } 'v' => { - let mut send_server_instructions = IpcSenderWithContext::new(); + let mut send_server_instructions = IpcSenderWithContext::to_server(); send_server_instructions .send(ServerInstruction::SplitVertically) .unwrap(); @@ -76,12 +76,12 @@ pub fn main() { _ => {} }; } else if opts.move_focus { - let mut send_server_instructions = IpcSenderWithContext::new(); + let mut send_server_instructions = IpcSenderWithContext::to_server(); send_server_instructions .send(ServerInstruction::MoveFocus) .unwrap(); } else if let Some(file_to_open) = opts.open_file { - let mut send_server_instructions = IpcSenderWithContext::new(); + let mut send_server_instructions = IpcSenderWithContext::to_server(); send_server_instructions .send(ServerInstruction::OpenFile(file_to_open)) .unwrap(); diff --git a/src/server/mod.rs b/src/server/mod.rs index dd65e81f..27b24736 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -12,7 +12,7 @@ use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; use crate::utils::consts::ZELLIJ_IPC_PIPE; use crate::wasm_vm::PluginInstruction; -use interprocess::local_socket::{LocalSocketListener, LocalSocketStream}; +use ipmpsc::{Receiver, SharedRingBuffer}; use std::io::{BufReader, Read}; use std::path::PathBuf; use std::sync::mpsc::channel; @@ -32,8 +32,7 @@ pub fn start_server( ); std::fs::remove_file(ZELLIJ_IPC_PIPE).ok(); - let listener = - LocalSocketListener::bind(ZELLIJ_IPC_PIPE).expect("could not listen on ipc socket"); + let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, 8192).unwrap(); // Don't use default layouts in tests, but do everywhere else #[cfg(not(test))] @@ -42,7 +41,7 @@ pub fn start_server( let default_layout = None; let maybe_layout = opts.layout.or(default_layout); - let send_server_instructions = IpcSenderWithContext::new(); + let send_server_instructions = IpcSenderWithContext::new(server_buffer.clone()); let mut pty_bus = PtyBus::new( receive_pty_instructions, @@ -120,98 +119,56 @@ pub fn start_server( thread::Builder::new() .name("ipc_server".to_string()) .spawn({ - move || { - let mut km = 0; - for stream in listener.incoming() { - match stream { - Ok(stream) => { - let send_app_instructions = send_app_instructions.clone(); - let send_pty_instructions = send_pty_instructions.clone(); - let nm = format!("{}", km); - thread::Builder::new() - .name(nm) - .spawn(move || { - handle_stream( - send_pty_instructions, - send_app_instructions, - stream, - km, - ); - }) - .unwrap(); - km += 1; - } - Err(err) => { - panic!("err {:?}", err); - } + let recv_server_instructions = Receiver::new(server_buffer); + move || loop { + let (mut err_ctx, decoded): (ErrorContext, ServerInstruction) = + recv_server_instructions.recv().unwrap(); + err_ctx.add_call(ContextType::IPCServer); + send_pty_instructions.update(err_ctx); + send_app_instructions.update(err_ctx); + + match decoded { + ServerInstruction::OpenFile(file_name) => { + let path = PathBuf::from(file_name); + send_pty_instructions + .send(PtyInstruction::SpawnTerminal(Some(path))) + .unwrap(); + } + ServerInstruction::SplitHorizontally => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalHorizontally(None)) + .unwrap(); + } + ServerInstruction::SplitVertically => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalVertically(None)) + .unwrap(); + } + ServerInstruction::MoveFocus => { + send_app_instructions + .send(AppInstruction::ToScreen(ScreenInstruction::MoveFocus)) + .unwrap(); + } + ServerInstruction::ToPty(instruction) => { + send_pty_instructions.send(instruction).unwrap(); + } + ServerInstruction::ToScreen(instruction) => { + send_app_instructions + .send(AppInstruction::ToScreen(instruction)) + .unwrap(); + } + ServerInstruction::ClosePluginPane(pid) => { + send_app_instructions + .send(AppInstruction::ToPlugin(PluginInstruction::Unload(pid))) + .unwrap(); + } + ServerInstruction::Quit => { + let _ = send_pty_instructions.send(PtyInstruction::Quit); + let _ = pty_thread.join(); + break; } } } }) - .unwrap(); - pty_thread -} - -fn handle_stream( - mut send_pty_instructions: SenderWithContext, - mut send_app_instructions: SenderWithContext, - mut stream: LocalSocketStream, - km: u32, -) { - let mut reader = BufReader::new(stream); - let mut buffer = [0; 65535]; // TODO: more accurate - loop { - let bytes = reader - .read(&mut buffer) - .expect("failed to parse ipc message"); - let (mut err_ctx, decoded): (ErrorContext, ServerInstruction) = - match bincode::deserialize(&buffer[..bytes]) { - Ok(d) => d, - Err(_) => break, - }; - err_ctx.add_call(ContextType::IPCServer); - send_pty_instructions.update(err_ctx); - send_app_instructions.update(err_ctx); - - match decoded { - ServerInstruction::OpenFile(file_name) => { - let path = PathBuf::from(file_name); - send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(path))) - .unwrap(); - } - ServerInstruction::SplitHorizontally => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalHorizontally(None)) - .unwrap(); - } - ServerInstruction::SplitVertically => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalVertically(None)) - .unwrap(); - } - ServerInstruction::MoveFocus => { - send_app_instructions - .send(AppInstruction::ToScreen(ScreenInstruction::MoveFocus)) - .unwrap(); - } - ServerInstruction::ToPty(instruction) => { - send_pty_instructions.send(instruction).unwrap(); - } - ServerInstruction::ToScreen(instruction) => { - send_app_instructions - .send(AppInstruction::ToScreen(instruction)) - .unwrap(); - } - ServerInstruction::ClosePluginPane(pid) => { - send_app_instructions - .send(AppInstruction::ToPlugin(PluginInstruction::Unload(pid))) - .unwrap(); - } - ServerInstruction::Quit => { - let _ = send_pty_instructions.send(PtyInstruction::Quit); - break; - } - } - } + .unwrap() } From 831a02b9c0070f0e9bcec090d8fbd9d463456ace Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 18 Feb 2021 11:45:41 +0530 Subject: [PATCH 16/64] ensure proper shutdown --- src/common/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 34249f86..7e7de23c 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -567,11 +567,11 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } AppInstruction::Error(backtrace) => { let _ = send_server_instructions.send(ServerInstruction::Quit); - //let _ = ipc_thread.join(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); - let _ = screen_thread.join(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); + let _ = screen_thread.join(); let _ = wasm_thread.join(); + let _ = ipc_thread.join(); os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); let error = format!("{}\n{}", goto_start_of_last_line, backtrace); @@ -594,11 +594,11 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } let _ = send_server_instructions.send(ServerInstruction::Quit); - //let _ = ipc_thread.join().unwrap(); let _ = send_screen_instructions.send(ScreenInstruction::Quit); - screen_thread.join().unwrap(); let _ = send_plugin_instructions.send(PluginInstruction::Quit); + screen_thread.join().unwrap(); wasm_thread.join().unwrap(); + ipc_thread.join().unwrap(); // cleanup(); let reset_style = "\u{1b}[m"; From 5ece7f44ccfcbecbbc7dd2ce1ae3fb377e84ccbc Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 18 Feb 2021 13:29:11 +0530 Subject: [PATCH 17/64] Use IPC for Server to client as well Add router thread --- src/common/errors.rs | 12 ++--- src/common/mod.rs | 100 +++++++++++++++++++++++++----------------- src/common/pty_bus.rs | 2 +- src/common/screen.rs | 2 +- src/common/wasm_vm.rs | 2 +- src/server/mod.rs | 54 +++++++++++++---------- 6 files changed, 98 insertions(+), 74 deletions(-) diff --git a/src/common/errors.rs b/src/common/errors.rs index a9156ae6..1cdff574 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -194,7 +194,7 @@ pub enum ScreenContext { MoveFocusDown, MoveFocusUp, MoveFocusRight, - Quit, + Exit, ScrollUp, ScrollDown, PageScrollUp, @@ -239,7 +239,7 @@ impl From<&ScreenInstruction> for ScreenContext { ScreenInstruction::MoveFocusDown => ScreenContext::MoveFocusDown, ScreenInstruction::MoveFocusUp => ScreenContext::MoveFocusUp, ScreenInstruction::MoveFocusRight => ScreenContext::MoveFocusRight, - ScreenInstruction::Quit => ScreenContext::Quit, + ScreenInstruction::Exit => ScreenContext::Exit, ScreenInstruction::ScrollUp => ScreenContext::ScrollUp, ScreenInstruction::ScrollDown => ScreenContext::ScrollDown, ScreenInstruction::PageScrollUp => ScreenContext::PageScrollUp, @@ -276,7 +276,7 @@ pub enum PtyContext { NewTab, ClosePane, CloseTab, - Quit, + Exit, } impl From<&PtyInstruction> for PtyContext { @@ -288,7 +288,7 @@ impl From<&PtyInstruction> for PtyContext { PtyInstruction::ClosePane(_) => PtyContext::ClosePane, PtyInstruction::CloseTab(_) => PtyContext::CloseTab, PtyInstruction::NewTab => PtyContext::NewTab, - PtyInstruction::Quit => PtyContext::Quit, + PtyInstruction::Exit => PtyContext::Exit, } } } @@ -304,7 +304,7 @@ pub enum PluginContext { Update, Render, Unload, - Quit, + Exit, } impl From<&PluginInstruction> for PluginContext { @@ -314,7 +314,7 @@ impl From<&PluginInstruction> for PluginContext { PluginInstruction::Update(..) => PluginContext::Update, PluginInstruction::Render(..) => PluginContext::Render, PluginInstruction::Unload(_) => PluginContext::Unload, - PluginInstruction::Quit => PluginContext::Quit, + PluginInstruction::Exit => PluginContext::Exit, } } } diff --git a/src/common/mod.rs b/src/common/mod.rs index 7e7de23c..3ae95a74 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -18,7 +18,7 @@ use std::{collections::HashMap, fs}; use crate::panes::PaneId; use directories_next::ProjectDirs; use input::handler::InputMode; -use ipmpsc::{Sender as IpcSender, SharedRingBuffer}; +use ipmpsc::{Receiver as IpcReceiver, Sender as IpcSender, SharedRingBuffer}; use serde::{Deserialize, Serialize}; use termion::input::TermRead; use wasm_vm::PluginEnv; @@ -48,10 +48,11 @@ pub enum ServerInstruction { SplitHorizontally, SplitVertically, MoveFocus, + NewClient(String), ToPty(PtyInstruction), ToScreen(ScreenInstruction), ClosePluginPane(u32), - Quit, + Exit, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -59,6 +60,7 @@ pub enum ClientInstruction { ToScreen(ScreenInstruction), ClosePluginPane(u32), Error(String), + Exit, } // FIXME: It would be good to add some more things to this over time @@ -177,6 +179,19 @@ pub enum AppInstruction { ToPlugin(PluginInstruction), } +impl From for AppInstruction { + fn from(item: ClientInstruction) -> Self { + match item { + ClientInstruction::ToScreen(s) => AppInstruction::ToScreen(s), + ClientInstruction::Error(e) => AppInstruction::Error(e), + ClientInstruction::ClosePluginPane(p) => { + AppInstruction::ToPlugin(PluginInstruction::Unload(p)) + } + ClientInstruction::Exit => AppInstruction::Exit, + } + } +} + /// Start Zellij with the specified [`OsApi`] and command-line arguments. // FIXME this should definitely be modularized and split into different functions. pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { @@ -207,15 +222,16 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let (send_app_instructions, receive_app_instructions): SyncChannelWithContext = mpsc::sync_channel(500); - let send_app_instructions = - SenderWithContext::new(SenderType::SyncSender(send_app_instructions)); + let mut send_app_instructions = + SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - let ipc_thread = start_server( - os_input.clone(), - opts.clone(), - command_is_executing.clone(), - send_app_instructions.clone(), - ); + let ipc_thread = start_server(os_input.clone(), opts.clone(), command_is_executing.clone()); + + let (client_buffer_path, client_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); + let mut send_server_instructions = IpcSenderWithContext::to_server(); + send_server_instructions + .send(ServerInstruction::NewClient(client_buffer_path)) + .unwrap(); #[cfg(not(test))] std::panic::set_hook({ @@ -405,26 +421,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { screen.apply_layout(Layout::new(layout), new_pane_pids); command_is_executing.done_opening_new_pane(); } - ScreenInstruction::GoToTab(tab_index) => { - screen.go_to_tab(tab_index as usize) - } - ScreenInstruction::UpdateTabName(c) => { - screen.update_active_tab_name(c); - } - ScreenInstruction::TerminalResize => { - screen.resize_to_screen(); - } - ScreenInstruction::ChangeMode(mode_info) => { - screen.change_mode(mode_info); - } - ScreenInstruction::ToggleActiveSyncPanes => { - screen - .get_active_tab_mut() - .unwrap() - .toggle_sync_panes_is_active(); - screen.update_tabs(); - } - ScreenInstruction::Quit => { + ScreenInstruction::Exit => { break; } } @@ -525,7 +522,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { buf_tx.send(wasi_read_string(&plugin_env.wasi_env)).unwrap(); } PluginInstruction::Unload(pid) => drop(plugin_map.remove(&pid)), - PluginInstruction::Quit => break, + PluginInstruction::Exit => break, } } }) @@ -536,6 +533,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { .spawn({ let send_screen_instructions = send_screen_instructions.clone(); let send_plugin_instructions = send_plugin_instructions.clone(); + let send_app_instructions = send_app_instructions.clone(); let os_input = os_input.clone(); let config = config; move || { @@ -550,7 +548,25 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } }); - let mut send_server_instructions = IpcSenderWithContext::to_server(); + let router_thread = thread::Builder::new() + .name("router".to_string()) + .spawn({ + let recv_client_instructions = IpcReceiver::new(client_buffer); + move || loop { + let (err_ctx, instruction): (ErrorContext, ClientInstruction) = + recv_client_instructions.recv().unwrap(); + send_app_instructions.update(err_ctx); + match instruction { + ClientInstruction::Exit => break, + _ => { + send_app_instructions + .send(AppInstruction::from(instruction)) + .unwrap(); + } + } + } + }) + .unwrap(); #[warn(clippy::never_loop)] loop { @@ -562,16 +578,17 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { send_screen_instructions.update(err_ctx); send_server_instructions.update(err_ctx); match app_instruction { - AppInstruction::Exit => { - break; - } + AppInstruction::GetState(state_tx) => drop(state_tx.send(app_state.clone())), + AppInstruction::SetState(state) => app_state = state, + AppInstruction::Exit => break, AppInstruction::Error(backtrace) => { - let _ = send_server_instructions.send(ServerInstruction::Quit); - let _ = send_screen_instructions.send(ScreenInstruction::Quit); - let _ = send_plugin_instructions.send(PluginInstruction::Quit); + let _ = send_server_instructions.send(ServerInstruction::Exit); + let _ = send_screen_instructions.send(ScreenInstruction::Exit); + let _ = send_plugin_instructions.send(PluginInstruction::Exit); let _ = screen_thread.join(); let _ = wasm_thread.join(); let _ = ipc_thread.join(); + //let _ = router_thread.join(); os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); let error = format!("{}\n{}", goto_start_of_last_line, backtrace); @@ -593,12 +610,13 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } } - let _ = send_server_instructions.send(ServerInstruction::Quit); - let _ = send_screen_instructions.send(ScreenInstruction::Quit); - let _ = send_plugin_instructions.send(PluginInstruction::Quit); + let _ = send_server_instructions.send(ServerInstruction::Exit); + let _ = send_screen_instructions.send(ScreenInstruction::Exit); + let _ = send_plugin_instructions.send(PluginInstruction::Exit); screen_thread.join().unwrap(); wasm_thread.join().unwrap(); ipc_thread.join().unwrap(); + router_thread.join().unwrap(); // cleanup(); let reset_style = "\u{1b}[m"; diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 52144454..e08e8576 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -181,7 +181,7 @@ pub enum PtyInstruction { NewTab, ClosePane(PaneId), CloseTab(Vec), - Quit, + Exit, } pub struct PtyBus { diff --git a/src/common/screen.rs b/src/common/screen.rs index dc628a4b..7848c243 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -36,7 +36,7 @@ pub enum ScreenInstruction { MoveFocusDown, MoveFocusUp, MoveFocusRight, - Quit, + Exit, ScrollUp, ScrollDown, PageScrollUp, diff --git a/src/common/wasm_vm.rs b/src/common/wasm_vm.rs index ddb7deaf..31b1000c 100644 --- a/src/common/wasm_vm.rs +++ b/src/common/wasm_vm.rs @@ -21,7 +21,7 @@ pub enum PluginInstruction { Update(Option, Event), // Focused plugin / broadcast, event data Render(Sender, u32, usize, usize), // String buffer, plugin id, rows, cols Unload(u32), - Quit, + Exit, } #[derive(WasmerEnv, Clone)] diff --git a/src/server/mod.rs b/src/server/mod.rs index 27b24736..a39d0bc0 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,19 +1,16 @@ use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; use crate::common::{ - AppInstruction, ChannelWithContext, IpcSenderWithContext, SenderType, SenderWithContext, + ChannelWithContext, ClientInstruction, IpcSenderWithContext, SenderType, SenderWithContext, ServerInstruction, }; use crate::errors::{ContextType, ErrorContext, PtyContext}; -use crate::layout::Layout; use crate::os_input_output::OsApi; use crate::panes::PaneId; use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; use crate::utils::consts::ZELLIJ_IPC_PIPE; -use crate::wasm_vm::PluginInstruction; -use ipmpsc::{Receiver, SharedRingBuffer}; -use std::io::{BufReader, Read}; +use ipmpsc::{Receiver as IpcReceiver, SharedRingBuffer}; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; @@ -22,7 +19,6 @@ pub fn start_server( os_input: Box, opts: CliArgs, command_is_executing: CommandIsExecuting, - mut send_app_instructions: SenderWithContext, ) -> thread::JoinHandle<()> { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); @@ -31,7 +27,6 @@ pub fn start_server( SenderType::Sender(send_pty_instructions), ); - std::fs::remove_file(ZELLIJ_IPC_PIPE).ok(); let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, 8192).unwrap(); // Don't use default layouts in tests, but do everywhere else @@ -54,7 +49,6 @@ pub fn start_server( .name("pty".to_string()) .spawn({ let mut command_is_executing = command_is_executing.clone(); - send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); move || loop { let (event, mut err_ctx) = pty_bus .receive_pty_instructions @@ -108,7 +102,7 @@ pub fn start_server( pty_bus.close_tab(ids); command_is_executing.done_closing_pane(); } - PtyInstruction::Quit => { + PtyInstruction::Exit => { break; } } @@ -119,15 +113,20 @@ pub fn start_server( thread::Builder::new() .name("ipc_server".to_string()) .spawn({ - let recv_server_instructions = Receiver::new(server_buffer); + let recv_server_instructions = IpcReceiver::new(server_buffer); + // Fixme: We cannot use uninitialised sender, therefore this Vec. + // We make sure that the first message is `NewClient` so there are no out of bouns panics. + let mut send_client_instructions: Vec = Vec::with_capacity(1); move || loop { - let (mut err_ctx, decoded): (ErrorContext, ServerInstruction) = + let (mut err_ctx, instruction): (ErrorContext, ServerInstruction) = recv_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer); send_pty_instructions.update(err_ctx); - send_app_instructions.update(err_ctx); + if send_client_instructions.len() == 1 { + send_client_instructions[0].update(err_ctx); + } - match decoded { + match instruction { ServerInstruction::OpenFile(file_name) => { let path = PathBuf::from(file_name); send_pty_instructions @@ -145,26 +144,33 @@ pub fn start_server( .unwrap(); } ServerInstruction::MoveFocus => { - send_app_instructions - .send(AppInstruction::ToScreen(ScreenInstruction::MoveFocus)) + send_client_instructions[0] + .send(ClientInstruction::ToScreen(ScreenInstruction::MoveFocus)) .unwrap(); } - ServerInstruction::ToPty(instruction) => { - send_pty_instructions.send(instruction).unwrap(); + ServerInstruction::NewClient(buffer_path) => { + send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); + send_client_instructions.push(IpcSenderWithContext::new( + SharedRingBuffer::open(&buffer_path).unwrap(), + )); } - ServerInstruction::ToScreen(instruction) => { - send_app_instructions - .send(AppInstruction::ToScreen(instruction)) + ServerInstruction::ToPty(instr) => { + send_pty_instructions.send(instr).unwrap(); + } + ServerInstruction::ToScreen(instr) => { + send_client_instructions[0] + .send(ClientInstruction::ToScreen(instr)) .unwrap(); } ServerInstruction::ClosePluginPane(pid) => { - send_app_instructions - .send(AppInstruction::ToPlugin(PluginInstruction::Unload(pid))) + send_client_instructions[0] + .send(ClientInstruction::ClosePluginPane(pid)) .unwrap(); } - ServerInstruction::Quit => { - let _ = send_pty_instructions.send(PtyInstruction::Quit); + ServerInstruction::Exit => { + let _ = send_pty_instructions.send(PtyInstruction::Exit); let _ = pty_thread.join(); + let _ = send_client_instructions[0].send(ClientInstruction::Exit); break; } } From 2111f95f33cd17a27d2eb2a46560a84836cec4b5 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 18 Feb 2021 15:16:42 +0530 Subject: [PATCH 18/64] remove command_is_executing from pty_thread --- src/common/mod.rs | 9 +++- src/server/mod.rs | 107 ++++++++++++++++++++-------------------------- 2 files changed, 54 insertions(+), 62 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 3ae95a74..fc060e4d 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -225,7 +225,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let mut send_app_instructions = SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - let ipc_thread = start_server(os_input.clone(), opts.clone(), command_is_executing.clone()); + let ipc_thread = start_server(os_input.clone(), opts.clone()); let (client_buffer_path, client_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); let mut send_server_instructions = IpcSenderWithContext::to_server(); @@ -379,6 +379,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } ScreenInstruction::CloseFocusedPane => { screen.get_active_tab_mut().unwrap().close_focused_pane(); + command_is_executing.done_closing_pane(); screen.render(); } ScreenInstruction::SetSelectable(id, selectable) => { @@ -402,6 +403,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } ScreenInstruction::ClosePane(id) => { screen.get_active_tab_mut().unwrap().close_pane(id); + command_is_executing.done_closing_pane(); screen.render(); } ScreenInstruction::ToggleActiveTerminalFullscreen => { @@ -416,7 +418,10 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } ScreenInstruction::SwitchTabNext => screen.switch_tab_next(), ScreenInstruction::SwitchTabPrev => screen.switch_tab_prev(), - ScreenInstruction::CloseTab => screen.close_tab(), + ScreenInstruction::CloseTab => { + screen.close_tab(); + command_is_executing.done_closing_pane(); + } ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => { screen.apply_layout(Layout::new(layout), new_pane_pids); command_is_executing.done_opening_new_pane(); diff --git a/src/server/mod.rs b/src/server/mod.rs index a39d0bc0..e62aa7fc 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -15,11 +15,7 @@ use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; -pub fn start_server( - os_input: Box, - opts: CliArgs, - command_is_executing: CommandIsExecuting, -) -> thread::JoinHandle<()> { +pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); let mut send_pty_instructions = SenderWithContext::new( @@ -47,64 +43,55 @@ pub fn start_server( let pty_thread = thread::Builder::new() .name("pty".to_string()) - .spawn({ - let mut command_is_executing = command_is_executing.clone(); - move || loop { - let (event, mut err_ctx) = pty_bus - .receive_pty_instructions - .recv() - .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); - match event { - PtyInstruction::SpawnTerminal(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); + .spawn(move || loop { + let (event, mut err_ctx) = pty_bus + .receive_pty_instructions + .recv() + .expect("failed to receive event on channel"); + err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); + match event { + PtyInstruction::SpawnTerminal(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::NewPane( + PaneId::Terminal(pid), + ))) + .unwrap(); + } + PtyInstruction::SpawnTerminalVertically(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen( + ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), + )) + .unwrap(); + } + PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen( + ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), + )) + .unwrap(); + } + PtyInstruction::NewTab => { + if let Some(layout) = maybe_layout.clone() { + pty_bus.spawn_terminals_for_layout(layout); + } else { + let pid = pty_bus.spawn_terminal(None); pty_bus .send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::NewPane( - PaneId::Terminal(pid), - ))) + .send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid))) .unwrap(); } - PtyInstruction::SpawnTerminalVertically(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen( - ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), - )) - .unwrap(); - } - PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen( - ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), - )) - .unwrap(); - } - PtyInstruction::NewTab => { - if let Some(layout) = maybe_layout.clone() { - pty_bus.spawn_terminals_for_layout(layout); - } else { - let pid = pty_bus.spawn_terminal(None); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid))) - .unwrap(); - } - } - PtyInstruction::ClosePane(id) => { - pty_bus.close_pane(id); - command_is_executing.done_closing_pane(); - } - PtyInstruction::CloseTab(ids) => { - pty_bus.close_tab(ids); - command_is_executing.done_closing_pane(); - } - PtyInstruction::Exit => { - break; - } + } + PtyInstruction::ClosePane(id) => pty_bus.close_pane(id), + PtyInstruction::CloseTab(ids) => pty_bus.close_tab(ids), + PtyInstruction::Exit => { + break; } } }) @@ -115,7 +102,7 @@ pub fn start_server( .spawn({ let recv_server_instructions = IpcReceiver::new(server_buffer); // Fixme: We cannot use uninitialised sender, therefore this Vec. - // We make sure that the first message is `NewClient` so there are no out of bouns panics. + // For now, We make sure that the first message is `NewClient` so there are no out of bound panics. let mut send_client_instructions: Vec = Vec::with_capacity(1); move || loop { let (mut err_ctx, instruction): (ErrorContext, ServerInstruction) = From ef1c902be6c9d004f2f4124f7aa5b7d53fe22f17 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 18 Feb 2021 22:37:38 +0530 Subject: [PATCH 19/64] Introduce DoneCLosingPane message to ensure atomicity in state change --- src/common/errors.rs | 2 ++ src/common/mod.rs | 15 ++++++++------- src/main.rs | 2 +- src/server/mod.rs | 22 +++++++++++++++++++--- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/common/errors.rs b/src/common/errors.rs index 1cdff574..fcb37482 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -327,6 +327,7 @@ pub enum AppContext { ToPty, ToPlugin, ToScreen, + DoneClosingPane, } impl From<&AppInstruction> for AppContext { @@ -337,6 +338,7 @@ impl From<&AppInstruction> for AppContext { AppInstruction::ToPty(_) => AppContext::ToPty, AppInstruction::ToPlugin(_) => AppContext::ToPlugin, AppInstruction::ToScreen(_) => AppContext::ToScreen, + AppInstruction::DoneClosingPane => AppContext::DoneClosingPane, } } } diff --git a/src/common/mod.rs b/src/common/mod.rs index fc060e4d..c0c35565 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -9,7 +9,7 @@ pub mod setup; pub mod utils; pub mod wasm_vm; -use std::io::{BufWriter, Write}; +use std::io::Write; use std::path::{Path, PathBuf}; use std::sync::mpsc; use std::thread; @@ -51,6 +51,7 @@ pub enum ServerInstruction { NewClient(String), ToPty(PtyInstruction), ToScreen(ScreenInstruction), + DoneClosingPane, ClosePluginPane(u32), Exit, } @@ -60,6 +61,7 @@ pub enum ClientInstruction { ToScreen(ScreenInstruction), ClosePluginPane(u32), Error(String), + DoneClosingPane, Exit, } @@ -177,6 +179,7 @@ pub enum AppInstruction { ToPty(PtyInstruction), ToScreen(ScreenInstruction), ToPlugin(PluginInstruction), + DoneClosingPane, } impl From for AppInstruction { @@ -187,6 +190,7 @@ impl From for AppInstruction { ClientInstruction::ClosePluginPane(p) => { AppInstruction::ToPlugin(PluginInstruction::Unload(p)) } + ClientInstruction::DoneClosingPane => AppInstruction::DoneClosingPane, ClientInstruction::Exit => AppInstruction::Exit, } } @@ -202,9 +206,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { .write(take_snapshot.as_bytes()) .unwrap(); - env::set_var(&"ZELLIJ", "0"); - - let command_is_executing = CommandIsExecuting::new(); + let mut command_is_executing = CommandIsExecuting::new(); let full_screen_ws = os_input.get_terminal_size_using_fd(0); os_input.set_raw_mode(0); @@ -379,7 +381,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } ScreenInstruction::CloseFocusedPane => { screen.get_active_tab_mut().unwrap().close_focused_pane(); - command_is_executing.done_closing_pane(); screen.render(); } ScreenInstruction::SetSelectable(id, selectable) => { @@ -403,7 +404,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { } ScreenInstruction::ClosePane(id) => { screen.get_active_tab_mut().unwrap().close_pane(id); - command_is_executing.done_closing_pane(); screen.render(); } ScreenInstruction::ToggleActiveTerminalFullscreen => { @@ -420,7 +420,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { ScreenInstruction::SwitchTabPrev => screen.switch_tab_prev(), ScreenInstruction::CloseTab => { screen.close_tab(); - command_is_executing.done_closing_pane(); } ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => { screen.apply_layout(Layout::new(layout), new_pane_pids); @@ -539,6 +538,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let send_screen_instructions = send_screen_instructions.clone(); let send_plugin_instructions = send_plugin_instructions.clone(); let send_app_instructions = send_app_instructions.clone(); + let command_is_executing = command_is_executing.clone(); let os_input = os_input.clone(); let config = config; move || { @@ -612,6 +612,7 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { AppInstruction::ToPty(instruction) => { let _ = send_server_instructions.send(ServerInstruction::ToPty(instruction)); } + AppInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), } } diff --git a/src/main.rs b/src/main.rs index 2ad38135..e5cdbe53 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ mod server; use client::{boundaries, layout, panes, tab}; use common::{ - command_is_executing, errors, ipc, os_input_output, pty_bus, screen, start, utils, wasm_vm, + command_is_executing, errors, os_input_output, pty_bus, screen, start, utils, wasm_vm, IpcSenderWithContext, ServerInstruction, }; use directories_next::ProjectDirs; diff --git a/src/server/mod.rs b/src/server/mod.rs index e62aa7fc..e71e91da 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,5 +1,4 @@ use crate::cli::CliArgs; -use crate::command_is_executing::CommandIsExecuting; use crate::common::{ ChannelWithContext, ClientInstruction, IpcSenderWithContext, SenderType, SenderWithContext, ServerInstruction, @@ -88,8 +87,20 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHand .unwrap(); } } - PtyInstruction::ClosePane(id) => pty_bus.close_pane(id), - PtyInstruction::CloseTab(ids) => pty_bus.close_tab(ids), + PtyInstruction::ClosePane(id) => { + pty_bus.close_pane(id); + pty_bus + .send_server_instructions + .send(ServerInstruction::DoneClosingPane) + .unwrap(); + } + PtyInstruction::CloseTab(ids) => { + pty_bus.close_tab(ids); + pty_bus + .send_server_instructions + .send(ServerInstruction::DoneClosingPane) + .unwrap(); + } PtyInstruction::Exit => { break; } @@ -149,6 +160,11 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHand .send(ClientInstruction::ToScreen(instr)) .unwrap(); } + ServerInstruction::DoneClosingPane => { + send_client_instructions[0] + .send(ClientInstruction::DoneClosingPane) + .unwrap(); + } ServerInstruction::ClosePluginPane(pid) => { send_client_instructions[0] .send(ClientInstruction::ClosePluginPane(pid)) From 627e6b3672f6a02e2dac1e6a597088e97a9f631f Mon Sep 17 00:00:00 2001 From: denis Date: Mon, 1 Mar 2021 15:19:40 +0200 Subject: [PATCH 20/64] wip: working on osapi message variants --- src/common/mod.rs | 3 ++- src/common/os_input_output.rs | 18 +++++++++++++++++- src/server/mod.rs | 11 ++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index c0c35565..a5c004f9 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -31,7 +31,7 @@ use crate::server::start_server; use command_is_executing::CommandIsExecuting; use errors::{AppContext, ContextType, ErrorContext, PluginContext, ScreenContext}; use input::handler::input_loop; -use os_input_output::OsApi; +use os_input_output::{OsApi, OsApiInstruction}; use pty_bus::PtyInstruction; use screen::{Screen, ScreenInstruction}; use serde::{Deserialize, Serialize}; @@ -51,6 +51,7 @@ pub enum ServerInstruction { NewClient(String), ToPty(PtyInstruction), ToScreen(ScreenInstruction), + OsApi(OsApiInstruction), DoneClosingPane, ClosePluginPane(u32), Exit, diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 74d14036..8a8cea14 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -13,7 +13,7 @@ use std::os::unix::io::RawFd; use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; -use zellij_tile::data::Palette; +use serde::{Deserialize, Serialize}; use signal_hook::{consts::signal::*, iterator::Signals}; @@ -269,6 +269,22 @@ impl OsApi for OsInputOutput { } } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum OsApiInstruction { + GetTerminalSizeUsingFd(RawFd), + SetTerminalSizeUsingFd(RawFd, u16, u16), + SetRawMode(RawFd), + UnsetRawMode(RawFd), + SpawnTerminal(Option), + ReadFromTtyStdout(RawFd, Vec), + WriteToTtyStdin(RawFd, Vec), + TcDrain(RawFd), + Kill(RawFd), + ReadFromStdin, + GetStdoutWriter, + BoxClone +} + impl Clone for Box { fn clone(&self) -> Box { self.box_clone() diff --git a/src/server/mod.rs b/src/server/mod.rs index e71e91da..fef66366 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -4,7 +4,7 @@ use crate::common::{ ServerInstruction, }; use crate::errors::{ContextType, ErrorContext, PtyContext}; -use crate::os_input_output::OsApi; +use crate::os_input_output::{OsApi, OsApiInstruction}; use crate::panes::PaneId; use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; @@ -24,6 +24,12 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHand let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, 8192).unwrap(); + let (send_os_instructions, receive_os_instructions): ChannelWithContext = channel(); + let mut send_os_instructions = SenderWithContext::new( + ErrorContext::new(), + SenderType::Sender(send_os_instructions), + ); + // Don't use default layouts in tests, but do everywhere else #[cfg(not(test))] let default_layout = Some(PathBuf::from("default")); @@ -160,6 +166,9 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHand .send(ClientInstruction::ToScreen(instr)) .unwrap(); } + ServerInstruction::OsApi(instr) => { + send_os_instructions.send(instr).unwrap(); + } ServerInstruction::DoneClosingPane => { send_client_instructions[0] .send(ClientInstruction::DoneClosingPane) From d8986351ed1b5ab7c5b1e28b0b429d8a42eb5e50 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 12 Mar 2021 22:33:06 +0530 Subject: [PATCH 21/64] fix testing for pseudo client-server model --- Cargo.lock | 25 ++++++++++--------------- src/common/mod.rs | 5 +++-- src/server/mod.rs | 15 +++++++++++---- src/tests/fakes.rs | 2 +- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b66f3f28..95648ec2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -332,12 +332,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "colors-transform" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9226dbc05df4fb986f48d730b001532580883c4c06c5d1c213f4b34c1c157178" - [[package]] name = "concurrent-queue" version = "1.2.2" @@ -360,12 +354,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "const_fn" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" - [[package]] name = "cpuid-bool" version = "0.1.2" @@ -1568,6 +1556,16 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "socket2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2331,7 +2329,6 @@ dependencies = [ "async-std", "backtrace", "bincode", - "colors-transform", "directories-next", "futures", "insta", @@ -2355,8 +2352,6 @@ dependencies = [ "vte 0.8.0", "wasmer", "wasmer-wasi", - "zellij-tile", - "zellij-tile-extra", ] [[package]] diff --git a/src/common/mod.rs b/src/common/mod.rs index a5c004f9..d003aab0 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -228,10 +228,11 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let mut send_app_instructions = SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - let ipc_thread = start_server(os_input.clone(), opts.clone()); + let (ipc_thread, server_name) = start_server(os_input.clone(), opts.clone()); let (client_buffer_path, client_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); - let mut send_server_instructions = IpcSenderWithContext::to_server(); + let mut send_server_instructions = + IpcSenderWithContext::new(SharedRingBuffer::open(&server_name).unwrap()); send_server_instructions .send(ServerInstruction::NewClient(client_buffer_path)) .unwrap(); diff --git a/src/server/mod.rs b/src/server/mod.rs index fef66366..794066b0 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -14,7 +14,7 @@ use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; -pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { +pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHandle<()>, String) { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); let mut send_pty_instructions = SenderWithContext::new( @@ -22,7 +22,13 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHand SenderType::Sender(send_pty_instructions), ); - let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, 8192).unwrap(); + #[cfg(not(test))] + let (server_name, server_buffer) = ( + String::from(ZELLIJ_IPC_PIPE), + SharedRingBuffer::create(ZELLIJ_IPC_PIPE, 8192).unwrap(), + ); + #[cfg(test)] + let (server_name, server_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); let (send_os_instructions, receive_os_instructions): ChannelWithContext = channel(); let mut send_os_instructions = SenderWithContext::new( @@ -114,7 +120,7 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHand }) .unwrap(); - thread::Builder::new() + let join_handle = thread::Builder::new() .name("ipc_server".to_string()) .spawn({ let recv_server_instructions = IpcReceiver::new(server_buffer); @@ -188,5 +194,6 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHand } } }) - .unwrap() + .unwrap(); + (join_handle, server_name) } diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 684a24a7..8e4aff25 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -13,7 +13,7 @@ use zellij_tile::data::Palette; use crate::tests::utils::commands::{QUIT, SLEEP}; -const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(50); +const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(300); #[derive(Clone)] pub enum IoEvent { From daddac65aa62fc8d519a8ef944a34e90724aa6eb Mon Sep 17 00:00:00 2001 From: denis Date: Thu, 18 Mar 2021 12:20:23 +0200 Subject: [PATCH 22/64] wip: here goes the os_thread and OsContext --- src/common/errors.rs | 41 ++++- src/server/mod.rs | 407 ++++++++++++++++++++++++------------------- 2 files changed, 270 insertions(+), 178 deletions(-) diff --git a/src/common/errors.rs b/src/common/errors.rs index fcb37482..37b3a2c7 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -1,7 +1,7 @@ //! Error context system based on a thread-local representation of the call stack, itself based on //! the instructions that are sent between threads. -use super::{AppInstruction, ASYNCOPENCALLS, OPENCALLS}; +use super::{os_input_output::OsApiInstruction, AppInstruction, OPENCALLS}; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; use serde::{Deserialize, Serialize}; @@ -138,6 +138,8 @@ pub enum ContextType { Screen(ScreenContext), /// A PTY-related call. Pty(PtyContext), + /// An OS-related call. + Os(OsContext), /// A plugin-related call. Plugin(PluginContext), /// An app-related call. @@ -158,7 +160,7 @@ impl Display for ContextType { match *self { ContextType::Screen(c) => write!(f, "{}screen_thread: {}{:?}", purple, green, c), ContextType::Pty(c) => write!(f, "{}pty_thread: {}{:?}", purple, green, c), - + ContextType::Os(c) => write!(f, "{}os_thread: {}{:?}", purple, green, c), ContextType::Plugin(c) => write!(f, "{}plugin_thread: {}{:?}", purple, green, c), ContextType::App(c) => write!(f, "{}main_thread: {}{:?}", purple, green, c), ContextType::IpcServer => write!(f, "{}ipc_server: {}AcceptInput", purple, green), @@ -293,6 +295,41 @@ impl From<&PtyInstruction> for PtyContext { } } +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub enum OsContext { + SpawnTerminal, + GetTerminalSizeUsingFd, + SetTerminalSizeUsingFd, + SetRawMode, + UnsetRawMode, + ReadFromTtyStdout, + WriteToTtyStdin, + TcDrain, + Kill, + ReadFromStdin, + GetStdoutWriter, + BoxClone, +} + +impl From<&OsApiInstruction> for OsContext { + fn from(os_instruction: &OsApiInstruction) -> Self { + match *os_instruction { + OsApiInstruction::SpawnTerminal(_) => OsContext::SpawnTerminal, + OsApiInstruction::GetTerminalSizeUsingFd(_) => OsContext::GetTerminalSizeUsingFd, + OsApiInstruction::SetTerminalSizeUsingFd(_, _, _) => OsContext::SetTerminalSizeUsingFd, + OsApiInstruction::SetRawMode(_) => OsContext::SetRawMode, + OsApiInstruction::UnsetRawMode(_) => OsContext::UnsetRawMode, + OsApiInstruction::ReadFromTtyStdout(_, _) => OsContext::ReadFromTtyStdout, + OsApiInstruction::WriteToTtyStdin(_, _) => OsContext::WriteToTtyStdin, + OsApiInstruction::TcDrain(_) => OsContext::TcDrain, + OsApiInstruction::Kill(_) => OsContext::Kill, + OsApiInstruction::ReadFromStdin => OsContext::ReadFromStdin, + OsApiInstruction::GetStdoutWriter => OsContext::GetStdoutWriter, + OsApiInstruction::BoxClone => OsContext::BoxClone + } + } +} + // FIXME: This whole pattern *needs* a macro eventually, it's soul-crushing to write use crate::wasm_vm::PluginInstruction; diff --git a/src/server/mod.rs b/src/server/mod.rs index 794066b0..3ca9e004 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,9 +1,9 @@ use crate::cli::CliArgs; use crate::common::{ - ChannelWithContext, ClientInstruction, IpcSenderWithContext, SenderType, SenderWithContext, - ServerInstruction, + ChannelWithContext, ClientInstruction, IpcSenderWithContext, SenderType, SenderWithContext, + ServerInstruction, }; -use crate::errors::{ContextType, ErrorContext, PtyContext}; +use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext}; use crate::os_input_output::{OsApi, OsApiInstruction}; use crate::panes::PaneId; use crate::pty_bus::{PtyBus, PtyInstruction}; @@ -15,185 +15,240 @@ use std::sync::mpsc::channel; use std::thread; pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHandle<()>, String) { - let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = - channel(); - let mut send_pty_instructions = SenderWithContext::new( - ErrorContext::new(), - SenderType::Sender(send_pty_instructions), - ); + let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = + channel(); + let mut send_pty_instructions = SenderWithContext::new( + ErrorContext::new(), + SenderType::Sender(send_pty_instructions), + ); - #[cfg(not(test))] - let (server_name, server_buffer) = ( - String::from(ZELLIJ_IPC_PIPE), - SharedRingBuffer::create(ZELLIJ_IPC_PIPE, 8192).unwrap(), - ); - #[cfg(test)] - let (server_name, server_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); + #[cfg(not(test))] + let (server_name, server_buffer) = ( + String::from(ZELLIJ_IPC_PIPE), + SharedRingBuffer::create(ZELLIJ_IPC_PIPE, 8192).unwrap(), + ); + #[cfg(test)] + let (server_name, server_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); - let (send_os_instructions, receive_os_instructions): ChannelWithContext = channel(); - let mut send_os_instructions = SenderWithContext::new( - ErrorContext::new(), - SenderType::Sender(send_os_instructions), - ); + let (send_os_instructions, receive_os_instructions): ChannelWithContext = + channel(); + let mut send_os_instructions = SenderWithContext::new( + ErrorContext::new(), + SenderType::Sender(send_os_instructions), + ); - // Don't use default layouts in tests, but do everywhere else - #[cfg(not(test))] - let default_layout = Some(PathBuf::from("default")); - #[cfg(test)] - let default_layout = None; - let maybe_layout = opts.layout.or(default_layout); + // Don't use default layouts in tests, but do everywhere else + #[cfg(not(test))] + let default_layout = Some(PathBuf::from("default")); + #[cfg(test)] + let default_layout = None; + let maybe_layout = opts.layout.or(default_layout); - let send_server_instructions = IpcSenderWithContext::new(server_buffer.clone()); + let send_server_instructions = IpcSenderWithContext::new(server_buffer.clone()); - let mut pty_bus = PtyBus::new( - receive_pty_instructions, - os_input.clone(), - send_server_instructions, - opts.debug, - ); + let mut pty_bus = PtyBus::new( + receive_pty_instructions, + os_input.clone(), + send_server_instructions, + opts.debug, + ); - let pty_thread = thread::Builder::new() - .name("pty".to_string()) - .spawn(move || loop { - let (event, mut err_ctx) = pty_bus - .receive_pty_instructions - .recv() - .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); - match event { - PtyInstruction::SpawnTerminal(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::NewPane( - PaneId::Terminal(pid), - ))) - .unwrap(); - } - PtyInstruction::SpawnTerminalVertically(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen( - ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), - )) - .unwrap(); - } - PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen( - ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), - )) - .unwrap(); - } - PtyInstruction::NewTab => { - if let Some(layout) = maybe_layout.clone() { - pty_bus.spawn_terminals_for_layout(layout); - } else { - let pid = pty_bus.spawn_terminal(None); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid))) - .unwrap(); - } - } - PtyInstruction::ClosePane(id) => { - pty_bus.close_pane(id); - pty_bus - .send_server_instructions - .send(ServerInstruction::DoneClosingPane) - .unwrap(); - } - PtyInstruction::CloseTab(ids) => { - pty_bus.close_tab(ids); - pty_bus - .send_server_instructions - .send(ServerInstruction::DoneClosingPane) - .unwrap(); - } - PtyInstruction::Exit => { - break; - } - } - }) - .unwrap(); + let pty_thread = thread::Builder::new() + .name("pty".to_string()) + .spawn(move || loop { + let (event, mut err_ctx) = pty_bus + .receive_pty_instructions + .recv() + .expect("failed to receive event on channel"); + err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); + match event { + PtyInstruction::SpawnTerminal(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::NewPane( + PaneId::Terminal(pid), + ))) + .unwrap(); + } + PtyInstruction::SpawnTerminalVertically(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen( + ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), + )) + .unwrap(); + } + PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen( + ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), + )) + .unwrap(); + } + PtyInstruction::NewTab => { + if let Some(layout) = maybe_layout.clone() { + pty_bus.spawn_terminals_for_layout(layout); + } else { + let pid = pty_bus.spawn_terminal(None); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid))) + .unwrap(); + } + } + PtyInstruction::ClosePane(id) => { + pty_bus.close_pane(id); + pty_bus + .send_server_instructions + .send(ServerInstruction::DoneClosingPane) + .unwrap(); + } + PtyInstruction::CloseTab(ids) => { + pty_bus.close_tab(ids); + pty_bus + .send_server_instructions + .send(ServerInstruction::DoneClosingPane) + .unwrap(); + } + PtyInstruction::Exit => { + break; + } + } + }) + .unwrap(); - let join_handle = thread::Builder::new() - .name("ipc_server".to_string()) - .spawn({ - let recv_server_instructions = IpcReceiver::new(server_buffer); - // Fixme: We cannot use uninitialised sender, therefore this Vec. - // For now, We make sure that the first message is `NewClient` so there are no out of bound panics. - let mut send_client_instructions: Vec = Vec::with_capacity(1); - move || loop { - let (mut err_ctx, instruction): (ErrorContext, ServerInstruction) = - recv_server_instructions.recv().unwrap(); - err_ctx.add_call(ContextType::IPCServer); - send_pty_instructions.update(err_ctx); - if send_client_instructions.len() == 1 { - send_client_instructions[0].update(err_ctx); - } + let os_thread = thread::Builder::new() + .name("os".to_string()) + .spawn({ + let mut os_input = os_input.clone(); + move || loop { + let (event, mut err_ctx) = receive_os_instructions + .recv() + .expect("failed to receive an event on the channel"); + err_ctx.add_call(ContextType::Os(OsContext::from(&event))); + match event { + OsApiInstruction::SpawnTerminal(file_to_open) => { + os_input.spawn_terminal(file_to_open); + } + OsApiInstruction::GetTerminalSizeUsingFd(fd) => { + os_input.get_terminal_size_using_fd(fd); + } + OsApiInstruction::SetTerminalSizeUsingFd(fd, cols, rows) => { + os_input.set_terminal_size_using_fd(fd, cols, rows); + } + OsApiInstruction::SetRawMode(fd) => { + os_input.set_raw_mode(fd); + } + OsApiInstruction::UnsetRawMode(fd) => { + os_input.unset_raw_mode(fd); + } + OsApiInstruction::ReadFromTtyStdout(fd, mut buf) => { + let slice = buf.as_mut_slice(); + os_input.read_from_tty_stdout(fd, slice).unwrap(); + } + OsApiInstruction::WriteToTtyStdin(fd, mut buf) => { + let slice = buf.as_mut_slice(); + os_input.write_to_tty_stdin(fd, slice).unwrap(); + } + OsApiInstruction::TcDrain(fd) => { + os_input.tcdrain(fd).unwrap(); + } + OsApiInstruction::Kill(pid) => { + os_input.kill(pid).unwrap(); + } + OsApiInstruction::ReadFromStdin => { + os_input.read_from_stdin(); + } + OsApiInstruction::GetStdoutWriter => { + os_input.get_stdout_writer(); + } + OsApiInstruction::BoxClone => { + os_input.box_clone(); + } + } + } + }) + .unwrap(); - match instruction { - ServerInstruction::OpenFile(file_name) => { - let path = PathBuf::from(file_name); - send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(path))) - .unwrap(); - } - ServerInstruction::SplitHorizontally => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalHorizontally(None)) - .unwrap(); - } - ServerInstruction::SplitVertically => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalVertically(None)) - .unwrap(); - } - ServerInstruction::MoveFocus => { - send_client_instructions[0] - .send(ClientInstruction::ToScreen(ScreenInstruction::MoveFocus)) - .unwrap(); - } - ServerInstruction::NewClient(buffer_path) => { - send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); - send_client_instructions.push(IpcSenderWithContext::new( - SharedRingBuffer::open(&buffer_path).unwrap(), - )); - } - ServerInstruction::ToPty(instr) => { - send_pty_instructions.send(instr).unwrap(); - } - ServerInstruction::ToScreen(instr) => { - send_client_instructions[0] - .send(ClientInstruction::ToScreen(instr)) - .unwrap(); - } - ServerInstruction::OsApi(instr) => { - send_os_instructions.send(instr).unwrap(); - } - ServerInstruction::DoneClosingPane => { - send_client_instructions[0] - .send(ClientInstruction::DoneClosingPane) - .unwrap(); - } - ServerInstruction::ClosePluginPane(pid) => { - send_client_instructions[0] - .send(ClientInstruction::ClosePluginPane(pid)) - .unwrap(); - } - ServerInstruction::Exit => { - let _ = send_pty_instructions.send(PtyInstruction::Exit); - let _ = pty_thread.join(); - let _ = send_client_instructions[0].send(ClientInstruction::Exit); - break; - } - } - } - }) - .unwrap(); - (join_handle, server_name) + let join_handle = thread::Builder::new() + .name("ipc_server".to_string()) + .spawn({ + let recv_server_instructions = IpcReceiver::new(server_buffer); + // Fixme: We cannot use uninitialised sender, therefore this Vec. + // For now, We make sure that the first message is `NewClient` so there are no out of bound panics. + let mut send_client_instructions: Vec = Vec::with_capacity(1); + move || loop { + let (mut err_ctx, instruction): (ErrorContext, ServerInstruction) = + recv_server_instructions.recv().unwrap(); + err_ctx.add_call(ContextType::IPCServer); + send_pty_instructions.update(err_ctx); + if send_client_instructions.len() == 1 { + send_client_instructions[0].update(err_ctx); + } + + match instruction { + ServerInstruction::OpenFile(file_name) => { + let path = PathBuf::from(file_name); + send_pty_instructions + .send(PtyInstruction::SpawnTerminal(Some(path))) + .unwrap(); + } + ServerInstruction::SplitHorizontally => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalHorizontally(None)) + .unwrap(); + } + ServerInstruction::SplitVertically => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalVertically(None)) + .unwrap(); + } + ServerInstruction::MoveFocus => { + send_client_instructions[0] + .send(ClientInstruction::ToScreen(ScreenInstruction::MoveFocus)) + .unwrap(); + } + ServerInstruction::NewClient(buffer_path) => { + send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); + send_client_instructions.push(IpcSenderWithContext::new( + SharedRingBuffer::open(&buffer_path).unwrap(), + )); + } + ServerInstruction::ToPty(instr) => { + send_pty_instructions.send(instr).unwrap(); + } + ServerInstruction::ToScreen(instr) => { + send_client_instructions[0] + .send(ClientInstruction::ToScreen(instr)) + .unwrap(); + } + ServerInstruction::OsApi(instr) => { + send_os_instructions.send(instr).unwrap(); + } + ServerInstruction::DoneClosingPane => { + send_client_instructions[0] + .send(ClientInstruction::DoneClosingPane) + .unwrap(); + } + ServerInstruction::ClosePluginPane(pid) => { + send_client_instructions[0] + .send(ClientInstruction::ClosePluginPane(pid)) + .unwrap(); + } + ServerInstruction::Exit => { + let _ = send_pty_instructions.send(PtyInstruction::Exit); + let _ = pty_thread.join(); + let _ = os_thread.join(); + let _ = send_client_instructions[0].send(ClientInstruction::Exit); + break; + } + } + } + }) + .unwrap(); + (join_handle, server_name) } From 70d8be07417c023b27400b0f8c6c4ce736cf8cd2 Mon Sep 17 00:00:00 2001 From: denis Date: Thu, 18 Mar 2021 15:28:00 +0200 Subject: [PATCH 23/64] wip: remove the commands that are called only on the client --- src/common/errors.rs | 9 --------- src/common/os_input_output.rs | 9 --------- src/server/mod.rs | 28 ---------------------------- 3 files changed, 46 deletions(-) diff --git a/src/common/errors.rs b/src/common/errors.rs index 37b3a2c7..3b5c8354 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -314,18 +314,9 @@ pub enum OsContext { impl From<&OsApiInstruction> for OsContext { fn from(os_instruction: &OsApiInstruction) -> Self { match *os_instruction { - OsApiInstruction::SpawnTerminal(_) => OsContext::SpawnTerminal, - OsApiInstruction::GetTerminalSizeUsingFd(_) => OsContext::GetTerminalSizeUsingFd, OsApiInstruction::SetTerminalSizeUsingFd(_, _, _) => OsContext::SetTerminalSizeUsingFd, - OsApiInstruction::SetRawMode(_) => OsContext::SetRawMode, - OsApiInstruction::UnsetRawMode(_) => OsContext::UnsetRawMode, - OsApiInstruction::ReadFromTtyStdout(_, _) => OsContext::ReadFromTtyStdout, OsApiInstruction::WriteToTtyStdin(_, _) => OsContext::WriteToTtyStdin, OsApiInstruction::TcDrain(_) => OsContext::TcDrain, - OsApiInstruction::Kill(_) => OsContext::Kill, - OsApiInstruction::ReadFromStdin => OsContext::ReadFromStdin, - OsApiInstruction::GetStdoutWriter => OsContext::GetStdoutWriter, - OsApiInstruction::BoxClone => OsContext::BoxClone } } } diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 8a8cea14..0e7363ea 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -271,18 +271,9 @@ impl OsApi for OsInputOutput { #[derive(Serialize, Deserialize, Debug, Clone)] pub enum OsApiInstruction { - GetTerminalSizeUsingFd(RawFd), SetTerminalSizeUsingFd(RawFd, u16, u16), - SetRawMode(RawFd), - UnsetRawMode(RawFd), - SpawnTerminal(Option), - ReadFromTtyStdout(RawFd, Vec), WriteToTtyStdin(RawFd, Vec), TcDrain(RawFd), - Kill(RawFd), - ReadFromStdin, - GetStdoutWriter, - BoxClone } impl Clone for Box { diff --git a/src/server/mod.rs b/src/server/mod.rs index 3ca9e004..c1713918 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -131,25 +131,9 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHan .expect("failed to receive an event on the channel"); err_ctx.add_call(ContextType::Os(OsContext::from(&event))); match event { - OsApiInstruction::SpawnTerminal(file_to_open) => { - os_input.spawn_terminal(file_to_open); - } - OsApiInstruction::GetTerminalSizeUsingFd(fd) => { - os_input.get_terminal_size_using_fd(fd); - } OsApiInstruction::SetTerminalSizeUsingFd(fd, cols, rows) => { os_input.set_terminal_size_using_fd(fd, cols, rows); } - OsApiInstruction::SetRawMode(fd) => { - os_input.set_raw_mode(fd); - } - OsApiInstruction::UnsetRawMode(fd) => { - os_input.unset_raw_mode(fd); - } - OsApiInstruction::ReadFromTtyStdout(fd, mut buf) => { - let slice = buf.as_mut_slice(); - os_input.read_from_tty_stdout(fd, slice).unwrap(); - } OsApiInstruction::WriteToTtyStdin(fd, mut buf) => { let slice = buf.as_mut_slice(); os_input.write_to_tty_stdin(fd, slice).unwrap(); @@ -157,18 +141,6 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHan OsApiInstruction::TcDrain(fd) => { os_input.tcdrain(fd).unwrap(); } - OsApiInstruction::Kill(pid) => { - os_input.kill(pid).unwrap(); - } - OsApiInstruction::ReadFromStdin => { - os_input.read_from_stdin(); - } - OsApiInstruction::GetStdoutWriter => { - os_input.get_stdout_writer(); - } - OsApiInstruction::BoxClone => { - os_input.box_clone(); - } } } }) From 0d814ebcde98659babeaaa71a3ad5ee720021fc4 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 18 Mar 2021 22:37:25 +0530 Subject: [PATCH 24/64] Divide OsApi into ClientOsApi and ServerOsApi and move calls to os thread --- src/client/tab.rs | 365 ++++++++++++++++++++++------------ src/common/errors.rs | 27 ++- src/common/input/handler.rs | 10 +- src/common/mod.rs | 20 +- src/common/os_input_output.rs | 144 +++++++------- src/common/pty_bus.rs | 12 +- src/common/screen.rs | 9 +- src/main.rs | 5 +- src/server/mod.rs | 23 ++- src/tests/fakes.rs | 74 ++++--- 10 files changed, 420 insertions(+), 269 deletions(-) diff --git a/src/client/tab.rs b/src/client/tab.rs index b87926b7..8e07dfc3 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -10,7 +10,11 @@ use crate::pty_bus::{PtyInstruction, VteBytes}; use crate::utils::shared::adjust_to_size; use crate::wasm_vm::PluginInstruction; use crate::{boundaries::Boundaries, panes::PluginPane}; -use serde::{Deserialize, Serialize}; +use crate::{layout::Layout, wasm_vm::PluginInstruction}; +use crate::{ + os_input_output::{ClientOsApi, ServerOsApiInstruction}, + utils::shared::pad_to_size, +}; use std::os::unix::io::RawFd; use std::time::Instant; use std::{ @@ -67,8 +71,7 @@ pub struct Tab { max_panes: Option, full_screen_ws: PositionAndSize, fullscreen_is_active: bool, - synchronize_is_active: bool, - os_api: Box, + os_api: Box, pub send_plugin_instructions: SenderWithContext, pub send_app_instructions: SenderWithContext, should_clear_display_before_rendering: bool, @@ -224,7 +227,7 @@ impl Tab { position: usize, name: String, full_screen_ws: &PositionAndSize, - mut os_api: Box, + os_api: Box, send_plugin_instructions: SenderWithContext, send_app_instructions: SenderWithContext, max_panes: Option, @@ -235,11 +238,15 @@ impl Tab { ) -> Self { let panes = if let Some(PaneId::Terminal(pid)) = pane_id { let new_terminal = TerminalPane::new(pid, *full_screen_ws); - os_api.set_terminal_size_using_fd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ); + send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )) + .unwrap(); let mut panes: BTreeMap> = BTreeMap::new(); panes.insert(PaneId::Terminal(pid), Box::new(new_terminal)); panes @@ -292,11 +299,15 @@ impl Tab { terminal_pane.set_max_width(max_columns); } terminal_pane.change_pos_and_size(&position_and_size); - self.os_api.set_terminal_size_using_fd( - *pid, - position_and_size.columns as u16, - position_and_size.rows as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *pid, + position_and_size.columns as u16, + position_and_size.rows as u16, + ), + )) + .unwrap(); } None => { // we filled the entire layout, no room for this pane @@ -338,11 +349,15 @@ impl Tab { // there are still panes left to fill, use the pids we received in this method let pid = new_pids.next().unwrap(); // if this crashes it means we got less pids than there are panes in this layout let new_terminal = TerminalPane::new(*pid, *position_and_size); - self.os_api.set_terminal_size_using_fd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )) + .unwrap(); self.panes .insert(PaneId::Terminal(*pid), Box::new(new_terminal)); } @@ -368,11 +383,15 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.os_api.set_terminal_size_using_fd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )) + .unwrap(); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -418,19 +437,27 @@ impl Tab { if let PaneId::Terminal(term_pid) = pid { let (top_winsize, bottom_winsize) = split_horizontally_with_gap(&terminal_ws); let new_terminal = TerminalPane::new(term_pid, bottom_winsize); - self.os_api.set_terminal_size_using_fd( - new_terminal.pid, - bottom_winsize.columns as u16, - bottom_winsize.rows as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + bottom_winsize.columns as u16, + bottom_winsize.rows as u16, + ), + )) + .unwrap(); terminal_to_split.change_pos_and_size(&top_winsize); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(terminal_id_to_split) = terminal_id_to_split { - self.os_api.set_terminal_size_using_fd( - terminal_id_to_split, - top_winsize.columns as u16, - top_winsize.rows as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + terminal_id_to_split, + top_winsize.columns as u16, + top_winsize.rows as u16, + ), + )) + .unwrap(); } self.active_terminal = Some(pid); } @@ -438,19 +465,27 @@ impl Tab { if let PaneId::Terminal(term_pid) = pid { let (left_winsize, right_winsize) = split_vertically_with_gap(&terminal_ws); let new_terminal = TerminalPane::new(term_pid, right_winsize); - self.os_api.set_terminal_size_using_fd( - new_terminal.pid, - right_winsize.columns as u16, - right_winsize.rows as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + right_winsize.columns as u16, + right_winsize.rows as u16, + ), + )) + .unwrap(); terminal_to_split.change_pos_and_size(&left_winsize); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(terminal_id_to_split) = terminal_id_to_split { - self.os_api.set_terminal_size_using_fd( - terminal_id_to_split, - left_winsize.columns as u16, - left_winsize.rows as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + terminal_id_to_split, + left_winsize.columns as u16, + left_winsize.rows as u16, + ), + )) + .unwrap(); } } } @@ -466,11 +501,15 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.os_api.set_terminal_size_using_fd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )) + .unwrap(); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -496,20 +535,32 @@ impl Tab { active_pane.change_pos_and_size(&top_winsize); - let new_terminal = TerminalPane::new(term_pid, bottom_winsize); - self.os_api.set_terminal_size_using_fd( - new_terminal.pid, - bottom_winsize.columns as u16, - bottom_winsize.rows as u16, - ); - self.panes.insert(pid, Box::new(new_terminal)); + let new_terminal = TerminalPane::new(term_pid, bottom_winsize); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + bottom_winsize.columns as u16, + bottom_winsize.rows as u16, + ), + )) + .unwrap(); + self.panes.insert(pid, Box::new(new_terminal)); - if let PaneId::Terminal(active_terminal_pid) = active_pane_id { - self.os_api.set_terminal_size_using_fd( - *active_terminal_pid, - top_winsize.columns as u16, - top_winsize.rows as u16, - ); + if let PaneId::Terminal(active_terminal_pid) = active_pane_id { + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *active_terminal_pid, + top_winsize.columns as u16, + top_winsize.rows as u16, + ), + )) + .unwrap(); + } + + self.active_terminal = Some(pid); + self.render(); } self.active_terminal = Some(pid); @@ -524,11 +575,15 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.os_api.set_terminal_size_using_fd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )) + .unwrap(); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -560,12 +615,32 @@ impl Tab { ); self.panes.insert(pid, Box::new(new_terminal)); - if let PaneId::Terminal(active_terminal_pid) = active_pane_id { - self.os_api.set_terminal_size_using_fd( - *active_terminal_pid, - left_winsize.columns as u16, - left_winsize.rows as u16, - ); + let new_terminal = TerminalPane::new(term_pid, right_winsize); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + right_winsize.columns as u16, + right_winsize.rows as u16, + ), + )) + .unwrap(); + self.panes.insert(pid, Box::new(new_terminal)); + + if let PaneId::Terminal(active_terminal_pid) = active_pane_id { + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *active_terminal_pid, + left_winsize.columns as u16, + left_winsize.rows as u16, + ), + )) + .unwrap(); + } + + self.active_terminal = Some(pid); + self.render(); } self.active_terminal = Some(pid); @@ -622,13 +697,17 @@ impl Tab { match self.get_active_pane_id() { Some(PaneId::Terminal(active_terminal_id)) => { let active_terminal = self.get_active_pane().unwrap(); - let mut adjusted_input = active_terminal.adjust_input_to_terminal(input_bytes); - self.os_api - .write_to_tty_stdin(active_terminal_id, &mut adjusted_input) - .expect("failed to write to terminal"); - self.os_api - .tcdrain(active_terminal_id) - .expect("failed to drain terminal"); + let adjusted_input = active_terminal.adjust_input_to_terminal(input_bytes); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::WriteToTtyStdin(active_terminal_id, adjusted_input), + )) + .unwrap(); + self.send_app_instructions + .send(AppInstruction::OsApi(ServerOsApiInstruction::TcDrain( + active_terminal_id, + ))) + .unwrap(); } Some(PaneId::Plugin(pid)) => { for key in parse_keys(&input_bytes) { @@ -690,11 +769,15 @@ impl Tab { } let active_terminal = self.panes.get(&active_pane_id).unwrap(); if let PaneId::Terminal(active_pid) = active_pane_id { - self.os_api.set_terminal_size_using_fd( - active_pid, - active_terminal.columns() as u16, - active_terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + active_pid, + active_terminal.columns() as u16, + active_terminal.rows() as u16, + ), + )) + .unwrap(); } self.render(); self.toggle_fullscreen_is_active(); @@ -1254,88 +1337,120 @@ impl Tab { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_height_down(count); if let PaneId::Terminal(pid) = id { - self.os_api.set_terminal_size_using_fd( - *pid, - terminal.columns() as u16, - terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )) + .unwrap(); } } fn reduce_pane_height_up(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_height_up(count); if let PaneId::Terminal(pid) = id { - self.os_api.set_terminal_size_using_fd( - *pid, - terminal.columns() as u16, - terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )) + .unwrap(); } } fn increase_pane_height_down(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_height_down(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.set_terminal_size_using_fd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )) + .unwrap(); } } fn increase_pane_height_up(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_height_up(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.set_terminal_size_using_fd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )) + .unwrap(); } } fn increase_pane_width_right(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_width_right(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.set_terminal_size_using_fd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )) + .unwrap(); } } fn increase_pane_width_left(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_width_left(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.set_terminal_size_using_fd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )) + .unwrap(); } } fn reduce_pane_width_right(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_width_right(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.set_terminal_size_using_fd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )) + .unwrap(); } } fn reduce_pane_width_left(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_width_left(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.set_terminal_size_using_fd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )) + .unwrap(); } } fn pane_is_between_vertical_borders( diff --git a/src/common/errors.rs b/src/common/errors.rs index 3b5c8354..4259600f 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -1,7 +1,7 @@ //! Error context system based on a thread-local representation of the call stack, itself based on //! the instructions that are sent between threads. -use super::{os_input_output::OsApiInstruction, AppInstruction, OPENCALLS}; +use super::{os_input_output::ServerOsApiInstruction, AppInstruction, OPENCALLS}; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; use serde::{Deserialize, Serialize}; @@ -297,26 +297,21 @@ impl From<&PtyInstruction> for PtyContext { #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum OsContext { - SpawnTerminal, - GetTerminalSizeUsingFd, SetTerminalSizeUsingFd, - SetRawMode, - UnsetRawMode, - ReadFromTtyStdout, WriteToTtyStdin, TcDrain, - Kill, - ReadFromStdin, - GetStdoutWriter, - BoxClone, + Exit, } -impl From<&OsApiInstruction> for OsContext { - fn from(os_instruction: &OsApiInstruction) -> Self { +impl From<&ServerOsApiInstruction> for OsContext { + fn from(os_instruction: &ServerOsApiInstruction) -> Self { match *os_instruction { - OsApiInstruction::SetTerminalSizeUsingFd(_, _, _) => OsContext::SetTerminalSizeUsingFd, - OsApiInstruction::WriteToTtyStdin(_, _) => OsContext::WriteToTtyStdin, - OsApiInstruction::TcDrain(_) => OsContext::TcDrain, + ServerOsApiInstruction::SetTerminalSizeUsingFd(_, _, _) => { + OsContext::SetTerminalSizeUsingFd + } + ServerOsApiInstruction::WriteToTtyStdin(_, _) => OsContext::WriteToTtyStdin, + ServerOsApiInstruction::TcDrain(_) => OsContext::TcDrain, + ServerOsApiInstruction::Exit => OsContext::Exit, } } } @@ -356,6 +351,7 @@ pub enum AppContext { ToPlugin, ToScreen, DoneClosingPane, + OsApi, } impl From<&AppInstruction> for AppContext { @@ -364,6 +360,7 @@ impl From<&AppInstruction> for AppContext { AppInstruction::Exit => AppContext::Exit, AppInstruction::Error(_) => AppContext::Error, AppInstruction::ToPty(_) => AppContext::ToPty, + AppInstruction::OsApi(_) => AppContext::OsApi, AppInstruction::ToPlugin(_) => AppContext::ToPlugin, AppInstruction::ToScreen(_) => AppContext::ToScreen, AppInstruction::DoneClosingPane => AppContext::DoneClosingPane, diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index f8f07f53..b74e2929 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -5,7 +5,7 @@ use super::keybinds::Keybinds; use crate::common::input::config::Config; use crate::common::{AppInstruction, SenderWithContext, OPENCALLS}; use crate::errors::ContextType; -use crate::os_input_output::OsApi; +use crate::os_input_output::ClientOsApi; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; use crate::wasm_vm::PluginInstruction; @@ -19,8 +19,7 @@ use zellij_tile::data::{Event, InputMode, Key, ModeInfo, Palette}; struct InputHandler { /// The current input mode mode: InputMode, - os_input: Box, - config: Config, + os_input: Box, command_is_executing: CommandIsExecuting, send_screen_instructions: SenderWithContext, send_plugin_instructions: SenderWithContext, @@ -31,7 +30,7 @@ struct InputHandler { impl InputHandler { /// Returns a new [`InputHandler`] with the attributes specified as arguments. fn new( - os_input: Box, + os_input: Box, command_is_executing: CommandIsExecuting, config: Config, send_screen_instructions: SenderWithContext, @@ -336,8 +335,7 @@ pub fn get_mode_info(mode: InputMode, palette: Palette) -> ModeInfo { /// Entry point to the module. Instantiates an [`InputHandler`] and starts /// its [`InputHandler::handle_input()`] loop. pub fn input_loop( - os_input: Box, - config: Config, + os_input: Box, command_is_executing: CommandIsExecuting, send_screen_instructions: SenderWithContext, send_plugin_instructions: SenderWithContext, diff --git a/src/common/mod.rs b/src/common/mod.rs index d003aab0..0b55d3b9 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -31,7 +31,7 @@ use crate::server::start_server; use command_is_executing::CommandIsExecuting; use errors::{AppContext, ContextType, ErrorContext, PluginContext, ScreenContext}; use input::handler::input_loop; -use os_input_output::{OsApi, OsApiInstruction}; +use os_input_output::{ClientOsApi, ServerOsApiInstruction}; use pty_bus::PtyInstruction; use screen::{Screen, ScreenInstruction}; use serde::{Deserialize, Serialize}; @@ -51,7 +51,7 @@ pub enum ServerInstruction { NewClient(String), ToPty(PtyInstruction), ToScreen(ScreenInstruction), - OsApi(OsApiInstruction), + OsApi(ServerOsApiInstruction), DoneClosingPane, ClosePluginPane(u32), Exit, @@ -180,6 +180,7 @@ pub enum AppInstruction { ToPty(PtyInstruction), ToScreen(ScreenInstruction), ToPlugin(PluginInstruction), + OsApi(ServerOsApiInstruction), DoneClosingPane, } @@ -199,7 +200,9 @@ impl From for AppInstruction { /// Start Zellij with the specified [`OsApi`] and command-line arguments. // FIXME this should definitely be modularized and split into different functions. -pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { +pub fn start(mut os_input: Box, opts: CliArgs) { + let (ipc_thread, server_name) = start_server(opts.clone()); + let take_snapshot = "\u{1b}[?1049h"; os_input.unset_raw_mode(0); let _ = os_input @@ -228,8 +231,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let mut send_app_instructions = SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - let (ipc_thread, server_name) = start_server(os_input.clone(), opts.clone()); - let (client_buffer_path, client_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); let mut send_server_instructions = IpcSenderWithContext::new(SharedRingBuffer::open(&server_name).unwrap()); @@ -612,7 +613,14 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { send_plugin_instructions.send(instruction).unwrap(); } AppInstruction::ToPty(instruction) => { - let _ = send_server_instructions.send(ServerInstruction::ToPty(instruction)); + let _ = send_server_instructions + .send(ServerInstruction::ToPty(instruction)) + .unwrap(); + } + AppInstruction::OsApi(instruction) => { + let _ = send_server_instructions + .send(ServerInstruction::OsApi(instruction)) + .unwrap(); } AppInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), } diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 0e7363ea..5c0115bc 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -7,13 +7,13 @@ use nix::sys::termios; use nix::sys::wait::waitpid; use nix::unistd; use nix::unistd::{ForkResult, Pid}; +use serde::{Deserialize, Serialize}; use std::io; use std::io::prelude::*; use std::os::unix::io::RawFd; use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; -use serde::{Deserialize, Serialize}; use signal_hook::{consts::signal::*, iterator::Signals}; @@ -156,23 +156,15 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) } #[derive(Clone)] -pub struct OsInputOutput { +pub struct ServerOsInputOutput { orig_termios: Arc>, } /// The `OsApi` trait represents an abstract interface to the features of an operating system that /// Zellij requires. -pub trait OsApi: Send + Sync { - /// Returns the size of the terminal associated to file descriptor `fd`. - fn get_terminal_size_using_fd(&self, fd: RawFd) -> PositionAndSize; +pub trait ServerOsApi: Send + Sync { /// Sets the size of the terminal associated to file descriptor `fd`. fn set_terminal_size_using_fd(&mut self, fd: RawFd, cols: u16, rows: u16); - /// Set the terminal associated to file descriptor `fd` to - /// [raw mode](https://en.wikipedia.org/wiki/Terminal_mode). - fn set_raw_mode(&mut self, fd: RawFd); - /// Set the terminal associated to file descriptor `fd` to - /// [cooked mode](https://en.wikipedia.org/wiki/Terminal_mode). - fn unset_raw_mode(&mut self, fd: RawFd); /// Spawn a new terminal, with an optional file to open in a terminal program. fn spawn_terminal(&mut self, file_to_open: Option) -> (RawFd, RawFd); /// Read bytes from the standard output of the virtual terminal referred to by `fd`. @@ -186,30 +178,14 @@ pub trait OsApi: Send + Sync { // or a nix::unistd::Pid. See `man kill.3`, nix::sys::signal::kill (both take an argument // called `pid` and of type `pid_t`, and not `fd`) fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error>; - /// Returns the raw contents of standard input. - fn read_from_stdin(&self) -> Vec; - /// Returns the writer that allows writing to standard output. - fn get_stdout_writer(&self) -> Box; /// Returns a [`Box`] pointer to this [`OsApi`] struct. - fn box_clone(&self) -> Box; - fn receive_sigwinch(&self, cb: Box); - fn load_palette(&self) -> Palette; + fn box_clone(&self) -> Box; } -impl OsApi for OsInputOutput { - fn get_terminal_size_using_fd(&self, fd: RawFd) -> PositionAndSize { - get_terminal_size_using_fd(fd) - } +impl ServerOsApi for ServerOsInputOutput { fn set_terminal_size_using_fd(&mut self, fd: RawFd, cols: u16, rows: u16) { set_terminal_size_using_fd(fd, cols, rows); } - fn set_raw_mode(&mut self, fd: RawFd) { - into_raw_mode(fd); - } - fn unset_raw_mode(&mut self, fd: RawFd) { - let orig_termios = self.orig_termios.lock().unwrap(); - unset_raw_mode(fd, orig_termios.clone()); - } fn spawn_terminal(&mut self, file_to_open: Option) -> (RawFd, RawFd) { let orig_termios = self.orig_termios.lock().unwrap(); spawn_terminal(file_to_open, orig_termios.clone()) @@ -223,7 +199,72 @@ impl OsApi for OsInputOutput { fn tcdrain(&mut self, fd: RawFd) -> Result<(), nix::Error> { termios::tcdrain(fd) } - fn box_clone(&self) -> Box { + fn box_clone(&self) -> Box { + Box::new((*self).clone()) + } + fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error> { + kill(Pid::from_raw(pid), Some(Signal::SIGINT)).unwrap(); + waitpid(Pid::from_raw(pid), None).unwrap(); + Ok(()) + } +} + +impl Clone for Box { + fn clone(&self) -> Box { + self.box_clone() + } +} + +pub fn get_server_os_input() -> ServerOsInputOutput { + let current_termios = termios::tcgetattr(0).unwrap(); + let orig_termios = Arc::new(Mutex::new(current_termios)); + ServerOsInputOutput { orig_termios } +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ServerOsApiInstruction { + SetTerminalSizeUsingFd(RawFd, u16, u16), + WriteToTtyStdin(RawFd, Vec), + TcDrain(RawFd), + Exit, +} + +#[derive(Clone)] +pub struct ClientOsInputOutput { + orig_termios: Arc>, +} + +/// The `OsApi` trait represents an abstract interface to the features of an operating system that +/// Zellij requires. +pub trait ClientOsApi: Send + Sync { + /// Returns the size of the terminal associated to file descriptor `fd`. + fn get_terminal_size_using_fd(&self, fd: RawFd) -> PositionAndSize; + /// Set the terminal associated to file descriptor `fd` to + /// [raw mode](https://en.wikipedia.org/wiki/Terminal_mode). + fn set_raw_mode(&mut self, fd: RawFd); + /// Set the terminal associated to file descriptor `fd` to + /// [cooked mode](https://en.wikipedia.org/wiki/Terminal_mode). + fn unset_raw_mode(&mut self, fd: RawFd); + /// Returns the writer that allows writing to standard output. + fn get_stdout_writer(&self) -> Box; + /// Returns the raw contents of standard input. + fn read_from_stdin(&self) -> Vec; + /// Returns a [`Box`] pointer to this [`OsApi`] struct. + fn box_clone(&self) -> Box; +} + +impl ClientOsApi for ClientOsInputOutput { + fn get_terminal_size_using_fd(&self, fd: RawFd) -> PositionAndSize { + get_terminal_size_using_fd(fd) + } + fn set_raw_mode(&mut self, fd: RawFd) { + into_raw_mode(fd); + } + fn unset_raw_mode(&mut self, fd: RawFd) { + let orig_termios = self.orig_termios.lock().unwrap(); + unset_raw_mode(fd, orig_termios.clone()); + } + fn box_clone(&self) -> Box { Box::new((*self).clone()) } fn read_from_stdin(&self) -> Vec { @@ -239,51 +280,16 @@ impl OsApi for OsInputOutput { let stdout = ::std::io::stdout(); Box::new(stdout) } - fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error> { - // TODO: - // Ideally, we should be using SIGINT rather than SIGKILL here, but there are cases in which - // the terminal we're trying to kill hangs on SIGINT and so all the app gets stuck - // that's why we're sending SIGKILL here - // A better solution would be to send SIGINT here and not wait for it, and then have - // a background thread do the waitpid stuff and send SIGKILL if the process is stuck - kill(Pid::from_raw(pid), Some(Signal::SIGKILL)).unwrap(); - waitpid(Pid::from_raw(pid), None).unwrap(); - Ok(()) - } - fn receive_sigwinch(&self, cb: Box) { - let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); - for signal in signals.forever() { - match signal { - SIGWINCH => { - cb(); - } - SIGTERM | SIGINT | SIGQUIT => { - break; - } - _ => unreachable!(), - } - } - } - fn load_palette(&self) -> Palette { - default_palette() - } } -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum OsApiInstruction { - SetTerminalSizeUsingFd(RawFd, u16, u16), - WriteToTtyStdin(RawFd, Vec), - TcDrain(RawFd), -} - -impl Clone for Box { - fn clone(&self) -> Box { +impl Clone for Box { + fn clone(&self) -> Box { self.box_clone() } } -pub fn get_os_input() -> OsInputOutput { +pub fn get_client_os_input() -> ClientOsInputOutput { let current_termios = termios::tcgetattr(0).unwrap(); let orig_termios = Arc::new(Mutex::new(current_termios)); - OsInputOutput { orig_termios } + ClientOsInputOutput { orig_termios } } diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index e08e8576..a0eda375 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -12,7 +12,7 @@ use std::path::PathBuf; use super::{IpcSenderWithContext, ScreenInstruction, OPENCALLS}; use crate::layout::Layout; -use crate::os_input_output::OsApi; +use crate::os_input_output::ServerOsApi; use crate::utils::logging::debug_to_file; use crate::{ common::ServerInstruction, @@ -22,11 +22,11 @@ use crate::{ pub struct ReadFromPid { pid: RawFd, - os_input: Box, + os_input: Box, } impl ReadFromPid { - pub fn new(pid: &RawFd, os_input: Box) -> ReadFromPid { + pub fn new(pid: &RawFd, os_input: Box) -> ReadFromPid { ReadFromPid { pid: *pid, os_input, @@ -187,7 +187,7 @@ pub enum PtyInstruction { pub struct PtyBus { pub receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, pub id_to_child_pid: HashMap, - os_input: Box, + os_input: Box, debug_to_file: bool, task_handles: HashMap>, pub send_server_instructions: IpcSenderWithContext, @@ -195,7 +195,7 @@ pub struct PtyBus { fn stream_terminal_bytes( pid: RawFd, - os_input: Box, + os_input: Box, mut send_server_instructions: IpcSenderWithContext, debug: bool, ) -> JoinHandle<()> { @@ -274,7 +274,7 @@ fn stream_terminal_bytes( impl PtyBus { pub fn new( receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, - os_input: Box, + os_input: Box, send_server_instructions: IpcSenderWithContext, debug_to_file: bool, ) -> Self { diff --git a/src/common/screen.rs b/src/common/screen.rs index 7848c243..ae1f4dd7 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -7,7 +7,7 @@ use std::path::PathBuf; use std::sync::mpsc::Receiver; use super::{AppInstruction, SenderWithContext}; -use crate::os_input_output::OsApi; +use crate::os_input_output::ClientOsApi; use crate::panes::PositionAndSize; use crate::pty_bus::{PtyInstruction, VteBytes}; use crate::tab::Tab; @@ -78,10 +78,7 @@ pub struct Screen { /// The index of this [`Screen`]'s active [`Tab`]. active_tab_index: Option, /// The [`OsApi`] this [`Screen`] uses. - os_api: Box, - mode_info: ModeInfo, - input_mode: InputMode, - colors: Palette, + os_api: Box, } impl Screen { @@ -93,7 +90,7 @@ impl Screen { send_plugin_instructions: SenderWithContext, send_app_instructions: SenderWithContext, full_screen_ws: &PositionAndSize, - os_api: Box, + os_api: Box, max_panes: Option, mode_info: ModeInfo, input_mode: InputMode, diff --git a/src/main.rs b/src/main.rs index e5cdbe53..c103085b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,8 @@ use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::os_input_output::get_os_input; +use crate::os_input_output::get_client_os_input; +use crate::pty_bus::VteEvent; use crate::utils::{ consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, logging::*, @@ -86,7 +87,7 @@ pub fn main() { .send(ServerInstruction::OpenFile(file_to_open)) .unwrap(); } else { - let os_input = get_os_input(); + let os_input = get_client_os_input(); atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); start(Box::new(os_input), opts, config); diff --git a/src/server/mod.rs b/src/server/mod.rs index c1713918..00368904 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -4,7 +4,7 @@ use crate::common::{ ServerInstruction, }; use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext}; -use crate::os_input_output::{OsApi, OsApiInstruction}; +use crate::os_input_output::{get_server_os_input, ServerOsApi, ServerOsApiInstruction}; use crate::panes::PaneId; use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; @@ -14,9 +14,10 @@ use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; -pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHandle<()>, String) { +pub fn start_server(opts: CliArgs) -> (thread::JoinHandle<()>, String) { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); + let os_input = Box::new(get_server_os_input()); let mut send_pty_instructions = SenderWithContext::new( ErrorContext::new(), SenderType::Sender(send_pty_instructions), @@ -30,8 +31,9 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHan #[cfg(test)] let (server_name, server_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); - let (send_os_instructions, receive_os_instructions): ChannelWithContext = - channel(); + let (send_os_instructions, receive_os_instructions): ChannelWithContext< + ServerOsApiInstruction, + > = channel(); let mut send_os_instructions = SenderWithContext::new( ErrorContext::new(), SenderType::Sender(send_os_instructions), @@ -131,22 +133,23 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHan .expect("failed to receive an event on the channel"); err_ctx.add_call(ContextType::Os(OsContext::from(&event))); match event { - OsApiInstruction::SetTerminalSizeUsingFd(fd, cols, rows) => { + ServerOsApiInstruction::SetTerminalSizeUsingFd(fd, cols, rows) => { os_input.set_terminal_size_using_fd(fd, cols, rows); } - OsApiInstruction::WriteToTtyStdin(fd, mut buf) => { + ServerOsApiInstruction::WriteToTtyStdin(fd, mut buf) => { let slice = buf.as_mut_slice(); os_input.write_to_tty_stdin(fd, slice).unwrap(); } - OsApiInstruction::TcDrain(fd) => { + ServerOsApiInstruction::TcDrain(fd) => { os_input.tcdrain(fd).unwrap(); } + ServerOsApiInstruction::Exit => break, } } }) .unwrap(); - let join_handle = thread::Builder::new() + let server_handle = thread::Builder::new() .name("ipc_server".to_string()) .spawn({ let recv_server_instructions = IpcReceiver::new(server_buffer); @@ -158,6 +161,7 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHan recv_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer); send_pty_instructions.update(err_ctx); + send_os_instructions.update(err_ctx); if send_client_instructions.len() == 1 { send_client_instructions[0].update(err_ctx); } @@ -213,6 +217,7 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHan } ServerInstruction::Exit => { let _ = send_pty_instructions.send(PtyInstruction::Exit); + let _ = send_os_instructions.send(ServerOsApiInstruction::Exit); let _ = pty_thread.join(); let _ = os_thread.join(); let _ = send_client_instructions[0].send(ClientInstruction::Exit); @@ -222,5 +227,5 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> (thread::JoinHan } }) .unwrap(); - (join_handle, server_name) + (server_handle, server_name) } diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 8e4aff25..57f1ac95 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -6,7 +6,7 @@ use std::path::PathBuf; use std::sync::{Arc, Condvar, Mutex}; use std::time::{Duration, Instant}; -use crate::os_input_output::OsApi; +use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::utils::shared::default_palette; use zellij_tile::data::Palette; @@ -116,7 +116,7 @@ impl FakeInputOutput { } } -impl OsApi for FakeInputOutput { +impl ClientOsApi for FakeInputOutput { fn get_terminal_size_using_fd(&self, pid: RawFd) -> PositionAndSize { if let Some(new_position_and_size) = self.sigwinch_event { let (lock, _cvar) = &*self.should_trigger_sigwinch; @@ -129,6 +129,42 @@ impl OsApi for FakeInputOutput { let winsize = win_sizes.get(&pid).unwrap(); *winsize } + fn set_raw_mode(&mut self, pid: RawFd) { + self.io_events + .lock() + .unwrap() + .push(IoEvent::IntoRawMode(pid)); + } + fn unset_raw_mode(&mut self, pid: RawFd) { + self.io_events + .lock() + .unwrap() + .push(IoEvent::UnsetRawMode(pid)); + } + fn box_clone(&self) -> Box { + Box::new((*self).clone()) + } + fn read_from_stdin(&self) -> Vec { + loop { + let last_snapshot_time = { *self.last_snapshot_time.lock().unwrap() }; + if last_snapshot_time.elapsed() > MIN_TIME_BETWEEN_SNAPSHOTS { + break; + } else { + ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS - last_snapshot_time.elapsed()); + } + } + self.stdin_commands + .lock() + .unwrap() + .pop_front() + .unwrap_or(vec![]) + } + fn get_stdout_writer(&self) -> Box { + Box::new(self.stdout_writer.clone()) + } +} + +impl ServerOsApi for FakeInputOutput { fn set_terminal_size_using_fd(&mut self, pid: RawFd, cols: u16, rows: u16) { let terminal_input = self .possible_tty_inputs @@ -143,23 +179,21 @@ impl OsApi for FakeInputOutput { .unwrap() .push(IoEvent::SetTerminalSizeUsingFd(pid, cols, rows)); } - fn set_raw_mode(&mut self, pid: RawFd) { - self.io_events - .lock() - .unwrap() - .push(IoEvent::IntoRawMode(pid)); - } - fn unset_raw_mode(&mut self, pid: RawFd) { - self.io_events - .lock() - .unwrap() - .push(IoEvent::UnsetRawMode(pid)); - } fn spawn_terminal(&mut self, _file_to_open: Option) -> (RawFd, RawFd) { let next_terminal_id = self.stdin_writes.lock().unwrap().keys().len() as RawFd + 1; self.add_terminal(next_terminal_id); (next_terminal_id as i32, next_terminal_id + 1000) // secondary number is arbitrary here } + fn write_to_tty_stdin(&mut self, pid: RawFd, buf: &mut [u8]) -> Result { + let mut stdin_writes = self.stdin_writes.lock().unwrap(); + let write_buffer = stdin_writes.get_mut(&pid).unwrap(); + let mut bytes_written = 0; + for byte in buf { + bytes_written += 1; + write_buffer.push(*byte); + } + Ok(bytes_written) + } fn read_from_tty_stdout(&mut self, pid: RawFd, buf: &mut [u8]) -> Result { let mut read_buffers = self.read_buffers.lock().unwrap(); let mut bytes_read = 0; @@ -177,21 +211,11 @@ impl OsApi for FakeInputOutput { None => Err(nix::Error::Sys(nix::errno::Errno::EAGAIN)), } } - fn write_to_tty_stdin(&mut self, pid: RawFd, buf: &mut [u8]) -> Result { - let mut stdin_writes = self.stdin_writes.lock().unwrap(); - let write_buffer = stdin_writes.get_mut(&pid).unwrap(); - let mut bytes_written = 0; - for byte in buf { - bytes_written += 1; - write_buffer.push(*byte); - } - Ok(bytes_written) - } fn tcdrain(&mut self, pid: RawFd) -> Result<(), nix::Error> { self.io_events.lock().unwrap().push(IoEvent::TcDrain(pid)); Ok(()) } - fn box_clone(&self) -> Box { + fn box_clone(&self) -> Box { Box::new((*self).clone()) } fn read_from_stdin(&self) -> Vec { From 2ab18244f718628fa1fc0a41a5c11692944d328c Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 19 Mar 2021 00:05:24 +0530 Subject: [PATCH 25/64] fix tests --- src/common/mod.rs | 10 +- src/common/os_input_output.rs | 8 +- src/main.rs | 5 +- src/server/mod.rs | 6 +- src/tests/fakes.rs | 2 +- src/tests/integration/basic.rs | 136 ++++++++------------- src/tests/integration/close_pane.rs | 26 ++-- src/tests/integration/compatibility.rs | 80 ++++++------ src/tests/integration/layouts.rs | 6 +- src/tests/integration/move_focus_down.rs | 4 +- src/tests/integration/move_focus_left.rs | 4 +- src/tests/integration/move_focus_right.rs | 4 +- src/tests/integration/move_focus_up.rs | 4 +- src/tests/integration/resize_down.rs | 78 ++---------- src/tests/integration/resize_left.rs | 26 ++-- src/tests/integration/resize_right.rs | 26 ++-- src/tests/integration/resize_up.rs | 26 ++-- src/tests/integration/tabs.rs | 16 +-- src/tests/integration/toggle_fullscreen.rs | 4 +- 19 files changed, 196 insertions(+), 275 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 0b55d3b9..e8883d4f 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -31,7 +31,7 @@ use crate::server::start_server; use command_is_executing::CommandIsExecuting; use errors::{AppContext, ContextType, ErrorContext, PluginContext, ScreenContext}; use input::handler::input_loop; -use os_input_output::{ClientOsApi, ServerOsApiInstruction}; +use os_input_output::{ClientOsApi, ServerOsApi, ServerOsApiInstruction}; use pty_bus::PtyInstruction; use screen::{Screen, ScreenInstruction}; use serde::{Deserialize, Serialize}; @@ -200,8 +200,12 @@ impl From for AppInstruction { /// Start Zellij with the specified [`OsApi`] and command-line arguments. // FIXME this should definitely be modularized and split into different functions. -pub fn start(mut os_input: Box, opts: CliArgs) { - let (ipc_thread, server_name) = start_server(opts.clone()); +pub fn start( + mut os_input: Box, + opts: CliArgs, + server_os_input: Box, +) { + let (ipc_thread, server_name) = start_server(server_os_input.clone(), opts.clone()); let take_snapshot = "\u{1b}[?1049h"; os_input.unset_raw_mode(0); diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 5c0115bc..d0c13ccd 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -160,8 +160,8 @@ pub struct ServerOsInputOutput { orig_termios: Arc>, } -/// The `OsApi` trait represents an abstract interface to the features of an operating system that -/// Zellij requires. +/// The `ServerOsApi` trait represents an abstract interface to the features of an operating system that +/// Zellij server requires. pub trait ServerOsApi: Send + Sync { /// Sets the size of the terminal associated to file descriptor `fd`. fn set_terminal_size_using_fd(&mut self, fd: RawFd, cols: u16, rows: u16); @@ -234,8 +234,8 @@ pub struct ClientOsInputOutput { orig_termios: Arc>, } -/// The `OsApi` trait represents an abstract interface to the features of an operating system that -/// Zellij requires. +/// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that +/// Zellij client requires. pub trait ClientOsApi: Send + Sync { /// Returns the size of the terminal associated to file descriptor `fd`. fn get_terminal_size_using_fd(&self, fd: RawFd) -> PositionAndSize; diff --git a/src/main.rs b/src/main.rs index c103085b..5c0049ec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,7 @@ use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::os_input_output::get_client_os_input; +use crate::os_input_output::{get_client_os_input, get_server_os_input}; use crate::pty_bus::VteEvent; use crate::utils::{ consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, @@ -88,8 +88,9 @@ pub fn main() { .unwrap(); } else { let os_input = get_client_os_input(); + let server_os_input = get_server_os_input(); atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); - start(Box::new(os_input), opts, config); + start(Box::new(os_input), opts, Box::new(server_os_input)); } } diff --git a/src/server/mod.rs b/src/server/mod.rs index 00368904..9ad2cbce 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -14,10 +14,12 @@ use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; -pub fn start_server(opts: CliArgs) -> (thread::JoinHandle<()>, String) { +pub fn start_server( + os_input: Box, + opts: CliArgs, +) -> (thread::JoinHandle<()>, String) { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); - let os_input = Box::new(get_server_os_input()); let mut send_pty_instructions = SenderWithContext::new( ErrorContext::new(), SenderType::Sender(send_pty_instructions), diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 57f1ac95..a59bfa4a 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -13,7 +13,7 @@ use zellij_tile::data::Palette; use crate::tests::utils::commands::{QUIT, SLEEP}; -const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(300); +const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(350); #[derive(Clone)] pub enum IoEvent { diff --git a/src/tests/integration/basic.rs b/src/tests/integration/basic.rs index f785666a..75f96bda 100644 --- a/src/tests/integration/basic.rs +++ b/src/tests/integration/basic.rs @@ -26,11 +26,11 @@ pub fn starts_with_one_terminal() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -53,11 +53,16 @@ pub fn split_terminals_vertically() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_RIGHT_IN_PANE_MODE, &QUIT]); + fake_input_output.add_terminal_input(&[ + &COMMAND_TOGGLE, + &PANE_MODE, + &SPLIT_RIGHT_IN_PANE_MODE, + &QUIT, + ]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -80,11 +85,16 @@ pub fn split_terminals_horizontally() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_DOWN_IN_PANE_MODE, &QUIT]); + fake_input_output.add_terminal_input(&[ + &COMMAND_TOGGLE, + &PANE_MODE, + &SPLIT_DOWN_IN_PANE_MODE, + &QUIT, + ]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -118,7 +128,7 @@ pub fn split_largest_terminal() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -141,11 +151,16 @@ pub fn cannot_split_terminals_vertically_when_active_terminal_is_too_small() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_RIGHT_IN_PANE_MODE, &QUIT]); + fake_input_output.add_terminal_input(&[ + &COMMAND_TOGGLE, + &PANE_MODE, + &SPLIT_RIGHT_IN_PANE_MODE, + &QUIT, + ]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -168,11 +183,16 @@ pub fn cannot_split_terminals_horizontally_when_active_terminal_is_too_small() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_DOWN_IN_PANE_MODE, &QUIT]); + fake_input_output.add_terminal_input(&[ + &COMMAND_TOGGLE, + &PANE_MODE, + &SPLIT_DOWN_IN_PANE_MODE, + &QUIT, + ]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -195,11 +215,16 @@ pub fn cannot_split_largest_terminal_when_there_is_no_room() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&PANE_MODE, &SPAWN_TERMINAL_IN_PANE_MODE, &QUIT]); + fake_input_output.add_terminal_input(&[ + &COMMAND_TOGGLE, + &PANE_MODE, + &SPAWN_TERMINAL_IN_PANE_MODE, + &QUIT, + ]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -234,7 +259,7 @@ pub fn scrolling_up_inside_a_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -271,78 +296,7 @@ pub fn scrolling_down_inside_a_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn scrolling_page_up_inside_a_pane() { - let fake_win_size = PositionAndSize { - columns: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SCROLL_MODE, - &SCROLL_PAGE_UP_IN_SCROLL_MODE, - &QUIT, - ]); - start( Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); - let output_frames = fake_input_output - .stdout_writer - .output_frames - .lock() - .unwrap(); - let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); - let snapshot_before_quit = - get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); - assert_snapshot!(snapshot_before_quit); -} - -#[test] -pub fn scrolling_page_down_inside_a_pane() { - let fake_win_size = PositionAndSize { - columns: 121, - rows: 20, - x: 0, - y: 0, - ..Default::default() - }; - let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &SCROLL_MODE, - &SCROLL_PAGE_UP_IN_SCROLL_MODE, - &SCROLL_PAGE_UP_IN_SCROLL_MODE, - &SCROLL_PAGE_DOWN_IN_SCROLL_MODE, - &SCROLL_PAGE_DOWN_IN_SCROLL_MODE, - &QUIT, - ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -377,7 +331,11 @@ pub fn max_panes() { ]); let mut opts = CliArgs::default(); opts.max_panes = Some(4); - start(Box::new(fake_input_output.clone()), opts, Config::default()); + start( + Box::new(fake_input_output.clone()), + opts, + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer .output_frames @@ -409,7 +367,11 @@ pub fn toggle_focused_pane_fullscreen() { ]); let mut opts = CliArgs::default(); opts.max_panes = Some(4); - start(Box::new(fake_input_output.clone()), opts, Config::default()); + start( + Box::new(fake_input_output.clone()), + opts, + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer .output_frames diff --git a/src/tests/integration/close_pane.rs b/src/tests/integration/close_pane.rs index f73f4027..5feee241 100644 --- a/src/tests/integration/close_pane.rs +++ b/src/tests/integration/close_pane.rs @@ -43,7 +43,7 @@ pub fn close_pane_with_another_pane_above_it() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -85,7 +85,7 @@ pub fn close_pane_with_another_pane_below_it() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -124,7 +124,7 @@ pub fn close_pane_with_another_pane_to_the_left() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -164,7 +164,7 @@ pub fn close_pane_with_another_pane_to_the_right() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -209,7 +209,7 @@ pub fn close_pane_with_multiple_panes_above_it() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -252,7 +252,7 @@ pub fn close_pane_with_multiple_panes_below_it() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -297,7 +297,7 @@ pub fn close_pane_with_multiple_panes_to_the_left() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -340,7 +340,7 @@ pub fn close_pane_with_multiple_panes_to_the_right() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -405,7 +405,7 @@ pub fn close_pane_with_multiple_panes_above_it_away_from_screen_edges() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -466,7 +466,7 @@ pub fn close_pane_with_multiple_panes_below_it_away_from_screen_edges() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -529,7 +529,7 @@ pub fn close_pane_with_multiple_panes_to_the_left_away_from_screen_edges() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -592,7 +592,7 @@ pub fn close_pane_with_multiple_panes_to_the_right_away_from_screen_edges() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -628,7 +628,7 @@ pub fn closing_last_pane_exits_app() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs index ef93135e..8e9630d4 100644 --- a/src/tests/integration/compatibility.rs +++ b/src/tests/integration/compatibility.rs @@ -41,11 +41,11 @@ pub fn run_bandwhich_from_fish_shell() { }; let fixture_name = "fish_and_bandwhich"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -69,11 +69,11 @@ pub fn fish_tab_completion_options() { }; let fixture_name = "fish_tab_completion_options"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -102,11 +102,11 @@ pub fn fish_select_tab_completion_options() { }; let fixture_name = "fish_select_tab_completion_options"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -139,11 +139,11 @@ pub fn vim_scroll_region_down() { }; let fixture_name = "vim_scroll_region_down"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); // quit (ctrl-q) + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); // quit (ctrl-q) start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -173,11 +173,11 @@ pub fn vim_ctrl_d() { }; let fixture_name = "vim_ctrl_d"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -206,11 +206,11 @@ pub fn vim_ctrl_u() { }; let fixture_name = "vim_ctrl_u"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -234,11 +234,11 @@ pub fn htop() { }; let fixture_name = "htop"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -262,11 +262,11 @@ pub fn htop_scrolling() { }; let fixture_name = "htop_scrolling"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -290,11 +290,11 @@ pub fn htop_right_scrolling() { }; let fixture_name = "htop_right_scrolling"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -326,11 +326,11 @@ pub fn vim_overwrite() { }; let fixture_name = "vim_overwrite"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -357,11 +357,11 @@ pub fn clear_scroll_region() { }; let fixture_name = "clear_scroll_region"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -385,11 +385,11 @@ pub fn display_tab_characters_properly() { }; let fixture_name = "tab_characters"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -413,11 +413,11 @@ pub fn neovim_insert_mode() { }; let fixture_name = "nvim_insert"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -443,11 +443,11 @@ pub fn bash_cursor_linewrap() { }; let fixture_name = "bash_cursor_linewrap"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -473,11 +473,11 @@ pub fn fish_paste_multiline() { }; let fixture_name = "fish_paste_multiline"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -501,11 +501,11 @@ pub fn git_log() { }; let fixture_name = "git_log"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -531,11 +531,11 @@ pub fn git_diff_scrollup() { }; let fixture_name = "git_diff_scrollup"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -559,11 +559,11 @@ pub fn emacs_longbuf() { }; let fixture_name = "emacs_longbuf_tutorial"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -587,11 +587,11 @@ pub fn top_and_quit() { }; let fixture_name = "top_and_quit"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer @@ -621,11 +621,11 @@ pub fn exa_plus_omf_theme() { }; let fixture_name = "exa_plus_omf_theme"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&QUIT]); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/layouts.rs b/src/tests/integration/layouts.rs index a2ac4702..753453c9 100644 --- a/src/tests/integration/layouts.rs +++ b/src/tests/integration/layouts.rs @@ -28,7 +28,11 @@ pub fn accepts_basic_layout() { "src/tests/fixtures/layouts/three-panes-with-nesting.yaml", )); - start(Box::new(fake_input_output.clone()), opts, Config::default()); + start( + Box::new(fake_input_output.clone()), + opts, + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer .output_frames diff --git a/src/tests/integration/move_focus_down.rs b/src/tests/integration/move_focus_down.rs index 21fa7925..ca487be5 100644 --- a/src/tests/integration/move_focus_down.rs +++ b/src/tests/integration/move_focus_down.rs @@ -35,7 +35,7 @@ pub fn move_focus_down() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -71,7 +71,7 @@ pub fn move_focus_down_to_the_most_recently_used_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_left.rs b/src/tests/integration/move_focus_left.rs index 6441357d..60f89ffd 100644 --- a/src/tests/integration/move_focus_left.rs +++ b/src/tests/integration/move_focus_left.rs @@ -34,7 +34,7 @@ pub fn move_focus_left() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -71,7 +71,7 @@ pub fn move_focus_left_to_the_most_recently_used_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_right.rs b/src/tests/integration/move_focus_right.rs index bc4f551c..22f09136 100644 --- a/src/tests/integration/move_focus_right.rs +++ b/src/tests/integration/move_focus_right.rs @@ -35,7 +35,7 @@ pub fn move_focus_right() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -71,7 +71,7 @@ pub fn move_focus_right_to_the_most_recently_used_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_up.rs b/src/tests/integration/move_focus_up.rs index 77f06703..4f0416d4 100644 --- a/src/tests/integration/move_focus_up.rs +++ b/src/tests/integration/move_focus_up.rs @@ -34,7 +34,7 @@ pub fn move_focus_up() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -71,7 +71,7 @@ pub fn move_focus_up_to_the_most_recently_used_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_down.rs b/src/tests/integration/resize_down.rs index d5ad4ef8..850f6807 100644 --- a/src/tests/integration/resize_down.rs +++ b/src/tests/integration/resize_down.rs @@ -43,11 +43,7 @@ pub fn resize_down_with_pane_above() { &SLEEP, &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -87,11 +83,7 @@ pub fn resize_down_with_pane_below() { &SLEEP, &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -137,11 +129,7 @@ pub fn resize_down_with_panes_above_and_below() { &SLEEP, &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -186,11 +174,7 @@ pub fn resize_down_with_multiple_panes_above() { &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -237,11 +221,7 @@ pub fn resize_down_with_panes_above_aligned_left_with_current_pane() { &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -287,11 +267,7 @@ pub fn resize_down_with_panes_below_aligned_left_with_current_pane() { &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -335,11 +311,7 @@ pub fn resize_down_with_panes_above_aligned_right_with_current_pane() { &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -384,11 +356,7 @@ pub fn resize_down_with_panes_below_aligned_right_with_current_pane() { &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -436,11 +404,7 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_current_pane() { &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -490,11 +454,7 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_current_pane() { &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -561,11 +521,7 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_lef &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -634,11 +590,7 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_ &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer @@ -675,11 +627,7 @@ pub fn cannot_resize_down_when_pane_below_is_at_minimum_height() { &SLEEP, &QUIT, ]); - start( - Box::new(fake_input_output.clone()), - CliArgs::default(), - Config::default(), - ); + start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/resize_left.rs b/src/tests/integration/resize_left.rs index 2444f3a1..307198b1 100644 --- a/src/tests/integration/resize_left.rs +++ b/src/tests/integration/resize_left.rs @@ -42,7 +42,7 @@ pub fn resize_left_with_pane_to_the_left() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -84,7 +84,7 @@ pub fn resize_left_with_pane_to_the_right() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -128,7 +128,7 @@ pub fn resize_left_with_panes_to_the_left_and_right() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -175,7 +175,7 @@ pub fn resize_left_with_multiple_panes_to_the_left() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -224,7 +224,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -270,7 +270,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -318,7 +318,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -365,7 +365,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -417,7 +417,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pa start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -471,7 +471,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_p start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -542,7 +542,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_abov start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -616,7 +616,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_abo start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -657,7 +657,7 @@ pub fn cannot_resize_left_when_pane_to_the_left_is_at_minimum_width() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_right.rs b/src/tests/integration/resize_right.rs index 3f242f5a..05553de1 100644 --- a/src/tests/integration/resize_right.rs +++ b/src/tests/integration/resize_right.rs @@ -42,7 +42,7 @@ pub fn resize_right_with_pane_to_the_left() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -84,7 +84,7 @@ pub fn resize_right_with_pane_to_the_right() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -128,7 +128,7 @@ pub fn resize_right_with_panes_to_the_left_and_right() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -175,7 +175,7 @@ pub fn resize_right_with_multiple_panes_to_the_left() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -224,7 +224,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -270,7 +270,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -318,7 +318,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -365,7 +365,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -417,7 +417,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_p start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -471,7 +471,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_ start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -542,7 +542,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_abo start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -615,7 +615,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_ab start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -656,7 +656,7 @@ pub fn cannot_resize_right_when_pane_to_the_left_is_at_minimum_width() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_up.rs b/src/tests/integration/resize_up.rs index e2d0c4ba..6330b074 100644 --- a/src/tests/integration/resize_up.rs +++ b/src/tests/integration/resize_up.rs @@ -44,7 +44,7 @@ pub fn resize_up_with_pane_above() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -88,7 +88,7 @@ pub fn resize_up_with_pane_below() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -137,7 +137,7 @@ pub fn resize_up_with_panes_above_and_below() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -185,7 +185,7 @@ pub fn resize_up_with_multiple_panes_above() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -234,7 +234,7 @@ pub fn resize_up_with_panes_above_aligned_left_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -284,7 +284,7 @@ pub fn resize_up_with_panes_below_aligned_left_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -332,7 +332,7 @@ pub fn resize_up_with_panes_above_aligned_right_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -381,7 +381,7 @@ pub fn resize_up_with_panes_below_aligned_right_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -433,7 +433,7 @@ pub fn resize_up_with_panes_above_aligned_left_and_right_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -487,7 +487,7 @@ pub fn resize_up_with_panes_below_aligned_left_and_right_with_current_pane() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -558,7 +558,7 @@ pub fn resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_ start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -631,7 +631,7 @@ pub fn resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_ri start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -672,7 +672,7 @@ pub fn cannot_resize_up_when_pane_above_is_at_minimum_height() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/tabs.rs b/src/tests/integration/tabs.rs index f62ad0c4..d45ec18a 100644 --- a/src/tests/integration/tabs.rs +++ b/src/tests/integration/tabs.rs @@ -36,7 +36,7 @@ pub fn open_new_tab() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -71,7 +71,7 @@ pub fn switch_to_prev_tab() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -106,7 +106,7 @@ pub fn switch_to_next_tab() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -141,7 +141,7 @@ pub fn close_tab() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -177,7 +177,7 @@ pub fn close_last_pane_in_a_tab() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -215,7 +215,7 @@ pub fn close_the_middle_tab() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -258,7 +258,7 @@ pub fn close_the_tab_that_has_a_pane_in_fullscreen() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -293,7 +293,7 @@ pub fn closing_last_tab_exits_the_app() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output diff --git a/src/tests/integration/toggle_fullscreen.rs b/src/tests/integration/toggle_fullscreen.rs index 9fd22144..83a8f215 100644 --- a/src/tests/integration/toggle_fullscreen.rs +++ b/src/tests/integration/toggle_fullscreen.rs @@ -35,7 +35,7 @@ pub fn adding_new_terminal_in_fullscreen() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output @@ -69,7 +69,7 @@ pub fn move_focus_is_disabled_in_fullscreen() { start( Box::new(fake_input_output.clone()), CliArgs::default(), - Config::default(), + Box::new(fake_input_output.clone()), ); let output_frames = fake_input_output From be060e9a138b1d38cc4476a24cec51fde00c7076 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 20 Mar 2021 01:18:09 +0530 Subject: [PATCH 26/64] Introduce ServerContext --- src/common/errors.rs | 42 +++++++++++++++++++++++++++++++++++++++--- src/server/mod.rs | 6 +++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/common/errors.rs b/src/common/errors.rs index 4259600f..e8e02e5a 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -1,7 +1,9 @@ //! Error context system based on a thread-local representation of the call stack, itself based on //! the instructions that are sent between threads. -use super::{os_input_output::ServerOsApiInstruction, AppInstruction, OPENCALLS}; +use super::{ + os_input_output::ServerOsApiInstruction, AppInstruction, ServerInstruction, OPENCALLS, +}; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; use serde::{Deserialize, Serialize}; @@ -144,7 +146,7 @@ pub enum ContextType { Plugin(PluginContext), /// An app-related call. App(AppContext), - IPCServer, // Fix: Create a separate ServerContext when sessions are introduced + IPCServer(ServerContext), StdinHandler, AsyncTask, /// An empty, placeholder call. This should be thought of as representing no call at all. @@ -163,7 +165,7 @@ impl Display for ContextType { ContextType::Os(c) => write!(f, "{}os_thread: {}{:?}", purple, green, c), ContextType::Plugin(c) => write!(f, "{}plugin_thread: {}{:?}", purple, green, c), ContextType::App(c) => write!(f, "{}main_thread: {}{:?}", purple, green, c), - ContextType::IpcServer => write!(f, "{}ipc_server: {}AcceptInput", purple, green), + ContextType::IPCServer(c) => write!(f, "{}ipc_server: {}{:?}", purple, green, c), ContextType::StdinHandler => { write!(f, "{}stdin_handler_thread: {}AcceptInput", purple, green) } @@ -367,3 +369,37 @@ impl From<&AppInstruction> for AppContext { } } } + +/// Stack call representations corresponding to the different types of [`AppInstruction`]s. +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub enum ServerContext { + OpenFile, + SplitHorizontally, + SplitVertically, + MoveFocus, + NewClient, + ToPty, + ToScreen, + OsApi, + DoneClosingPane, + ClosePluginPane, + Exit, +} + +impl From<&ServerInstruction> for ServerContext { + fn from(server_instruction: &ServerInstruction) -> Self { + match *server_instruction { + ServerInstruction::OpenFile(_) => ServerContext::OpenFile, + ServerInstruction::SplitHorizontally => ServerContext::SplitHorizontally, + ServerInstruction::SplitVertically => ServerContext::SplitVertically, + ServerInstruction::MoveFocus => ServerContext::MoveFocus, + ServerInstruction::NewClient(_) => ServerContext::NewClient, + ServerInstruction::ToPty(_) => ServerContext::ToPty, + ServerInstruction::ToScreen(_) => ServerContext::ToScreen, + ServerInstruction::OsApi(_) => ServerContext::OsApi, + ServerInstruction::DoneClosingPane => ServerContext::DoneClosingPane, + ServerInstruction::ClosePluginPane(_) => ServerContext::ClosePluginPane, + ServerInstruction::Exit => ServerContext::Exit, + } + } +} diff --git a/src/server/mod.rs b/src/server/mod.rs index 9ad2cbce..b1318061 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -3,8 +3,8 @@ use crate::common::{ ChannelWithContext, ClientInstruction, IpcSenderWithContext, SenderType, SenderWithContext, ServerInstruction, }; -use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext}; -use crate::os_input_output::{get_server_os_input, ServerOsApi, ServerOsApiInstruction}; +use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext, ServerContext}; +use crate::os_input_output::{ServerOsApi, ServerOsApiInstruction}; use crate::panes::PaneId; use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; @@ -161,7 +161,7 @@ pub fn start_server( move || loop { let (mut err_ctx, instruction): (ErrorContext, ServerInstruction) = recv_server_instructions.recv().unwrap(); - err_ctx.add_call(ContextType::IPCServer); + err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); send_pty_instructions.update(err_ctx); send_os_instructions.update(err_ctx); if send_client_instructions.len() == 1 { From fd1debaa79da2f03c37c7a92a0e5c0eef490feff Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 20 Mar 2021 01:55:13 +0530 Subject: [PATCH 27/64] Fix after rebase --- Cargo.lock | 231 ++++++++++++++----------- src/client/tab.rs | 14 +- src/common/errors.rs | 2 + src/common/mod.rs | 6 + src/common/screen.rs | 2 + src/common/wasm_vm.rs | 1 + src/tests/fakes.rs | 2 +- src/tests/integration/basic.rs | 37 +--- src/tests/integration/compatibility.rs | 41 ++--- 9 files changed, 172 insertions(+), 164 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 95648ec2..0c736a50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler" -version = "1.0.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" [[package]] name = "ansi_term" @@ -43,9 +43,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "async-channel" -version = "1.6.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" +checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9" dependencies = [ "concurrent-queue", "event-listener", @@ -132,7 +132,7 @@ dependencies = [ "event-listener", "futures-lite", "once_cell", - "signal-hook", + "signal-hook 0.3.4", "winapi", ] @@ -209,9 +209,9 @@ dependencies = [ [[package]] name = "bincode" -version = "1.3.3" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" dependencies = [ "serde", ] @@ -259,15 +259,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.6.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" +checksum = "099e596ef14349721d9016f6b80dd3419ea1bf289ab9b44df8e4dfd3a005d5d9" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" [[package]] name = "cache-padded" @@ -277,9 +277,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cc" -version = "1.0.67" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" [[package]] name = "cfg-if" @@ -354,6 +354,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "const_fn" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" + [[package]] name = "cpuid-bool" version = "0.1.2" @@ -457,11 +463,12 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12" +checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" dependencies = [ "cfg-if 1.0.0", + "const_fn", "crossbeam-utils", "lazy_static", "memoffset", @@ -470,9 +477,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" +checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" dependencies = [ "autocfg", "cfg-if 1.0.0", @@ -491,9 +498,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.12.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d6ddad5866bb2170686ed03f6839d31a76e5407d80b1c334a2c24618543ffa" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ "darling_core", "darling_macro", @@ -501,23 +508,23 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.12.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ced1fd13dc386d5a8315899de465708cf34ee2a6d9394654515214e67bb846" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", + "strsim 0.9.3", "syn", ] [[package]] name = "darling_macro" -version = "0.12.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7a1445d54b2f9792e3b31a3e715feabbace393f38dc4ffd49d94ee9bc487d5" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ "darling_core", "quote", @@ -574,18 +581,18 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "enumset" -version = "1.0.6" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3" +checksum = "cf6167d1be7a76696cadccfbdb89e5cb519244a42bab7da5577994579217dcff" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19c52f9ec503c8a68dc04daf71a04b07e690c32ab1a8b68e33897f255269d47" +checksum = "0d8a79bce471eb6165aa8ac86ebc8d788543b741eaa15e8b8486591696207d6c" dependencies = [ "darling", "proc-macro2", @@ -637,9 +644,9 @@ checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" [[package]] name = "futures" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253" +checksum = "da9052a1a50244d8d5aa9bf55cbc2fb6f357c86cc52e46c62ed390a7180cf150" dependencies = [ "futures-channel", "futures-core", @@ -652,9 +659,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25" +checksum = "f2d31b7ec7efab6eefc7c57233bb10b847986139d88cc2f5a02a1ae6871a1846" dependencies = [ "futures-core", "futures-sink", @@ -662,15 +669,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815" +checksum = "79e5145dde8da7d1b3892dad07a9c98fc04bc39892b1ecc9692cf53e2b780a65" [[package]] name = "futures-executor" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f6cb7042eda00f0049b1d2080aa4b93442997ee507eb3828e8bd7577f94c9d" +checksum = "e9e59fdc009a4b3096bf94f740a0f2424c082521f20a9b08c5c07c48d90fd9b9" dependencies = [ "futures-core", "futures-task", @@ -679,9 +686,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04" +checksum = "28be053525281ad8259d47e4de5de657b25e7bac113458555bb4b70bc6870500" [[package]] name = "futures-lite" @@ -700,9 +707,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b" +checksum = "c287d25add322d9f9abdcdc5927ca398917996600182178774032e9f8258fedd" dependencies = [ "proc-macro-hack", "proc-macro2", @@ -712,21 +719,24 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23" +checksum = "caf5c69029bda2e743fddd0582d1083951d65cc9539aebf8812f36c3491342d6" [[package]] name = "futures-task" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc" +checksum = "13de07eb8ea81ae445aca7b69f5f7bf15d7bf4912d8ca37d6645c77ae8a58d86" +dependencies = [ + "once_cell", +] [[package]] name = "futures-util" -version = "0.3.14" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025" +checksum = "632a8cd0f2a4b3fdea1657f08bde063848c3bd00f9bbf6e256b8be78802e624b" dependencies = [ "futures-channel", "futures-core", @@ -872,9 +882,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.7.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1b21a2971cea49ca4613c0e9fe8225ecaf5de64090fddc6002284726e9244" +checksum = "6b0d4f10636e7b40bf9eb71ecaf660498a120a86e9251bd4dea72a64ce9b8a93" dependencies = [ "console", "lazy_static", @@ -972,13 +982,13 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "lexical-core" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21f866863575d0e1d654fbeeabdc927292fdf862873dc3c96c6f753357e13374" +checksum = "db65c6da02e61f55dae90a0ae427b2a5f6b3e8db09f58d10efab23af92592616" dependencies = [ "arrayvec", "bitflags", - "cfg-if 1.0.0", + "cfg-if 0.1.10", "ryu", "static_assertions", ] @@ -1060,9 +1070,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" dependencies = [ "adler", "autocfg", @@ -1074,6 +1084,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "nb-connect" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8123a81538e457d44b933a02faf885d3fe8408806b23fa700e8f01c6c3a98998" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "nix" version = "0.19.1" @@ -1088,12 +1108,11 @@ dependencies = [ [[package]] name = "nom" -version = "6.1.2" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" +checksum = "ab6f70b46d6325aa300f1c7bb3d470127dfc27806d8ea6bf294ee0ce643ce2b1" dependencies = [ "bitvec", - "funty", "lexical-core", "memchr", "version_check", @@ -1152,9 +1171,9 @@ checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" [[package]] name = "once_cell" -version = "1.7.2" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" [[package]] name = "opaque-debug" @@ -1265,9 +1284,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.9" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" dependencies = [ "proc-macro2", ] @@ -1302,9 +1321,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5" dependencies = [ "getrandom", ] @@ -1345,9 +1364,15 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.6" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8270314b5ccceb518e7e578952f0b72b88222d02e8f77f5ecf7abbb673539041" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570" dependencies = [ "bitflags", ] @@ -1358,7 +1383,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f" dependencies = [ - "redox_syscall", + "redox_syscall 0.2.4", ] [[package]] @@ -1368,7 +1393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ "getrandom", - "redox_syscall", + "redox_syscall 0.2.4", ] [[package]] @@ -1485,9 +1510,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486" dependencies = [ "itoa", "ryu", @@ -1496,9 +1521,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.17" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15654ed4ab61726bf918a39cb8d98a2e2995b002387807fa6ba58fdf7f59bb23" +checksum = "bdd2af560da3c1fdc02cb80965289254fc35dff869810061e2d8290ee48848ae" dependencies = [ "dtoa", "linked-hash-map", @@ -1521,9 +1546,19 @@ dependencies = [ [[package]] name = "signal-hook" -version = "0.3.8" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef33d6d0cd06e0840fba9985aab098c147e67e05cee14d412d3345ed14ff30ac" +checksum = "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780f5e3fe0c66f67197236097d89de1e86216f1f6fdeaf47c442f854ab46c240" dependencies = [ "libc", "signal-hook-registry", @@ -1540,9 +1575,9 @@ dependencies = [ [[package]] name = "similar" -version = "1.3.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad1d488a557b235fc46dae55512ffbfc429d2482b08b4d9435ab07384ca8aec" +checksum = "da916d7c5876bff6fbf5794bd1e64aba8f5f110b76b192d80bb264423c0736f6" [[package]] name = "slab" @@ -1556,16 +1591,6 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" -[[package]] -name = "socket2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1614,9 +1639,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "strsim" -version = "0.10.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "structopt" @@ -1683,15 +1708,15 @@ dependencies = [ [[package]] name = "tap" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +checksum = "36474e732d1affd3a6ed582781b3683df3d0563714c59c39591e8ff707cf078e" [[package]] name = "target-lexicon" -version = "0.11.2" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422045212ea98508ae3d28025bc5aaa2bd4a9cdaecd442a08da2ee620ee9ea95" +checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" [[package]] name = "tempfile" @@ -1702,7 +1727,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "rand", - "redox_syscall", + "redox_syscall 0.2.4", "remove_dir_all", "winapi", ] @@ -1749,18 +1774,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.24" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" +checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.24" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" +checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" dependencies = [ "proc-macro2", "quote", @@ -1779,9 +1804,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.25" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +checksum = "f7d40a22fd029e33300d8d89a5cc8ffce18bb7c587662f54629e94c9de5487f3" dependencies = [ "cfg-if 1.0.0", "log", @@ -1792,9 +1817,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.15" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +checksum = "43f080ea7e4107844ef4766459426fa2d5c1ada2e47edba05dc7fa99d9629f47" dependencies = [ "proc-macro2", "quote", @@ -2239,18 +2264,18 @@ checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" [[package]] name = "wast" -version = "35.0.2" +version = "33.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +checksum = "1d04fe175c7f78214971293e7d8875673804e736092206a3a4544dbc12811c1b" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.37" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ec280a739b69173e0ffd12c1658507996836ba4e992ed9bc1e5385a0bd72a02" +checksum = "7ec9c6ee01ae07a26adadcdfed22c7a97e0b8cbee9c06e0e96076ece5aeb5cfe" dependencies = [ "wast", ] diff --git a/src/client/tab.rs b/src/client/tab.rs index 8e07dfc3..60f51004 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -4,17 +4,13 @@ use crate::client::pane_resizer::PaneResizer; use crate::common::{input::handler::parse_keys, AppInstruction, SenderWithContext}; use crate::layout::Layout; -use crate::os_input_output::OsApi; +use crate::os_input_output::{ClientOsApi, ServerOsApiInstruction}; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; -use crate::pty_bus::{PtyInstruction, VteBytes}; -use crate::utils::shared::adjust_to_size; -use crate::wasm_vm::PluginInstruction; +use crate::pty_bus::{PtyInstruction, VteEvent}; +use crate::utils::shared::pad_to_size; +use crate::wasm_vm::{PluginInputType, PluginInstruction}; use crate::{boundaries::Boundaries, panes::PluginPane}; -use crate::{layout::Layout, wasm_vm::PluginInstruction}; -use crate::{ - os_input_output::{ClientOsApi, ServerOsApiInstruction}, - utils::shared::pad_to_size, -}; +use serde::{Deserialize, Serialize}; use std::os::unix::io::RawFd; use std::time::Instant; use std::{ diff --git a/src/common/errors.rs b/src/common/errors.rs index e8e02e5a..234745ad 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -330,6 +330,7 @@ pub enum PluginContext { Render, Unload, Exit, + Tabs, } impl From<&PluginInstruction> for PluginContext { @@ -340,6 +341,7 @@ impl From<&PluginInstruction> for PluginContext { PluginInstruction::Render(..) => PluginContext::Render, PluginInstruction::Unload(_) => PluginContext::Unload, PluginInstruction::Exit => PluginContext::Exit, + PluginInstruction::UpdateTabs(..) => PluginContext::Tabs, } } } diff --git a/src/common/mod.rs b/src/common/mod.rs index e8883d4f..9554eb78 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -432,6 +432,12 @@ pub fn start( screen.apply_layout(Layout::new(layout), new_pane_pids); command_is_executing.done_opening_new_pane(); } + ScreenInstruction::GoToTab(tab_index) => { + screen.go_to_tab(tab_index as usize) + } + ScreenInstruction::UpdateTabName(c) => { + screen.update_active_tab_name(c); + } ScreenInstruction::Exit => { break; } diff --git a/src/common/screen.rs b/src/common/screen.rs index ae1f4dd7..1bc372f6 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -4,6 +4,7 @@ use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::os::unix::io::RawFd; use std::path::PathBuf; +use std::str; use std::sync::mpsc::Receiver; use super::{AppInstruction, SenderWithContext}; @@ -79,6 +80,7 @@ pub struct Screen { active_tab_index: Option, /// The [`OsApi`] this [`Screen`] uses. os_api: Box, + tabname_buf: String, } impl Screen { diff --git a/src/common/wasm_vm.rs b/src/common/wasm_vm.rs index 31b1000c..d4580572 100644 --- a/src/common/wasm_vm.rs +++ b/src/common/wasm_vm.rs @@ -21,6 +21,7 @@ pub enum PluginInstruction { Update(Option, Event), // Focused plugin / broadcast, event data Render(Sender, u32, usize, usize), // String buffer, plugin id, rows, cols Unload(u32), + UpdateTabs(Vec), // num tabs, active tab Exit, } diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index a59bfa4a..16b98101 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -13,7 +13,7 @@ use zellij_tile::data::Palette; use crate::tests::utils::commands::{QUIT, SLEEP}; -const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(350); +const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(400); #[derive(Clone)] pub enum IoEvent { diff --git a/src/tests/integration/basic.rs b/src/tests/integration/basic.rs index 75f96bda..406e6174 100644 --- a/src/tests/integration/basic.rs +++ b/src/tests/integration/basic.rs @@ -26,7 +26,7 @@ pub fn starts_with_one_terminal() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -53,12 +53,7 @@ pub fn split_terminals_vertically() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &COMMAND_TOGGLE, - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &QUIT, - ]); + fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_RIGHT_IN_PANE_MODE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -85,12 +80,7 @@ pub fn split_terminals_horizontally() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &COMMAND_TOGGLE, - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &QUIT, - ]); + fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_DOWN_IN_PANE_MODE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -151,12 +141,7 @@ pub fn cannot_split_terminals_vertically_when_active_terminal_is_too_small() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &COMMAND_TOGGLE, - &PANE_MODE, - &SPLIT_RIGHT_IN_PANE_MODE, - &QUIT, - ]); + fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_RIGHT_IN_PANE_MODE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -183,12 +168,7 @@ pub fn cannot_split_terminals_horizontally_when_active_terminal_is_too_small() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &COMMAND_TOGGLE, - &PANE_MODE, - &SPLIT_DOWN_IN_PANE_MODE, - &QUIT, - ]); + fake_input_output.add_terminal_input(&[&PANE_MODE, &SPLIT_DOWN_IN_PANE_MODE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -215,12 +195,7 @@ pub fn cannot_split_largest_terminal_when_there_is_no_room() { ..Default::default() }; let mut fake_input_output = get_fake_os_input(&fake_win_size); - fake_input_output.add_terminal_input(&[ - &COMMAND_TOGGLE, - &PANE_MODE, - &SPAWN_TERMINAL_IN_PANE_MODE, - &QUIT, - ]); + fake_input_output.add_terminal_input(&[&PANE_MODE, &SPAWN_TERMINAL_IN_PANE_MODE, &QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs index 8e9630d4..861d5a05 100644 --- a/src/tests/integration/compatibility.rs +++ b/src/tests/integration/compatibility.rs @@ -41,7 +41,8 @@ pub fn run_bandwhich_from_fish_shell() { }; let fixture_name = "fish_and_bandwhich"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -69,7 +70,7 @@ pub fn fish_tab_completion_options() { }; let fixture_name = "fish_tab_completion_options"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -102,7 +103,7 @@ pub fn fish_select_tab_completion_options() { }; let fixture_name = "fish_select_tab_completion_options"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -139,7 +140,7 @@ pub fn vim_scroll_region_down() { }; let fixture_name = "vim_scroll_region_down"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); // quit (ctrl-q) + fake_input_output.add_terminal_input(&[&QUIT]); // quit (ctrl-q) start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -173,7 +174,7 @@ pub fn vim_ctrl_d() { }; let fixture_name = "vim_ctrl_d"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -206,7 +207,7 @@ pub fn vim_ctrl_u() { }; let fixture_name = "vim_ctrl_u"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -234,7 +235,7 @@ pub fn htop() { }; let fixture_name = "htop"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -262,7 +263,7 @@ pub fn htop_scrolling() { }; let fixture_name = "htop_scrolling"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -290,7 +291,7 @@ pub fn htop_right_scrolling() { }; let fixture_name = "htop_right_scrolling"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -326,7 +327,7 @@ pub fn vim_overwrite() { }; let fixture_name = "vim_overwrite"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -357,7 +358,7 @@ pub fn clear_scroll_region() { }; let fixture_name = "clear_scroll_region"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -385,7 +386,7 @@ pub fn display_tab_characters_properly() { }; let fixture_name = "tab_characters"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -413,7 +414,7 @@ pub fn neovim_insert_mode() { }; let fixture_name = "nvim_insert"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -443,7 +444,7 @@ pub fn bash_cursor_linewrap() { }; let fixture_name = "bash_cursor_linewrap"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -473,7 +474,7 @@ pub fn fish_paste_multiline() { }; let fixture_name = "fish_paste_multiline"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -501,7 +502,7 @@ pub fn git_log() { }; let fixture_name = "git_log"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -531,7 +532,7 @@ pub fn git_diff_scrollup() { }; let fixture_name = "git_diff_scrollup"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -559,7 +560,7 @@ pub fn emacs_longbuf() { }; let fixture_name = "emacs_longbuf_tutorial"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -587,7 +588,7 @@ pub fn top_and_quit() { }; let fixture_name = "top_and_quit"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), @@ -621,7 +622,7 @@ pub fn exa_plus_omf_theme() { }; let fixture_name = "exa_plus_omf_theme"; let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); - fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &QUIT]); + fake_input_output.add_terminal_input(&[&QUIT]); start( Box::new(fake_input_output.clone()), CliArgs::default(), From 5d06a49f8aded46f45487e87ea31fd3d82dae1ab Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 20 Mar 2021 09:40:45 +0530 Subject: [PATCH 28/64] fix fmt errors --- src/tests/fakes.rs | 29 ----------- src/tests/integration/resize_down.rs | 78 +++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 42 deletions(-) diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 16b98101..fcf0cefb 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -218,35 +218,6 @@ impl ServerOsApi for FakeInputOutput { fn box_clone(&self) -> Box { Box::new((*self).clone()) } - fn read_from_stdin(&self) -> Vec { - loop { - let last_snapshot_time = { *self.last_snapshot_time.lock().unwrap() }; - if last_snapshot_time.elapsed() > MIN_TIME_BETWEEN_SNAPSHOTS { - break; - } else { - ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS - last_snapshot_time.elapsed()); - } - } - let command = self - .stdin_commands - .lock() - .unwrap() - .pop_front() - .unwrap_or(vec![]); - if command == SLEEP { - std::thread::sleep(std::time::Duration::from_millis(200)); - } else if command == QUIT && self.sigwinch_event.is_some() { - let (lock, cvar) = &*self.should_trigger_sigwinch; - let mut should_trigger_sigwinch = lock.lock().unwrap(); - *should_trigger_sigwinch = true; - cvar.notify_one(); - ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS); // give some time for the app to resize before quitting - } - command - } - fn get_stdout_writer(&self) -> Box { - Box::new(self.stdout_writer.clone()) - } fn kill(&mut self, fd: RawFd) -> Result<(), nix::Error> { self.io_events.lock().unwrap().push(IoEvent::Kill(fd)); Ok(()) diff --git a/src/tests/integration/resize_down.rs b/src/tests/integration/resize_down.rs index 850f6807..745ba109 100644 --- a/src/tests/integration/resize_down.rs +++ b/src/tests/integration/resize_down.rs @@ -43,7 +43,11 @@ pub fn resize_down_with_pane_above() { &SLEEP, &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -83,7 +87,11 @@ pub fn resize_down_with_pane_below() { &SLEEP, &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -129,7 +137,11 @@ pub fn resize_down_with_panes_above_and_below() { &SLEEP, &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -174,7 +186,11 @@ pub fn resize_down_with_multiple_panes_above() { &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -221,7 +237,11 @@ pub fn resize_down_with_panes_above_aligned_left_with_current_pane() { &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -267,7 +287,11 @@ pub fn resize_down_with_panes_below_aligned_left_with_current_pane() { &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -311,7 +335,11 @@ pub fn resize_down_with_panes_above_aligned_right_with_current_pane() { &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -356,7 +384,11 @@ pub fn resize_down_with_panes_below_aligned_right_with_current_pane() { &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -404,7 +436,11 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_current_pane() { &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -454,7 +490,11 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_current_pane() { &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -521,7 +561,11 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_lef &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -590,7 +634,11 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_ &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer @@ -627,7 +675,11 @@ pub fn cannot_resize_down_when_pane_below_is_at_minimum_height() { &SLEEP, &QUIT, ]); - start(Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone())); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer From 3ef27158271363c09a7e873fb529a47a7d062423 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 20 Mar 2021 11:37:52 +0530 Subject: [PATCH 29/64] increase snapshot time --- src/tests/fakes.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index fcf0cefb..8621de71 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -13,7 +13,7 @@ use zellij_tile::data::Palette; use crate::tests::utils::commands::{QUIT, SLEEP}; -const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(400); +const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(500); #[derive(Clone)] pub enum IoEvent { From bc2345c413fb310628380ad06af9653eb9e12b9e Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Mon, 22 Mar 2021 02:08:39 +0530 Subject: [PATCH 30/64] Hide server-side Ipc channels creation behind OsApis and some documentation fixes --- src/common/errors.rs | 4 +++- src/common/mod.rs | 10 ++++++---- src/common/os_input_output.rs | 30 ++++++++++++++++++++++++------ src/main.rs | 2 +- src/server/mod.rs | 25 ++++++------------------- src/tests/fakes.rs | 29 ++++++++++++++++------------- 6 files changed, 56 insertions(+), 44 deletions(-) diff --git a/src/common/errors.rs b/src/common/errors.rs index 234745ad..83527448 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -146,6 +146,7 @@ pub enum ContextType { Plugin(PluginContext), /// An app-related call. App(AppContext), + /// A server-related call. IPCServer(ServerContext), StdinHandler, AsyncTask, @@ -297,6 +298,7 @@ impl From<&PtyInstruction> for PtyContext { } } +/// Stack call representations corresponding to the different types of [`ServerOsApiInstruction`]s. #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum OsContext { SetTerminalSizeUsingFd, @@ -372,7 +374,7 @@ impl From<&AppInstruction> for AppContext { } } -/// Stack call representations corresponding to the different types of [`AppInstruction`]s. +/// Stack call representations corresponding to the different types of [`ServerInstruction`]s. #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum ServerContext { OpenFile, diff --git a/src/common/mod.rs b/src/common/mod.rs index 9554eb78..ec1f0959 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -42,6 +42,8 @@ use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; use zellij_tile::data::{EventType, InputMode, ModeInfo}; +pub const IPC_BUFFER_SIZE: u32 = 8192; + #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ServerInstruction { OpenFile(PathBuf), @@ -205,7 +207,7 @@ pub fn start( opts: CliArgs, server_os_input: Box, ) { - let (ipc_thread, server_name) = start_server(server_os_input.clone(), opts.clone()); + let ipc_thread = start_server(server_os_input.clone(), opts.clone()); let take_snapshot = "\u{1b}[?1049h"; os_input.unset_raw_mode(0); @@ -235,9 +237,9 @@ pub fn start( let mut send_app_instructions = SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - let (client_buffer_path, client_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); - let mut send_server_instructions = - IpcSenderWithContext::new(SharedRingBuffer::open(&server_name).unwrap()); + let (client_buffer_path, client_buffer) = + SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); + let mut send_server_instructions = os_input.get_server_sender().unwrap(); send_server_instructions .send(ServerInstruction::NewClient(client_buffer_path)) .unwrap(); diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index d0c13ccd..90bd0e49 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -1,5 +1,7 @@ +use crate::common::{IpcSenderWithContext, IPC_BUFFER_SIZE}; use crate::panes::PositionAndSize; -use crate::utils::shared::default_palette; +use crate::utils::consts::ZELLIJ_IPC_PIPE; +use ipmpsc::{Receiver as IpcReceiver, Result as IpcResult, SharedRingBuffer}; use nix::fcntl::{fcntl, FcntlArg, OFlag}; use nix::pty::{forkpty, Winsize}; use nix::sys::signal::{kill, Signal}; @@ -8,6 +10,7 @@ use nix::sys::wait::waitpid; use nix::unistd; use nix::unistd::{ForkResult, Pid}; use serde::{Deserialize, Serialize}; +use std::env; use std::io; use std::io::prelude::*; use std::os::unix::io::RawFd; @@ -15,10 +18,6 @@ use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; -use signal_hook::{consts::signal::*, iterator::Signals}; - -use std::env; - fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); termios::cfmakeraw(&mut tio); @@ -158,6 +157,7 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) #[derive(Clone)] pub struct ServerOsInputOutput { orig_termios: Arc>, + server_buffer: SharedRingBuffer, } /// The `ServerOsApi` trait represents an abstract interface to the features of an operating system that @@ -180,6 +180,8 @@ pub trait ServerOsApi: Send + Sync { fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error>; /// Returns a [`Box`] pointer to this [`OsApi`] struct. fn box_clone(&self) -> Box; + fn get_server_receiver(&self) -> IpcReceiver; + fn get_server_sender(&self) -> IpcSenderWithContext; } impl ServerOsApi for ServerOsInputOutput { @@ -207,6 +209,12 @@ impl ServerOsApi for ServerOsInputOutput { waitpid(Pid::from_raw(pid), None).unwrap(); Ok(()) } + fn get_server_receiver(&self) -> IpcReceiver { + IpcReceiver::new(self.server_buffer.clone()) + } + fn get_server_sender(&self) -> IpcSenderWithContext { + IpcSenderWithContext::new(self.server_buffer.clone()) + } } impl Clone for Box { @@ -218,9 +226,14 @@ impl Clone for Box { pub fn get_server_os_input() -> ServerOsInputOutput { let current_termios = termios::tcgetattr(0).unwrap(); let orig_termios = Arc::new(Mutex::new(current_termios)); - ServerOsInputOutput { orig_termios } + let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, IPC_BUFFER_SIZE).unwrap(); + ServerOsInputOutput { + orig_termios, + server_buffer, + } } +/// OS Instructions sent to the Server by clients #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ServerOsApiInstruction { SetTerminalSizeUsingFd(RawFd, u16, u16), @@ -251,6 +264,7 @@ pub trait ClientOsApi: Send + Sync { fn read_from_stdin(&self) -> Vec; /// Returns a [`Box`] pointer to this [`OsApi`] struct. fn box_clone(&self) -> Box; + fn get_server_sender(&self) -> IpcResult; } impl ClientOsApi for ClientOsInputOutput { @@ -280,6 +294,10 @@ impl ClientOsApi for ClientOsInputOutput { let stdout = ::std::io::stdout(); Box::new(stdout) } + fn get_server_sender(&self) -> IpcResult { + let buffer = SharedRingBuffer::open(ZELLIJ_IPC_PIPE)?; + Ok(IpcSenderWithContext::new(buffer)) + } } impl Clone for Box { diff --git a/src/main.rs b/src/main.rs index 5c0049ec..e6b94064 100644 --- a/src/main.rs +++ b/src/main.rs @@ -87,8 +87,8 @@ pub fn main() { .send(ServerInstruction::OpenFile(file_to_open)) .unwrap(); } else { - let os_input = get_client_os_input(); let server_os_input = get_server_os_input(); + let os_input = get_client_os_input(); atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); start(Box::new(os_input), opts, Box::new(server_os_input)); diff --git a/src/server/mod.rs b/src/server/mod.rs index b1318061..3c6918ea 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -8,16 +8,12 @@ use crate::os_input_output::{ServerOsApi, ServerOsApiInstruction}; use crate::panes::PaneId; use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; -use crate::utils::consts::ZELLIJ_IPC_PIPE; -use ipmpsc::{Receiver as IpcReceiver, SharedRingBuffer}; +use ipmpsc::SharedRingBuffer; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; -pub fn start_server( - os_input: Box, - opts: CliArgs, -) -> (thread::JoinHandle<()>, String) { +pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); let mut send_pty_instructions = SenderWithContext::new( @@ -25,14 +21,6 @@ pub fn start_server( SenderType::Sender(send_pty_instructions), ); - #[cfg(not(test))] - let (server_name, server_buffer) = ( - String::from(ZELLIJ_IPC_PIPE), - SharedRingBuffer::create(ZELLIJ_IPC_PIPE, 8192).unwrap(), - ); - #[cfg(test)] - let (server_name, server_buffer) = SharedRingBuffer::create_temp(8192).unwrap(); - let (send_os_instructions, receive_os_instructions): ChannelWithContext< ServerOsApiInstruction, > = channel(); @@ -48,7 +36,7 @@ pub fn start_server( let default_layout = None; let maybe_layout = opts.layout.or(default_layout); - let send_server_instructions = IpcSenderWithContext::new(server_buffer.clone()); + let send_server_instructions = os_input.get_server_sender(); let mut pty_bus = PtyBus::new( receive_pty_instructions, @@ -151,10 +139,10 @@ pub fn start_server( }) .unwrap(); - let server_handle = thread::Builder::new() + thread::Builder::new() .name("ipc_server".to_string()) .spawn({ - let recv_server_instructions = IpcReceiver::new(server_buffer); + let recv_server_instructions = os_input.get_server_receiver(); // Fixme: We cannot use uninitialised sender, therefore this Vec. // For now, We make sure that the first message is `NewClient` so there are no out of bound panics. let mut send_client_instructions: Vec = Vec::with_capacity(1); @@ -228,6 +216,5 @@ pub fn start_server( } } }) - .unwrap(); - (server_handle, server_name) + .unwrap() } diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 8621de71..80cf67b5 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -1,4 +1,5 @@ use crate::panes::PositionAndSize; +use ipmpsc::{Receiver as IpcReceiver, Result as IpcResult, SharedRingBuffer}; use std::collections::{HashMap, VecDeque}; use std::io::Write; use std::os::unix::io::RawFd; @@ -6,6 +7,7 @@ use std::path::PathBuf; use std::sync::{Arc, Condvar, Mutex}; use std::time::{Duration, Instant}; +use crate::common::{IpcSenderWithContext, IPC_BUFFER_SIZE}; use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::utils::shared::default_palette; @@ -73,8 +75,8 @@ pub struct FakeInputOutput { win_sizes: Arc>>, possible_tty_inputs: HashMap, last_snapshot_time: Arc>, - should_trigger_sigwinch: Arc<(Mutex, Condvar)>, - sigwinch_event: Option, + started_reading_from_pty: Arc, + server_buffer: SharedRingBuffer, } impl FakeInputOutput { @@ -82,7 +84,9 @@ impl FakeInputOutput { let mut win_sizes = HashMap::new(); let last_snapshot_time = Arc::new(Mutex::new(Instant::now())); let stdout_writer = FakeStdoutWriter::new(last_snapshot_time.clone()); + let (_, server_buffer) = SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); win_sizes.insert(0, winsize); // 0 is the current terminal + FakeInputOutput { read_buffers: Arc::new(Mutex::new(HashMap::new())), stdin_writes: Arc::new(Mutex::new(HashMap::new())), @@ -93,8 +97,8 @@ impl FakeInputOutput { io_events: Arc::new(Mutex::new(vec![])), win_sizes: Arc::new(Mutex::new(win_sizes)), possible_tty_inputs: get_possible_tty_inputs(), - should_trigger_sigwinch: Arc::new((Mutex::new(false), Condvar::new())), - sigwinch_event: None, + started_reading_from_pty: Arc::new(AtomicBool::new(false)), + server_buffer, } } pub fn with_tty_inputs(mut self, tty_inputs: HashMap) -> Self { @@ -162,6 +166,9 @@ impl ClientOsApi for FakeInputOutput { fn get_stdout_writer(&self) -> Box { Box::new(self.stdout_writer.clone()) } + fn get_server_sender(&self) -> IpcResult { + Ok(IpcSenderWithContext::new(self.server_buffer.clone())) + } } impl ServerOsApi for FakeInputOutput { @@ -222,15 +229,11 @@ impl ServerOsApi for FakeInputOutput { self.io_events.lock().unwrap().push(IoEvent::Kill(fd)); Ok(()) } - fn receive_sigwinch(&self, cb: Box) { - if self.sigwinch_event.is_some() { - let (lock, cvar) = &*self.should_trigger_sigwinch; - let mut should_trigger_sigwinch = lock.lock().unwrap(); - while !*should_trigger_sigwinch { - should_trigger_sigwinch = cvar.wait(should_trigger_sigwinch).unwrap(); - } - cb(); - } + fn get_server_receiver(&self) -> IpcReceiver { + IpcReceiver::new(self.server_buffer.clone()) + } + fn get_server_sender(&self) -> IpcSenderWithContext { + IpcSenderWithContext::new(self.server_buffer.clone()) } fn load_palette(&self) -> Palette { default_palette() From 660434be06b14b44059db852c9c26e09b027f619 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Mon, 22 Mar 2021 09:05:08 +0530 Subject: [PATCH 31/64] documentation and nit fix --- src/common/mod.rs | 4 ++-- src/common/os_input_output.rs | 4 ++++ src/server/mod.rs | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index ec1f0959..9a7e40e4 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -164,7 +164,7 @@ impl IpcSenderWithContext { } pub fn send(&mut self, msg: T) -> ipmpsc::Result<()> { - self.sender.send(&(self.err_ctx, msg)) + self.sender.send(&(msg, self.err_ctx)) } } @@ -573,7 +573,7 @@ pub fn start( .spawn({ let recv_client_instructions = IpcReceiver::new(client_buffer); move || loop { - let (err_ctx, instruction): (ErrorContext, ClientInstruction) = + let (instruction, err_ctx): (ClientInstruction, ErrorContext) = recv_client_instructions.recv().unwrap(); send_app_instructions.update(err_ctx); match instruction { diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 90bd0e49..b97834b5 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -180,7 +180,10 @@ pub trait ServerOsApi: Send + Sync { fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error>; /// Returns a [`Box`] pointer to this [`OsApi`] struct. fn box_clone(&self) -> Box; + /// Returns the receiver of ServerInstructions. + // Should be called by server once only. fn get_server_receiver(&self) -> IpcReceiver; + /// Returns a sender to the Server. fn get_server_sender(&self) -> IpcSenderWithContext; } @@ -264,6 +267,7 @@ pub trait ClientOsApi: Send + Sync { fn read_from_stdin(&self) -> Vec; /// Returns a [`Box`] pointer to this [`OsApi`] struct. fn box_clone(&self) -> Box; + /// Returns a sender to the Server. fn get_server_sender(&self) -> IpcResult; } diff --git a/src/server/mod.rs b/src/server/mod.rs index 3c6918ea..b902ea27 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -147,7 +147,7 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo // For now, We make sure that the first message is `NewClient` so there are no out of bound panics. let mut send_client_instructions: Vec = Vec::with_capacity(1); move || loop { - let (mut err_ctx, instruction): (ErrorContext, ServerInstruction) = + let (instruction, mut err_ctx): (ServerInstruction, ErrorContext) = recv_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); send_pty_instructions.update(err_ctx); From 965cc71918d465faaf54b54021af7e67a08afef7 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 23 Mar 2021 13:54:15 +0530 Subject: [PATCH 32/64] Hide IpcChannel entirely behind OsApi --- src/common/mod.rs | 68 ++++-------------- src/common/os_input_output.rs | 123 +++++++++++++++++++++++++------ src/common/pty_bus.rs | 131 +++++++++++++--------------------- src/main.rs | 24 ++----- src/server/mod.rs | 94 ++++++++---------------- src/tests/fakes.rs | 62 ++++++++++++---- 6 files changed, 247 insertions(+), 255 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 9a7e40e4..9cafb5d6 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -18,7 +18,6 @@ use std::{collections::HashMap, fs}; use crate::panes::PaneId; use directories_next::ProjectDirs; use input::handler::InputMode; -use ipmpsc::{Receiver as IpcReceiver, Sender as IpcSender, SharedRingBuffer}; use serde::{Deserialize, Serialize}; use termion::input::TermRead; use wasm_vm::PluginEnv; @@ -34,13 +33,10 @@ use input::handler::input_loop; use os_input_output::{ClientOsApi, ServerOsApi, ServerOsApiInstruction}; use pty_bus::PtyInstruction; use screen::{Screen, ScreenInstruction}; -use serde::{Deserialize, Serialize}; -use setup::install; -use utils::consts::ZELLIJ_IPC_PIPE; -use wasm_vm::{wasi_read_string, wasi_write_object, zellij_exports, PluginEnv, PluginInstruction}; -use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; -use wasmer_wasi::{Pipe, WasiState}; -use zellij_tile::data::{EventType, InputMode, ModeInfo}; +use utils::consts::ZELLIJ_ROOT_PLUGIN_DIR; +use wasm_vm::{ + wasi_stdout, wasi_write_string, zellij_imports, EventType, PluginInputType, PluginInstruction, +}; pub const IPC_BUFFER_SIZE: u32 = 8192; @@ -139,34 +135,6 @@ thread_local!( /// stack in the form of an [`ErrorContext`]. static OPENCALLS: RefCell = RefCell::default() ); -#[derive(Clone)] -pub struct IpcSenderWithContext { - err_ctx: ErrorContext, - sender: IpcSender, -} - -impl IpcSenderWithContext { - pub fn new(buffer: SharedRingBuffer) -> Self { - Self { - err_ctx: ErrorContext::new(), - sender: IpcSender::new(buffer), - } - } - - // This is expensive. Use this only if a buffer is not available. - // Otherwise clone the buffer and use `new()` - pub fn to_server() -> Self { - Self::new(SharedRingBuffer::open(ZELLIJ_IPC_PIPE).unwrap()) - } - - pub fn update(&mut self, ctx: ErrorContext) { - self.err_ctx = ctx; - } - - pub fn send(&mut self, msg: T) -> ipmpsc::Result<()> { - self.sender.send(&(msg, self.err_ctx)) - } -} task_local! { /// A key to some task local storage that holds a representation of the task's call @@ -207,7 +175,7 @@ pub fn start( opts: CliArgs, server_os_input: Box, ) { - let ipc_thread = start_server(server_os_input.clone(), opts.clone()); + let ipc_thread = start_server(server_os_input, opts.clone()); let take_snapshot = "\u{1b}[?1049h"; os_input.unset_raw_mode(0); @@ -237,12 +205,7 @@ pub fn start( let mut send_app_instructions = SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - let (client_buffer_path, client_buffer) = - SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); - let mut send_server_instructions = os_input.get_server_sender().unwrap(); - send_server_instructions - .send(ServerInstruction::NewClient(client_buffer_path)) - .unwrap(); + os_input.notify_server(); #[cfg(not(test))] std::panic::set_hook({ @@ -571,10 +534,9 @@ pub fn start( let router_thread = thread::Builder::new() .name("router".to_string()) .spawn({ - let recv_client_instructions = IpcReceiver::new(client_buffer); + let os_input = os_input.clone(); move || loop { - let (instruction, err_ctx): (ClientInstruction, ErrorContext) = - recv_client_instructions.recv().unwrap(); + let (instruction, err_ctx) = os_input.client_recv(); send_app_instructions.update(err_ctx); match instruction { ClientInstruction::Exit => break, @@ -596,13 +558,13 @@ pub fn start( err_ctx.add_call(ContextType::App(AppContext::from(&app_instruction))); send_screen_instructions.update(err_ctx); - send_server_instructions.update(err_ctx); + os_input.update_senders(err_ctx); match app_instruction { AppInstruction::GetState(state_tx) => drop(state_tx.send(app_state.clone())), AppInstruction::SetState(state) => app_state = state, AppInstruction::Exit => break, AppInstruction::Error(backtrace) => { - let _ = send_server_instructions.send(ServerInstruction::Exit); + let _ = os_input.send_to_server(ServerInstruction::Exit); let _ = send_screen_instructions.send(ScreenInstruction::Exit); let _ = send_plugin_instructions.send(PluginInstruction::Exit); let _ = screen_thread.join(); @@ -625,20 +587,16 @@ pub fn start( send_plugin_instructions.send(instruction).unwrap(); } AppInstruction::ToPty(instruction) => { - let _ = send_server_instructions - .send(ServerInstruction::ToPty(instruction)) - .unwrap(); + let _ = os_input.send_to_server(ServerInstruction::ToPty(instruction)); } AppInstruction::OsApi(instruction) => { - let _ = send_server_instructions - .send(ServerInstruction::OsApi(instruction)) - .unwrap(); + let _ = os_input.send_to_server(ServerInstruction::OsApi(instruction)); } AppInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), } } - let _ = send_server_instructions.send(ServerInstruction::Exit); + let _ = os_input.send_to_server(ServerInstruction::Exit); let _ = send_screen_instructions.send(ScreenInstruction::Exit); let _ = send_plugin_instructions.send(PluginInstruction::Exit); screen_thread.join().unwrap(); diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index b97834b5..6585251c 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -1,7 +1,4 @@ -use crate::common::{IpcSenderWithContext, IPC_BUFFER_SIZE}; -use crate::panes::PositionAndSize; -use crate::utils::consts::ZELLIJ_IPC_PIPE; -use ipmpsc::{Receiver as IpcReceiver, Result as IpcResult, SharedRingBuffer}; +use ipmpsc::{Receiver as IpcReceiver, Sender as IpcSender, SharedRingBuffer}; use nix::fcntl::{fcntl, FcntlArg, OFlag}; use nix::pty::{forkpty, Winsize}; use nix::sys::signal::{kill, Signal}; @@ -13,11 +10,17 @@ use serde::{Deserialize, Serialize}; use std::env; use std::io; use std::io::prelude::*; +use std::marker::PhantomData; use std::os::unix::io::RawFd; use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; +use crate::common::{ClientInstruction, ServerInstruction, IPC_BUFFER_SIZE}; +use crate::errors::ErrorContext; +use crate::panes::PositionAndSize; +use crate::utils::consts::ZELLIJ_IPC_PIPE; + fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); termios::cfmakeraw(&mut tio); @@ -154,10 +157,37 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) (pid_primary, pid_secondary) } +#[derive(Clone)] +struct IpcSenderWithContext { + err_ctx: ErrorContext, + sender: IpcSender, + _phantom: PhantomData, +} + +impl IpcSenderWithContext { + fn new(buffer: SharedRingBuffer) -> Self { + Self { + err_ctx: ErrorContext::new(), + sender: IpcSender::new(buffer), + _phantom: PhantomData, + } + } + + fn update(&mut self, ctx: ErrorContext) { + self.err_ctx = ctx; + } + + fn send(&mut self, msg: T) -> ipmpsc::Result<()> { + self.sender.send(&(msg, self.err_ctx)) + } +} + #[derive(Clone)] pub struct ServerOsInputOutput { orig_termios: Arc>, - server_buffer: SharedRingBuffer, + server_sender: IpcSenderWithContext, + server_receiver: Arc>, + client_sender: Option>, } /// The `ServerOsApi` trait represents an abstract interface to the features of an operating system that @@ -180,11 +210,16 @@ pub trait ServerOsApi: Send + Sync { fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error>; /// Returns a [`Box`] pointer to this [`OsApi`] struct. fn box_clone(&self) -> Box; - /// Returns the receiver of ServerInstructions. - // Should be called by server once only. - fn get_server_receiver(&self) -> IpcReceiver; - /// Returns a sender to the Server. - fn get_server_sender(&self) -> IpcSenderWithContext; + /// Sends a message to the server. + fn send_to_server(&mut self, msg: ServerInstruction); + /// Receives a message on server-side IPC channel + fn server_recv(&self) -> (ServerInstruction, ErrorContext); + /// Sends a message to client + fn send_to_client(&mut self, msg: ClientInstruction); + /// Adds a sender to client + fn add_client_sender(&mut self, buffer_path: String); + /// Update ErrorContext of senders + fn update_senders(&mut self, new_ctx: ErrorContext); } impl ServerOsApi for ServerOsInputOutput { @@ -212,11 +247,24 @@ impl ServerOsApi for ServerOsInputOutput { waitpid(Pid::from_raw(pid), None).unwrap(); Ok(()) } - fn get_server_receiver(&self) -> IpcReceiver { - IpcReceiver::new(self.server_buffer.clone()) + fn send_to_server(&mut self, msg: ServerInstruction) { + self.server_sender.send(msg).unwrap(); } - fn get_server_sender(&self) -> IpcSenderWithContext { - IpcSenderWithContext::new(self.server_buffer.clone()) + fn server_recv(&self) -> (ServerInstruction, ErrorContext) { + self.server_receiver.lock().unwrap().recv().unwrap() + } + fn send_to_client(&mut self, msg: ClientInstruction) { + self.client_sender.as_mut().unwrap().send(msg).unwrap(); + } + fn add_client_sender(&mut self, buffer_path: String) { + let buffer = SharedRingBuffer::open(buffer_path.as_str()).unwrap(); + self.client_sender = Some(IpcSenderWithContext::new(buffer)); + } + fn update_senders(&mut self, new_ctx: ErrorContext) { + self.server_sender.update(new_ctx); + if let Some(ref mut s) = self.client_sender { + s.update(new_ctx); + } } } @@ -230,9 +278,13 @@ pub fn get_server_os_input() -> ServerOsInputOutput { let current_termios = termios::tcgetattr(0).unwrap(); let orig_termios = Arc::new(Mutex::new(current_termios)); let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, IPC_BUFFER_SIZE).unwrap(); + let server_sender = IpcSenderWithContext::new(server_buffer.clone()); + let server_receiver = Arc::new(Mutex::new(IpcReceiver::new(server_buffer.clone()))); ServerOsInputOutput { orig_termios, - server_buffer, + server_sender, + server_receiver, + client_sender: None, } } @@ -248,6 +300,9 @@ pub enum ServerOsApiInstruction { #[derive(Clone)] pub struct ClientOsInputOutput { orig_termios: Arc>, + server_sender: IpcSenderWithContext, + client_buffer_path: String, + client_receiver: Arc>, } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -267,8 +322,14 @@ pub trait ClientOsApi: Send + Sync { fn read_from_stdin(&self) -> Vec; /// Returns a [`Box`] pointer to this [`OsApi`] struct. fn box_clone(&self) -> Box; - /// Returns a sender to the Server. - fn get_server_sender(&self) -> IpcResult; + /// Sends a message to the server. + fn send_to_server(&mut self, msg: ServerInstruction); + /// Update ErrorContext of senders + fn update_senders(&mut self, new_ctx: ErrorContext); + /// Receives a message on client-side IPC channel + fn client_recv(&self) -> (ClientInstruction, ErrorContext); + /// Notify server of new client + fn notify_server(&mut self); } impl ClientOsApi for ClientOsInputOutput { @@ -298,9 +359,19 @@ impl ClientOsApi for ClientOsInputOutput { let stdout = ::std::io::stdout(); Box::new(stdout) } - fn get_server_sender(&self) -> IpcResult { - let buffer = SharedRingBuffer::open(ZELLIJ_IPC_PIPE)?; - Ok(IpcSenderWithContext::new(buffer)) + fn send_to_server(&mut self, msg: ServerInstruction) { + self.server_sender.send(msg).unwrap(); + } + fn update_senders(&mut self, new_ctx: ErrorContext) { + self.server_sender.update(new_ctx); + } + fn notify_server(&mut self) { + self.send_to_server(ServerInstruction::NewClient( + self.client_buffer_path.clone(), + )); + } + fn client_recv(&self) -> (ClientInstruction, ErrorContext) { + self.client_receiver.lock().unwrap().recv().unwrap() } } @@ -313,5 +384,15 @@ impl Clone for Box { pub fn get_client_os_input() -> ClientOsInputOutput { let current_termios = termios::tcgetattr(0).unwrap(); let orig_termios = Arc::new(Mutex::new(current_termios)); - ClientOsInputOutput { orig_termios } + let server_buffer = SharedRingBuffer::open(ZELLIJ_IPC_PIPE).unwrap(); + let server_sender = IpcSenderWithContext::new(server_buffer); + let (client_buffer_path, client_buffer) = + SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); + let client_receiver = Arc::new(Mutex::new(IpcReceiver::new(client_buffer.clone()))); + ClientOsInputOutput { + orig_termios, + server_sender, + client_buffer_path, + client_receiver, + } } diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index a0eda375..84a06e80 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -10,7 +10,7 @@ use ::vte; use serde::{Deserialize, Serialize}; use std::path::PathBuf; -use super::{IpcSenderWithContext, ScreenInstruction, OPENCALLS}; +use super::{ScreenInstruction, OPENCALLS}; use crate::layout::Layout; use crate::os_input_output::ServerOsApi; use crate::utils::logging::debug_to_file; @@ -81,94 +81,83 @@ pub enum VteEvent { struct VteEventSender { id: RawFd, - send_server_instructions: IpcSenderWithContext, + os_input: Box, } impl VteEventSender { - pub fn new(id: RawFd, send_server_instructions: IpcSenderWithContext) -> Self { - VteEventSender { - id, - send_server_instructions, - } + pub fn new(id: RawFd, os_input: Box) -> Self { + VteEventSender { id, os_input } } } impl vte::Perform for VteEventSender { fn print(&mut self, c: char) { - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Print(c), - ))) - .unwrap(); + ))); } fn execute(&mut self, byte: u8) { - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Execute(byte), - ))) - .unwrap(); + ))); } fn hook(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Hook(params, intermediates, ignore, c), - ))) - .unwrap(); + ))); } fn put(&mut self, byte: u8) { - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Put(byte), - ))) - .unwrap(); + ))); } fn unhook(&mut self) { - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Unhook, - ))) - .unwrap(); + ))); } fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { let params = params.iter().map(|p| p.to_vec()).collect(); - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::OscDispatch(params, bell_terminated), - ))) - .unwrap(); + ))); } fn csi_dispatch(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::CsiDispatch(params, intermediates, ignore, c), - ))) - .unwrap(); + ))); } fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) { let intermediates = intermediates.iter().copied().collect(); - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::EscDispatch(intermediates, ignore, byte), - ))) - .unwrap(); + ))); } } @@ -187,26 +176,24 @@ pub enum PtyInstruction { pub struct PtyBus { pub receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, pub id_to_child_pid: HashMap, - os_input: Box, + pub os_input: Box, debug_to_file: bool, task_handles: HashMap>, - pub send_server_instructions: IpcSenderWithContext, } fn stream_terminal_bytes( pid: RawFd, - os_input: Box, - mut send_server_instructions: IpcSenderWithContext, + mut os_input: Box, debug: bool, ) -> JoinHandle<()> { let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); task::spawn({ async move { err_ctx.add_call(ContextType::AsyncTask); - send_server_instructions.update(err_ctx); + os_input.update_senders(err_ctx); let mut vte_parser = vte::Parser::new(); - let mut vte_event_sender = VteEventSender::new(pid, send_server_instructions.clone()); - let mut terminal_bytes = ReadFromPid::new(&pid, os_input); + let mut vte_event_sender = VteEventSender::new(pid, os_input.clone()); + let mut terminal_bytes = ReadFromPid::new(&pid, os_input.clone()); let mut last_byte_receive_time: Option = None; let mut pending_render = false; @@ -231,9 +218,9 @@ fn stream_terminal_bytes( Some(receive_time) => { if receive_time.elapsed() > max_render_pause { pending_render = false; - send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) - .unwrap(); + os_input.send_to_server(ServerInstruction::ToScreen( + ScreenInstruction::Render, + )); last_byte_receive_time = Some(Instant::now()); } else { pending_render = true; @@ -247,26 +234,21 @@ fn stream_terminal_bytes( } else { if pending_render { pending_render = false; - send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) - .unwrap(); + os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Render)); } last_byte_receive_time = None; task::sleep(::std::time::Duration::from_millis(10)).await; } } - send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) - .unwrap(); + os_input.send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Render)); #[cfg(not(test))] // 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 // a better solution would be to fix the test fakes, but this will do for now - send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::ClosePane( - PaneId::Terminal(pid), - ))) - .unwrap(); + os_input.send_to_server(ServerInstruction::ToScreen(ScreenInstruction::ClosePane( + PaneId::Terminal(pid), + ))); } }) } @@ -275,7 +257,6 @@ impl PtyBus { pub fn new( receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, os_input: Box, - send_server_instructions: IpcSenderWithContext, debug_to_file: bool, ) -> Self { PtyBus { @@ -284,18 +265,13 @@ impl PtyBus { id_to_child_pid: HashMap::new(), debug_to_file, task_handles: HashMap::new(), - send_server_instructions, } } pub fn spawn_terminal(&mut self, file_to_open: Option) -> RawFd { let (pid_primary, pid_secondary): (RawFd, RawFd) = self.os_input.spawn_terminal(file_to_open); - let task_handle = stream_terminal_bytes( - pid_primary, - self.os_input.clone(), - self.send_server_instructions.clone(), - self.debug_to_file, - ); + let task_handle = + stream_terminal_bytes(pid_primary, self.os_input.clone(), self.debug_to_file); self.task_handles.insert(pid_primary, task_handle); self.id_to_child_pid.insert(pid_primary, pid_secondary); pid_primary @@ -309,18 +285,12 @@ impl PtyBus { self.id_to_child_pid.insert(pid_primary, pid_secondary); new_pane_pids.push(pid_primary); } - self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::ApplyLayout( + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::ApplyLayout( (layout_path, new_pane_pids.clone()), - ))) - .unwrap(); + ))); for id in new_pane_pids { - let task_handle = stream_terminal_bytes( - id, - self.os_input.clone(), - self.send_server_instructions.clone(), - self.debug_to_file, - ); + let task_handle = stream_terminal_bytes(id, self.os_input.clone(), self.debug_to_file); self.task_handles.insert(id, task_handle); } } @@ -335,9 +305,8 @@ impl PtyBus { }); } PaneId::Plugin(pid) => self - .send_server_instructions - .send(ServerInstruction::ClosePluginPane(pid)) - .unwrap(), + .os_input + .send_to_server(ServerInstruction::ClosePluginPane(pid)), } } pub fn close_tab(&mut self, ids: Vec) { diff --git a/src/main.rs b/src/main.rs index e6b94064..4a89470c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ mod server; use client::{boundaries, layout, panes, tab}; use common::{ command_is_executing, errors, os_input_output, pty_bus, screen, start, utils, wasm_vm, - IpcSenderWithContext, ServerInstruction, + ServerInstruction, }; use directories_next::ProjectDirs; @@ -14,7 +14,7 @@ use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::os_input_output::{get_client_os_input, get_server_os_input}; +use crate::os_input_output::{get_client_os_input, get_server_os_input, ClientOsApi}; use crate::pty_bus::VteEvent; use crate::utils::{ consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, @@ -63,29 +63,17 @@ pub fn main() { if let Some(split_dir) = opts.split { match split_dir { 'h' => { - let mut send_server_instructions = IpcSenderWithContext::to_server(); - send_server_instructions - .send(ServerInstruction::SplitHorizontally) - .unwrap(); + get_client_os_input().send_to_server(ServerInstruction::SplitHorizontally); } 'v' => { - let mut send_server_instructions = IpcSenderWithContext::to_server(); - send_server_instructions - .send(ServerInstruction::SplitVertically) - .unwrap(); + get_client_os_input().send_to_server(ServerInstruction::SplitVertically); } _ => {} }; } else if opts.move_focus { - let mut send_server_instructions = IpcSenderWithContext::to_server(); - send_server_instructions - .send(ServerInstruction::MoveFocus) - .unwrap(); + get_client_os_input().send_to_server(ServerInstruction::MoveFocus); } else if let Some(file_to_open) = opts.open_file { - let mut send_server_instructions = IpcSenderWithContext::to_server(); - send_server_instructions - .send(ServerInstruction::OpenFile(file_to_open)) - .unwrap(); + get_client_os_input().send_to_server(ServerInstruction::OpenFile(file_to_open)); } else { let server_os_input = get_server_os_input(); let os_input = get_client_os_input(); diff --git a/src/server/mod.rs b/src/server/mod.rs index b902ea27..45c0db39 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,19 +1,17 @@ use crate::cli::CliArgs; use crate::common::{ - ChannelWithContext, ClientInstruction, IpcSenderWithContext, SenderType, SenderWithContext, - ServerInstruction, + ChannelWithContext, ClientInstruction, SenderType, SenderWithContext, ServerInstruction, }; use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext, ServerContext}; use crate::os_input_output::{ServerOsApi, ServerOsApiInstruction}; use crate::panes::PaneId; use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; -use ipmpsc::SharedRingBuffer; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; -pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { +pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); let mut send_pty_instructions = SenderWithContext::new( @@ -36,14 +34,7 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo let default_layout = None; let maybe_layout = opts.layout.or(default_layout); - let send_server_instructions = os_input.get_server_sender(); - - let mut pty_bus = PtyBus::new( - receive_pty_instructions, - os_input.clone(), - send_server_instructions, - opts.debug, - ); + let mut pty_bus = PtyBus::new(receive_pty_instructions, os_input.clone(), opts.debug); let pty_thread = thread::Builder::new() .name("pty".to_string()) @@ -56,55 +47,43 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo match event { PtyInstruction::SpawnTerminal(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::NewPane( - PaneId::Terminal(pid), - ))) - .unwrap(); + pty_bus.os_input.send_to_server(ServerInstruction::ToScreen( + ScreenInstruction::NewPane(PaneId::Terminal(pid)), + )); } PtyInstruction::SpawnTerminalVertically(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen( - ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), - )) - .unwrap(); + pty_bus.os_input.send_to_server(ServerInstruction::ToScreen( + ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), + )); } PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen( - ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), - )) - .unwrap(); + pty_bus.os_input.send_to_server(ServerInstruction::ToScreen( + ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), + )); } PtyInstruction::NewTab => { if let Some(layout) = maybe_layout.clone() { pty_bus.spawn_terminals_for_layout(layout); } else { let pid = pty_bus.spawn_terminal(None); - pty_bus - .send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid))) - .unwrap(); + pty_bus.os_input.send_to_server(ServerInstruction::ToScreen( + ScreenInstruction::NewTab(pid), + )); } } PtyInstruction::ClosePane(id) => { pty_bus.close_pane(id); pty_bus - .send_server_instructions - .send(ServerInstruction::DoneClosingPane) - .unwrap(); + .os_input + .send_to_server(ServerInstruction::DoneClosingPane); } PtyInstruction::CloseTab(ids) => { pty_bus.close_tab(ids); pty_bus - .send_server_instructions - .send(ServerInstruction::DoneClosingPane) - .unwrap(); + .os_input + .send_to_server(ServerInstruction::DoneClosingPane); } PtyInstruction::Exit => { break; @@ -142,19 +121,12 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo thread::Builder::new() .name("ipc_server".to_string()) .spawn({ - let recv_server_instructions = os_input.get_server_receiver(); - // Fixme: We cannot use uninitialised sender, therefore this Vec. - // For now, We make sure that the first message is `NewClient` so there are no out of bound panics. - let mut send_client_instructions: Vec = Vec::with_capacity(1); move || loop { - let (instruction, mut err_ctx): (ServerInstruction, ErrorContext) = - recv_server_instructions.recv().unwrap(); + let (instruction, mut err_ctx) = os_input.server_recv(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); send_pty_instructions.update(err_ctx); send_os_instructions.update(err_ctx); - if send_client_instructions.len() == 1 { - send_client_instructions[0].update(err_ctx); - } + os_input.update_senders(err_ctx); match instruction { ServerInstruction::OpenFile(file_name) => { @@ -174,43 +146,35 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo .unwrap(); } ServerInstruction::MoveFocus => { - send_client_instructions[0] - .send(ClientInstruction::ToScreen(ScreenInstruction::MoveFocus)) - .unwrap(); + os_input.send_to_client(ClientInstruction::ToScreen( + ScreenInstruction::MoveFocus, + )); } ServerInstruction::NewClient(buffer_path) => { send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); - send_client_instructions.push(IpcSenderWithContext::new( - SharedRingBuffer::open(&buffer_path).unwrap(), - )); + os_input.add_client_sender(buffer_path); } ServerInstruction::ToPty(instr) => { send_pty_instructions.send(instr).unwrap(); } ServerInstruction::ToScreen(instr) => { - send_client_instructions[0] - .send(ClientInstruction::ToScreen(instr)) - .unwrap(); + os_input.send_to_client(ClientInstruction::ToScreen(instr)); } ServerInstruction::OsApi(instr) => { send_os_instructions.send(instr).unwrap(); } ServerInstruction::DoneClosingPane => { - send_client_instructions[0] - .send(ClientInstruction::DoneClosingPane) - .unwrap(); + os_input.send_to_client(ClientInstruction::DoneClosingPane); } ServerInstruction::ClosePluginPane(pid) => { - send_client_instructions[0] - .send(ClientInstruction::ClosePluginPane(pid)) - .unwrap(); + os_input.send_to_client(ClientInstruction::ClosePluginPane(pid)); } ServerInstruction::Exit => { let _ = send_pty_instructions.send(PtyInstruction::Exit); let _ = send_os_instructions.send(ServerOsApiInstruction::Exit); let _ = pty_thread.join(); let _ = os_thread.join(); - let _ = send_client_instructions[0].send(ClientInstruction::Exit); + let _ = os_input.send_to_client(ClientInstruction::Exit); break; } } diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 80cf67b5..42993614 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -1,21 +1,22 @@ use crate::panes::PositionAndSize; -use ipmpsc::{Receiver as IpcReceiver, Result as IpcResult, SharedRingBuffer}; use std::collections::{HashMap, VecDeque}; use std::io::Write; use std::os::unix::io::RawFd; use std::path::PathBuf; -use std::sync::{Arc, Condvar, Mutex}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{mpsc, Arc, Mutex}; use std::time::{Duration, Instant}; -use crate::common::{IpcSenderWithContext, IPC_BUFFER_SIZE}; +use crate::common::{ + ChannelWithContext, ClientInstruction, SenderType, SenderWithContext, ServerInstruction, +}; +use crate::errors::ErrorContext; use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::utils::shared::default_palette; use zellij_tile::data::Palette; -use crate::tests::utils::commands::{QUIT, SLEEP}; - -const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(500); +const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(100); #[derive(Clone)] pub enum IoEvent { @@ -76,7 +77,10 @@ pub struct FakeInputOutput { possible_tty_inputs: HashMap, last_snapshot_time: Arc>, started_reading_from_pty: Arc, - server_buffer: SharedRingBuffer, + client_sender: SenderWithContext, + client_receiver: Arc>>, + server_sender: SenderWithContext, + server_receiver: Arc>>, } impl FakeInputOutput { @@ -84,7 +88,14 @@ impl FakeInputOutput { let mut win_sizes = HashMap::new(); let last_snapshot_time = Arc::new(Mutex::new(Instant::now())); let stdout_writer = FakeStdoutWriter::new(last_snapshot_time.clone()); - let (_, server_buffer) = SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); + let (client_sender, client_receiver): ChannelWithContext = + mpsc::channel(); + let client_sender = + SenderWithContext::new(ErrorContext::new(), SenderType::Sender(client_sender)); + let (server_sender, server_receiver): ChannelWithContext = + mpsc::channel(); + let server_sender = + SenderWithContext::new(ErrorContext::new(), SenderType::Sender(server_sender)); win_sizes.insert(0, winsize); // 0 is the current terminal FakeInputOutput { @@ -98,7 +109,10 @@ impl FakeInputOutput { win_sizes: Arc::new(Mutex::new(win_sizes)), possible_tty_inputs: get_possible_tty_inputs(), started_reading_from_pty: Arc::new(AtomicBool::new(false)), - server_buffer, + server_receiver: Arc::new(Mutex::new(server_receiver)), + server_sender, + client_receiver: Arc::new(Mutex::new(client_receiver)), + client_sender, } } pub fn with_tty_inputs(mut self, tty_inputs: HashMap) -> Self { @@ -166,8 +180,18 @@ impl ClientOsApi for FakeInputOutput { fn get_stdout_writer(&self) -> Box { Box::new(self.stdout_writer.clone()) } - fn get_server_sender(&self) -> IpcResult { - Ok(IpcSenderWithContext::new(self.server_buffer.clone())) + fn send_to_server(&mut self, msg: ServerInstruction) { + self.server_sender.send(msg).unwrap(); + } + fn update_senders(&mut self, new_ctx: ErrorContext) { + self.server_sender.update(new_ctx); + self.client_sender.update(new_ctx); + } + fn notify_server(&mut self) { + ClientOsApi::send_to_server(self, ServerInstruction::NewClient("zellij".into())); + } + fn client_recv(&self) -> (ClientInstruction, ErrorContext) { + self.client_receiver.lock().unwrap().recv().unwrap() } } @@ -229,11 +253,19 @@ impl ServerOsApi for FakeInputOutput { self.io_events.lock().unwrap().push(IoEvent::Kill(fd)); Ok(()) } - fn get_server_receiver(&self) -> IpcReceiver { - IpcReceiver::new(self.server_buffer.clone()) + fn send_to_server(&mut self, msg: ServerInstruction) { + self.server_sender.send(msg).unwrap(); } - fn get_server_sender(&self) -> IpcSenderWithContext { - IpcSenderWithContext::new(self.server_buffer.clone()) + fn server_recv(&self) -> (ServerInstruction, ErrorContext) { + self.server_receiver.lock().unwrap().recv().unwrap() + } + fn send_to_client(&mut self, msg: ClientInstruction) { + self.client_sender.send(msg).unwrap(); + } + fn add_client_sender(&mut self, _buffer_path: String) {} + fn update_senders(&mut self, new_ctx: ErrorContext) { + self.server_sender.update(new_ctx); + self.client_sender.update(new_ctx); } fn load_palette(&self) -> Palette { default_palette() From bbcea3198892cb005d551a4c3b90c1f02712ace7 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 23 Mar 2021 18:25:31 +0530 Subject: [PATCH 33/64] Synchronize update tabs actions using command_is_executing --- src/common/command_is_executing.rs | 20 ++++++++++++++++++++ src/common/input/handler.rs | 27 +++++++++++++++++++++++---- src/common/mod.rs | 17 +++++++++++++---- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/common/command_is_executing.rs b/src/common/command_is_executing.rs index 775a7bfc..fdce0429 100644 --- a/src/common/command_is_executing.rs +++ b/src/common/command_is_executing.rs @@ -5,6 +5,7 @@ use std::sync::{Arc, Condvar, Mutex}; pub struct CommandIsExecuting { opening_new_pane: Arc<(Mutex, Condvar)>, closing_pane: Arc<(Mutex, Condvar)>, + updating_tabs: Arc<(Mutex, Condvar)>, } impl CommandIsExecuting { @@ -12,6 +13,7 @@ impl CommandIsExecuting { CommandIsExecuting { opening_new_pane: Arc::new((Mutex::new(false), Condvar::new())), closing_pane: Arc::new((Mutex::new(false), Condvar::new())), + updating_tabs: Arc::new((Mutex::new(false), Condvar::new())), } } pub fn closing_pane(&mut self) { @@ -36,6 +38,17 @@ impl CommandIsExecuting { *opening_new_pane = false; cvar.notify_all(); } + pub fn updating_tabs(&mut self) { + let (lock, _cvar) = &*self.updating_tabs; + let mut updating_tabs = lock.lock().unwrap(); + *updating_tabs = true; + } + pub fn done_updating_tabs(&self) { + let (lock, cvar) = &*self.updating_tabs; + let mut updating_tabs = lock.lock().unwrap(); + *updating_tabs = false; + cvar.notify_one(); + } pub fn wait_until_pane_is_closed(&self) { let (lock, cvar) = &*self.closing_pane; let mut closing_pane = lock.lock().unwrap(); @@ -50,4 +63,11 @@ impl CommandIsExecuting { opening_new_pane = cvar.wait(opening_new_pane).unwrap(); } } + pub fn wait_until_tabs_are_updated(&self) { + let (lock, cvar) = &*self.updating_tabs; + let mut updating_tabs = lock.lock().unwrap(); + while *updating_tabs { + updating_tabs = cvar.wait(updating_tabs).unwrap(); + } + } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index b74e2929..0eda77bf 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -238,21 +238,25 @@ impl InputHandler { self.command_is_executing.wait_until_pane_is_closed(); } Action::NewTab => { - self.command_is_executing.opening_new_pane(); + self.command_is_executing.updating_tabs(); self.send_app_instructions .send(AppInstruction::ToPty(PtyInstruction::NewTab)) .unwrap(); - self.command_is_executing.wait_until_new_pane_is_opened(); + self.command_is_executing.wait_until_tabs_are_updated(); } Action::GoToNextTab => { + self.command_is_executing.updating_tabs(); self.send_screen_instructions .send(ScreenInstruction::SwitchTabNext) .unwrap(); + self.command_is_executing.wait_until_tabs_are_updated(); } Action::GoToPreviousTab => { + self.command_is_executing.updating_tabs(); self.send_screen_instructions .send(ScreenInstruction::SwitchTabPrev) .unwrap(); + self.command_is_executing.wait_until_tabs_are_updated(); } Action::ToggleActiveSyncPanes => { self.send_screen_instructions @@ -260,22 +264,37 @@ impl InputHandler { .unwrap(); } Action::CloseTab => { - self.command_is_executing.closing_pane(); + self.command_is_executing.updating_tabs(); self.send_screen_instructions .send(ScreenInstruction::CloseTab) .unwrap(); - self.command_is_executing.wait_until_pane_is_closed(); + self.command_is_executing.wait_until_tabs_are_updated(); } Action::GoToTab(i) => { + self.command_is_executing.updating_tabs(); self.send_screen_instructions .send(ScreenInstruction::GoToTab(i)) .unwrap(); + self.command_is_executing.wait_until_tabs_are_updated(); } Action::TabNameInput(c) => { self.send_screen_instructions .send(ScreenInstruction::UpdateTabName(c)) .unwrap(); } + Action::SaveTabName => { + self.command_is_executing.updating_tabs(); + self.send_plugin_instructions + .send(PluginInstruction::Input( + PluginInputType::Event(EventType::Tab), + vec![b'\n'], + )) + .unwrap(); + self.send_screen_instructions + .send(ScreenInstruction::UpdateTabName(vec![b'\n'])) + .unwrap(); + self.command_is_executing.wait_until_tabs_are_updated(); + } Action::NoOp => {} } diff --git a/src/common/mod.rs b/src/common/mod.rs index 9cafb5d6..8bff832e 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -386,22 +386,31 @@ pub fn start( } ScreenInstruction::NewTab(pane_id) => { screen.new_tab(pane_id); - command_is_executing.done_opening_new_pane(); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::SwitchTabNext => { + screen.switch_tab_next(); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::SwitchTabPrev => { + screen.switch_tab_prev(); + command_is_executing.done_updating_tabs(); } - ScreenInstruction::SwitchTabNext => screen.switch_tab_next(), - ScreenInstruction::SwitchTabPrev => screen.switch_tab_prev(), ScreenInstruction::CloseTab => { screen.close_tab(); + command_is_executing.done_updating_tabs(); } ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => { screen.apply_layout(Layout::new(layout), new_pane_pids); command_is_executing.done_opening_new_pane(); } ScreenInstruction::GoToTab(tab_index) => { - screen.go_to_tab(tab_index as usize) + screen.go_to_tab(tab_index as usize); + command_is_executing.done_updating_tabs(); } ScreenInstruction::UpdateTabName(c) => { screen.update_active_tab_name(c); + command_is_executing.done_updating_tabs(); } ScreenInstruction::Exit => { break; From af445394c0535c9c74942f48074816e71f17e0ac Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 24 Mar 2021 01:28:19 +0530 Subject: [PATCH 34/64] minor fix while opening new tab --- src/common/mod.rs | 2 +- src/tests/fakes.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 8bff832e..372b1ea7 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -402,7 +402,7 @@ pub fn start( } ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => { screen.apply_layout(Layout::new(layout), new_pane_pids); - command_is_executing.done_opening_new_pane(); + command_is_executing.done_updating_tabs(); } ScreenInstruction::GoToTab(tab_index) => { screen.go_to_tab(tab_index as usize); diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 42993614..6b759fb1 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -16,7 +16,7 @@ use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::utils::shared::default_palette; use zellij_tile::data::Palette; -const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(100); +const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(150); #[derive(Clone)] pub enum IoEvent { From fe8fb79da072d7a0aa1e31a70b65d8475db68416 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 24 Mar 2021 01:47:53 +0530 Subject: [PATCH 35/64] a probable fix for tests --- src/tests/fakes.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 6b759fb1..342353f6 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -171,6 +171,9 @@ impl ClientOsApi for FakeInputOutput { ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS - last_snapshot_time.elapsed()); } } + if self.stdin_commands.lock().unwrap().len() == 1 { + std::thread::sleep_ms(100); + } self.stdin_commands .lock() .unwrap() From 90982c3e47f8af98fda3bd5617a3d1bc9acd871d Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 24 Mar 2021 13:50:29 +0530 Subject: [PATCH 36/64] Some documentation an ClientOsApi stuff --- src/common/mod.rs | 4 +-- src/common/os_input_output.rs | 47 ++++++++++++++++++++++++----------- src/common/screen.rs | 2 +- src/tests/fakes.rs | 2 +- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index 372b1ea7..cca8b0db 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -38,8 +38,6 @@ use wasm_vm::{ wasi_stdout, wasi_write_string, zellij_imports, EventType, PluginInputType, PluginInstruction, }; -pub const IPC_BUFFER_SIZE: u32 = 8192; - #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ServerInstruction { OpenFile(PathBuf), @@ -168,7 +166,7 @@ impl From for AppInstruction { } } -/// Start Zellij with the specified [`OsApi`] and command-line arguments. +/// Start Zellij with the specified [`ClientOsApi`], [`ServerOsApi`] and command-line arguments. // FIXME this should definitely be modularized and split into different functions. pub fn start( mut os_input: Box, diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 6585251c..ad772833 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -16,11 +16,13 @@ use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; -use crate::common::{ClientInstruction, ServerInstruction, IPC_BUFFER_SIZE}; +use crate::common::{ClientInstruction, ServerInstruction}; use crate::errors::ErrorContext; use crate::panes::PositionAndSize; use crate::utils::consts::ZELLIJ_IPC_PIPE; +const IPC_BUFFER_SIZE: u32 = 8192; + fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); termios::cfmakeraw(&mut tio); @@ -157,6 +159,7 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) (pid_primary, pid_secondary) } +/// Sends messages on an [ipmpsc](ipmpsc) channel, along with an [`ErrorContext`]. #[derive(Clone)] struct IpcSenderWithContext { err_ctx: ErrorContext, @@ -165,6 +168,7 @@ struct IpcSenderWithContext { } impl IpcSenderWithContext { + /// Returns a sender to the given [SharedRingBuffer](ipmpsc::SharedRingBuffer). fn new(buffer: SharedRingBuffer) -> Self { Self { err_ctx: ErrorContext::new(), @@ -173,10 +177,17 @@ impl IpcSenderWithContext { } } + /// Updates this [`IpcSenderWithContext`]'s [`ErrorContext`]. This is the way one adds + /// a call to the error context. + /// + /// Updating [`ErrorContext`]s works in this way so that these contexts are only ever + /// allocated on the stack (which is thread-specific), and not on the heap. fn update(&mut self, ctx: ErrorContext) { self.err_ctx = ctx; } + /// Sends an event, along with the current [`ErrorContext`], on this + /// [`IpcSenderWithContext`]'s channel. fn send(&mut self, msg: T) -> ipmpsc::Result<()> { self.sender.send(&(msg, self.err_ctx)) } @@ -208,7 +219,7 @@ pub trait ServerOsApi: Send + Sync { // or a nix::unistd::Pid. See `man kill.3`, nix::sys::signal::kill (both take an argument // called `pid` and of type `pid_t`, and not `fd`) fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error>; - /// Returns a [`Box`] pointer to this [`OsApi`] struct. + /// Returns a [`Box`] pointer to this [`ServerOsApi`] struct. fn box_clone(&self) -> Box; /// Sends a message to the server. fn send_to_server(&mut self, msg: ServerInstruction); @@ -301,8 +312,8 @@ pub enum ServerOsApiInstruction { pub struct ClientOsInputOutput { orig_termios: Arc>, server_sender: IpcSenderWithContext, - client_buffer_path: String, - client_receiver: Arc>, + // This is used by router thread only hence lock resolves immediately. + client_receiver: Option>>, } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -320,15 +331,16 @@ pub trait ClientOsApi: Send + Sync { fn get_stdout_writer(&self) -> Box; /// Returns the raw contents of standard input. fn read_from_stdin(&self) -> Vec; - /// Returns a [`Box`] pointer to this [`OsApi`] struct. + /// Returns a [`Box`] pointer to this [`ClientOsApi`] struct. fn box_clone(&self) -> Box; /// Sends a message to the server. fn send_to_server(&mut self, msg: ServerInstruction); /// Update ErrorContext of senders fn update_senders(&mut self, new_ctx: ErrorContext); /// Receives a message on client-side IPC channel + // This should be called from the client-side router thread only. fn client_recv(&self) -> (ClientInstruction, ErrorContext); - /// Notify server of new client + /// Setup the client IpcChannel and notify server of new client fn notify_server(&mut self); } @@ -366,12 +378,21 @@ impl ClientOsApi for ClientOsInputOutput { self.server_sender.update(new_ctx); } fn notify_server(&mut self) { - self.send_to_server(ServerInstruction::NewClient( - self.client_buffer_path.clone(), - )); + let (client_buffer_path, client_buffer) = + SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); + self.client_receiver = Some(Arc::new(Mutex::new(IpcReceiver::new( + client_buffer.clone(), + )))); + self.send_to_server(ServerInstruction::NewClient(client_buffer_path)); } fn client_recv(&self) -> (ClientInstruction, ErrorContext) { - self.client_receiver.lock().unwrap().recv().unwrap() + self.client_receiver + .as_ref() + .unwrap() + .lock() + .unwrap() + .recv() + .unwrap() } } @@ -386,13 +407,9 @@ pub fn get_client_os_input() -> ClientOsInputOutput { let orig_termios = Arc::new(Mutex::new(current_termios)); let server_buffer = SharedRingBuffer::open(ZELLIJ_IPC_PIPE).unwrap(); let server_sender = IpcSenderWithContext::new(server_buffer); - let (client_buffer_path, client_buffer) = - SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); - let client_receiver = Arc::new(Mutex::new(IpcReceiver::new(client_buffer.clone()))); ClientOsInputOutput { orig_termios, server_sender, - client_buffer_path, - client_receiver, + client_receiver: None, } } diff --git a/src/common/screen.rs b/src/common/screen.rs index 1bc372f6..7dbc2fe4 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -78,7 +78,7 @@ pub struct Screen { full_screen_ws: PositionAndSize, /// The index of this [`Screen`]'s active [`Tab`]. active_tab_index: Option, - /// The [`OsApi`] this [`Screen`] uses. + /// The [`ClientOsApi`] this [`Screen`] uses. os_api: Box, tabname_buf: String, } diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 342353f6..43d100bf 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -172,7 +172,7 @@ impl ClientOsApi for FakeInputOutput { } } if self.stdin_commands.lock().unwrap().len() == 1 { - std::thread::sleep_ms(100); + std::thread::sleep(Duration::from_millis(100)); } self.stdin_commands .lock() From e30ec5745ef1f5526a05be1f49fed7b406558805 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 24 Mar 2021 15:34:53 +0530 Subject: [PATCH 37/64] Add router thread on server side as well --- src/common/errors.rs | 2 + src/common/mod.rs | 30 ++------ src/common/os_input_output.rs | 11 +-- src/common/pty_bus.rs | 131 +++++++++++++++++++++------------- src/main.rs | 2 +- src/server/mod.rs | 107 +++++++++++++++++++++------ src/tests/fakes.rs | 9 ++- 7 files changed, 183 insertions(+), 109 deletions(-) diff --git a/src/common/errors.rs b/src/common/errors.rs index 83527448..37729fbb 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -387,6 +387,7 @@ pub enum ServerContext { OsApi, DoneClosingPane, ClosePluginPane, + ClientExit, Exit, } @@ -403,6 +404,7 @@ impl From<&ServerInstruction> for ServerContext { ServerInstruction::OsApi(_) => ServerContext::OsApi, ServerInstruction::DoneClosingPane => ServerContext::DoneClosingPane, ServerInstruction::ClosePluginPane(_) => ServerContext::ClosePluginPane, + ServerInstruction::ClientExit => ServerContext::ClientExit, ServerInstruction::Exit => ServerContext::Exit, } } diff --git a/src/common/mod.rs b/src/common/mod.rs index cca8b0db..ef9fc47f 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -26,7 +26,7 @@ use wasmer_wasi::{Pipe, WasiState}; use crate::cli::CliArgs; use crate::layout::Layout; -use crate::server::start_server; +use crate::server::{start_server, ServerInstruction}; use command_is_executing::CommandIsExecuting; use errors::{AppContext, ContextType, ErrorContext, PluginContext, ScreenContext}; use input::handler::input_loop; @@ -38,21 +38,7 @@ use wasm_vm::{ wasi_stdout, wasi_write_string, zellij_imports, EventType, PluginInputType, PluginInstruction, }; -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum ServerInstruction { - OpenFile(PathBuf), - SplitHorizontally, - SplitVertically, - MoveFocus, - NewClient(String), - ToPty(PtyInstruction), - ToScreen(ScreenInstruction), - OsApi(ServerOsApiInstruction), - DoneClosingPane, - ClosePluginPane(u32), - Exit, -} - +/// Instructions sent from server to client #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ClientInstruction { ToScreen(ScreenInstruction), @@ -134,13 +120,7 @@ thread_local!( static OPENCALLS: RefCell = RefCell::default() ); -task_local! { - /// A key to some task local storage that holds a representation of the task's call - /// stack in the form of an [`ErrorContext`]. - static ASYNCOPENCALLS: RefCell = RefCell::default() -} - -/// Instructions related to the entire application. +/// Instructions related to the client-side application. #[derive(Clone)] pub enum AppInstruction { Exit, @@ -571,7 +551,7 @@ pub fn start( AppInstruction::SetState(state) => app_state = state, AppInstruction::Exit => break, AppInstruction::Error(backtrace) => { - let _ = os_input.send_to_server(ServerInstruction::Exit); + let _ = os_input.send_to_server(ServerInstruction::ClientExit); let _ = send_screen_instructions.send(ScreenInstruction::Exit); let _ = send_plugin_instructions.send(PluginInstruction::Exit); let _ = screen_thread.join(); @@ -603,7 +583,7 @@ pub fn start( } } - let _ = os_input.send_to_server(ServerInstruction::Exit); + let _ = os_input.send_to_server(ServerInstruction::ClientExit); let _ = send_screen_instructions.send(ScreenInstruction::Exit); let _ = send_plugin_instructions.send(PluginInstruction::Exit); screen_thread.join().unwrap(); diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index ad772833..62006162 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -16,9 +16,10 @@ use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; -use crate::common::{ClientInstruction, ServerInstruction}; +use crate::common::ClientInstruction; use crate::errors::ErrorContext; use crate::panes::PositionAndSize; +use crate::server::ServerInstruction; use crate::utils::consts::ZELLIJ_IPC_PIPE; const IPC_BUFFER_SIZE: u32 = 8192; @@ -221,8 +222,8 @@ pub trait ServerOsApi: Send + Sync { fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error>; /// Returns a [`Box`] pointer to this [`ServerOsApi`] struct. fn box_clone(&self) -> Box; - /// Sends a message to the server. - fn send_to_server(&mut self, msg: ServerInstruction); + /// Sends an `Exit` message to the server router thread. + fn server_exit(&mut self); /// Receives a message on server-side IPC channel fn server_recv(&self) -> (ServerInstruction, ErrorContext); /// Sends a message to client @@ -258,8 +259,8 @@ impl ServerOsApi for ServerOsInputOutput { waitpid(Pid::from_raw(pid), None).unwrap(); Ok(()) } - fn send_to_server(&mut self, msg: ServerInstruction) { - self.server_sender.send(msg).unwrap(); + fn server_exit(&mut self) { + self.server_sender.send(ServerInstruction::Exit).unwrap(); } fn server_recv(&self) -> (ServerInstruction, ErrorContext) { self.server_receiver.lock().unwrap().recv().unwrap() diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 84a06e80..1d887ba2 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -10,14 +10,14 @@ use ::vte; use serde::{Deserialize, Serialize}; use std::path::PathBuf; -use super::{ScreenInstruction, OPENCALLS}; +use super::{ScreenInstruction, SenderWithContext, OPENCALLS}; use crate::layout::Layout; use crate::os_input_output::ServerOsApi; use crate::utils::logging::debug_to_file; use crate::{ - common::ServerInstruction, errors::{ContextType, ErrorContext}, panes::PaneId, + server::ServerInstruction, }; pub struct ReadFromPid { @@ -81,83 +81,94 @@ pub enum VteEvent { struct VteEventSender { id: RawFd, - os_input: Box, + send_server_instructions: SenderWithContext, } impl VteEventSender { - pub fn new(id: RawFd, os_input: Box) -> Self { - VteEventSender { id, os_input } + pub fn new(id: RawFd, send_server_instructions: SenderWithContext) -> Self { + VteEventSender { + id, + send_server_instructions, + } } } impl vte::Perform for VteEventSender { fn print(&mut self, c: char) { - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Print(c), - ))); + ))) + .unwrap(); } fn execute(&mut self, byte: u8) { - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Execute(byte), - ))); + ))) + .unwrap(); } fn hook(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Hook(params, intermediates, ignore, c), - ))); + ))) + .unwrap(); } fn put(&mut self, byte: u8) { - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Put(byte), - ))); + ))) + .unwrap(); } fn unhook(&mut self) { - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::Unhook, - ))); + ))) + .unwrap(); } fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { let params = params.iter().map(|p| p.to_vec()).collect(); - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::OscDispatch(params, bell_terminated), - ))); + ))) + .unwrap(); } fn csi_dispatch(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::CsiDispatch(params, intermediates, ignore, c), - ))); + ))) + .unwrap(); } fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) { let intermediates = intermediates.iter().copied().collect(); - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Pty( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( self.id, VteEvent::EscDispatch(intermediates, ignore, byte), - ))); + ))) + .unwrap(); } } @@ -176,23 +187,25 @@ pub enum PtyInstruction { pub struct PtyBus { pub receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, pub id_to_child_pid: HashMap, - pub os_input: Box, + pub send_server_instructions: SenderWithContext, + os_input: Box, debug_to_file: bool, task_handles: HashMap>, } fn stream_terminal_bytes( pid: RawFd, - mut os_input: Box, + os_input: Box, + mut send_server_instructions: SenderWithContext, debug: bool, ) -> JoinHandle<()> { let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); task::spawn({ async move { err_ctx.add_call(ContextType::AsyncTask); - os_input.update_senders(err_ctx); + send_server_instructions.update(err_ctx); let mut vte_parser = vte::Parser::new(); - let mut vte_event_sender = VteEventSender::new(pid, os_input.clone()); + let mut vte_event_sender = VteEventSender::new(pid, send_server_instructions.clone()); let mut terminal_bytes = ReadFromPid::new(&pid, os_input.clone()); let mut last_byte_receive_time: Option = None; @@ -218,9 +231,9 @@ fn stream_terminal_bytes( Some(receive_time) => { if receive_time.elapsed() > max_render_pause { pending_render = false; - os_input.send_to_server(ServerInstruction::ToScreen( - ScreenInstruction::Render, - )); + send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) + .unwrap(); last_byte_receive_time = Some(Instant::now()); } else { pending_render = true; @@ -234,21 +247,26 @@ fn stream_terminal_bytes( } else { if pending_render { pending_render = false; - os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Render)); + send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) + .unwrap(); } last_byte_receive_time = None; task::sleep(::std::time::Duration::from_millis(10)).await; } } - os_input.send_to_server(ServerInstruction::ToScreen(ScreenInstruction::Render)); + send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) + .unwrap(); #[cfg(not(test))] // 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 // a better solution would be to fix the test fakes, but this will do for now - os_input.send_to_server(ServerInstruction::ToScreen(ScreenInstruction::ClosePane( - PaneId::Terminal(pid), - ))); + send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::ClosePane( + PaneId::Terminal(pid), + ))) + .unwrap(); } }) } @@ -257,12 +275,14 @@ impl PtyBus { pub fn new( receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, os_input: Box, + send_server_instructions: SenderWithContext, debug_to_file: bool, ) -> Self { PtyBus { receive_pty_instructions, os_input, id_to_child_pid: HashMap::new(), + send_server_instructions, debug_to_file, task_handles: HashMap::new(), } @@ -270,8 +290,12 @@ impl PtyBus { pub fn spawn_terminal(&mut self, file_to_open: Option) -> RawFd { let (pid_primary, pid_secondary): (RawFd, RawFd) = self.os_input.spawn_terminal(file_to_open); - let task_handle = - stream_terminal_bytes(pid_primary, self.os_input.clone(), self.debug_to_file); + let task_handle = stream_terminal_bytes( + pid_primary, + self.os_input.clone(), + self.send_server_instructions.clone(), + self.debug_to_file, + ); self.task_handles.insert(pid_primary, task_handle); self.id_to_child_pid.insert(pid_primary, pid_secondary); pid_primary @@ -285,12 +309,18 @@ impl PtyBus { self.id_to_child_pid.insert(pid_primary, pid_secondary); new_pane_pids.push(pid_primary); } - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::ApplyLayout( + self.send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::ApplyLayout( (layout_path, new_pane_pids.clone()), - ))); + ))) + .unwrap(); for id in new_pane_pids { - let task_handle = stream_terminal_bytes(id, self.os_input.clone(), self.debug_to_file); + let task_handle = stream_terminal_bytes( + id, + self.os_input.clone(), + self.send_server_instructions.clone(), + self.debug_to_file, + ); self.task_handles.insert(id, task_handle); } } @@ -305,8 +335,9 @@ impl PtyBus { }); } PaneId::Plugin(pid) => self - .os_input - .send_to_server(ServerInstruction::ClosePluginPane(pid)), + .send_server_instructions + .send(ServerInstruction::ClosePluginPane(pid)) + .unwrap(), } } pub fn close_tab(&mut self, ids: Vec) { diff --git a/src/main.rs b/src/main.rs index 4a89470c..eef590a4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,9 +6,9 @@ mod server; use client::{boundaries, layout, panes, tab}; use common::{ command_is_executing, errors, os_input_output, pty_bus, screen, start, utils, wasm_vm, - ServerInstruction, }; use directories_next::ProjectDirs; +use server::ServerInstruction; use structopt::StructOpt; diff --git a/src/server/mod.rs b/src/server/mod.rs index 45c0db39..495cceb4 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,16 +1,33 @@ use crate::cli::CliArgs; -use crate::common::{ - ChannelWithContext, ClientInstruction, SenderType, SenderWithContext, ServerInstruction, -}; +use crate::common::{ChannelWithContext, ClientInstruction, SenderType, SenderWithContext}; use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext, ServerContext}; use crate::os_input_output::{ServerOsApi, ServerOsApiInstruction}; use crate::panes::PaneId; use crate::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; +use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; +/// Instructions related to server-side application including the +/// ones sent by client to server +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ServerInstruction { + OpenFile(PathBuf), + SplitHorizontally, + SplitVertically, + MoveFocus, + NewClient(String), + ToPty(PtyInstruction), + ToScreen(ScreenInstruction), + OsApi(ServerOsApiInstruction), + DoneClosingPane, + ClosePluginPane(u32), + ClientExit, + Exit, +} + pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); @@ -27,6 +44,14 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread SenderType::Sender(send_os_instructions), ); + let (send_server_instructions, receive_server_instructions): ChannelWithContext< + ServerInstruction, + > = channel(); + let mut send_server_instructions = SenderWithContext::new( + ErrorContext::new(), + SenderType::Sender(send_server_instructions), + ); + // Don't use default layouts in tests, but do everywhere else #[cfg(not(test))] let default_layout = Some(PathBuf::from("default")); @@ -34,7 +59,12 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread let default_layout = None; let maybe_layout = opts.layout.or(default_layout); - let mut pty_bus = PtyBus::new(receive_pty_instructions, os_input.clone(), opts.debug); + let mut pty_bus = PtyBus::new( + receive_pty_instructions, + os_input.clone(), + send_server_instructions.clone(), + opts.debug, + ); let pty_thread = thread::Builder::new() .name("pty".to_string()) @@ -47,43 +77,55 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread match event { PtyInstruction::SpawnTerminal(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus.os_input.send_to_server(ServerInstruction::ToScreen( - ScreenInstruction::NewPane(PaneId::Terminal(pid)), - )); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::NewPane( + PaneId::Terminal(pid), + ))) + .unwrap(); } PtyInstruction::SpawnTerminalVertically(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus.os_input.send_to_server(ServerInstruction::ToScreen( - ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), - )); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen( + ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), + )) + .unwrap(); } PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus.os_input.send_to_server(ServerInstruction::ToScreen( - ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), - )); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen( + ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), + )) + .unwrap(); } PtyInstruction::NewTab => { if let Some(layout) = maybe_layout.clone() { pty_bus.spawn_terminals_for_layout(layout); } else { let pid = pty_bus.spawn_terminal(None); - pty_bus.os_input.send_to_server(ServerInstruction::ToScreen( - ScreenInstruction::NewTab(pid), - )); + pty_bus + .send_server_instructions + .send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid))) + .unwrap(); } } PtyInstruction::ClosePane(id) => { pty_bus.close_pane(id); pty_bus - .os_input - .send_to_server(ServerInstruction::DoneClosingPane); + .send_server_instructions + .send(ServerInstruction::DoneClosingPane) + .unwrap(); } PtyInstruction::CloseTab(ids) => { pty_bus.close_tab(ids); pty_bus - .os_input - .send_to_server(ServerInstruction::DoneClosingPane); + .send_server_instructions + .send(ServerInstruction::DoneClosingPane) + .unwrap(); } PtyInstruction::Exit => { break; @@ -118,16 +160,32 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread }) .unwrap(); + let router_thread = thread::Builder::new() + .name("server_router".to_string()) + .spawn({ + let os_input = os_input.clone(); + move || loop { + let (instruction, err_ctx) = os_input.server_recv(); + send_server_instructions.update(err_ctx); + match instruction { + ServerInstruction::Exit => break, + _ => { + send_server_instructions.send(instruction).unwrap(); + } + } + } + }) + .unwrap(); + thread::Builder::new() .name("ipc_server".to_string()) .spawn({ move || loop { - let (instruction, mut err_ctx) = os_input.server_recv(); + let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); send_pty_instructions.update(err_ctx); send_os_instructions.update(err_ctx); os_input.update_senders(err_ctx); - match instruction { ServerInstruction::OpenFile(file_name) => { let path = PathBuf::from(file_name); @@ -169,14 +227,17 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread ServerInstruction::ClosePluginPane(pid) => { os_input.send_to_client(ClientInstruction::ClosePluginPane(pid)); } - ServerInstruction::Exit => { + ServerInstruction::ClientExit => { let _ = send_pty_instructions.send(PtyInstruction::Exit); let _ = send_os_instructions.send(ServerOsApiInstruction::Exit); + os_input.server_exit(); let _ = pty_thread.join(); let _ = os_thread.join(); + let _ = router_thread.join(); let _ = os_input.send_to_client(ClientInstruction::Exit); break; } + _ => {} } } }) diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 43d100bf..32dde38f 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -7,11 +7,10 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{mpsc, Arc, Mutex}; use std::time::{Duration, Instant}; -use crate::common::{ - ChannelWithContext, ClientInstruction, SenderType, SenderWithContext, ServerInstruction, -}; +use crate::common::{ChannelWithContext, ClientInstruction, SenderType, SenderWithContext}; use crate::errors::ErrorContext; use crate::os_input_output::{ClientOsApi, ServerOsApi}; +use crate::server::ServerInstruction; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::utils::shared::default_palette; use zellij_tile::data::Palette; @@ -256,8 +255,8 @@ impl ServerOsApi for FakeInputOutput { self.io_events.lock().unwrap().push(IoEvent::Kill(fd)); Ok(()) } - fn send_to_server(&mut self, msg: ServerInstruction) { - self.server_sender.send(msg).unwrap(); + fn server_exit(&mut self) { + self.server_sender.send(ServerInstruction::Exit).unwrap(); } fn server_recv(&self) -> (ServerInstruction, ErrorContext) { self.server_receiver.lock().unwrap().recv().unwrap() From 813547483f1e08f11bfa3bcca35d91e33ee96111 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 26 Mar 2021 13:13:00 +0530 Subject: [PATCH 38/64] Rename notify_server to connect_to_server --- src/common/mod.rs | 4 ++-- src/common/os_input_output.rs | 4 ++-- src/main.rs | 1 + src/tests/fakes.rs | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/common/mod.rs b/src/common/mod.rs index ef9fc47f..bb59f1d2 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -10,7 +10,7 @@ pub mod utils; pub mod wasm_vm; use std::io::Write; -use std::path::{Path, PathBuf}; +use std::path::Path; use std::sync::mpsc; use std::thread; use std::{collections::HashMap, fs}; @@ -183,7 +183,7 @@ pub fn start( let mut send_app_instructions = SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - os_input.notify_server(); + os_input.connect_to_server(); #[cfg(not(test))] std::panic::set_hook({ diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 62006162..396a1955 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -342,7 +342,7 @@ pub trait ClientOsApi: Send + Sync { // This should be called from the client-side router thread only. fn client_recv(&self) -> (ClientInstruction, ErrorContext); /// Setup the client IpcChannel and notify server of new client - fn notify_server(&mut self); + fn connect_to_server(&mut self); } impl ClientOsApi for ClientOsInputOutput { @@ -378,7 +378,7 @@ impl ClientOsApi for ClientOsInputOutput { fn update_senders(&mut self, new_ctx: ErrorContext) { self.server_sender.update(new_ctx); } - fn notify_server(&mut self) { + fn connect_to_server(&mut self) { let (client_buffer_path, client_buffer) = SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); self.client_receiver = Some(Arc::new(Mutex::new(IpcReceiver::new( diff --git a/src/main.rs b/src/main.rs index eef590a4..e2d567c4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -75,6 +75,7 @@ pub fn main() { } else if let Some(file_to_open) = opts.open_file { get_client_os_input().send_to_server(ServerInstruction::OpenFile(file_to_open)); } else { + // Mind the order: server_os_input should be created before client_os_input let server_os_input = get_server_os_input(); let os_input = get_client_os_input(); atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 32dde38f..edfd1247 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -189,7 +189,7 @@ impl ClientOsApi for FakeInputOutput { self.server_sender.update(new_ctx); self.client_sender.update(new_ctx); } - fn notify_server(&mut self) { + fn connect_to_server(&mut self) { ClientOsApi::send_to_server(self, ServerInstruction::NewClient("zellij".into())); } fn client_recv(&self) -> (ClientInstruction, ErrorContext) { From 2059d2c6aa6a6626d394ef572755f6ff88e2138c Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 27 Mar 2021 11:56:40 +0530 Subject: [PATCH 39/64] Fix after rebase --- Cargo.lock | 268 ++++++++++++++++++++---------------- Cargo.toml | 2 + src/client/tab.rs | 151 +++++++++----------- src/common/errors.rs | 2 - src/common/input/handler.rs | 13 -- src/common/mod.rs | 55 +++----- src/common/screen.rs | 2 +- src/common/wasm_vm.rs | 1 - 8 files changed, 240 insertions(+), 254 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c736a50..72f684cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler" -version = "0.2.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ansi_term" @@ -43,9 +43,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "async-channel" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9" +checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" dependencies = [ "concurrent-queue", "event-listener", @@ -132,7 +132,7 @@ dependencies = [ "event-listener", "futures-lite", "once_cell", - "signal-hook 0.3.4", + "signal-hook 0.3.6", "winapi", ] @@ -209,9 +209,9 @@ dependencies = [ [[package]] name = "bincode" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" +checksum = "d175dfa69e619905c4c3cdb7c3c203fa3bdd5d51184e3afdb2742c0280493772" dependencies = [ "serde", ] @@ -259,15 +259,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.6.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099e596ef14349721d9016f6b80dd3419ea1bf289ab9b44df8e4dfd3a005d5d9" +checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" [[package]] name = "byteorder" -version = "1.4.2" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "cache-padded" @@ -277,9 +277,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cc" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" +checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" [[package]] name = "cfg-if" @@ -354,12 +354,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "const_fn" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" - [[package]] name = "cpuid-bool" version = "0.1.2" @@ -463,12 +457,11 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +checksum = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12" dependencies = [ "cfg-if 1.0.0", - "const_fn", "crossbeam-utils", "lazy_static", "memoffset", @@ -477,9 +470,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" dependencies = [ "autocfg", "cfg-if 1.0.0", @@ -498,9 +491,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +checksum = "a06d4a9551359071d1890820e3571252b91229e0712e7c36b08940e603c5a8fc" dependencies = [ "darling_core", "darling_macro", @@ -508,23 +501,23 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +checksum = "b443e5fb0ddd56e0c9bfa47dc060c5306ee500cb731f2b91432dd65589a77684" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.9.3", + "strsim 0.10.0", "syn", ] [[package]] name = "darling_macro" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +checksum = "c0220073ce504f12a70efc4e7cdaea9e9b1b324872e7ad96a208056d7a638b81" dependencies = [ "darling_core", "quote", @@ -581,18 +574,18 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "enumset" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf6167d1be7a76696cadccfbdb89e5cb519244a42bab7da5577994579217dcff" +checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8a79bce471eb6165aa8ac86ebc8d788543b741eaa15e8b8486591696207d6c" +checksum = "e19c52f9ec503c8a68dc04daf71a04b07e690c32ab1a8b68e33897f255269d47" dependencies = [ "darling", "proc-macro2", @@ -644,9 +637,9 @@ checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" [[package]] name = "futures" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9052a1a50244d8d5aa9bf55cbc2fb6f357c86cc52e46c62ed390a7180cf150" +checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1" dependencies = [ "futures-channel", "futures-core", @@ -659,9 +652,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d31b7ec7efab6eefc7c57233bb10b847986139d88cc2f5a02a1ae6871a1846" +checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" dependencies = [ "futures-core", "futures-sink", @@ -669,15 +662,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e5145dde8da7d1b3892dad07a9c98fc04bc39892b1ecc9692cf53e2b780a65" +checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" [[package]] name = "futures-executor" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e59fdc009a4b3096bf94f740a0f2424c082521f20a9b08c5c07c48d90fd9b9" +checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1" dependencies = [ "futures-core", "futures-task", @@ -686,9 +679,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28be053525281ad8259d47e4de5de657b25e7bac113458555bb4b70bc6870500" +checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" [[package]] name = "futures-lite" @@ -707,9 +700,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c287d25add322d9f9abdcdc5927ca398917996600182178774032e9f8258fedd" +checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7" dependencies = [ "proc-macro-hack", "proc-macro2", @@ -719,24 +712,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5c69029bda2e743fddd0582d1083951d65cc9539aebf8812f36c3491342d6" +checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" [[package]] name = "futures-task" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13de07eb8ea81ae445aca7b69f5f7bf15d7bf4912d8ca37d6645c77ae8a58d86" -dependencies = [ - "once_cell", -] +checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" [[package]] name = "futures-util" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632a8cd0f2a4b3fdea1657f08bde063848c3bd00f9bbf6e256b8be78802e624b" +checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" dependencies = [ "futures-channel", "futures-core", @@ -859,9 +849,9 @@ dependencies = [ [[package]] name = "hex" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "ident_case" @@ -882,9 +872,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d4f10636e7b40bf9eb71ecaf660498a120a86e9251bd4dea72a64ce9b8a93" +checksum = "e1b6cf41e31a7e7b78055b548826da45c7dc74e6a13a3fa6b897a17a01322f26" dependencies = [ "console", "lazy_static", @@ -904,6 +894,29 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "interprocess" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c58ec7fbda1df9a93f587b780659db3c99f61f4be27f9c82c9b37684ffd0366" +dependencies = [ + "blocking", + "cfg-if 1.0.0", + "futures", + "intmap", + "libc", + "once_cell", + "spinning", + "thiserror", + "winapi", +] + +[[package]] +name = "intmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e50930385956f6c4a0b99f3dd654adcc40788456c36e17c5b20e1d1ceb523ec6" + [[package]] name = "inventory" version = "0.1.10" @@ -982,13 +995,13 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "lexical-core" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db65c6da02e61f55dae90a0ae427b2a5f6b3e8db09f58d10efab23af92592616" +checksum = "21f866863575d0e1d654fbeeabdc927292fdf862873dc3c96c6f753357e13374" dependencies = [ "arrayvec", "bitflags", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "ryu", "static_assertions", ] @@ -1015,6 +1028,15 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +[[package]] +name = "lock_api" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.14" @@ -1070,9 +1092,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", "autocfg", @@ -1086,12 +1108,12 @@ checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" [[package]] name = "nb-connect" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8123a81538e457d44b933a02faf885d3fe8408806b23fa700e8f01c6c3a98998" +checksum = "670361df1bc2399ee1ff50406a0d422587dd3bb0da596e1978fe8e05dabddf4f" dependencies = [ "libc", - "winapi", + "socket2", ] [[package]] @@ -1108,11 +1130,12 @@ dependencies = [ [[package]] name = "nom" -version = "6.1.0" +version = "6.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6f70b46d6325aa300f1c7bb3d470127dfc27806d8ea6bf294ee0ce643ce2b1" +checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" dependencies = [ "bitvec", + "funty", "lexical-core", "memchr", "version_check", @@ -1171,9 +1194,9 @@ checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" [[package]] name = "once_cell" -version = "1.5.2" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" [[package]] name = "opaque-debug" @@ -1284,9 +1307,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] @@ -1321,9 +1344,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" dependencies = [ "getrandom", ] @@ -1364,15 +1387,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570" +checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" dependencies = [ "bitflags", ] @@ -1383,7 +1400,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f" dependencies = [ - "redox_syscall 0.2.4", + "redox_syscall", ] [[package]] @@ -1393,7 +1410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ "getrandom", - "redox_syscall 0.2.4", + "redox_syscall", ] [[package]] @@ -1510,9 +1527,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.62" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", @@ -1521,9 +1538,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.16" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd2af560da3c1fdc02cb80965289254fc35dff869810061e2d8290ee48848ae" +checksum = "15654ed4ab61726bf918a39cb8d98a2e2995b002387807fa6ba58fdf7f59bb23" dependencies = [ "dtoa", "linked-hash-map", @@ -1556,9 +1573,9 @@ dependencies = [ [[package]] name = "signal-hook" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f5e3fe0c66f67197236097d89de1e86216f1f6fdeaf47c442f854ab46c240" +checksum = "8a7f3f92a1da3d6b1d32245d0cbcbbab0cfc45996d8df619c42bccfa6d2bbb5f" dependencies = [ "libc", "signal-hook-registry", @@ -1575,9 +1592,9 @@ dependencies = [ [[package]] name = "similar" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da916d7c5876bff6fbf5794bd1e64aba8f5f110b76b192d80bb264423c0736f6" +checksum = "1ad1d488a557b235fc46dae55512ffbfc429d2482b08b4d9435ab07384ca8aec" [[package]] name = "slab" @@ -1591,6 +1608,26 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "socket2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "winapi", +] + +[[package]] +name = "spinning" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d4f0e86297cad2658d92a707320d87bf4e6ae1050287f51d19b67ef3f153a7b" +dependencies = [ + "lock_api", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1639,9 +1676,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "strsim" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "structopt" @@ -1708,15 +1745,15 @@ dependencies = [ [[package]] name = "tap" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36474e732d1affd3a6ed582781b3683df3d0563714c59c39591e8ff707cf078e" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "422045212ea98508ae3d28025bc5aaa2bd4a9cdaecd442a08da2ee620ee9ea95" [[package]] name = "tempfile" @@ -1727,7 +1764,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "rand", - "redox_syscall 0.2.4", + "redox_syscall", "remove_dir_all", "winapi", ] @@ -1774,18 +1811,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" dependencies = [ "proc-macro2", "quote", @@ -1804,9 +1841,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.23" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d40a22fd029e33300d8d89a5cc8ffce18bb7c587662f54629e94c9de5487f3" +checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" dependencies = [ "cfg-if 1.0.0", "log", @@ -1817,9 +1854,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f080ea7e4107844ef4766459426fa2d5c1ada2e47edba05dc7fa99d9629f47" +checksum = "a8a9bd1db7706f2373a190b0d067146caa39350c486f3d455b0e33b431f94c07" dependencies = [ "proc-macro2", "quote", @@ -1837,9 +1874,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" [[package]] name = "typetag" @@ -2264,18 +2301,18 @@ checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" [[package]] name = "wast" -version = "33.0.0" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d04fe175c7f78214971293e7d8875673804e736092206a3a4544dbc12811c1b" +checksum = "db5ae96da18bb5926341516fd409b5a8ce4e4714da7f0a1063d3b20ac9f9a1e1" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.34" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ec9c6ee01ae07a26adadcdfed22c7a97e0b8cbee9c06e0e96076ece5aeb5cfe" +checksum = "0b0fa059022c5dabe129f02b429d67086400deb8277f89c975555dacc1dadbcc" dependencies = [ "wast", ] @@ -2357,6 +2394,7 @@ dependencies = [ "directories-next", "futures", "insta", + "interprocess", "ipmpsc", "lazy_static", "libc", diff --git a/Cargo.toml b/Cargo.toml index f55396ce..e1439dc2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,8 @@ strum = "0.20.0" lazy_static = "1.4.0" wasmer = "1.0.0" wasmer-wasi = "1.0.0" +interprocess = "1.0.1" +zellij-tile = { path = "zellij-tile/", version = "0.5.0" } [dependencies.async-std] version = "1.3.0" diff --git a/src/client/tab.rs b/src/client/tab.rs index 60f51004..d5ad77a2 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -8,9 +8,8 @@ use crate::os_input_output::{ClientOsApi, ServerOsApiInstruction}; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; use crate::pty_bus::{PtyInstruction, VteEvent}; use crate::utils::shared::pad_to_size; -use crate::wasm_vm::{PluginInputType, PluginInstruction}; +use crate::wasm_vm::PluginInstruction; use crate::{boundaries::Boundaries, panes::PluginPane}; -use serde::{Deserialize, Serialize}; use std::os::unix::io::RawFd; use std::time::Instant; use std::{ @@ -509,54 +508,48 @@ impl Tab { self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } - } else { - // FIXME: This could use a second look - if let PaneId::Terminal(term_pid) = pid { - // TODO: check minimum size of active terminal - let active_pane_id = &self.get_active_pane_id().unwrap(); - let active_pane = self.panes.get_mut(active_pane_id).unwrap(); - if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 { - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty - .unwrap(); - return; - } - let terminal_ws = PositionAndSize { - x: active_pane.x(), - y: active_pane.y(), - rows: active_pane.rows(), - columns: active_pane.columns(), - }; - let (top_winsize, bottom_winsize) = split_horizontally_with_gap(&terminal_ws); + } else if let PaneId::Terminal(term_pid) = pid { + // TODO: check minimum size of active terminal + let active_pane_id = &self.get_active_pane_id().unwrap(); + let active_pane = self.panes.get_mut(active_pane_id).unwrap(); + if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 { + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty + .unwrap(); + return; + } + let terminal_ws = PositionAndSize { + x: active_pane.x(), + y: active_pane.y(), + rows: active_pane.rows(), + columns: active_pane.columns(), + }; + let (top_winsize, bottom_winsize) = split_horizontally_with_gap(&terminal_ws); active_pane.change_pos_and_size(&top_winsize); - let new_terminal = TerminalPane::new(term_pid, bottom_winsize); + let new_terminal = TerminalPane::new(term_pid, bottom_winsize); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + bottom_winsize.columns as u16, + bottom_winsize.rows as u16, + ), + )) + .unwrap(); + self.panes.insert(pid, Box::new(new_terminal)); + + if let PaneId::Terminal(active_terminal_pid) = active_pane_id { self.send_app_instructions .send(AppInstruction::OsApi( ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - bottom_winsize.columns as u16, - bottom_winsize.rows as u16, + *active_terminal_pid, + top_winsize.columns as u16, + top_winsize.rows as u16, ), )) .unwrap(); - self.panes.insert(pid, Box::new(new_terminal)); - - if let PaneId::Terminal(active_terminal_pid) = active_pane_id { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *active_terminal_pid, - top_winsize.columns as u16, - top_winsize.rows as u16, - ), - )) - .unwrap(); - } - - self.active_terminal = Some(pid); - self.render(); } self.active_terminal = Some(pid); @@ -583,60 +576,48 @@ impl Tab { self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } - } else { - // FIXME: This could use a second look - if let PaneId::Terminal(term_pid) = pid { - // TODO: check minimum size of active terminal - let active_pane_id = &self.get_active_pane_id().unwrap(); - let active_pane = self.panes.get_mut(active_pane_id).unwrap(); - if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 { - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty - .unwrap(); - return; - } - let terminal_ws = PositionAndSize { - x: active_pane.x(), - y: active_pane.y(), - rows: active_pane.rows(), - columns: active_pane.columns(), - }; - let (left_winsize, right_winsize) = split_vertically_with_gap(&terminal_ws); + } else if let PaneId::Terminal(term_pid) = pid { + // TODO: check minimum size of active terminal + let active_pane_id = &self.get_active_pane_id().unwrap(); + let active_pane = self.panes.get_mut(active_pane_id).unwrap(); + if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 { + self.send_app_instructions + .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty + .unwrap(); + return; + } + let terminal_ws = PositionAndSize { + x: active_pane.x(), + y: active_pane.y(), + rows: active_pane.rows(), + columns: active_pane.columns(), + }; + let (left_winsize, right_winsize) = split_vertically_with_gap(&terminal_ws); + + active_pane.change_pos_and_size(&left_winsize); let new_terminal = TerminalPane::new(term_pid, right_winsize); - self.os_api.set_terminal_size_using_fd( - new_terminal.pid, - right_winsize.columns as u16, - right_winsize.rows as u16, - ); + self.send_app_instructions + .send(AppInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + right_winsize.columns as u16, + right_winsize.rows as u16, + ), + )) + .unwrap(); self.panes.insert(pid, Box::new(new_terminal)); - let new_terminal = TerminalPane::new(term_pid, right_winsize); + if let PaneId::Terminal(active_terminal_pid) = active_pane_id { self.send_app_instructions .send(AppInstruction::OsApi( ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - right_winsize.columns as u16, - right_winsize.rows as u16, + *active_terminal_pid, + left_winsize.columns as u16, + left_winsize.rows as u16, ), )) .unwrap(); - self.panes.insert(pid, Box::new(new_terminal)); - - if let PaneId::Terminal(active_terminal_pid) = active_pane_id { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *active_terminal_pid, - left_winsize.columns as u16, - left_winsize.rows as u16, - ), - )) - .unwrap(); - } - - self.active_terminal = Some(pid); - self.render(); } self.active_terminal = Some(pid); diff --git a/src/common/errors.rs b/src/common/errors.rs index 37729fbb..3b3d79d8 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -332,7 +332,6 @@ pub enum PluginContext { Render, Unload, Exit, - Tabs, } impl From<&PluginInstruction> for PluginContext { @@ -343,7 +342,6 @@ impl From<&PluginInstruction> for PluginContext { PluginInstruction::Render(..) => PluginContext::Render, PluginInstruction::Unload(_) => PluginContext::Unload, PluginInstruction::Exit => PluginContext::Exit, - PluginInstruction::UpdateTabs(..) => PluginContext::Tabs, } } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 0eda77bf..52d4082b 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -282,19 +282,6 @@ impl InputHandler { .send(ScreenInstruction::UpdateTabName(c)) .unwrap(); } - Action::SaveTabName => { - self.command_is_executing.updating_tabs(); - self.send_plugin_instructions - .send(PluginInstruction::Input( - PluginInputType::Event(EventType::Tab), - vec![b'\n'], - )) - .unwrap(); - self.send_screen_instructions - .send(ScreenInstruction::UpdateTabName(vec![b'\n'])) - .unwrap(); - self.command_is_executing.wait_until_tabs_are_updated(); - } Action::NoOp => {} } diff --git a/src/common/mod.rs b/src/common/mod.rs index bb59f1d2..72067219 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -9,34 +9,34 @@ pub mod setup; pub mod utils; pub mod wasm_vm; -use std::io::Write; -use std::path::Path; +use std::cell::RefCell; use std::sync::mpsc; use std::thread; use std::{collections::HashMap, fs}; - -use crate::panes::PaneId; -use directories_next::ProjectDirs; -use input::handler::InputMode; -use serde::{Deserialize, Serialize}; -use termion::input::TermRead; -use wasm_vm::PluginEnv; -use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; -use wasmer_wasi::{Pipe, WasiState}; +use std::{ + collections::HashSet, + io::Write, + str::FromStr, + sync::{Arc, Mutex}, +}; use crate::cli::CliArgs; use crate::layout::Layout; +use crate::panes::PaneId; use crate::server::{start_server, ServerInstruction}; use command_is_executing::CommandIsExecuting; +use directories_next::ProjectDirs; use errors::{AppContext, ContextType, ErrorContext, PluginContext, ScreenContext}; use input::handler::input_loop; use os_input_output::{ClientOsApi, ServerOsApi, ServerOsApiInstruction}; use pty_bus::PtyInstruction; use screen::{Screen, ScreenInstruction}; -use utils::consts::ZELLIJ_ROOT_PLUGIN_DIR; -use wasm_vm::{ - wasi_stdout, wasi_write_string, zellij_imports, EventType, PluginInputType, PluginInstruction, -}; +use serde::{Deserialize, Serialize}; +use wasm_vm::PluginEnv; +use wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginInstruction}; +use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; +use wasmer_wasi::{Pipe, WasiState}; +use zellij_tile::data::{EventType, InputMode}; /// Instructions sent from server to client #[derive(Serialize, Deserialize, Debug, Clone)] @@ -48,26 +48,6 @@ pub enum ClientInstruction { Exit, } -// FIXME: It would be good to add some more things to this over time -#[derive(Debug, Clone, Default)] -pub struct AppState { - pub input_mode: InputMode, -} - -// FIXME: Make this a method on the big `Communication` struct, so that app_tx can be extracted -// from self instead of being explicitly passed here -pub fn update_state( - app_tx: &SenderWithContext, - update_fn: impl FnOnce(AppState) -> AppState, -) { - let (state_tx, state_rx) = mpsc::channel(); - - drop(app_tx.send(AppInstruction::GetState(state_tx))); - let state = state_rx.recv().unwrap(); - - drop(app_tx.send(AppInstruction::SetState(update_fn(state)))) -} - /// An [MPSC](mpsc) asynchronous channel with added error context. pub type ChannelWithContext = ( mpsc::Sender<(T, ErrorContext)>, @@ -390,6 +370,9 @@ pub fn start( screen.update_active_tab_name(c); command_is_executing.done_updating_tabs(); } + ScreenInstruction::ChangeInputMode(input_mode) => { + screen.change_input_mode(input_mode); + } ScreenInstruction::Exit => { break; } @@ -547,8 +530,6 @@ pub fn start( send_screen_instructions.update(err_ctx); os_input.update_senders(err_ctx); match app_instruction { - AppInstruction::GetState(state_tx) => drop(state_tx.send(app_state.clone())), - AppInstruction::SetState(state) => app_state = state, AppInstruction::Exit => break, AppInstruction::Error(backtrace) => { let _ = os_input.send_to_server(ServerInstruction::ClientExit); diff --git a/src/common/screen.rs b/src/common/screen.rs index 7dbc2fe4..cba24618 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -80,7 +80,7 @@ pub struct Screen { active_tab_index: Option, /// The [`ClientOsApi`] this [`Screen`] uses. os_api: Box, - tabname_buf: String, + input_mode: InputMode, } impl Screen { diff --git a/src/common/wasm_vm.rs b/src/common/wasm_vm.rs index d4580572..31b1000c 100644 --- a/src/common/wasm_vm.rs +++ b/src/common/wasm_vm.rs @@ -21,7 +21,6 @@ pub enum PluginInstruction { Update(Option, Event), // Focused plugin / broadcast, event data Render(Sender, u32, usize, usize), // String buffer, plugin id, rows, cols Unload(u32), - UpdateTabs(Vec), // num tabs, active tab Exit, } From 4f088e8185ec256d181103256df9c46d6432976a Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 27 Mar 2021 19:55:22 +0530 Subject: [PATCH 40/64] split start into start_server and start_client --- src/client/mod.rs | 486 ++++++++++++++++++++++++++++++- src/client/tab.rs | 5 +- src/common/errors.rs | 5 +- src/common/input/handler.rs | 6 +- src/common/mod.rs | 531 +--------------------------------- src/common/os_input_output.rs | 2 +- src/common/pty_bus.rs | 3 +- src/common/screen.rs | 3 +- src/common/wasm_vm.rs | 5 +- src/main.rs | 22 +- src/server/mod.rs | 3 +- src/tests/fakes.rs | 3 +- 12 files changed, 524 insertions(+), 550 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index cba12a46..f5c77a5b 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -4,4 +4,488 @@ pub mod pane_resizer; pub mod panes; pub mod tab; -pub fn _start_client() {} +use std::sync::mpsc; +use std::thread; +use std::{collections::HashMap, fs}; +use std::{ + collections::HashSet, + io::Write, + str::FromStr, + sync::{Arc, Mutex}, +}; + +use directories_next::ProjectDirs; +use serde::{Deserialize, Serialize}; +use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; +use wasmer_wasi::{Pipe, WasiState}; +use zellij_tile::data::{EventType, InputMode}; + +use crate::cli::CliArgs; +use crate::common::{ + command_is_executing::CommandIsExecuting, + errors::{AppContext, ContextType, PluginContext, ScreenContext}, + input::handler::input_loop, + os_input_output::{ClientOsApi, ServerOsApiInstruction}, + pty_bus::PtyInstruction, + screen::{Screen, ScreenInstruction}, + wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginEnv, PluginInstruction}, + ChannelWithContext, SenderType, SenderWithContext, SyncChannelWithContext, OPENCALLS, +}; +use crate::layout::Layout; +use crate::server::ServerInstruction; + +/// Instructions sent from server to client +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ClientInstruction { + ToScreen(ScreenInstruction), + ClosePluginPane(u32), + Error(String), + DoneClosingPane, + Exit, +} + +/// Instructions related to the client-side application. +#[derive(Clone)] +pub enum AppInstruction { + Exit, + Error(String), + ToPty(PtyInstruction), + ToScreen(ScreenInstruction), + ToPlugin(PluginInstruction), + OsApi(ServerOsApiInstruction), + DoneClosingPane, +} + +impl From for AppInstruction { + fn from(item: ClientInstruction) -> Self { + match item { + ClientInstruction::ToScreen(s) => AppInstruction::ToScreen(s), + ClientInstruction::Error(e) => AppInstruction::Error(e), + ClientInstruction::ClosePluginPane(p) => { + AppInstruction::ToPlugin(PluginInstruction::Unload(p)) + } + ClientInstruction::DoneClosingPane => AppInstruction::DoneClosingPane, + ClientInstruction::Exit => AppInstruction::Exit, + } + } +} + +pub fn start_client(mut os_input: Box, opts: CliArgs) { + let take_snapshot = "\u{1b}[?1049h"; + os_input.unset_raw_mode(0); + let _ = os_input + .get_stdout_writer() + .write(take_snapshot.as_bytes()) + .unwrap(); + + let mut command_is_executing = CommandIsExecuting::new(); + + let full_screen_ws = os_input.get_terminal_size_using_fd(0); + os_input.set_raw_mode(0); + let (send_screen_instructions, receive_screen_instructions): ChannelWithContext< + ScreenInstruction, + > = mpsc::channel(); + let err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); + let mut send_screen_instructions = + SenderWithContext::new(err_ctx, SenderType::Sender(send_screen_instructions)); + + let (send_plugin_instructions, receive_plugin_instructions): ChannelWithContext< + PluginInstruction, + > = mpsc::channel(); + let send_plugin_instructions = + SenderWithContext::new(err_ctx, SenderType::Sender(send_plugin_instructions)); + + let (send_app_instructions, receive_app_instructions): SyncChannelWithContext = + mpsc::sync_channel(500); + let mut send_app_instructions = + SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); + + os_input.connect_to_server(); + + #[cfg(not(test))] + std::panic::set_hook({ + use crate::errors::handle_panic; + let send_app_instructions = send_app_instructions.clone(); + Box::new(move |info| { + handle_panic(info, &send_app_instructions); + }) + }); + + let screen_thread = thread::Builder::new() + .name("screen".to_string()) + .spawn({ + let mut command_is_executing = command_is_executing.clone(); + let os_input = os_input.clone(); + let send_plugin_instructions = send_plugin_instructions.clone(); + let send_app_instructions = send_app_instructions.clone(); + let max_panes = opts.max_panes; + + move || { + let mut screen = Screen::new( + receive_screen_instructions, + send_plugin_instructions, + send_app_instructions, + &full_screen_ws, + os_input, + max_panes, + InputMode::Normal, + ); + loop { + let (event, mut err_ctx) = screen + .receiver + .recv() + .expect("failed to receive event on channel"); + err_ctx.add_call(ContextType::Screen(ScreenContext::from(&event))); + screen.send_app_instructions.update(err_ctx); + match event { + ScreenInstruction::Pty(pid, vte_event) => { + screen + .get_active_tab_mut() + .unwrap() + .handle_pty_event(pid, vte_event); + } + ScreenInstruction::Render => { + screen.render(); + } + ScreenInstruction::NewPane(pid) => { + screen.get_active_tab_mut().unwrap().new_pane(pid); + command_is_executing.done_opening_new_pane(); + } + ScreenInstruction::HorizontalSplit(pid) => { + screen.get_active_tab_mut().unwrap().horizontal_split(pid); + command_is_executing.done_opening_new_pane(); + } + ScreenInstruction::VerticalSplit(pid) => { + screen.get_active_tab_mut().unwrap().vertical_split(pid); + command_is_executing.done_opening_new_pane(); + } + ScreenInstruction::WriteCharacter(bytes) => { + screen + .get_active_tab_mut() + .unwrap() + .write_to_active_terminal(bytes); + } + ScreenInstruction::ResizeLeft => { + screen.get_active_tab_mut().unwrap().resize_left(); + } + ScreenInstruction::ResizeRight => { + screen.get_active_tab_mut().unwrap().resize_right(); + } + ScreenInstruction::ResizeDown => { + screen.get_active_tab_mut().unwrap().resize_down(); + } + ScreenInstruction::ResizeUp => { + screen.get_active_tab_mut().unwrap().resize_up(); + } + ScreenInstruction::MoveFocus => { + screen.get_active_tab_mut().unwrap().move_focus(); + } + ScreenInstruction::MoveFocusLeft => { + screen.get_active_tab_mut().unwrap().move_focus_left(); + } + ScreenInstruction::MoveFocusDown => { + screen.get_active_tab_mut().unwrap().move_focus_down(); + } + ScreenInstruction::MoveFocusRight => { + screen.get_active_tab_mut().unwrap().move_focus_right(); + } + ScreenInstruction::MoveFocusUp => { + screen.get_active_tab_mut().unwrap().move_focus_up(); + } + ScreenInstruction::ScrollUp => { + screen + .get_active_tab_mut() + .unwrap() + .scroll_active_terminal_up(); + } + ScreenInstruction::ScrollDown => { + screen + .get_active_tab_mut() + .unwrap() + .scroll_active_terminal_down(); + } + ScreenInstruction::ClearScroll => { + screen + .get_active_tab_mut() + .unwrap() + .clear_active_terminal_scroll(); + } + ScreenInstruction::CloseFocusedPane => { + screen.get_active_tab_mut().unwrap().close_focused_pane(); + screen.render(); + } + ScreenInstruction::SetSelectable(id, selectable) => { + screen + .get_active_tab_mut() + .unwrap() + .set_pane_selectable(id, selectable); + } + ScreenInstruction::SetMaxHeight(id, max_height) => { + screen + .get_active_tab_mut() + .unwrap() + .set_pane_max_height(id, max_height); + } + ScreenInstruction::SetInvisibleBorders(id, invisible_borders) => { + screen + .get_active_tab_mut() + .unwrap() + .set_pane_invisible_borders(id, invisible_borders); + screen.render(); + } + ScreenInstruction::ClosePane(id) => { + screen.get_active_tab_mut().unwrap().close_pane(id); + screen.render(); + } + ScreenInstruction::ToggleActiveTerminalFullscreen => { + screen + .get_active_tab_mut() + .unwrap() + .toggle_active_pane_fullscreen(); + } + ScreenInstruction::NewTab(pane_id) => { + screen.new_tab(pane_id); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::SwitchTabNext => { + screen.switch_tab_next(); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::SwitchTabPrev => { + screen.switch_tab_prev(); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::CloseTab => { + screen.close_tab(); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => { + screen.apply_layout(Layout::new(layout), new_pane_pids); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::GoToTab(tab_index) => { + screen.go_to_tab(tab_index as usize); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::UpdateTabName(c) => { + screen.update_active_tab_name(c); + command_is_executing.done_updating_tabs(); + } + ScreenInstruction::ChangeInputMode(input_mode) => { + screen.change_input_mode(input_mode); + } + ScreenInstruction::Exit => { + break; + } + } + } + } + }) + .unwrap(); + + let wasm_thread = thread::Builder::new() + .name("wasm".to_string()) + .spawn({ + let mut send_screen_instructions = send_screen_instructions.clone(); + let mut send_app_instructions = send_app_instructions.clone(); + + let store = Store::default(); + let mut plugin_id = 0; + let mut plugin_map = HashMap::new(); + move || loop { + let (event, mut err_ctx) = receive_plugin_instructions + .recv() + .expect("failed to receive event on channel"); + err_ctx.add_call(ContextType::Plugin(PluginContext::from(&event))); + send_screen_instructions.update(err_ctx); + send_app_instructions.update(err_ctx); + match event { + PluginInstruction::Load(pid_tx, path) => { + let project_dirs = + ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); + let plugin_dir = project_dirs.data_dir().join("plugins/"); + let wasm_bytes = fs::read(&path) + .or_else(|_| fs::read(&path.with_extension("wasm"))) + .or_else(|_| fs::read(&plugin_dir.join(&path).with_extension("wasm"))) + .unwrap_or_else(|_| panic!("cannot find plugin {}", &path.display())); + + // FIXME: Cache this compiled module on disk. I could use `(de)serialize_to_file()` for that + let module = Module::new(&store, &wasm_bytes).unwrap(); + + let output = Pipe::new(); + let input = Pipe::new(); + let mut wasi_env = WasiState::new("Zellij") + .env("CLICOLOR_FORCE", "1") + .preopen(|p| { + p.directory(".") // FIXME: Change this to a more meaningful dir + .alias(".") + .read(true) + .write(true) + .create(true) + }) + .unwrap() + .stdin(Box::new(input)) + .stdout(Box::new(output)) + .finalize() + .unwrap(); + + let wasi = wasi_env.import_object(&module).unwrap(); + + let plugin_env = PluginEnv { + plugin_id, + send_screen_instructions: send_screen_instructions.clone(), + send_app_instructions: send_app_instructions.clone(), + wasi_env, + subscriptions: Arc::new(Mutex::new(HashSet::new())), + }; + + let zellij = zellij_imports(&store, &plugin_env); + let instance = Instance::new(&module, &zellij.chain_back(wasi)).unwrap(); + + let start = instance.exports.get_function("_start").unwrap(); + + // This eventually calls the `.init()` method + start.call(&[]).unwrap(); + + plugin_map.insert(plugin_id, (instance, plugin_env)); + pid_tx.send(plugin_id).unwrap(); + plugin_id += 1; + } + PluginInstruction::Update(pid, event) => { + for (&i, (instance, plugin_env)) in &plugin_map { + let subs = plugin_env.subscriptions.lock().unwrap(); + // FIXME: This is very janky... Maybe I should write my own macro for Event -> EventType? + let event_type = EventType::from_str(&event.to_string()).unwrap(); + if (pid.is_none() || pid == Some(i)) && subs.contains(&event_type) { + let update = instance.exports.get_function("update").unwrap(); + wasi_write_string( + &plugin_env.wasi_env, + &serde_json::to_string(&event).unwrap(), + ); + update.call(&[]).unwrap(); + } + } + drop(send_screen_instructions.send(ScreenInstruction::Render)); + } + PluginInstruction::Render(buf_tx, pid, rows, cols) => { + let (instance, plugin_env) = plugin_map.get(&pid).unwrap(); + + let render = instance.exports.get_function("render").unwrap(); + + render + .call(&[Value::I32(rows as i32), Value::I32(cols as i32)]) + .unwrap(); + + buf_tx.send(wasi_stdout(&plugin_env.wasi_env)).unwrap(); + } + PluginInstruction::Unload(pid) => drop(plugin_map.remove(&pid)), + PluginInstruction::Exit => break, + } + } + }) + .unwrap(); + + let _stdin_thread = thread::Builder::new() + .name("stdin_handler".to_string()) + .spawn({ + let send_screen_instructions = send_screen_instructions.clone(); + let send_plugin_instructions = send_plugin_instructions.clone(); + let send_app_instructions = send_app_instructions.clone(); + let command_is_executing = command_is_executing.clone(); + let os_input = os_input.clone(); + move || { + input_loop( + os_input, + command_is_executing, + send_screen_instructions, + send_plugin_instructions, + send_app_instructions, + ) + } + }); + + let router_thread = thread::Builder::new() + .name("router".to_string()) + .spawn({ + let os_input = os_input.clone(); + move || loop { + let (instruction, err_ctx) = os_input.client_recv(); + send_app_instructions.update(err_ctx); + match instruction { + ClientInstruction::Exit => break, + _ => { + send_app_instructions + .send(AppInstruction::from(instruction)) + .unwrap(); + } + } + } + }) + .unwrap(); + + #[warn(clippy::never_loop)] + loop { + let (app_instruction, mut err_ctx) = receive_app_instructions + .recv() + .expect("failed to receive app instruction on channel"); + + err_ctx.add_call(ContextType::App(AppContext::from(&app_instruction))); + send_screen_instructions.update(err_ctx); + os_input.update_senders(err_ctx); + match app_instruction { + AppInstruction::Exit => break, + AppInstruction::Error(backtrace) => { + let _ = os_input.send_to_server(ServerInstruction::ClientExit); + let _ = send_screen_instructions.send(ScreenInstruction::Exit); + let _ = send_plugin_instructions.send(PluginInstruction::Exit); + let _ = screen_thread.join(); + let _ = wasm_thread.join(); + os_input.unset_raw_mode(0); + let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); + let error = format!("{}\n{}", goto_start_of_last_line, backtrace); + let _ = os_input + .get_stdout_writer() + .write(error.as_bytes()) + .unwrap(); + std::process::exit(1); + } + AppInstruction::ToScreen(instruction) => { + send_screen_instructions.send(instruction).unwrap(); + } + AppInstruction::ToPlugin(instruction) => { + send_plugin_instructions.send(instruction).unwrap(); + } + AppInstruction::ToPty(instruction) => { + let _ = os_input.send_to_server(ServerInstruction::ToPty(instruction)); + } + AppInstruction::OsApi(instruction) => { + let _ = os_input.send_to_server(ServerInstruction::OsApi(instruction)); + } + AppInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), + } + } + + let _ = os_input.send_to_server(ServerInstruction::ClientExit); + let _ = send_screen_instructions.send(ScreenInstruction::Exit); + let _ = send_plugin_instructions.send(PluginInstruction::Exit); + screen_thread.join().unwrap(); + wasm_thread.join().unwrap(); + router_thread.join().unwrap(); + + // cleanup(); + let reset_style = "\u{1b}[m"; + let show_cursor = "\u{1b}[?25h"; + let restore_snapshot = "\u{1b}[?1049l"; + let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); + let goodbye_message = format!( + "{}\n{}{}{}Bye from Zellij!\n", + goto_start_of_last_line, restore_snapshot, reset_style, show_cursor + ); + + os_input.unset_raw_mode(0); + let _ = os_input + .get_stdout_writer() + .write(goodbye_message.as_bytes()) + .unwrap(); + os_input.get_stdout_writer().flush().unwrap(); +} diff --git a/src/client/tab.rs b/src/client/tab.rs index d5ad77a2..7dba2e96 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -1,8 +1,9 @@ //! `Tab`s holds multiple panes. It tracks their coordinates (x/y) and size, //! as well as how they should be resized -use crate::client::pane_resizer::PaneResizer; -use crate::common::{input::handler::parse_keys, AppInstruction, SenderWithContext}; +use crate::boundaries::colors; +use crate::client::AppInstruction; +use crate::common::{input::handler::parse_keys, SenderWithContext}; use crate::layout::Layout; use crate::os_input_output::{ClientOsApi, ServerOsApiInstruction}; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; diff --git a/src/common/errors.rs b/src/common/errors.rs index 3b3d79d8..ab831bc4 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -1,9 +1,8 @@ //! Error context system based on a thread-local representation of the call stack, itself based on //! the instructions that are sent between threads. -use super::{ - os_input_output::ServerOsApiInstruction, AppInstruction, ServerInstruction, OPENCALLS, -}; +use super::{os_input_output::ServerOsApiInstruction, ServerInstruction, OPENCALLS}; +use crate::client::AppInstruction; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; use serde::{Deserialize, Serialize}; diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 52d4082b..447cc443 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -1,9 +1,9 @@ //! Main input logic. use super::actions::Action; -use super::keybinds::Keybinds; -use crate::common::input::config::Config; -use crate::common::{AppInstruction, SenderWithContext, OPENCALLS}; +use super::keybinds::get_default_keybinds; +use crate::client::AppInstruction; +use crate::common::{SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::ClientOsApi; use crate::pty_bus::PtyInstruction; diff --git a/src/common/mod.rs b/src/common/mod.rs index 72067219..d9b5e6cf 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -9,44 +9,11 @@ pub mod setup; pub mod utils; pub mod wasm_vm; +use crate::panes::PaneId; +use crate::server::ServerInstruction; +use errors::ErrorContext; use std::cell::RefCell; use std::sync::mpsc; -use std::thread; -use std::{collections::HashMap, fs}; -use std::{ - collections::HashSet, - io::Write, - str::FromStr, - sync::{Arc, Mutex}, -}; - -use crate::cli::CliArgs; -use crate::layout::Layout; -use crate::panes::PaneId; -use crate::server::{start_server, ServerInstruction}; -use command_is_executing::CommandIsExecuting; -use directories_next::ProjectDirs; -use errors::{AppContext, ContextType, ErrorContext, PluginContext, ScreenContext}; -use input::handler::input_loop; -use os_input_output::{ClientOsApi, ServerOsApi, ServerOsApiInstruction}; -use pty_bus::PtyInstruction; -use screen::{Screen, ScreenInstruction}; -use serde::{Deserialize, Serialize}; -use wasm_vm::PluginEnv; -use wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginInstruction}; -use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; -use wasmer_wasi::{Pipe, WasiState}; -use zellij_tile::data::{EventType, InputMode}; - -/// Instructions sent from server to client -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum ClientInstruction { - ToScreen(ScreenInstruction), - ClosePluginPane(u32), - Error(String), - DoneClosingPane, - Exit, -} /// An [MPSC](mpsc) asynchronous channel with added error context. pub type ChannelWithContext = ( @@ -97,495 +64,5 @@ unsafe impl Sync for SenderWithContext {} thread_local!( /// A key to some thread local storage (TLS) that holds a representation of the thread's call /// stack in the form of an [`ErrorContext`]. - static OPENCALLS: RefCell = RefCell::default() + pub static OPENCALLS: RefCell = RefCell::default() ); - -/// Instructions related to the client-side application. -#[derive(Clone)] -pub enum AppInstruction { - Exit, - Error(String), - ToPty(PtyInstruction), - ToScreen(ScreenInstruction), - ToPlugin(PluginInstruction), - OsApi(ServerOsApiInstruction), - DoneClosingPane, -} - -impl From for AppInstruction { - fn from(item: ClientInstruction) -> Self { - match item { - ClientInstruction::ToScreen(s) => AppInstruction::ToScreen(s), - ClientInstruction::Error(e) => AppInstruction::Error(e), - ClientInstruction::ClosePluginPane(p) => { - AppInstruction::ToPlugin(PluginInstruction::Unload(p)) - } - ClientInstruction::DoneClosingPane => AppInstruction::DoneClosingPane, - ClientInstruction::Exit => AppInstruction::Exit, - } - } -} - -/// Start Zellij with the specified [`ClientOsApi`], [`ServerOsApi`] and command-line arguments. -// FIXME this should definitely be modularized and split into different functions. -pub fn start( - mut os_input: Box, - opts: CliArgs, - server_os_input: Box, -) { - let ipc_thread = start_server(server_os_input, opts.clone()); - - let take_snapshot = "\u{1b}[?1049h"; - os_input.unset_raw_mode(0); - let _ = os_input - .get_stdout_writer() - .write(take_snapshot.as_bytes()) - .unwrap(); - - let mut command_is_executing = CommandIsExecuting::new(); - - let full_screen_ws = os_input.get_terminal_size_using_fd(0); - os_input.set_raw_mode(0); - let (send_screen_instructions, receive_screen_instructions): ChannelWithContext< - ScreenInstruction, - > = mpsc::channel(); - let send_screen_instructions = - SenderWithContext::new(SenderType::Sender(send_screen_instructions)); - - let (send_plugin_instructions, receive_plugin_instructions): ChannelWithContext< - PluginInstruction, - > = mpsc::channel(); - let send_plugin_instructions = - SenderWithContext::new(SenderType::Sender(send_plugin_instructions)); - - let (send_app_instructions, receive_app_instructions): SyncChannelWithContext = - mpsc::sync_channel(500); - let mut send_app_instructions = - SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - - os_input.connect_to_server(); - - #[cfg(not(test))] - std::panic::set_hook({ - use crate::errors::handle_panic; - let send_app_instructions = send_app_instructions.clone(); - Box::new(move |info| { - handle_panic(info, &send_app_instructions); - }) - }); - - let screen_thread = thread::Builder::new() - .name("screen".to_string()) - .spawn({ - let mut command_is_executing = command_is_executing.clone(); - let os_input = os_input.clone(); - let send_plugin_instructions = send_plugin_instructions.clone(); - let send_app_instructions = send_app_instructions.clone(); - let max_panes = opts.max_panes; - let colors = os_input.load_palette(); - move || { - let mut screen = Screen::new( - receive_screen_instructions, - send_plugin_instructions, - send_app_instructions, - &full_screen_ws, - os_input, - max_panes, - ModeInfo { - palette: colors, - ..ModeInfo::default() - }, - InputMode::Normal, - colors, - ); - loop { - let (event, mut err_ctx) = screen - .receiver - .recv() - .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Screen(ScreenContext::from(&event))); - screen.send_app_instructions.update(err_ctx); - match event { - ScreenInstruction::PtyBytes(pid, vte_bytes) => { - let active_tab = screen.get_active_tab_mut().unwrap(); - if active_tab.has_terminal_pid(pid) { - // it's most likely that this event is directed at the active tab - // look there first - active_tab.handle_pty_bytes(pid, vte_bytes); - } else { - // if this event wasn't directed at the active tab, start looking - // in other tabs - let all_tabs = screen.get_tabs_mut(); - for tab in all_tabs.values_mut() { - if tab.has_terminal_pid(pid) { - tab.handle_pty_bytes(pid, vte_bytes); - break; - } - } - } - } - ScreenInstruction::Render => { - screen.render(); - } - ScreenInstruction::NewPane(pid) => { - screen.get_active_tab_mut().unwrap().new_pane(pid); - command_is_executing.done_opening_new_pane(); - } - ScreenInstruction::HorizontalSplit(pid) => { - screen.get_active_tab_mut().unwrap().horizontal_split(pid); - command_is_executing.done_opening_new_pane(); - } - ScreenInstruction::VerticalSplit(pid) => { - screen.get_active_tab_mut().unwrap().vertical_split(pid); - command_is_executing.done_opening_new_pane(); - } - ScreenInstruction::WriteCharacter(bytes) => { - let active_tab = screen.get_active_tab_mut().unwrap(); - match active_tab.is_sync_panes_active() { - true => active_tab.write_to_terminals_on_current_tab(bytes), - false => active_tab.write_to_active_terminal(bytes), - } - } - ScreenInstruction::ResizeLeft => { - screen.get_active_tab_mut().unwrap().resize_left(); - } - ScreenInstruction::ResizeRight => { - screen.get_active_tab_mut().unwrap().resize_right(); - } - ScreenInstruction::ResizeDown => { - screen.get_active_tab_mut().unwrap().resize_down(); - } - ScreenInstruction::ResizeUp => { - screen.get_active_tab_mut().unwrap().resize_up(); - } - ScreenInstruction::SwitchFocus => { - screen.get_active_tab_mut().unwrap().move_focus(); - } - ScreenInstruction::FocusNextPane => { - screen.get_active_tab_mut().unwrap().focus_next_pane(); - } - ScreenInstruction::FocusPreviousPane => { - screen.get_active_tab_mut().unwrap().focus_previous_pane(); - } - ScreenInstruction::MoveFocusLeft => { - screen.get_active_tab_mut().unwrap().move_focus_left(); - } - ScreenInstruction::MoveFocusDown => { - screen.get_active_tab_mut().unwrap().move_focus_down(); - } - ScreenInstruction::MoveFocusRight => { - screen.get_active_tab_mut().unwrap().move_focus_right(); - } - ScreenInstruction::MoveFocusUp => { - screen.get_active_tab_mut().unwrap().move_focus_up(); - } - ScreenInstruction::ScrollUp => { - screen - .get_active_tab_mut() - .unwrap() - .scroll_active_terminal_up(); - } - ScreenInstruction::ScrollDown => { - screen - .get_active_tab_mut() - .unwrap() - .scroll_active_terminal_down(); - } - ScreenInstruction::PageScrollUp => { - screen - .get_active_tab_mut() - .unwrap() - .scroll_active_terminal_up_page(); - } - ScreenInstruction::PageScrollDown => { - screen - .get_active_tab_mut() - .unwrap() - .scroll_active_terminal_down_page(); - } - ScreenInstruction::ClearScroll => { - screen - .get_active_tab_mut() - .unwrap() - .clear_active_terminal_scroll(); - } - ScreenInstruction::CloseFocusedPane => { - screen.get_active_tab_mut().unwrap().close_focused_pane(); - screen.render(); - } - ScreenInstruction::SetSelectable(id, selectable) => { - screen - .get_active_tab_mut() - .unwrap() - .set_pane_selectable(id, selectable); - } - ScreenInstruction::SetMaxHeight(id, max_height) => { - screen - .get_active_tab_mut() - .unwrap() - .set_pane_max_height(id, max_height); - } - ScreenInstruction::SetInvisibleBorders(id, invisible_borders) => { - screen - .get_active_tab_mut() - .unwrap() - .set_pane_invisible_borders(id, invisible_borders); - screen.render(); - } - ScreenInstruction::ClosePane(id) => { - screen.get_active_tab_mut().unwrap().close_pane(id); - screen.render(); - } - ScreenInstruction::ToggleActiveTerminalFullscreen => { - screen - .get_active_tab_mut() - .unwrap() - .toggle_active_pane_fullscreen(); - } - ScreenInstruction::NewTab(pane_id) => { - screen.new_tab(pane_id); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::SwitchTabNext => { - screen.switch_tab_next(); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::SwitchTabPrev => { - screen.switch_tab_prev(); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::CloseTab => { - screen.close_tab(); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => { - screen.apply_layout(Layout::new(layout), new_pane_pids); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::GoToTab(tab_index) => { - screen.go_to_tab(tab_index as usize); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::UpdateTabName(c) => { - screen.update_active_tab_name(c); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::ChangeInputMode(input_mode) => { - screen.change_input_mode(input_mode); - } - ScreenInstruction::Exit => { - break; - } - } - } - } - }) - .unwrap(); - - let wasm_thread = thread::Builder::new() - .name("wasm".to_string()) - .spawn({ - let mut send_screen_instructions = send_screen_instructions.clone(); - let mut send_app_instructions = send_app_instructions.clone(); - - let store = Store::default(); - let mut plugin_id = 0; - let mut plugin_map = HashMap::new(); - move || loop { - let (event, mut err_ctx) = receive_plugin_instructions - .recv() - .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Plugin(PluginContext::from(&event))); - send_screen_instructions.update(err_ctx); - send_app_instructions.update(err_ctx); - match event { - PluginInstruction::Load(pid_tx, path) => { - let plugin_dir = data_dir.join("plugins/"); - let wasm_bytes = fs::read(&path) - .or_else(|_| fs::read(&path.with_extension("wasm"))) - .or_else(|_| fs::read(&plugin_dir.join(&path).with_extension("wasm"))) - .unwrap_or_else(|_| panic!("cannot find plugin {}", &path.display())); - - // FIXME: Cache this compiled module on disk. I could use `(de)serialize_to_file()` for that - let module = Module::new(&store, &wasm_bytes).unwrap(); - - let output = Pipe::new(); - let input = Pipe::new(); - let mut wasi_env = WasiState::new("Zellij") - .env("CLICOLOR_FORCE", "1") - .preopen(|p| { - p.directory(".") // FIXME: Change this to a more meaningful dir - .alias(".") - .read(true) - .write(true) - .create(true) - }) - .unwrap() - .stdin(Box::new(input)) - .stdout(Box::new(output)) - .finalize() - .unwrap(); - - let wasi = wasi_env.import_object(&module).unwrap(); - - let plugin_env = PluginEnv { - plugin_id, - send_screen_instructions: send_screen_instructions.clone(), - send_app_instructions: send_app_instructions.clone(), - send_plugin_instructions: send_plugin_instructions.clone(), - wasi_env, - subscriptions: Arc::new(Mutex::new(HashSet::new())), - }; - - let zellij = zellij_exports(&store, &plugin_env); - let instance = Instance::new(&module, &zellij.chain_back(wasi)).unwrap(); - - let start = instance.exports.get_function("_start").unwrap(); - - // This eventually calls the `.load()` method - start.call(&[]).unwrap(); - - plugin_map.insert(plugin_id, (instance, plugin_env)); - pid_tx.send(plugin_id).unwrap(); - plugin_id += 1; - } - PluginInstruction::Update(pid, event) => { - for (&i, (instance, plugin_env)) in &plugin_map { - let subs = plugin_env.subscriptions.lock().unwrap(); - // FIXME: This is very janky... Maybe I should write my own macro for Event -> EventType? - let event_type = EventType::from_str(&event.to_string()).unwrap(); - if (pid.is_none() || pid == Some(i)) && subs.contains(&event_type) { - let update = instance.exports.get_function("update").unwrap(); - wasi_write_object(&plugin_env.wasi_env, &event); - update.call(&[]).unwrap(); - } - } - drop(send_screen_instructions.send(ScreenInstruction::Render)); - } - PluginInstruction::Render(buf_tx, pid, rows, cols) => { - let (instance, plugin_env) = plugin_map.get(&pid).unwrap(); - - let render = instance.exports.get_function("render").unwrap(); - - render - .call(&[Value::I32(rows as i32), Value::I32(cols as i32)]) - .unwrap(); - - buf_tx.send(wasi_read_string(&plugin_env.wasi_env)).unwrap(); - } - PluginInstruction::Unload(pid) => drop(plugin_map.remove(&pid)), - PluginInstruction::Exit => break, - } - } - }) - .unwrap(); - - let _stdin_thread = thread::Builder::new() - .name("stdin_handler".to_string()) - .spawn({ - let send_screen_instructions = send_screen_instructions.clone(); - let send_plugin_instructions = send_plugin_instructions.clone(); - let send_app_instructions = send_app_instructions.clone(); - let command_is_executing = command_is_executing.clone(); - let os_input = os_input.clone(); - let config = config; - move || { - input_loop( - os_input, - config, - command_is_executing, - send_screen_instructions, - send_plugin_instructions, - send_app_instructions, - ) - } - }); - - let router_thread = thread::Builder::new() - .name("router".to_string()) - .spawn({ - let os_input = os_input.clone(); - move || loop { - let (instruction, err_ctx) = os_input.client_recv(); - send_app_instructions.update(err_ctx); - match instruction { - ClientInstruction::Exit => break, - _ => { - send_app_instructions - .send(AppInstruction::from(instruction)) - .unwrap(); - } - } - } - }) - .unwrap(); - - #[warn(clippy::never_loop)] - loop { - let (app_instruction, mut err_ctx) = receive_app_instructions - .recv() - .expect("failed to receive app instruction on channel"); - - err_ctx.add_call(ContextType::App(AppContext::from(&app_instruction))); - send_screen_instructions.update(err_ctx); - os_input.update_senders(err_ctx); - match app_instruction { - AppInstruction::Exit => break, - AppInstruction::Error(backtrace) => { - let _ = os_input.send_to_server(ServerInstruction::ClientExit); - let _ = send_screen_instructions.send(ScreenInstruction::Exit); - let _ = send_plugin_instructions.send(PluginInstruction::Exit); - let _ = screen_thread.join(); - let _ = wasm_thread.join(); - let _ = ipc_thread.join(); - //let _ = router_thread.join(); - os_input.unset_raw_mode(0); - let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); - let error = format!("{}\n{}", goto_start_of_last_line, backtrace); - let _ = os_input - .get_stdout_writer() - .write(error.as_bytes()) - .unwrap(); - std::process::exit(1); - } - AppInstruction::ToScreen(instruction) => { - send_screen_instructions.send(instruction).unwrap(); - } - AppInstruction::ToPlugin(instruction) => { - send_plugin_instructions.send(instruction).unwrap(); - } - AppInstruction::ToPty(instruction) => { - let _ = os_input.send_to_server(ServerInstruction::ToPty(instruction)); - } - AppInstruction::OsApi(instruction) => { - let _ = os_input.send_to_server(ServerInstruction::OsApi(instruction)); - } - AppInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), - } - } - - let _ = os_input.send_to_server(ServerInstruction::ClientExit); - let _ = send_screen_instructions.send(ScreenInstruction::Exit); - let _ = send_plugin_instructions.send(PluginInstruction::Exit); - screen_thread.join().unwrap(); - wasm_thread.join().unwrap(); - ipc_thread.join().unwrap(); - router_thread.join().unwrap(); - - // cleanup(); - let reset_style = "\u{1b}[m"; - let show_cursor = "\u{1b}[?25h"; - let restore_snapshot = "\u{1b}[?1049l"; - let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); - let goodbye_message = format!( - "{}\n{}{}{}Bye from Zellij!\n", - goto_start_of_last_line, restore_snapshot, reset_style, show_cursor - ); - - os_input.unset_raw_mode(0); - let _ = os_input - .get_stdout_writer() - .write(goodbye_message.as_bytes()) - .unwrap(); - os_input.get_stdout_writer().flush().unwrap(); -} diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 396a1955..92fc51cb 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -16,7 +16,7 @@ use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; -use crate::common::ClientInstruction; +use crate::client::ClientInstruction; use crate::errors::ErrorContext; use crate::panes::PositionAndSize; use crate::server::ServerInstruction; diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 1d887ba2..593fece0 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -10,13 +10,14 @@ use ::vte; use serde::{Deserialize, Serialize}; use std::path::PathBuf; -use super::{ScreenInstruction, SenderWithContext, OPENCALLS}; +use super::{SenderWithContext, OPENCALLS}; use crate::layout::Layout; use crate::os_input_output::ServerOsApi; use crate::utils::logging::debug_to_file; use crate::{ errors::{ContextType, ErrorContext}, panes::PaneId, + screen::ScreenInstruction, server::ServerInstruction, }; diff --git a/src/common/screen.rs b/src/common/screen.rs index cba24618..229939f1 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -7,7 +7,8 @@ use std::path::PathBuf; use std::str; use std::sync::mpsc::Receiver; -use super::{AppInstruction, SenderWithContext}; +use crate::client::AppInstruction; +use crate::common::SenderWithContext; use crate::os_input_output::ClientOsApi; use crate::panes::PositionAndSize; use crate::pty_bus::{PtyInstruction, VteBytes}; diff --git a/src/common/wasm_vm.rs b/src/common/wasm_vm.rs index 31b1000c..a7cd7543 100644 --- a/src/common/wasm_vm.rs +++ b/src/common/wasm_vm.rs @@ -11,9 +11,8 @@ use wasmer::{imports, Function, ImportObject, Store, WasmerEnv}; use wasmer_wasi::WasiEnv; use zellij_tile::data::{Event, EventType, PluginIds}; -use super::{ - pty_bus::PtyInstruction, screen::ScreenInstruction, AppInstruction, PaneId, SenderWithContext, -}; +use super::{pty_bus::PtyInstruction, screen::ScreenInstruction, PaneId, SenderWithContext}; +use crate::client::AppInstruction; #[derive(Clone, Debug)] pub enum PluginInstruction { diff --git a/src/main.rs b/src/main.rs index e2d567c4..77dd6f9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,18 +3,16 @@ mod client; mod common; mod server; -use client::{boundaries, layout, panes, tab}; -use common::{ - command_is_executing, errors, os_input_output, pty_bus, screen, start, utils, wasm_vm, -}; +use client::{boundaries, layout, panes, start_client, tab}; +use common::{command_is_executing, errors, os_input_output, pty_bus, screen, utils, wasm_vm}; use directories_next::ProjectDirs; -use server::ServerInstruction; +use server::{start_server, ServerInstruction}; use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::os_input_output::{get_client_os_input, get_server_os_input, ClientOsApi}; +use crate::os_input_output::{get_client_os_input, get_server_os_input, ClientOsApi, ServerOsApi}; use crate::pty_bus::VteEvent; use crate::utils::{ consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, @@ -83,3 +81,15 @@ pub fn main() { start(Box::new(os_input), opts, Box::new(server_os_input)); } } + +/// Start Zellij with the specified [`ClientOsApi`], [`ServerOsApi`] and command-line arguments. +// FIXME this should definitely be modularized and split into different functions. +pub fn start( + client_os_input: Box, + opts: CliArgs, + server_os_input: Box, +) { + let ipc_thread = start_server(server_os_input, opts.clone()); + start_client(client_os_input, opts); + drop(ipc_thread.join()); +} diff --git a/src/server/mod.rs b/src/server/mod.rs index 495cceb4..960b9244 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,5 +1,6 @@ use crate::cli::CliArgs; -use crate::common::{ChannelWithContext, ClientInstruction, SenderType, SenderWithContext}; +use crate::client::ClientInstruction; +use crate::common::{ChannelWithContext, SenderType, SenderWithContext}; use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext, ServerContext}; use crate::os_input_output::{ServerOsApi, ServerOsApiInstruction}; use crate::panes::PaneId; diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index edfd1247..ce514b96 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -7,7 +7,8 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{mpsc, Arc, Mutex}; use std::time::{Duration, Instant}; -use crate::common::{ChannelWithContext, ClientInstruction, SenderType, SenderWithContext}; +use crate::client::ClientInstruction; +use crate::common::{ChannelWithContext, SenderType, SenderWithContext}; use crate::errors::ErrorContext; use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::server::ServerInstruction; From ea732166e35368b423de348a41db41662c3686ad Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Mon, 29 Mar 2021 22:43:54 +0530 Subject: [PATCH 41/64] client side threads should send messages directly to server and router threads should do the actual routing --- src/client/mod.rs | 36 ++- src/client/tab.rs | 421 +++++++++++++++------------------- src/common/errors.rs | 10 +- src/common/input/handler.rs | 12 +- src/common/ipc.rs | 2 +- src/common/os_input_output.rs | 6 +- src/common/screen.rs | 10 +- src/server/mod.rs | 16 +- src/tests/fakes.rs | 2 +- 9 files changed, 228 insertions(+), 287 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index f5c77a5b..e91ad07e 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -25,7 +25,7 @@ use crate::common::{ command_is_executing::CommandIsExecuting, errors::{AppContext, ContextType, PluginContext, ScreenContext}, input::handler::input_loop, - os_input_output::{ClientOsApi, ServerOsApiInstruction}, + os_input_output::ClientOsApi, pty_bus::PtyInstruction, screen::{Screen, ScreenInstruction}, wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginEnv, PluginInstruction}, @@ -50,22 +50,15 @@ pub enum AppInstruction { Exit, Error(String), ToPty(PtyInstruction), - ToScreen(ScreenInstruction), - ToPlugin(PluginInstruction), - OsApi(ServerOsApiInstruction), DoneClosingPane, } impl From for AppInstruction { fn from(item: ClientInstruction) -> Self { match item { - ClientInstruction::ToScreen(s) => AppInstruction::ToScreen(s), ClientInstruction::Error(e) => AppInstruction::Error(e), - ClientInstruction::ClosePluginPane(p) => { - AppInstruction::ToPlugin(PluginInstruction::Unload(p)) - } ClientInstruction::DoneClosingPane => AppInstruction::DoneClosingPane, - ClientInstruction::Exit => AppInstruction::Exit, + _ => panic!("Unsupported AppInstruction"), } } } @@ -137,6 +130,10 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { .expect("failed to receive event on channel"); err_ctx.add_call(ContextType::Screen(ScreenContext::from(&event))); screen.send_app_instructions.update(err_ctx); + screen.os_api.update_senders(err_ctx); + if let Some(t) = screen.get_active_tab_mut() { + t.os_api.update_senders(err_ctx); + } match event { ScreenInstruction::Pty(pid, vte_event) => { screen @@ -407,12 +404,22 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { let router_thread = thread::Builder::new() .name("router".to_string()) .spawn({ + let mut send_screen_instructions = send_screen_instructions.clone(); + let mut send_plugin_instructions = send_plugin_instructions.clone(); let os_input = os_input.clone(); move || loop { let (instruction, err_ctx) = os_input.client_recv(); send_app_instructions.update(err_ctx); + send_screen_instructions.update(err_ctx); + send_plugin_instructions.update(err_ctx); match instruction { ClientInstruction::Exit => break, + ClientInstruction::ClosePluginPane(p) => { + send_plugin_instructions + .send(PluginInstruction::Unload(p)) + .unwrap(); + } + ClientInstruction::ToScreen(s) => send_screen_instructions.send(s).unwrap(), _ => { send_app_instructions .send(AppInstruction::from(instruction)) @@ -449,17 +456,8 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { .unwrap(); std::process::exit(1); } - AppInstruction::ToScreen(instruction) => { - send_screen_instructions.send(instruction).unwrap(); - } - AppInstruction::ToPlugin(instruction) => { - send_plugin_instructions.send(instruction).unwrap(); - } AppInstruction::ToPty(instruction) => { - let _ = os_input.send_to_server(ServerInstruction::ToPty(instruction)); - } - AppInstruction::OsApi(instruction) => { - let _ = os_input.send_to_server(ServerInstruction::OsApi(instruction)); + os_input.send_to_server(ServerInstruction::ToPty(instruction)); } AppInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), } diff --git a/src/client/tab.rs b/src/client/tab.rs index 7dba2e96..6fe72131 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -8,6 +8,7 @@ use crate::layout::Layout; use crate::os_input_output::{ClientOsApi, ServerOsApiInstruction}; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; use crate::pty_bus::{PtyInstruction, VteEvent}; +use crate::server::ServerInstruction; use crate::utils::shared::pad_to_size; use crate::wasm_vm::PluginInstruction; use crate::{boundaries::Boundaries, panes::PluginPane}; @@ -67,7 +68,7 @@ pub struct Tab { max_panes: Option, full_screen_ws: PositionAndSize, fullscreen_is_active: bool, - os_api: Box, + pub os_api: Box, pub send_plugin_instructions: SenderWithContext, pub send_app_instructions: SenderWithContext, should_clear_display_before_rendering: bool, @@ -234,15 +235,13 @@ impl Tab { ) -> Self { let panes = if let Some(PaneId::Terminal(pid)) = pane_id { let new_terminal = TerminalPane::new(pid, *full_screen_ws); - send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )) - .unwrap(); + os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )); let mut panes: BTreeMap> = BTreeMap::new(); panes.insert(PaneId::Terminal(pid), Box::new(new_terminal)); panes @@ -295,15 +294,13 @@ impl Tab { terminal_pane.set_max_width(max_columns); } terminal_pane.change_pos_and_size(&position_and_size); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *pid, - position_and_size.columns as u16, - position_and_size.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *pid, + position_and_size.columns as u16, + position_and_size.rows as u16, + ), + )); } None => { // we filled the entire layout, no room for this pane @@ -345,15 +342,13 @@ impl Tab { // there are still panes left to fill, use the pids we received in this method let pid = new_pids.next().unwrap(); // if this crashes it means we got less pids than there are panes in this layout let new_terminal = TerminalPane::new(*pid, *position_and_size); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )); self.panes .insert(PaneId::Terminal(*pid), Box::new(new_terminal)); } @@ -362,11 +357,10 @@ impl Tab { // this is a bit of a hack and happens because we don't have any central location that // 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 - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::ClosePane( + self.os_api + .send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane( PaneId::Terminal(*unused_pid), - ))) - .unwrap(); + ))); } self.active_terminal = self.panes.iter().map(|(id, _)| id.to_owned()).next(); self.render(); @@ -379,15 +373,13 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -413,9 +405,8 @@ impl Tab { }, ); if terminal_id_to_split.is_none() { - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty - .unwrap(); + self.os_api + .send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(pid))); // we can't open this pane, close the pty return; // likely no terminal large enough to split } let terminal_id_to_split = terminal_id_to_split.unwrap(); @@ -433,27 +424,23 @@ impl Tab { if let PaneId::Terminal(term_pid) = pid { let (top_winsize, bottom_winsize) = split_horizontally_with_gap(&terminal_ws); let new_terminal = TerminalPane::new(term_pid, bottom_winsize); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - bottom_winsize.columns as u16, - bottom_winsize.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + bottom_winsize.columns as u16, + bottom_winsize.rows as u16, + ), + )); terminal_to_split.change_pos_and_size(&top_winsize); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(terminal_id_to_split) = terminal_id_to_split { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - terminal_id_to_split, - top_winsize.columns as u16, - top_winsize.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + terminal_id_to_split, + top_winsize.columns as u16, + top_winsize.rows as u16, + ), + )); } self.active_terminal = Some(pid); } @@ -461,27 +448,23 @@ impl Tab { if let PaneId::Terminal(term_pid) = pid { let (left_winsize, right_winsize) = split_vertically_with_gap(&terminal_ws); let new_terminal = TerminalPane::new(term_pid, right_winsize); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - right_winsize.columns as u16, - right_winsize.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + right_winsize.columns as u16, + right_winsize.rows as u16, + ), + )); terminal_to_split.change_pos_and_size(&left_winsize); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(terminal_id_to_split) = terminal_id_to_split { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - terminal_id_to_split, - left_winsize.columns as u16, - left_winsize.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + terminal_id_to_split, + left_winsize.columns as u16, + left_winsize.rows as u16, + ), + )); } } } @@ -497,15 +480,13 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -514,9 +495,8 @@ impl Tab { let active_pane_id = &self.get_active_pane_id().unwrap(); let active_pane = self.panes.get_mut(active_pane_id).unwrap(); if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 { - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty - .unwrap(); + self.os_api + .send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(pid))); // we can't open this pane, close the pty return; } let terminal_ws = PositionAndSize { @@ -530,27 +510,23 @@ impl Tab { active_pane.change_pos_and_size(&top_winsize); let new_terminal = TerminalPane::new(term_pid, bottom_winsize); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - bottom_winsize.columns as u16, - bottom_winsize.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + bottom_winsize.columns as u16, + bottom_winsize.rows as u16, + ), + )); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(active_terminal_pid) = active_pane_id { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *active_terminal_pid, - top_winsize.columns as u16, - top_winsize.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *active_terminal_pid, + top_winsize.columns as u16, + top_winsize.rows as u16, + ), + )); } self.active_terminal = Some(pid); @@ -565,15 +541,13 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ), + )); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -582,9 +556,8 @@ impl Tab { let active_pane_id = &self.get_active_pane_id().unwrap(); let active_pane = self.panes.get_mut(active_pane_id).unwrap(); if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 { - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) // we can't open this pane, close the pty - .unwrap(); + self.os_api + .send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(pid))); // we can't open this pane, close the pty return; } let terminal_ws = PositionAndSize { @@ -598,27 +571,23 @@ impl Tab { active_pane.change_pos_and_size(&left_winsize); let new_terminal = TerminalPane::new(term_pid, right_winsize); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - right_winsize.columns as u16, - right_winsize.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + new_terminal.pid, + right_winsize.columns as u16, + right_winsize.rows as u16, + ), + )); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(active_terminal_pid) = active_pane_id { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *active_terminal_pid, - left_winsize.columns as u16, - left_winsize.rows as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *active_terminal_pid, + left_winsize.columns as u16, + left_winsize.rows as u16, + ), + )); } self.active_terminal = Some(pid); @@ -676,16 +645,12 @@ impl Tab { Some(PaneId::Terminal(active_terminal_id)) => { let active_terminal = self.get_active_pane().unwrap(); let adjusted_input = active_terminal.adjust_input_to_terminal(input_bytes); - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::WriteToTtyStdin(active_terminal_id, adjusted_input), - )) - .unwrap(); - self.send_app_instructions - .send(AppInstruction::OsApi(ServerOsApiInstruction::TcDrain( - active_terminal_id, - ))) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::WriteToTtyStdin(active_terminal_id, adjusted_input), + )); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::TcDrain(active_terminal_id), + )); } Some(PaneId::Plugin(pid)) => { for key in parse_keys(&input_bytes) { @@ -747,15 +712,13 @@ impl Tab { } let active_terminal = self.panes.get(&active_pane_id).unwrap(); if let PaneId::Terminal(active_pid) = active_pane_id { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - active_pid, - active_terminal.columns() as u16, - active_terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + active_pid, + active_terminal.columns() as u16, + active_terminal.rows() as u16, + ), + )); } self.render(); self.toggle_fullscreen_is_active(); @@ -1315,120 +1278,104 @@ impl Tab { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_height_down(count); if let PaneId::Terminal(pid) = id { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )); } } fn reduce_pane_height_up(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_height_up(count); if let PaneId::Terminal(pid) = id { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + *pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )); } } fn increase_pane_height_down(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_height_down(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )); } } fn increase_pane_height_up(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_height_up(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )); } } fn increase_pane_width_right(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_width_right(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )); } } fn increase_pane_width_left(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_width_left(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )); } } fn reduce_pane_width_right(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_width_right(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )); } } fn reduce_pane_width_left(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_width_left(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.send_app_instructions - .send(AppInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )) - .unwrap(); + self.os_api.send_to_server(ServerInstruction::OsApi( + ServerOsApiInstruction::SetTerminalSizeUsingFd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ), + )); } } fn pane_is_between_vertical_borders( @@ -2197,9 +2144,8 @@ impl Tab { if let Some(max_panes) = self.max_panes { let terminals = self.get_pane_ids(); for &pid in terminals.iter().skip(max_panes - 1) { - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::ClosePane(pid))) - .unwrap(); + self.os_api + .send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane(pid))); self.close_pane_without_rerender(pid); } } @@ -2309,11 +2255,10 @@ impl Tab { pub fn close_focused_pane(&mut self) { if let Some(active_pane_id) = self.get_active_pane_id() { self.close_pane(active_pane_id); - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::ClosePane( + self.os_api + .send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane( active_pane_id, - ))) - .unwrap(); + ))); } } pub fn scroll_active_terminal_up(&mut self) { diff --git a/src/common/errors.rs b/src/common/errors.rs index ab831bc4..3ee36752 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -350,11 +350,8 @@ impl From<&PluginInstruction> for PluginContext { pub enum AppContext { Exit, Error, - ToPty, - ToPlugin, - ToScreen, DoneClosingPane, - OsApi, + ToPty, } impl From<&AppInstruction> for AppContext { @@ -362,11 +359,8 @@ impl From<&AppInstruction> for AppContext { match *app_instruction { AppInstruction::Exit => AppContext::Exit, AppInstruction::Error(_) => AppContext::Error, - AppInstruction::ToPty(_) => AppContext::ToPty, - AppInstruction::OsApi(_) => AppContext::OsApi, - AppInstruction::ToPlugin(_) => AppContext::ToPlugin, - AppInstruction::ToScreen(_) => AppContext::ToScreen, AppInstruction::DoneClosingPane => AppContext::DoneClosingPane, + AppInstruction::ToPty(_) => AppContext::ToPty, } } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 447cc443..09cc1a0d 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -8,6 +8,7 @@ use crate::errors::ContextType; use crate::os_input_output::ClientOsApi; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; +use crate::server::ServerInstruction; use crate::wasm_vm::PluginInstruction; use crate::CommandIsExecuting; @@ -56,6 +57,7 @@ impl InputHandler { err_ctx.add_call(ContextType::StdinHandler); self.send_app_instructions.update(err_ctx); self.send_screen_instructions.update(err_ctx); + self.os_input.update_senders(err_ctx); if let Ok(keybinds) = get_default_keybinds() { 'input_loop: loop { //@@@ I think this should actually just iterate over stdin directly @@ -225,9 +227,8 @@ impl InputHandler { None => PtyInstruction::SpawnTerminal(None), }; self.command_is_executing.opening_new_pane(); - self.send_app_instructions - .send(AppInstruction::ToPty(pty_instr)) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::ToPty(pty_instr)); self.command_is_executing.wait_until_new_pane_is_opened(); } Action::CloseFocus => { @@ -239,9 +240,8 @@ impl InputHandler { } Action::NewTab => { self.command_is_executing.updating_tabs(); - self.send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::NewTab)) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::ToPty(PtyInstruction::NewTab)); self.command_is_executing.wait_until_tabs_are_updated(); } Action::GoToNextTab => { diff --git a/src/common/ipc.rs b/src/common/ipc.rs index 81576b86..68aa676b 100644 --- a/src/common/ipc.rs +++ b/src/common/ipc.rs @@ -24,7 +24,7 @@ pub enum ClientType { // Types of messages sent from the client to the server #[derive(Serialize, Deserialize)] -pub enum ClientToServerMsg { +pub enum _ClientToServerMsg { // List which sessions are available ListSessions, // Create a new session diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 92fc51cb..7cc43e27 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -189,7 +189,7 @@ impl IpcSenderWithContext { /// Sends an event, along with the current [`ErrorContext`], on this /// [`IpcSenderWithContext`]'s channel. - fn send(&mut self, msg: T) -> ipmpsc::Result<()> { + fn send(&self, msg: T) -> ipmpsc::Result<()> { self.sender.send(&(msg, self.err_ctx)) } } @@ -335,7 +335,7 @@ pub trait ClientOsApi: Send + Sync { /// Returns a [`Box`] pointer to this [`ClientOsApi`] struct. fn box_clone(&self) -> Box; /// Sends a message to the server. - fn send_to_server(&mut self, msg: ServerInstruction); + fn send_to_server(&self, msg: ServerInstruction); /// Update ErrorContext of senders fn update_senders(&mut self, new_ctx: ErrorContext); /// Receives a message on client-side IPC channel @@ -372,7 +372,7 @@ impl ClientOsApi for ClientOsInputOutput { let stdout = ::std::io::stdout(); Box::new(stdout) } - fn send_to_server(&mut self, msg: ServerInstruction) { + fn send_to_server(&self, msg: ServerInstruction) { self.server_sender.send(msg).unwrap(); } fn update_senders(&mut self, new_ctx: ErrorContext) { diff --git a/src/common/screen.rs b/src/common/screen.rs index 229939f1..65222894 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -11,7 +11,8 @@ use crate::client::AppInstruction; use crate::common::SenderWithContext; use crate::os_input_output::ClientOsApi; use crate::panes::PositionAndSize; -use crate::pty_bus::{PtyInstruction, VteBytes}; +use crate::pty_bus::{PtyInstruction, VteEvent}; +use crate::server::ServerInstruction; use crate::tab::Tab; use crate::{errors::ErrorContext, wasm_vm::PluginInstruction}; use crate::{layout::Layout, panes::PaneId}; @@ -80,7 +81,7 @@ pub struct Screen { /// The index of this [`Screen`]'s active [`Tab`]. active_tab_index: Option, /// The [`ClientOsApi`] this [`Screen`] uses. - os_api: Box, + pub os_api: Box, input_mode: InputMode, } @@ -210,9 +211,8 @@ impl Screen { // below we don't check the result of sending the CloseTab instruction to 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 - let _ = self - .send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::CloseTab(pane_ids))); + self.os_api + .send_to_server(ServerInstruction::ToPty(PtyInstruction::CloseTab(pane_ids))); if self.tabs.is_empty() { self.active_tab_index = None; self.send_app_instructions diff --git a/src/server/mod.rs b/src/server/mod.rs index 960b9244..ea859302 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -165,11 +165,21 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread .name("server_router".to_string()) .spawn({ let os_input = os_input.clone(); + let mut send_os_instructions = send_os_instructions.clone(); + let mut send_pty_instructions = send_pty_instructions.clone(); move || loop { let (instruction, err_ctx) = os_input.server_recv(); send_server_instructions.update(err_ctx); + send_pty_instructions.update(err_ctx); + send_os_instructions.update(err_ctx); match instruction { ServerInstruction::Exit => break, + ServerInstruction::ToPty(instruction) => { + send_pty_instructions.send(instruction).unwrap(); + } + ServerInstruction::OsApi(instruction) => { + send_os_instructions.send(instruction).unwrap(); + } _ => { send_server_instructions.send(instruction).unwrap(); } @@ -213,15 +223,9 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); os_input.add_client_sender(buffer_path); } - ServerInstruction::ToPty(instr) => { - send_pty_instructions.send(instr).unwrap(); - } ServerInstruction::ToScreen(instr) => { os_input.send_to_client(ClientInstruction::ToScreen(instr)); } - ServerInstruction::OsApi(instr) => { - send_os_instructions.send(instr).unwrap(); - } ServerInstruction::DoneClosingPane => { os_input.send_to_client(ClientInstruction::DoneClosingPane); } diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index ce514b96..7c4175bb 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -183,7 +183,7 @@ impl ClientOsApi for FakeInputOutput { fn get_stdout_writer(&self) -> Box { Box::new(self.stdout_writer.clone()) } - fn send_to_server(&mut self, msg: ServerInstruction) { + fn send_to_server(&self, msg: ServerInstruction) { self.server_sender.send(msg).unwrap(); } fn update_senders(&mut self, new_ctx: ErrorContext) { From ee14d5f5ddb75ad6062e978e789f234e8dc09858 Mon Sep 17 00:00:00 2001 From: denis Date: Tue, 30 Mar 2021 14:17:16 +0300 Subject: [PATCH 42/64] wip: helper functions for ServerInstruction --- src/client/tab.rs | 16 ++-- src/common/input/handler.rs | 2 +- src/common/pty_bus.rs | 51 +++++------- src/common/screen.rs | 2 +- src/server/mod.rs | 159 +++++++++++++++++++++++++++++++++--- 5 files changed, 176 insertions(+), 54 deletions(-) diff --git a/src/client/tab.rs b/src/client/tab.rs index 6fe72131..c285cc0b 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -358,8 +358,8 @@ impl Tab { // 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 self.os_api - .send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane( - PaneId::Terminal(*unused_pid), + .send_to_server(ServerInstruction::pty_close_pane(PaneId::Terminal( + *unused_pid, ))); } 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() { 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 } 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(); if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 { 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; } let terminal_ws = PositionAndSize { @@ -557,7 +557,7 @@ impl Tab { let active_pane = self.panes.get_mut(active_pane_id).unwrap(); if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 { 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; } let terminal_ws = PositionAndSize { @@ -2145,7 +2145,7 @@ impl Tab { let terminals = self.get_pane_ids(); for &pid in terminals.iter().skip(max_panes - 1) { 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); } } @@ -2256,9 +2256,7 @@ impl Tab { if let Some(active_pane_id) = self.get_active_pane_id() { self.close_pane(active_pane_id); self.os_api - .send_to_server(ServerInstruction::ToPty(PtyInstruction::ClosePane( - active_pane_id, - ))); + .send_to_server(ServerInstruction::pty_close_pane(active_pane_id)); } } pub fn scroll_active_terminal_up(&mut self) { diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 09cc1a0d..d4ae3080 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -241,7 +241,7 @@ impl InputHandler { Action::NewTab => { self.command_is_executing.updating_tabs(); 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(); } Action::GoToNextTab => { diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 593fece0..bc49e9bd 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -97,18 +97,12 @@ impl VteEventSender { impl vte::Perform for VteEventSender { fn print(&mut self, c: char) { self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( - self.id, - VteEvent::Print(c), - ))) + .send(ServerInstruction::pty(self.id, VteEvent::Print(c))) .unwrap(); } fn execute(&mut self, byte: u8) { self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( - self.id, - VteEvent::Execute(byte), - ))) + .send(ServerInstruction::pty(self.id, VteEvent::Execute(byte))) .unwrap(); } @@ -116,38 +110,32 @@ impl vte::Perform for VteEventSender { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::pty( self.id, VteEvent::Hook(params, intermediates, ignore, c), - ))) + )) .unwrap(); } fn put(&mut self, byte: u8) { self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( - self.id, - VteEvent::Put(byte), - ))) + .send(ServerInstruction::pty(self.id, VteEvent::Put(byte))) .unwrap(); } fn unhook(&mut self) { self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( - self.id, - VteEvent::Unhook, - ))) + .send(ServerInstruction::pty(self.id, VteEvent::Unhook)) .unwrap(); } fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { let params = params.iter().map(|p| p.to_vec()).collect(); self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::pty( self.id, VteEvent::OscDispatch(params, bell_terminated), - ))) + )) .unwrap(); } @@ -155,20 +143,20 @@ impl vte::Perform for VteEventSender { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::pty( self.id, VteEvent::CsiDispatch(params, intermediates, ignore, c), - ))) + )) .unwrap(); } fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) { let intermediates = intermediates.iter().copied().collect(); self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Pty( + .send(ServerInstruction::pty( self.id, VteEvent::EscDispatch(intermediates, ignore, byte), - ))) + )) .unwrap(); } } @@ -233,7 +221,7 @@ fn stream_terminal_bytes( if receive_time.elapsed() > max_render_pause { pending_render = false; send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) + .send(ServerInstruction::render()) .unwrap(); last_byte_receive_time = Some(Instant::now()); } else { @@ -249,7 +237,7 @@ fn stream_terminal_bytes( if pending_render { pending_render = false; send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) + .send(ServerInstruction::render()) .unwrap(); } last_byte_receive_time = None; @@ -257,16 +245,14 @@ fn stream_terminal_bytes( } } send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::Render)) + .send(ServerInstruction::render()) .unwrap(); #[cfg(not(test))] // 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 // a better solution would be to fix the test fakes, but this will do for now send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::ClosePane( - PaneId::Terminal(pid), - ))) + .send(ServerInstruction::screen_close_pane(PaneId::Terminal(pid))) .unwrap(); } }) @@ -311,8 +297,9 @@ impl PtyBus { new_pane_pids.push(pid_primary); } self.send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::ApplyLayout( - (layout_path, new_pane_pids.clone()), + .send(ServerInstruction::apply_layout(( + layout_path, + new_pane_pids.clone(), ))) .unwrap(); for id in new_pane_pids { diff --git a/src/common/screen.rs b/src/common/screen.rs index 65222894..549eccd1 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -212,7 +212,7 @@ impl Screen { // 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 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() { self.active_tab_index = None; self.send_app_instructions diff --git a/src/server/mod.rs b/src/server/mod.rs index ea859302..eedc4c3f 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,4 +1,3 @@ -use crate::cli::CliArgs; use crate::client::ClientInstruction; use crate::common::{ChannelWithContext, SenderType, SenderWithContext}; 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::pty_bus::{PtyBus, PtyInstruction}; use crate::screen::ScreenInstruction; +use crate::{cli::CliArgs, common::pty_bus::VteEvent}; use serde::{Deserialize, Serialize}; +use std::os::unix::io::RawFd; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; +use zellij_tile::prelude::InputMode; /// Instructions related to server-side application including the /// ones sent by client to server @@ -28,6 +30,147 @@ pub enum ServerInstruction { ClientExit, Exit, } +impl ServerInstruction { + // ToPty + pub fn spawn_terminal(path: Option) -> Self { + Self::ToPty(PtyInstruction::SpawnTerminal(path)) + } + pub fn spawn_terminal_vertically(path: Option) -> Self { + Self::ToPty(PtyInstruction::SpawnTerminalVertically(path)) + } + pub fn spawn_terminal_horizontally(path: Option) -> 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) -> 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) -> 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)) -> 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) -> 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) -> 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, opts: CliArgs) -> thread::JoinHandle<()> { let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = @@ -80,27 +223,21 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread let pid = pty_bus.spawn_terminal(file_to_open); pty_bus .send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::NewPane( - PaneId::Terminal(pid), - ))) + .send(ServerInstruction::new_pane(PaneId::Terminal(pid))) .unwrap(); } PtyInstruction::SpawnTerminalVertically(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); pty_bus .send_server_instructions - .send(ServerInstruction::ToScreen( - ScreenInstruction::VerticalSplit(PaneId::Terminal(pid)), - )) + .send(ServerInstruction::vertical_split(PaneId::Terminal(pid))) .unwrap(); } PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { let pid = pty_bus.spawn_terminal(file_to_open); pty_bus .send_server_instructions - .send(ServerInstruction::ToScreen( - ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid)), - )) + .send(ServerInstruction::horizontal_split(PaneId::Terminal(pid))) .unwrap(); } PtyInstruction::NewTab => { @@ -110,7 +247,7 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread let pid = pty_bus.spawn_terminal(None); pty_bus .send_server_instructions - .send(ServerInstruction::ToScreen(ScreenInstruction::NewTab(pid))) + .send(ServerInstruction::screen_new_tab(pid)) .unwrap(); } } From 223ee743e1b503f7d81c06343c23b2c786b2dbee Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 1 Apr 2021 22:40:40 +0530 Subject: [PATCH 43/64] Move screen and plugins to client side. Remove AppInstruction enum spawn pty thread, screen thread and plugin thread on demand --- src/client/mod.rs | 440 ++---------------- src/client/panes/terminal_pane.rs | 2 +- src/client/tab.rs | 402 +++++++---------- src/common/errors.rs | 83 ++-- src/common/input/handler.rs | 152 +++---- src/common/os_input_output.rs | 22 +- src/common/pty_bus.rs | 85 ++-- src/common/screen.rs | 36 +- src/common/wasm_vm.rs | 9 +- src/main.rs | 4 +- src/server/mod.rs | 710 ++++++++++++++++++++++-------- src/tests/fakes.rs | 7 +- 12 files changed, 921 insertions(+), 1031 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index e91ad07e..ae298a5e 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -4,66 +4,32 @@ pub mod pane_resizer; pub mod panes; pub mod tab; +use serde::{Deserialize, Serialize}; +use std::io::Write; use std::sync::mpsc; use std::thread; -use std::{collections::HashMap, fs}; -use std::{ - collections::HashSet, - io::Write, - str::FromStr, - sync::{Arc, Mutex}, -}; -use directories_next::ProjectDirs; -use serde::{Deserialize, Serialize}; -use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; -use wasmer_wasi::{Pipe, WasiState}; -use zellij_tile::data::{EventType, InputMode}; - -use crate::cli::CliArgs; use crate::common::{ command_is_executing::CommandIsExecuting, - errors::{AppContext, ContextType, PluginContext, ScreenContext}, + errors::{ClientContext, ContextType}, input::handler::input_loop, os_input_output::ClientOsApi, - pty_bus::PtyInstruction, - screen::{Screen, ScreenInstruction}, - wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginEnv, PluginInstruction}, - ChannelWithContext, SenderType, SenderWithContext, SyncChannelWithContext, OPENCALLS, + SenderType, SenderWithContext, SyncChannelWithContext, OPENCALLS, }; -use crate::layout::Layout; use crate::server::ServerInstruction; -/// Instructions sent from server to client +/// Instructions related to the client-side application and sent from server to client #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ClientInstruction { - ToScreen(ScreenInstruction), - ClosePluginPane(u32), Error(String), + Render(String), DoneClosingPane, + DoneOpeningNewPane, + DoneUpdatingTabs, Exit, } -/// Instructions related to the client-side application. -#[derive(Clone)] -pub enum AppInstruction { - Exit, - Error(String), - ToPty(PtyInstruction), - DoneClosingPane, -} - -impl From for AppInstruction { - fn from(item: ClientInstruction) -> Self { - match item { - ClientInstruction::Error(e) => AppInstruction::Error(e), - ClientInstruction::DoneClosingPane => AppInstruction::DoneClosingPane, - _ => panic!("Unsupported AppInstruction"), - } - } -} - -pub fn start_client(mut os_input: Box, opts: CliArgs) { +pub fn start_client(mut os_input: Box) { let take_snapshot = "\u{1b}[?1049h"; os_input.unset_raw_mode(0); let _ = os_input @@ -75,378 +41,68 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { let full_screen_ws = os_input.get_terminal_size_using_fd(0); os_input.set_raw_mode(0); - let (send_screen_instructions, receive_screen_instructions): ChannelWithContext< - ScreenInstruction, - > = mpsc::channel(); let err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); - let mut send_screen_instructions = - SenderWithContext::new(err_ctx, SenderType::Sender(send_screen_instructions)); - let (send_plugin_instructions, receive_plugin_instructions): ChannelWithContext< - PluginInstruction, - > = mpsc::channel(); - let send_plugin_instructions = - SenderWithContext::new(err_ctx, SenderType::Sender(send_plugin_instructions)); + let (send_client_instructions, receive_client_instructions): SyncChannelWithContext< + ClientInstruction, + > = mpsc::sync_channel(500); + let mut send_client_instructions = + SenderWithContext::new(err_ctx, SenderType::SyncSender(send_client_instructions)); - let (send_app_instructions, receive_app_instructions): SyncChannelWithContext = - mpsc::sync_channel(500); - let mut send_app_instructions = - SenderWithContext::new(err_ctx, SenderType::SyncSender(send_app_instructions)); - - os_input.connect_to_server(); + os_input.connect_to_server(full_screen_ws); #[cfg(not(test))] std::panic::set_hook({ use crate::errors::handle_panic; - let send_app_instructions = send_app_instructions.clone(); + let send_client_instructions = send_client_instructions.clone(); Box::new(move |info| { - handle_panic(info, &send_app_instructions); + handle_panic(info, &send_client_instructions); }) }); - let screen_thread = thread::Builder::new() - .name("screen".to_string()) - .spawn({ - let mut command_is_executing = command_is_executing.clone(); - let os_input = os_input.clone(); - let send_plugin_instructions = send_plugin_instructions.clone(); - let send_app_instructions = send_app_instructions.clone(); - let max_panes = opts.max_panes; - - move || { - let mut screen = Screen::new( - receive_screen_instructions, - send_plugin_instructions, - send_app_instructions, - &full_screen_ws, - os_input, - max_panes, - InputMode::Normal, - ); - loop { - let (event, mut err_ctx) = screen - .receiver - .recv() - .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Screen(ScreenContext::from(&event))); - screen.send_app_instructions.update(err_ctx); - screen.os_api.update_senders(err_ctx); - if let Some(t) = screen.get_active_tab_mut() { - t.os_api.update_senders(err_ctx); - } - match event { - ScreenInstruction::Pty(pid, vte_event) => { - screen - .get_active_tab_mut() - .unwrap() - .handle_pty_event(pid, vte_event); - } - ScreenInstruction::Render => { - screen.render(); - } - ScreenInstruction::NewPane(pid) => { - screen.get_active_tab_mut().unwrap().new_pane(pid); - command_is_executing.done_opening_new_pane(); - } - ScreenInstruction::HorizontalSplit(pid) => { - screen.get_active_tab_mut().unwrap().horizontal_split(pid); - command_is_executing.done_opening_new_pane(); - } - ScreenInstruction::VerticalSplit(pid) => { - screen.get_active_tab_mut().unwrap().vertical_split(pid); - command_is_executing.done_opening_new_pane(); - } - ScreenInstruction::WriteCharacter(bytes) => { - screen - .get_active_tab_mut() - .unwrap() - .write_to_active_terminal(bytes); - } - ScreenInstruction::ResizeLeft => { - screen.get_active_tab_mut().unwrap().resize_left(); - } - ScreenInstruction::ResizeRight => { - screen.get_active_tab_mut().unwrap().resize_right(); - } - ScreenInstruction::ResizeDown => { - screen.get_active_tab_mut().unwrap().resize_down(); - } - ScreenInstruction::ResizeUp => { - screen.get_active_tab_mut().unwrap().resize_up(); - } - ScreenInstruction::MoveFocus => { - screen.get_active_tab_mut().unwrap().move_focus(); - } - ScreenInstruction::MoveFocusLeft => { - screen.get_active_tab_mut().unwrap().move_focus_left(); - } - ScreenInstruction::MoveFocusDown => { - screen.get_active_tab_mut().unwrap().move_focus_down(); - } - ScreenInstruction::MoveFocusRight => { - screen.get_active_tab_mut().unwrap().move_focus_right(); - } - ScreenInstruction::MoveFocusUp => { - screen.get_active_tab_mut().unwrap().move_focus_up(); - } - ScreenInstruction::ScrollUp => { - screen - .get_active_tab_mut() - .unwrap() - .scroll_active_terminal_up(); - } - ScreenInstruction::ScrollDown => { - screen - .get_active_tab_mut() - .unwrap() - .scroll_active_terminal_down(); - } - ScreenInstruction::ClearScroll => { - screen - .get_active_tab_mut() - .unwrap() - .clear_active_terminal_scroll(); - } - ScreenInstruction::CloseFocusedPane => { - screen.get_active_tab_mut().unwrap().close_focused_pane(); - screen.render(); - } - ScreenInstruction::SetSelectable(id, selectable) => { - screen - .get_active_tab_mut() - .unwrap() - .set_pane_selectable(id, selectable); - } - ScreenInstruction::SetMaxHeight(id, max_height) => { - screen - .get_active_tab_mut() - .unwrap() - .set_pane_max_height(id, max_height); - } - ScreenInstruction::SetInvisibleBorders(id, invisible_borders) => { - screen - .get_active_tab_mut() - .unwrap() - .set_pane_invisible_borders(id, invisible_borders); - screen.render(); - } - ScreenInstruction::ClosePane(id) => { - screen.get_active_tab_mut().unwrap().close_pane(id); - screen.render(); - } - ScreenInstruction::ToggleActiveTerminalFullscreen => { - screen - .get_active_tab_mut() - .unwrap() - .toggle_active_pane_fullscreen(); - } - ScreenInstruction::NewTab(pane_id) => { - screen.new_tab(pane_id); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::SwitchTabNext => { - screen.switch_tab_next(); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::SwitchTabPrev => { - screen.switch_tab_prev(); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::CloseTab => { - screen.close_tab(); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => { - screen.apply_layout(Layout::new(layout), new_pane_pids); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::GoToTab(tab_index) => { - screen.go_to_tab(tab_index as usize); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::UpdateTabName(c) => { - screen.update_active_tab_name(c); - command_is_executing.done_updating_tabs(); - } - ScreenInstruction::ChangeInputMode(input_mode) => { - screen.change_input_mode(input_mode); - } - ScreenInstruction::Exit => { - break; - } - } - } - } - }) - .unwrap(); - - let wasm_thread = thread::Builder::new() - .name("wasm".to_string()) - .spawn({ - let mut send_screen_instructions = send_screen_instructions.clone(); - let mut send_app_instructions = send_app_instructions.clone(); - - let store = Store::default(); - let mut plugin_id = 0; - let mut plugin_map = HashMap::new(); - move || loop { - let (event, mut err_ctx) = receive_plugin_instructions - .recv() - .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Plugin(PluginContext::from(&event))); - send_screen_instructions.update(err_ctx); - send_app_instructions.update(err_ctx); - match event { - PluginInstruction::Load(pid_tx, path) => { - let project_dirs = - ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); - let plugin_dir = project_dirs.data_dir().join("plugins/"); - let wasm_bytes = fs::read(&path) - .or_else(|_| fs::read(&path.with_extension("wasm"))) - .or_else(|_| fs::read(&plugin_dir.join(&path).with_extension("wasm"))) - .unwrap_or_else(|_| panic!("cannot find plugin {}", &path.display())); - - // FIXME: Cache this compiled module on disk. I could use `(de)serialize_to_file()` for that - let module = Module::new(&store, &wasm_bytes).unwrap(); - - let output = Pipe::new(); - let input = Pipe::new(); - let mut wasi_env = WasiState::new("Zellij") - .env("CLICOLOR_FORCE", "1") - .preopen(|p| { - p.directory(".") // FIXME: Change this to a more meaningful dir - .alias(".") - .read(true) - .write(true) - .create(true) - }) - .unwrap() - .stdin(Box::new(input)) - .stdout(Box::new(output)) - .finalize() - .unwrap(); - - let wasi = wasi_env.import_object(&module).unwrap(); - - let plugin_env = PluginEnv { - plugin_id, - send_screen_instructions: send_screen_instructions.clone(), - send_app_instructions: send_app_instructions.clone(), - wasi_env, - subscriptions: Arc::new(Mutex::new(HashSet::new())), - }; - - let zellij = zellij_imports(&store, &plugin_env); - let instance = Instance::new(&module, &zellij.chain_back(wasi)).unwrap(); - - let start = instance.exports.get_function("_start").unwrap(); - - // This eventually calls the `.init()` method - start.call(&[]).unwrap(); - - plugin_map.insert(plugin_id, (instance, plugin_env)); - pid_tx.send(plugin_id).unwrap(); - plugin_id += 1; - } - PluginInstruction::Update(pid, event) => { - for (&i, (instance, plugin_env)) in &plugin_map { - let subs = plugin_env.subscriptions.lock().unwrap(); - // FIXME: This is very janky... Maybe I should write my own macro for Event -> EventType? - let event_type = EventType::from_str(&event.to_string()).unwrap(); - if (pid.is_none() || pid == Some(i)) && subs.contains(&event_type) { - let update = instance.exports.get_function("update").unwrap(); - wasi_write_string( - &plugin_env.wasi_env, - &serde_json::to_string(&event).unwrap(), - ); - update.call(&[]).unwrap(); - } - } - drop(send_screen_instructions.send(ScreenInstruction::Render)); - } - PluginInstruction::Render(buf_tx, pid, rows, cols) => { - let (instance, plugin_env) = plugin_map.get(&pid).unwrap(); - - let render = instance.exports.get_function("render").unwrap(); - - render - .call(&[Value::I32(rows as i32), Value::I32(cols as i32)]) - .unwrap(); - - buf_tx.send(wasi_stdout(&plugin_env.wasi_env)).unwrap(); - } - PluginInstruction::Unload(pid) => drop(plugin_map.remove(&pid)), - PluginInstruction::Exit => break, - } - } - }) - .unwrap(); - let _stdin_thread = thread::Builder::new() .name("stdin_handler".to_string()) .spawn({ - let send_screen_instructions = send_screen_instructions.clone(); - let send_plugin_instructions = send_plugin_instructions.clone(); - let send_app_instructions = send_app_instructions.clone(); + let send_client_instructions = send_client_instructions.clone(); let command_is_executing = command_is_executing.clone(); let os_input = os_input.clone(); - move || { - input_loop( - os_input, - command_is_executing, - send_screen_instructions, - send_plugin_instructions, - send_app_instructions, - ) - } + move || input_loop(os_input, command_is_executing, send_client_instructions) }); let router_thread = thread::Builder::new() .name("router".to_string()) .spawn({ - let mut send_screen_instructions = send_screen_instructions.clone(); - let mut send_plugin_instructions = send_plugin_instructions.clone(); let os_input = os_input.clone(); - move || loop { - let (instruction, err_ctx) = os_input.client_recv(); - send_app_instructions.update(err_ctx); - send_screen_instructions.update(err_ctx); - send_plugin_instructions.update(err_ctx); - match instruction { - ClientInstruction::Exit => break, - ClientInstruction::ClosePluginPane(p) => { - send_plugin_instructions - .send(PluginInstruction::Unload(p)) - .unwrap(); - } - ClientInstruction::ToScreen(s) => send_screen_instructions.send(s).unwrap(), - _ => { - send_app_instructions - .send(AppInstruction::from(instruction)) - .unwrap(); + move || { + loop { + let (instruction, err_ctx) = os_input.client_recv(); + send_client_instructions.update(err_ctx); + if let ClientInstruction::Exit = instruction { + break; } + send_client_instructions.send(instruction).unwrap(); } + send_client_instructions + .send(ClientInstruction::Exit) + .unwrap(); } }) .unwrap(); #[warn(clippy::never_loop)] loop { - let (app_instruction, mut err_ctx) = receive_app_instructions + let (client_instruction, mut err_ctx) = receive_client_instructions .recv() .expect("failed to receive app instruction on channel"); - err_ctx.add_call(ContextType::App(AppContext::from(&app_instruction))); - send_screen_instructions.update(err_ctx); + err_ctx.add_call(ContextType::Client(ClientContext::from( + &client_instruction, + ))); os_input.update_senders(err_ctx); - match app_instruction { - AppInstruction::Exit => break, - AppInstruction::Error(backtrace) => { + match client_instruction { + ClientInstruction::Exit => break, + ClientInstruction::Error(backtrace) => { let _ = os_input.send_to_server(ServerInstruction::ClientExit); - let _ = send_screen_instructions.send(ScreenInstruction::Exit); - let _ = send_plugin_instructions.send(PluginInstruction::Exit); - let _ = screen_thread.join(); - let _ = wasm_thread.join(); os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); let error = format!("{}\n{}", goto_start_of_last_line, backtrace); @@ -456,18 +112,20 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { .unwrap(); std::process::exit(1); } - AppInstruction::ToPty(instruction) => { - os_input.send_to_server(ServerInstruction::ToPty(instruction)); + ClientInstruction::Render(output) => { + let mut stdout = os_input.get_stdout_writer(); + stdout + .write_all(&output.as_bytes()) + .expect("cannot write to stdout"); + stdout.flush().expect("could not flush"); } - AppInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), + ClientInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), + ClientInstruction::DoneOpeningNewPane => command_is_executing.done_opening_new_pane(), + ClientInstruction::DoneUpdatingTabs => command_is_executing.done_updating_tabs(), } } let _ = os_input.send_to_server(ServerInstruction::ClientExit); - let _ = send_screen_instructions.send(ScreenInstruction::Exit); - let _ = send_plugin_instructions.send(PluginInstruction::Exit); - screen_thread.join().unwrap(); - wasm_thread.join().unwrap(); router_thread.join().unwrap(); // cleanup(); @@ -481,9 +139,7 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { ); os_input.unset_raw_mode(0); - let _ = os_input - .get_stdout_writer() - .write(goodbye_message.as_bytes()) - .unwrap(); - os_input.get_stdout_writer().flush().unwrap(); + let mut stdout = os_input.get_stdout_writer(); + let _ = stdout.write(goodbye_message.as_bytes()).unwrap(); + stdout.flush().unwrap(); } diff --git a/src/client/panes/terminal_pane.rs b/src/client/panes/terminal_pane.rs index 1834e722..9fcddc82 100644 --- a/src/client/panes/terminal_pane.rs +++ b/src/client/panes/terminal_pane.rs @@ -20,7 +20,7 @@ pub enum PaneId { /// Contains the position and size of a [`Pane`], or more generally of any terminal, measured /// in character rows and columns. -#[derive(Clone, Copy, Debug, Default)] +#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize)] pub struct PositionAndSize { pub x: usize, pub y: usize, diff --git a/src/client/tab.rs b/src/client/tab.rs index c285cc0b..4eabab10 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -2,10 +2,9 @@ //! as well as how they should be resized use crate::boundaries::colors; -use crate::client::AppInstruction; use crate::common::{input::handler::parse_keys, SenderWithContext}; use crate::layout::Layout; -use crate::os_input_output::{ClientOsApi, ServerOsApiInstruction}; +use crate::os_input_output::ServerOsApi; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; use crate::pty_bus::{PtyInstruction, VteEvent}; use crate::server::ServerInstruction; @@ -13,13 +12,12 @@ use crate::utils::shared::pad_to_size; use crate::wasm_vm::PluginInstruction; use crate::{boundaries::Boundaries, panes::PluginPane}; use std::os::unix::io::RawFd; -use std::time::Instant; +use std::sync::mpsc::channel; use std::{ cmp::Reverse, collections::{BTreeMap, HashSet}, }; -use std::{io::Write, sync::mpsc::channel}; -use zellij_tile::data::{Event, InputMode, ModeInfo, Palette}; +use zellij_tile::data::{Event, InputMode}; const CURSOR_HEIGHT_WIDTH_RATIO: usize = 4; // this is not accurate and kind of a magic number, TODO: look into this @@ -68,9 +66,11 @@ pub struct Tab { max_panes: Option, full_screen_ws: PositionAndSize, fullscreen_is_active: bool, - pub os_api: Box, - pub send_plugin_instructions: SenderWithContext, - pub send_app_instructions: SenderWithContext, + os_api: Box, + send_plugin_instructions: SenderWithContext, + send_pty_instructions: SenderWithContext, + send_server_instructions: SenderWithContext, + expansion_boundary: Option, should_clear_display_before_rendering: bool, pub mode_info: ModeInfo, pub input_mode: InputMode, @@ -224,9 +224,10 @@ impl Tab { position: usize, name: String, full_screen_ws: &PositionAndSize, - os_api: Box, + mut os_api: Box, send_plugin_instructions: SenderWithContext, - send_app_instructions: SenderWithContext, + send_pty_instructions: SenderWithContext, + send_server_instructions: SenderWithContext, max_panes: Option, pane_id: Option, mode_info: ModeInfo, @@ -235,13 +236,11 @@ impl Tab { ) -> Self { let panes = if let Some(PaneId::Terminal(pid)) = pane_id { let new_terminal = TerminalPane::new(pid, *full_screen_ws); - os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )); + os_api.set_terminal_size_using_fd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ); let mut panes: BTreeMap> = BTreeMap::new(); panes.insert(PaneId::Terminal(pid), Box::new(new_terminal)); panes @@ -260,8 +259,10 @@ impl Tab { fullscreen_is_active: false, synchronize_is_active: false, os_api, - send_app_instructions, send_plugin_instructions, + send_pty_instructions, + send_server_instructions, + expansion_boundary: None, should_clear_display_before_rendering: false, mode_info, input_mode, @@ -294,13 +295,11 @@ impl Tab { terminal_pane.set_max_width(max_columns); } terminal_pane.change_pos_and_size(&position_and_size); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *pid, - position_and_size.columns as u16, - position_and_size.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + *pid, + position_and_size.columns as u16, + position_and_size.rows as u16, + ); } None => { // we filled the entire layout, no room for this pane @@ -342,13 +341,11 @@ impl Tab { // there are still panes left to fill, use the pids we received in this method let pid = new_pids.next().unwrap(); // if this crashes it means we got less pids than there are panes in this layout let new_terminal = TerminalPane::new(*pid, *position_and_size); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ); self.panes .insert(PaneId::Terminal(*pid), Box::new(new_terminal)); } @@ -357,10 +354,9 @@ impl Tab { // this is a bit of a hack and happens because we don't have any central location that // 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 - self.os_api - .send_to_server(ServerInstruction::pty_close_pane(PaneId::Terminal( - *unused_pid, - ))); + self.send_pty_instructions + .send(PtyInstruction::ClosePane(PaneId::Terminal(*unused_pid))) + .unwrap(); } self.active_terminal = self.panes.iter().map(|(id, _)| id.to_owned()).next(); self.render(); @@ -373,13 +369,11 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -405,8 +399,9 @@ impl Tab { }, ); if terminal_id_to_split.is_none() { - self.os_api - .send_to_server(ServerInstruction::pty_close_pane(pid)); // we can't open this pane, close the pty + self.send_pty_instructions + .send(PtyInstruction::ClosePane(pid)) + .unwrap(); // we can't open this pane, close the pty return; // likely no terminal large enough to split } let terminal_id_to_split = terminal_id_to_split.unwrap(); @@ -424,23 +419,19 @@ impl Tab { if let PaneId::Terminal(term_pid) = pid { let (top_winsize, bottom_winsize) = split_horizontally_with_gap(&terminal_ws); let new_terminal = TerminalPane::new(term_pid, bottom_winsize); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - bottom_winsize.columns as u16, - bottom_winsize.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + new_terminal.pid, + bottom_winsize.columns as u16, + bottom_winsize.rows as u16, + ); terminal_to_split.change_pos_and_size(&top_winsize); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(terminal_id_to_split) = terminal_id_to_split { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - terminal_id_to_split, - top_winsize.columns as u16, - top_winsize.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + terminal_id_to_split, + top_winsize.columns as u16, + top_winsize.rows as u16, + ); } self.active_terminal = Some(pid); } @@ -448,23 +439,19 @@ impl Tab { if let PaneId::Terminal(term_pid) = pid { let (left_winsize, right_winsize) = split_vertically_with_gap(&terminal_ws); let new_terminal = TerminalPane::new(term_pid, right_winsize); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - right_winsize.columns as u16, - right_winsize.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + new_terminal.pid, + right_winsize.columns as u16, + right_winsize.rows as u16, + ); terminal_to_split.change_pos_and_size(&left_winsize); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(terminal_id_to_split) = terminal_id_to_split { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - terminal_id_to_split, - left_winsize.columns as u16, - left_winsize.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + terminal_id_to_split, + left_winsize.columns as u16, + left_winsize.rows as u16, + ); } } } @@ -480,13 +467,11 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -495,8 +480,9 @@ impl Tab { let active_pane_id = &self.get_active_pane_id().unwrap(); let active_pane = self.panes.get_mut(active_pane_id).unwrap(); if active_pane.rows() < MIN_TERMINAL_HEIGHT * 2 + 1 { - self.os_api - .send_to_server(ServerInstruction::pty_close_pane(pid)); // we can't open this pane, close the pty + self.send_pty_instructions + .send(PtyInstruction::ClosePane(pid)) + .unwrap(); // we can't open this pane, close the pty return; } let terminal_ws = PositionAndSize { @@ -510,23 +496,19 @@ impl Tab { active_pane.change_pos_and_size(&top_winsize); let new_terminal = TerminalPane::new(term_pid, bottom_winsize); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - bottom_winsize.columns as u16, - bottom_winsize.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + new_terminal.pid, + bottom_winsize.columns as u16, + bottom_winsize.rows as u16, + ); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(active_terminal_pid) = active_pane_id { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *active_terminal_pid, - top_winsize.columns as u16, - top_winsize.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + *active_terminal_pid, + top_winsize.columns as u16, + top_winsize.rows as u16, + ); } self.active_terminal = Some(pid); @@ -541,13 +523,11 @@ impl Tab { if !self.has_panes() { if let PaneId::Terminal(term_pid) = pid { let new_terminal = TerminalPane::new(term_pid, self.full_screen_ws); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - new_terminal.columns() as u16, - new_terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + new_terminal.pid, + new_terminal.columns() as u16, + new_terminal.rows() as u16, + ); self.panes.insert(pid, Box::new(new_terminal)); self.active_terminal = Some(pid); } @@ -556,8 +536,9 @@ impl Tab { let active_pane_id = &self.get_active_pane_id().unwrap(); let active_pane = self.panes.get_mut(active_pane_id).unwrap(); if active_pane.columns() < MIN_TERMINAL_WIDTH * 2 + 1 { - self.os_api - .send_to_server(ServerInstruction::pty_close_pane(pid)); // we can't open this pane, close the pty + self.send_pty_instructions + .send(PtyInstruction::ClosePane(pid)) + .unwrap(); // we can't open this pane, close the pty return; } let terminal_ws = PositionAndSize { @@ -571,23 +552,19 @@ impl Tab { active_pane.change_pos_and_size(&left_winsize); let new_terminal = TerminalPane::new(term_pid, right_winsize); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - new_terminal.pid, - right_winsize.columns as u16, - right_winsize.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + new_terminal.pid, + right_winsize.columns as u16, + right_winsize.rows as u16, + ); self.panes.insert(pid, Box::new(new_terminal)); if let PaneId::Terminal(active_terminal_pid) = active_pane_id { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *active_terminal_pid, - left_winsize.columns as u16, - left_winsize.rows as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + *active_terminal_pid, + left_winsize.columns as u16, + left_winsize.rows as u16, + ); } self.active_terminal = Some(pid); @@ -644,13 +621,13 @@ impl Tab { match self.get_active_pane_id() { Some(PaneId::Terminal(active_terminal_id)) => { let active_terminal = self.get_active_pane().unwrap(); - let adjusted_input = active_terminal.adjust_input_to_terminal(input_bytes); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::WriteToTtyStdin(active_terminal_id, adjusted_input), - )); - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::TcDrain(active_terminal_id), - )); + let mut adjusted_input = active_terminal.adjust_input_to_terminal(input_bytes); + self.os_api + .write_to_tty_stdin(active_terminal_id, &mut adjusted_input) + .expect("failed to write to terminal"); + self.os_api + .tcdrain(active_terminal_id) + .expect("failed to drain terminal"); } Some(PaneId::Plugin(pid)) => { for key in parse_keys(&input_bytes) { @@ -712,13 +689,11 @@ impl Tab { } let active_terminal = self.panes.get(&active_pane_id).unwrap(); if let PaneId::Terminal(active_pid) = active_pane_id { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - active_pid, - active_terminal.columns() as u16, - active_terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + active_pid, + active_terminal.columns() as u16, + active_terminal.rows() as u16, + ); } self.render(); self.toggle_fullscreen_is_active(); @@ -747,30 +722,16 @@ impl Tab { // in that case, we should not render as the app is exiting return; } - // if any pane contain widechar, all pane in the same row will messup. We should render them every time - // FIXME: remove this when we can handle widechars correctly - if self.panes_contain_widechar() { - self.set_force_render() - } - let mut stdout = self.os_api.get_stdout_writer(); + let mut output = String::new(); let mut boundaries = Boundaries::new( self.full_screen_ws.columns as u16, self.full_screen_ws.rows as u16, ); let hide_cursor = "\u{1b}[?25l"; - stdout - .write_all(&hide_cursor.as_bytes()) - .expect("cannot write to stdout"); - if self.should_clear_display_before_rendering { - let clear_display = "\u{1b}[2J"; - stdout - .write_all(&clear_display.as_bytes()) - .expect("cannot write to stdout"); - self.should_clear_display_before_rendering = false; - } - for (kind, pane) in self.panes.iter_mut() { - if !self.panes_to_hide.contains(&pane.pid()) { - match self.active_terminal.unwrap() == pane.pid() { + output.push_str(hide_cursor); + for (kind, terminal) in self.panes.iter_mut() { + if !self.panes_to_hide.contains(&terminal.pid()) { + match self.active_terminal.unwrap() == terminal.pid() { true => { pane.set_active_at(Instant::now()); boundaries.add_rect(pane.as_ref(), self.mode_info.mode, Some(self.colors)) @@ -784,48 +745,39 @@ impl Tab { adjust_to_size(&vte_output, pane.rows(), pane.columns()) }; // FIXME: Use Termion for cursor and style clearing? - write!( - stdout, + output.push_str(&format!( "\u{1b}[{};{}H\u{1b}[m{}", pane.y() + 1, pane.x() + 1, vte_output - ) - .expect("cannot write to stdout"); + )); } } } // TODO: only render (and calculate) boundaries if there was a resize - let vte_output = boundaries.vte_output(); - stdout - .write_all(&vte_output.as_bytes()) - .expect("cannot write to stdout"); + output.push_str(&boundaries.vte_output()); match self.get_active_terminal_cursor_position() { Some((cursor_position_x, cursor_position_y)) => { let show_cursor = "\u{1b}[?25h"; - let goto_cursor_position = format!( + let goto_cursor_position = &format!( "\u{1b}[{};{}H\u{1b}[m", cursor_position_y + 1, cursor_position_x + 1 ); // goto row/col - stdout - .write_all(&show_cursor.as_bytes()) - .expect("cannot write to stdout"); - stdout - .write_all(&goto_cursor_position.as_bytes()) - .expect("cannot write to stdout"); - stdout.flush().expect("could not flush"); + output.push_str(show_cursor); + output.push_str(goto_cursor_position); } None => { let hide_cursor = "\u{1b}[?25l"; - stdout - .write_all(&hide_cursor.as_bytes()) - .expect("cannot write to stdout"); - stdout.flush().expect("could not flush"); + output.push_str(hide_cursor); } } + + self.send_server_instructions + .send(ServerInstruction::Render(output)) + .unwrap(); } fn get_panes(&self) -> impl Iterator)> { self.panes.iter() @@ -1278,104 +1230,88 @@ impl Tab { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_height_down(count); if let PaneId::Terminal(pid) = id { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + *pid, + terminal.columns() as u16, + terminal.rows() as u16, + ); } } fn reduce_pane_height_up(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_height_up(count); if let PaneId::Terminal(pid) = id { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - *pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + *pid, + terminal.columns() as u16, + terminal.rows() as u16, + ); } } fn increase_pane_height_down(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_height_down(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ); } } fn increase_pane_height_up(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_height_up(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ); } } fn increase_pane_width_right(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_width_right(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ); } } fn increase_pane_width_left(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.increase_width_left(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ); } } fn reduce_pane_width_right(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_width_right(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ); } } fn reduce_pane_width_left(&mut self, id: &PaneId, count: usize) { let terminal = self.panes.get_mut(id).unwrap(); terminal.reduce_width_left(count); if let PaneId::Terminal(pid) = terminal.pid() { - self.os_api.send_to_server(ServerInstruction::OsApi( - ServerOsApiInstruction::SetTerminalSizeUsingFd( - pid, - terminal.columns() as u16, - terminal.rows() as u16, - ), - )); + self.os_api.set_terminal_size_using_fd( + pid, + terminal.columns() as u16, + terminal.rows() as u16, + ); } } fn pane_is_between_vertical_borders( @@ -2144,8 +2080,9 @@ impl Tab { if let Some(max_panes) = self.max_panes { let terminals = self.get_pane_ids(); for &pid in terminals.iter().skip(max_panes - 1) { - self.os_api - .send_to_server(ServerInstruction::pty_close_pane(pid)); + self.send_pty_instructions + .send(PtyInstruction::ClosePane(pid)) + .unwrap(); self.close_pane_without_rerender(pid); } } @@ -2255,8 +2192,9 @@ impl Tab { pub fn close_focused_pane(&mut self) { if let Some(active_pane_id) = self.get_active_pane_id() { self.close_pane(active_pane_id); - self.os_api - .send_to_server(ServerInstruction::pty_close_pane(active_pane_id)); + self.send_pty_instructions + .send(PtyInstruction::ClosePane(active_pane_id)) + .unwrap(); } } pub fn scroll_active_terminal_up(&mut self) { diff --git a/src/common/errors.rs b/src/common/errors.rs index 3ee36752..720341a4 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -1,8 +1,8 @@ //! Error context system based on a thread-local representation of the call stack, itself based on //! the instructions that are sent between threads. -use super::{os_input_output::ServerOsApiInstruction, ServerInstruction, OPENCALLS}; -use crate::client::AppInstruction; +use super::{ServerInstruction, OPENCALLS}; +use crate::client::ClientInstruction; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; use serde::{Deserialize, Serialize}; @@ -21,7 +21,7 @@ use std::panic::PanicInfo; #[cfg(not(test))] pub fn handle_panic( info: &PanicInfo<'_>, - send_app_instructions: &SenderWithContext, + send_app_instructions: &SenderWithContext, ) { use backtrace::Backtrace; use std::{process, thread}; @@ -68,9 +68,7 @@ pub fn handle_panic( println!("{}", backtrace); process::exit(1); } else { - send_app_instructions - .send(AppInstruction::Error(backtrace)) - .unwrap(); + let _ = send_app_instructions.send(ClientInstruction::Error(backtrace)); } } @@ -132,19 +130,17 @@ impl Display for ErrorContext { /// /// Complex variants store a variant of a related enum, whose variants can be built from /// the corresponding Zellij MSPC instruction enum variants ([`ScreenInstruction`], -/// [`PtyInstruction`], [`AppInstruction`], etc). +/// [`PtyInstruction`], [`ClientInstruction`], etc). #[derive(Copy, Clone, PartialEq, Serialize, Deserialize)] pub enum ContextType { /// A screen-related call. Screen(ScreenContext), /// A PTY-related call. Pty(PtyContext), - /// An OS-related call. - Os(OsContext), /// A plugin-related call. Plugin(PluginContext), /// An app-related call. - App(AppContext), + Client(ClientContext), /// A server-related call. IPCServer(ServerContext), StdinHandler, @@ -162,9 +158,8 @@ impl Display for ContextType { match *self { ContextType::Screen(c) => write!(f, "{}screen_thread: {}{:?}", purple, green, c), ContextType::Pty(c) => write!(f, "{}pty_thread: {}{:?}", purple, green, c), - ContextType::Os(c) => write!(f, "{}os_thread: {}{:?}", purple, green, c), ContextType::Plugin(c) => write!(f, "{}plugin_thread: {}{:?}", purple, green, c), - ContextType::App(c) => write!(f, "{}main_thread: {}{:?}", purple, green, c), + ContextType::Client(c) => write!(f, "{}main_thread: {}{:?}", purple, green, c), ContextType::IPCServer(c) => write!(f, "{}ipc_server: {}{:?}", purple, green, c), ContextType::StdinHandler => { write!(f, "{}stdin_handler_thread: {}AcceptInput", purple, green) @@ -257,7 +252,7 @@ impl From<&ScreenInstruction> for ScreenContext { ScreenInstruction::SetInvisibleBorders(..) => ScreenContext::SetInvisibleBorders, ScreenInstruction::SetMaxHeight(..) => ScreenContext::SetMaxHeight, ScreenInstruction::ClosePane(_) => ScreenContext::ClosePane, - ScreenInstruction::ApplyLayout(_) => ScreenContext::ApplyLayout, + ScreenInstruction::ApplyLayout(..) => ScreenContext::ApplyLayout, ScreenInstruction::NewTab(_) => ScreenContext::NewTab, ScreenInstruction::SwitchTabNext => ScreenContext::SwitchTabNext, ScreenInstruction::SwitchTabPrev => ScreenContext::SwitchTabPrev, @@ -297,28 +292,6 @@ impl From<&PtyInstruction> for PtyContext { } } -/// Stack call representations corresponding to the different types of [`ServerOsApiInstruction`]s. -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] -pub enum OsContext { - SetTerminalSizeUsingFd, - WriteToTtyStdin, - TcDrain, - Exit, -} - -impl From<&ServerOsApiInstruction> for OsContext { - fn from(os_instruction: &ServerOsApiInstruction) -> Self { - match *os_instruction { - ServerOsApiInstruction::SetTerminalSizeUsingFd(_, _, _) => { - OsContext::SetTerminalSizeUsingFd - } - ServerOsApiInstruction::WriteToTtyStdin(_, _) => OsContext::WriteToTtyStdin, - ServerOsApiInstruction::TcDrain(_) => OsContext::TcDrain, - ServerOsApiInstruction::Exit => OsContext::Exit, - } - } -} - // FIXME: This whole pattern *needs* a macro eventually, it's soul-crushing to write use crate::wasm_vm::PluginInstruction; @@ -345,22 +318,26 @@ impl From<&PluginInstruction> for PluginContext { } } -/// Stack call representations corresponding to the different types of [`AppInstruction`]s. +/// Stack call representations corresponding to the different types of [`ClientInstruction`]s. #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] -pub enum AppContext { +pub enum ClientContext { Exit, Error, DoneClosingPane, - ToPty, + DoneOpeningNewPane, + DoneUpdatingTabs, + Render, } -impl From<&AppInstruction> for AppContext { - fn from(app_instruction: &AppInstruction) -> Self { - match *app_instruction { - AppInstruction::Exit => AppContext::Exit, - AppInstruction::Error(_) => AppContext::Error, - AppInstruction::DoneClosingPane => AppContext::DoneClosingPane, - AppInstruction::ToPty(_) => AppContext::ToPty, +impl From<&ClientInstruction> for ClientContext { + fn from(client_instruction: &ClientInstruction) -> Self { + match *client_instruction { + ClientInstruction::Exit => ClientContext::Exit, + ClientInstruction::Error(_) => ClientContext::Error, + ClientInstruction::Render(_) => ClientContext::Render, + ClientInstruction::DoneClosingPane => ClientContext::DoneClosingPane, + ClientInstruction::DoneOpeningNewPane => ClientContext::DoneOpeningNewPane, + ClientInstruction::DoneUpdatingTabs => ClientContext::DoneUpdatingTabs, } } } @@ -375,10 +352,13 @@ pub enum ServerContext { NewClient, ToPty, ToScreen, - OsApi, + Render, + PluginUpdate, DoneClosingPane, - ClosePluginPane, + DoneOpeningNewPane, + DoneUpdatingTabs, ClientExit, + ClientShouldExit, Exit, } @@ -389,13 +369,16 @@ impl From<&ServerInstruction> for ServerContext { ServerInstruction::SplitHorizontally => ServerContext::SplitHorizontally, ServerInstruction::SplitVertically => ServerContext::SplitVertically, ServerInstruction::MoveFocus => ServerContext::MoveFocus, - ServerInstruction::NewClient(_) => ServerContext::NewClient, + ServerInstruction::NewClient(..) => ServerContext::NewClient, ServerInstruction::ToPty(_) => ServerContext::ToPty, ServerInstruction::ToScreen(_) => ServerContext::ToScreen, - ServerInstruction::OsApi(_) => ServerContext::OsApi, + ServerInstruction::PluginUpdate(..) => ServerContext::PluginUpdate, + ServerInstruction::Render(_) => ServerContext::Render, ServerInstruction::DoneClosingPane => ServerContext::DoneClosingPane, - ServerInstruction::ClosePluginPane(_) => ServerContext::ClosePluginPane, + ServerInstruction::DoneOpeningNewPane => ServerContext::DoneOpeningNewPane, + ServerInstruction::DoneUpdatingTabs => ServerContext::DoneUpdatingTabs, ServerInstruction::ClientExit => ServerContext::ClientExit, + ServerInstruction::ClientShouldExit => ServerContext::ClientShouldExit, ServerInstruction::Exit => ServerContext::Exit, } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index d4ae3080..4015938a 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -2,14 +2,12 @@ use super::actions::Action; use super::keybinds::get_default_keybinds; -use crate::client::AppInstruction; +use crate::client::ClientInstruction; use crate::common::{SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::ClientOsApi; use crate::pty_bus::PtyInstruction; -use crate::screen::ScreenInstruction; use crate::server::ServerInstruction; -use crate::wasm_vm::PluginInstruction; use crate::CommandIsExecuting; use termion::input::{TermRead, TermReadEventsAndRaw}; @@ -22,10 +20,7 @@ struct InputHandler { mode: InputMode, os_input: Box, command_is_executing: CommandIsExecuting, - send_screen_instructions: SenderWithContext, - send_plugin_instructions: SenderWithContext, - send_app_instructions: SenderWithContext, - should_exit: bool, + send_client_instructions: SenderWithContext, } impl InputHandler { @@ -33,20 +28,14 @@ impl InputHandler { fn new( os_input: Box, command_is_executing: CommandIsExecuting, - config: Config, - send_screen_instructions: SenderWithContext, - send_plugin_instructions: SenderWithContext, - send_app_instructions: SenderWithContext, + send_client_instructions: SenderWithContext, ) -> Self { InputHandler { mode: InputMode::Normal, os_input, config, command_is_executing, - send_screen_instructions, - send_plugin_instructions, - send_app_instructions, - should_exit: false, + send_client_instructions, } } @@ -55,8 +44,7 @@ impl InputHandler { fn handle_input(&mut self) { let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); err_ctx.add_call(ContextType::StdinHandler); - self.send_app_instructions.update(err_ctx); - self.send_screen_instructions.update(err_ctx); + self.send_client_instructions.update(err_ctx); self.os_input.update_senders(err_ctx); if let Ok(keybinds) = get_default_keybinds() { 'input_loop: loop { @@ -122,12 +110,10 @@ impl InputHandler { match action { Action::Write(val) => { - self.send_screen_instructions - .send(ScreenInstruction::ClearScroll) - .unwrap(); - self.send_screen_instructions - .send(ScreenInstruction::WriteCharacter(val)) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::clear_scroll()); + self.os_input + .send_to_server(ServerInstruction::write_character(val)); } Action::Quit => { self.exit(); @@ -135,64 +121,42 @@ impl InputHandler { } Action::SwitchToMode(mode) => { self.mode = mode; - self.send_plugin_instructions - .send(PluginInstruction::Update( + self.os_input + .send_to_server(ServerInstruction::PluginUpdate( None, - Event::ModeUpdate(get_mode_info(mode, self.os_input.load_palette())), - )) - .unwrap(); - self.send_screen_instructions - .send(ScreenInstruction::ChangeMode(get_mode_info( - mode, - self.os_input.load_palette(), - ))) - .unwrap(); - self.send_screen_instructions - .send(ScreenInstruction::Render) - .unwrap(); + Event::ModeUpdate(get_mode_info(mode)), + )); + self.os_input + .send_to_server(ServerInstruction::change_input_mode(mode)); + self.os_input.send_to_server(ServerInstruction::render()); } Action::Resize(direction) => { let screen_instr = match direction { - super::actions::Direction::Left => ScreenInstruction::ResizeLeft, - super::actions::Direction::Right => ScreenInstruction::ResizeRight, - super::actions::Direction::Up => ScreenInstruction::ResizeUp, - super::actions::Direction::Down => ScreenInstruction::ResizeDown, + super::actions::Direction::Left => ServerInstruction::resize_left(), + super::actions::Direction::Right => ServerInstruction::resize_right(), + super::actions::Direction::Up => ServerInstruction::resize_up(), + super::actions::Direction::Down => ServerInstruction::resize_down(), }; - self.send_screen_instructions.send(screen_instr).unwrap(); + self.os_input.send_to_server(screen_instr); } - Action::SwitchFocus => { - self.send_screen_instructions - .send(ScreenInstruction::SwitchFocus) - .unwrap(); - } - Action::FocusNextPane => { - self.send_screen_instructions - .send(ScreenInstruction::FocusNextPane) - .unwrap(); - } - Action::FocusPreviousPane => { - self.send_screen_instructions - .send(ScreenInstruction::FocusPreviousPane) - .unwrap(); + Action::SwitchFocus(_) => { + self.os_input.send_to_server(ServerInstruction::MoveFocus); } Action::MoveFocus(direction) => { let screen_instr = match direction { - super::actions::Direction::Left => ScreenInstruction::MoveFocusLeft, - super::actions::Direction::Right => ScreenInstruction::MoveFocusRight, - super::actions::Direction::Up => ScreenInstruction::MoveFocusUp, - super::actions::Direction::Down => ScreenInstruction::MoveFocusDown, + super::actions::Direction::Left => ServerInstruction::move_focus_left(), + super::actions::Direction::Right => ServerInstruction::move_focus_right(), + super::actions::Direction::Up => ServerInstruction::move_focus_up(), + super::actions::Direction::Down => ServerInstruction::move_focus_down(), }; - self.send_screen_instructions.send(screen_instr).unwrap(); + self.os_input.send_to_server(screen_instr); } Action::ScrollUp => { - self.send_screen_instructions - .send(ScreenInstruction::ScrollUp) - .unwrap(); + self.os_input.send_to_server(ServerInstruction::scroll_up()); } Action::ScrollDown => { - self.send_screen_instructions - .send(ScreenInstruction::ScrollDown) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::scroll_down()); } Action::PageScrollUp => { self.send_screen_instructions @@ -205,9 +169,8 @@ impl InputHandler { .unwrap(); } Action::ToggleFocusFullscreen => { - self.send_screen_instructions - .send(ScreenInstruction::ToggleActiveTerminalFullscreen) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::toggle_active_terminal_fullscreen()); } Action::NewPane(direction) => { let pty_instr = match direction { @@ -233,9 +196,8 @@ impl InputHandler { } Action::CloseFocus => { self.command_is_executing.closing_pane(); - self.send_screen_instructions - .send(ScreenInstruction::CloseFocusedPane) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::close_focused_pane()); self.command_is_executing.wait_until_pane_is_closed(); } Action::NewTab => { @@ -246,16 +208,14 @@ impl InputHandler { } Action::GoToNextTab => { self.command_is_executing.updating_tabs(); - self.send_screen_instructions - .send(ScreenInstruction::SwitchTabNext) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::switch_tab_next()); self.command_is_executing.wait_until_tabs_are_updated(); } Action::GoToPreviousTab => { self.command_is_executing.updating_tabs(); - self.send_screen_instructions - .send(ScreenInstruction::SwitchTabPrev) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::switch_tab_prev()); self.command_is_executing.wait_until_tabs_are_updated(); } Action::ToggleActiveSyncPanes => { @@ -265,22 +225,19 @@ impl InputHandler { } Action::CloseTab => { self.command_is_executing.updating_tabs(); - self.send_screen_instructions - .send(ScreenInstruction::CloseTab) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::screen_close_tab()); self.command_is_executing.wait_until_tabs_are_updated(); } Action::GoToTab(i) => { self.command_is_executing.updating_tabs(); - self.send_screen_instructions - .send(ScreenInstruction::GoToTab(i)) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::go_to_tab(i)); self.command_is_executing.wait_until_tabs_are_updated(); } Action::TabNameInput(c) => { - self.send_screen_instructions - .send(ScreenInstruction::UpdateTabName(c)) - .unwrap(); + self.os_input + .send_to_server(ServerInstruction::update_tab_name(c)); } Action::NoOp => {} } @@ -291,8 +248,8 @@ impl InputHandler { /// Routine to be called when the input handler exits (at the moment this is the /// same as quitting Zellij). fn exit(&mut self) { - self.send_app_instructions - .send(AppInstruction::Exit) + self.send_client_instructions + .send(ClientInstruction::Exit) .unwrap(); } } @@ -343,19 +300,10 @@ pub fn get_mode_info(mode: InputMode, palette: Palette) -> ModeInfo { pub fn input_loop( os_input: Box, command_is_executing: CommandIsExecuting, - send_screen_instructions: SenderWithContext, - send_plugin_instructions: SenderWithContext, - send_app_instructions: SenderWithContext, + send_client_instructions: SenderWithContext, ) { - let _handler = InputHandler::new( - os_input, - command_is_executing, - config, - send_screen_instructions, - send_plugin_instructions, - send_app_instructions, - ) - .handle_input(); + let _handler = + InputHandler::new(os_input, command_is_executing, send_client_instructions).handle_input(); } pub fn parse_keys(input_bytes: &[u8]) -> Vec { diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 7cc43e27..53300424 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -6,7 +6,7 @@ use nix::sys::termios; use nix::sys::wait::waitpid; use nix::unistd; use nix::unistd::{ForkResult, Pid}; -use serde::{Deserialize, Serialize}; +use serde::Serialize; use std::env; use std::io; use std::io::prelude::*; @@ -22,7 +22,7 @@ use crate::panes::PositionAndSize; use crate::server::ServerInstruction; use crate::utils::consts::ZELLIJ_IPC_PIPE; -const IPC_BUFFER_SIZE: u32 = 8192; +const IPC_BUFFER_SIZE: u32 = 8388608; fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); @@ -300,15 +300,6 @@ pub fn get_server_os_input() -> ServerOsInputOutput { } } -/// OS Instructions sent to the Server by clients -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum ServerOsApiInstruction { - SetTerminalSizeUsingFd(RawFd, u16, u16), - WriteToTtyStdin(RawFd, Vec), - TcDrain(RawFd), - Exit, -} - #[derive(Clone)] pub struct ClientOsInputOutput { orig_termios: Arc>, @@ -342,7 +333,7 @@ pub trait ClientOsApi: Send + Sync { // This should be called from the client-side router thread only. fn client_recv(&self) -> (ClientInstruction, ErrorContext); /// Setup the client IpcChannel and notify server of new client - fn connect_to_server(&mut self); + fn connect_to_server(&mut self, full_screen_ws: PositionAndSize); } impl ClientOsApi for ClientOsInputOutput { @@ -378,13 +369,16 @@ impl ClientOsApi for ClientOsInputOutput { fn update_senders(&mut self, new_ctx: ErrorContext) { self.server_sender.update(new_ctx); } - fn connect_to_server(&mut self) { + fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) { let (client_buffer_path, client_buffer) = SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); self.client_receiver = Some(Arc::new(Mutex::new(IpcReceiver::new( client_buffer.clone(), )))); - self.send_to_server(ServerInstruction::NewClient(client_buffer_path)); + self.send_to_server(ServerInstruction::NewClient( + client_buffer_path, + full_screen_ws, + )); } fn client_recv(&self) -> (ClientInstruction, ErrorContext) { self.client_receiver diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index bc49e9bd..b9bb422b 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -18,7 +18,7 @@ use crate::{ errors::{ContextType, ErrorContext}, panes::PaneId, screen::ScreenInstruction, - server::ServerInstruction, + wasm_vm::PluginInstruction, }; pub struct ReadFromPid { @@ -82,35 +82,35 @@ pub enum VteEvent { struct VteEventSender { id: RawFd, - send_server_instructions: SenderWithContext, + send_screen_instructions: SenderWithContext, } impl VteEventSender { - pub fn new(id: RawFd, send_server_instructions: SenderWithContext) -> Self { + pub fn new(id: RawFd, send_screen_instructions: SenderWithContext) -> Self { VteEventSender { id, - send_server_instructions, + send_screen_instructions, } } } impl vte::Perform for VteEventSender { fn print(&mut self, c: char) { - self.send_server_instructions - .send(ServerInstruction::pty(self.id, VteEvent::Print(c))) + self.send_screen_instructions + .send(ScreenInstruction::Pty(self.id, VteEvent::Print(c))) .unwrap(); } fn execute(&mut self, byte: u8) { - self.send_server_instructions - .send(ServerInstruction::pty(self.id, VteEvent::Execute(byte))) + self.send_screen_instructions + .send(ScreenInstruction::Pty(self.id, VteEvent::Execute(byte))) .unwrap(); } fn hook(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); - self.send_server_instructions - .send(ServerInstruction::pty( + self.send_screen_instructions + .send(ScreenInstruction::Pty( self.id, VteEvent::Hook(params, intermediates, ignore, c), )) @@ -118,21 +118,21 @@ impl vte::Perform for VteEventSender { } fn put(&mut self, byte: u8) { - self.send_server_instructions - .send(ServerInstruction::pty(self.id, VteEvent::Put(byte))) + self.send_screen_instructions + .send(ScreenInstruction::Pty(self.id, VteEvent::Put(byte))) .unwrap(); } fn unhook(&mut self) { - self.send_server_instructions - .send(ServerInstruction::pty(self.id, VteEvent::Unhook)) + self.send_screen_instructions + .send(ScreenInstruction::Pty(self.id, VteEvent::Unhook)) .unwrap(); } fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { let params = params.iter().map(|p| p.to_vec()).collect(); - self.send_server_instructions - .send(ServerInstruction::pty( + self.send_screen_instructions + .send(ScreenInstruction::Pty( self.id, VteEvent::OscDispatch(params, bell_terminated), )) @@ -142,8 +142,8 @@ impl vte::Perform for VteEventSender { fn csi_dispatch(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { let params = params.iter().copied().collect(); let intermediates = intermediates.iter().copied().collect(); - self.send_server_instructions - .send(ServerInstruction::pty( + self.send_screen_instructions + .send(ScreenInstruction::Pty( self.id, VteEvent::CsiDispatch(params, intermediates, ignore, c), )) @@ -152,8 +152,8 @@ impl vte::Perform for VteEventSender { fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) { let intermediates = intermediates.iter().copied().collect(); - self.send_server_instructions - .send(ServerInstruction::pty( + self.send_screen_instructions + .send(ScreenInstruction::Pty( self.id, VteEvent::EscDispatch(intermediates, ignore, byte), )) @@ -176,7 +176,8 @@ pub enum PtyInstruction { pub struct PtyBus { pub receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, pub id_to_child_pid: HashMap, - pub send_server_instructions: SenderWithContext, + pub send_screen_instructions: SenderWithContext, + send_plugin_instructions: SenderWithContext, os_input: Box, debug_to_file: bool, task_handles: HashMap>, @@ -185,16 +186,16 @@ pub struct PtyBus { fn stream_terminal_bytes( pid: RawFd, os_input: Box, - mut send_server_instructions: SenderWithContext, + mut send_screen_instructions: SenderWithContext, debug: bool, ) -> JoinHandle<()> { let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); task::spawn({ async move { err_ctx.add_call(ContextType::AsyncTask); - send_server_instructions.update(err_ctx); + send_screen_instructions.update(err_ctx); let mut vte_parser = vte::Parser::new(); - let mut vte_event_sender = VteEventSender::new(pid, send_server_instructions.clone()); + let mut vte_event_sender = VteEventSender::new(pid, send_screen_instructions.clone()); let mut terminal_bytes = ReadFromPid::new(&pid, os_input.clone()); let mut last_byte_receive_time: Option = None; @@ -220,8 +221,8 @@ fn stream_terminal_bytes( Some(receive_time) => { if receive_time.elapsed() > max_render_pause { pending_render = false; - send_server_instructions - .send(ServerInstruction::render()) + send_screen_instructions + .send(ScreenInstruction::Render) .unwrap(); last_byte_receive_time = Some(Instant::now()); } else { @@ -236,23 +237,23 @@ fn stream_terminal_bytes( } else { if pending_render { pending_render = false; - send_server_instructions - .send(ServerInstruction::render()) + send_screen_instructions + .send(ScreenInstruction::Render) .unwrap(); } last_byte_receive_time = None; task::sleep(::std::time::Duration::from_millis(10)).await; } } - send_server_instructions - .send(ServerInstruction::render()) + send_screen_instructions + .send(ScreenInstruction::Render) .unwrap(); #[cfg(not(test))] // 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 // a better solution would be to fix the test fakes, but this will do for now - send_server_instructions - .send(ServerInstruction::screen_close_pane(PaneId::Terminal(pid))) + send_screen_instructions + .send(ScreenInstruction::ClosePane(PaneId::Terminal(pid))) .unwrap(); } }) @@ -262,14 +263,16 @@ impl PtyBus { pub fn new( receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, os_input: Box, - send_server_instructions: SenderWithContext, + send_screen_instructions: SenderWithContext, + send_plugin_instructions: SenderWithContext, debug_to_file: bool, ) -> Self { PtyBus { receive_pty_instructions, os_input, id_to_child_pid: HashMap::new(), - send_server_instructions, + send_screen_instructions, + send_plugin_instructions, debug_to_file, task_handles: HashMap::new(), } @@ -280,7 +283,7 @@ impl PtyBus { let task_handle = stream_terminal_bytes( pid_primary, self.os_input.clone(), - self.send_server_instructions.clone(), + self.send_screen_instructions.clone(), self.debug_to_file, ); self.task_handles.insert(pid_primary, task_handle); @@ -296,17 +299,17 @@ impl PtyBus { self.id_to_child_pid.insert(pid_primary, pid_secondary); new_pane_pids.push(pid_primary); } - self.send_server_instructions - .send(ServerInstruction::apply_layout(( + self.send_screen_instructions + .send(ScreenInstruction::ApplyLayout( layout_path, new_pane_pids.clone(), - ))) + )) .unwrap(); for id in new_pane_pids { let task_handle = stream_terminal_bytes( id, self.os_input.clone(), - self.send_server_instructions.clone(), + self.send_screen_instructions.clone(), self.debug_to_file, ); self.task_handles.insert(id, task_handle); @@ -323,8 +326,8 @@ impl PtyBus { }); } PaneId::Plugin(pid) => self - .send_server_instructions - .send(ServerInstruction::ClosePluginPane(pid)) + .send_plugin_instructions + .send(PluginInstruction::Unload(pid)) .unwrap(), } } diff --git a/src/common/screen.rs b/src/common/screen.rs index 549eccd1..8868febb 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -7,9 +7,8 @@ use std::path::PathBuf; use std::str; use std::sync::mpsc::Receiver; -use crate::client::AppInstruction; use crate::common::SenderWithContext; -use crate::os_input_output::ClientOsApi; +use crate::os_input_output::ServerOsApi; use crate::panes::PositionAndSize; use crate::pty_bus::{PtyInstruction, VteEvent}; use crate::server::ServerInstruction; @@ -51,7 +50,7 @@ pub enum ScreenInstruction { SetMaxHeight(PaneId, usize), SetInvisibleBorders(PaneId, bool), ClosePane(PaneId), - ApplyLayout((PathBuf, Vec)), + ApplyLayout(PathBuf, Vec), NewTab(RawFd), SwitchTabNext, SwitchTabPrev, @@ -74,14 +73,16 @@ pub struct Screen { tabs: BTreeMap, /// A [`PluginInstruction`] and [`ErrorContext`] sender. pub send_plugin_instructions: SenderWithContext, - /// An [`AppInstruction`] and [`ErrorContext`] sender. - pub send_app_instructions: SenderWithContext, + /// An [`PtyInstruction`] and [`ErrorContext`] sender. + pub send_pty_instructions: SenderWithContext, + /// An [`ServerInstruction`] and [`ErrorContext`] sender. + pub send_server_instructions: SenderWithContext, /// The full size of this [`Screen`]. full_screen_ws: PositionAndSize, /// The index of this [`Screen`]'s active [`Tab`]. active_tab_index: Option, /// The [`ClientOsApi`] this [`Screen`] uses. - pub os_api: Box, + os_api: Box, input_mode: InputMode, } @@ -92,9 +93,10 @@ impl Screen { pub fn new( receive_screen_instructions: Receiver<(ScreenInstruction, ErrorContext)>, send_plugin_instructions: SenderWithContext, - send_app_instructions: SenderWithContext, + send_pty_instructions: SenderWithContext, + send_server_instructions: SenderWithContext, full_screen_ws: &PositionAndSize, - os_api: Box, + os_api: Box, max_panes: Option, mode_info: ModeInfo, input_mode: InputMode, @@ -104,7 +106,8 @@ impl Screen { receiver: receive_screen_instructions, max_panes, send_plugin_instructions, - send_app_instructions, + send_pty_instructions, + send_server_instructions, full_screen_ws: *full_screen_ws, active_tab_index: None, tabs: BTreeMap::new(), @@ -127,7 +130,8 @@ impl Screen { &self.full_screen_ws, self.os_api.clone(), self.send_plugin_instructions.clone(), - self.send_app_instructions.clone(), + self.send_pty_instructions.clone(), + self.send_server_instructions.clone(), self.max_panes, Some(PaneId::Terminal(pane_id)), self.mode_info.clone(), @@ -211,12 +215,13 @@ impl Screen { // below we don't check the result of sending the CloseTab instruction to 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 - self.os_api - .send_to_server(ServerInstruction::pty_close_tab(pane_ids)); + self.send_pty_instructions + .send(PtyInstruction::CloseTab(pane_ids)) + .unwrap(); if self.tabs.is_empty() { self.active_tab_index = None; - self.send_app_instructions - .send(AppInstruction::Exit) + self.send_server_instructions + .send(ServerInstruction::ClientShouldExit) .unwrap(); } else { for t in self.tabs.values_mut() { @@ -282,7 +287,8 @@ impl Screen { &self.full_screen_ws, self.os_api.clone(), self.send_plugin_instructions.clone(), - self.send_app_instructions.clone(), + self.send_pty_instructions.clone(), + self.send_server_instructions.clone(), self.max_panes, None, self.mode_info.clone(), diff --git a/src/common/wasm_vm.rs b/src/common/wasm_vm.rs index a7cd7543..5c234403 100644 --- a/src/common/wasm_vm.rs +++ b/src/common/wasm_vm.rs @@ -12,7 +12,6 @@ use wasmer_wasi::WasiEnv; use zellij_tile::data::{Event, EventType, PluginIds}; use super::{pty_bus::PtyInstruction, screen::ScreenInstruction, PaneId, SenderWithContext}; -use crate::client::AppInstruction; #[derive(Clone, Debug)] pub enum PluginInstruction { @@ -28,7 +27,7 @@ pub struct PluginEnv { pub plugin_id: u32, // FIXME: This should be a big bundle of all of the channels pub send_screen_instructions: SenderWithContext, - pub send_app_instructions: SenderWithContext, // FIXME: This should be a big bundle of all of the channels + pub send_pty_instructions: SenderWithContext, // FIXME: This should be a big bundle of all of the channels pub wasi_env: WasiEnv, pub subscriptions: Arc>>, } @@ -74,10 +73,8 @@ fn host_unsubscribe(plugin_env: &PluginEnv) { fn host_open_file(plugin_env: &PluginEnv) { let path = PathBuf::from(wasi_stdout(&plugin_env.wasi_env).lines().next().unwrap()); plugin_env - .send_app_instructions - .send(AppInstruction::ToPty(PtyInstruction::SpawnTerminal(Some( - path, - )))) + .send_pty_instructions + .send(PtyInstruction::SpawnTerminal(Some(path))) .unwrap(); } diff --git a/src/main.rs b/src/main.rs index 77dd6f9a..d89ff577 100644 --- a/src/main.rs +++ b/src/main.rs @@ -89,7 +89,7 @@ pub fn start( opts: CliArgs, server_os_input: Box, ) { - let ipc_thread = start_server(server_os_input, opts.clone()); - start_client(client_os_input, opts); + let ipc_thread = start_server(server_os_input, opts); + start_client(client_os_input); drop(ipc_thread.join()); } diff --git a/src/server/mod.rs b/src/server/mod.rs index eedc4c3f..5f122799 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,17 +1,33 @@ -use crate::client::ClientInstruction; -use crate::common::{ChannelWithContext, SenderType, SenderWithContext}; -use crate::errors::{ContextType, ErrorContext, OsContext, PtyContext, ServerContext}; -use crate::os_input_output::{ServerOsApi, ServerOsApiInstruction}; -use crate::panes::PaneId; -use crate::pty_bus::{PtyBus, PtyInstruction}; -use crate::screen::ScreenInstruction; -use crate::{cli::CliArgs, common::pty_bus::VteEvent}; +use directories_next::ProjectDirs; use serde::{Deserialize, Serialize}; use std::os::unix::io::RawFd; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; -use zellij_tile::prelude::InputMode; +use std::{collections::HashMap, fs}; +use std::{ + collections::HashSet, + str::FromStr, + sync::{Arc, Mutex}, +}; +use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; +use wasmer_wasi::{Pipe, WasiState}; +use zellij_tile::data::{Event, EventType, InputMode}; + +use crate::cli::CliArgs; +use crate::client::ClientInstruction; +use crate::common::pty_bus::VteEvent; +use crate::common::{ + errors::{ContextType, ErrorContext, PluginContext, PtyContext, ScreenContext, ServerContext}, + os_input_output::ServerOsApi, + pty_bus::{PtyBus, PtyInstruction}, + screen::{Screen, ScreenInstruction}, + wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginEnv, PluginInstruction}, + ChannelWithContext, SenderType, SenderWithContext, OPENCALLS, +}; +use crate::layout::Layout; +use crate::panes::PaneId; +use crate::panes::PositionAndSize; /// Instructions related to server-side application including the /// ones sent by client to server @@ -21,13 +37,17 @@ pub enum ServerInstruction { SplitHorizontally, SplitVertically, MoveFocus, - NewClient(String), + NewClient(String, PositionAndSize), ToPty(PtyInstruction), ToScreen(ScreenInstruction), - OsApi(ServerOsApiInstruction), + Render(String), + PluginUpdate(Option, Event), DoneClosingPane, - ClosePluginPane(u32), + DoneOpeningNewPane, + DoneUpdatingTabs, ClientExit, + ClientShouldExit, + // notify router thread to exit Exit, } impl ServerInstruction { @@ -127,8 +147,8 @@ impl ServerInstruction { pub fn screen_close_pane(pane_id: PaneId) -> Self { Self::ToScreen(ScreenInstruction::ClosePane(pane_id)) } - pub fn apply_layout(layout: (PathBuf, Vec)) -> Self { - Self::ToScreen(ScreenInstruction::ApplyLayout(layout)) + pub fn apply_layout(layout: PathBuf, pids: Vec) -> Self { + Self::ToScreen(ScreenInstruction::ApplyLayout(layout, pids)) } pub fn screen_new_tab(fd: RawFd) -> Self { Self::ToScreen(ScreenInstruction::NewTab(fd)) @@ -154,169 +174,54 @@ impl ServerInstruction { 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, - )) +struct ClientMetaData { + pub send_pty_instructions: SenderWithContext, + pub send_screen_instructions: SenderWithContext, + pub send_plugin_instructions: SenderWithContext, + screen_thread: Option>, + pty_thread: Option>, + wasm_thread: Option>, +} + +impl ClientMetaData { + fn update(&mut self, err_ctx: ErrorContext) { + self.send_plugin_instructions.update(err_ctx); + self.send_screen_instructions.update(err_ctx); + self.send_pty_instructions.update(err_ctx); } - pub fn write_to_tty_stdin(fd: RawFd, buf: Vec) -> 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) +} + +impl Drop for ClientMetaData { + fn drop(&mut self) { + let _ = self.send_pty_instructions.send(PtyInstruction::Exit); + let _ = self.send_screen_instructions.send(ScreenInstruction::Exit); + let _ = self.send_plugin_instructions.send(PluginInstruction::Exit); + let _ = self.screen_thread.take().unwrap().join(); + let _ = self.pty_thread.take().unwrap().join(); + let _ = self.wasm_thread.take().unwrap().join(); } } pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { - let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = - channel(); - let mut send_pty_instructions = SenderWithContext::new( - ErrorContext::new(), - SenderType::Sender(send_pty_instructions), - ); - - let (send_os_instructions, receive_os_instructions): ChannelWithContext< - ServerOsApiInstruction, - > = channel(); - let mut send_os_instructions = SenderWithContext::new( - ErrorContext::new(), - SenderType::Sender(send_os_instructions), - ); - let (send_server_instructions, receive_server_instructions): ChannelWithContext< ServerInstruction, > = channel(); - let mut send_server_instructions = SenderWithContext::new( + let send_server_instructions = SenderWithContext::new( ErrorContext::new(), SenderType::Sender(send_server_instructions), ); - - // Don't use default layouts in tests, but do everywhere else - #[cfg(not(test))] - let default_layout = Some(PathBuf::from("default")); - #[cfg(test)] - let default_layout = None; - let maybe_layout = opts.layout.or(default_layout); - - let mut pty_bus = PtyBus::new( - receive_pty_instructions, - os_input.clone(), - send_server_instructions.clone(), - opts.debug, - ); - - let pty_thread = thread::Builder::new() - .name("pty".to_string()) - .spawn(move || loop { - let (event, mut err_ctx) = pty_bus - .receive_pty_instructions - .recv() - .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); - match event { - PtyInstruction::SpawnTerminal(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::new_pane(PaneId::Terminal(pid))) - .unwrap(); - } - PtyInstruction::SpawnTerminalVertically(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::vertical_split(PaneId::Terminal(pid))) - .unwrap(); - } - PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { - let pid = pty_bus.spawn_terminal(file_to_open); - pty_bus - .send_server_instructions - .send(ServerInstruction::horizontal_split(PaneId::Terminal(pid))) - .unwrap(); - } - PtyInstruction::NewTab => { - if let Some(layout) = maybe_layout.clone() { - pty_bus.spawn_terminals_for_layout(layout); - } else { - let pid = pty_bus.spawn_terminal(None); - pty_bus - .send_server_instructions - .send(ServerInstruction::screen_new_tab(pid)) - .unwrap(); - } - } - PtyInstruction::ClosePane(id) => { - pty_bus.close_pane(id); - pty_bus - .send_server_instructions - .send(ServerInstruction::DoneClosingPane) - .unwrap(); - } - PtyInstruction::CloseTab(ids) => { - pty_bus.close_tab(ids); - pty_bus - .send_server_instructions - .send(ServerInstruction::DoneClosingPane) - .unwrap(); - } - PtyInstruction::Exit => { - break; - } - } - }) - .unwrap(); - - let os_thread = thread::Builder::new() - .name("os".to_string()) - .spawn({ - let mut os_input = os_input.clone(); - move || loop { - let (event, mut err_ctx) = receive_os_instructions - .recv() - .expect("failed to receive an event on the channel"); - err_ctx.add_call(ContextType::Os(OsContext::from(&event))); - match event { - ServerOsApiInstruction::SetTerminalSizeUsingFd(fd, cols, rows) => { - os_input.set_terminal_size_using_fd(fd, cols, rows); - } - ServerOsApiInstruction::WriteToTtyStdin(fd, mut buf) => { - let slice = buf.as_mut_slice(); - os_input.write_to_tty_stdin(fd, slice).unwrap(); - } - ServerOsApiInstruction::TcDrain(fd) => { - os_input.tcdrain(fd).unwrap(); - } - ServerOsApiInstruction::Exit => break, - } - } - }) - .unwrap(); - let router_thread = thread::Builder::new() .name("server_router".to_string()) .spawn({ let os_input = os_input.clone(); - let mut send_os_instructions = send_os_instructions.clone(); - let mut send_pty_instructions = send_pty_instructions.clone(); + let mut send_server_instructions = send_server_instructions.clone(); move || loop { let (instruction, err_ctx) = os_input.server_recv(); send_server_instructions.update(err_ctx); - send_pty_instructions.update(err_ctx); - send_os_instructions.update(err_ctx); match instruction { ServerInstruction::Exit => break, - ServerInstruction::ToPty(instruction) => { - send_pty_instructions.send(instruction).unwrap(); - } - ServerInstruction::OsApi(instruction) => { - send_os_instructions.send(instruction).unwrap(); - } _ => { send_server_instructions.send(instruction).unwrap(); } @@ -328,60 +233,517 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread thread::Builder::new() .name("ipc_server".to_string()) .spawn({ + let mut clients: HashMap = HashMap::new(); + // We handle only single client for now + let mut client: Option = None; move || loop { let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); - send_pty_instructions.update(err_ctx); - send_os_instructions.update(err_ctx); os_input.update_senders(err_ctx); + if let Some(ref c) = client { + clients.get_mut(c).unwrap().update(err_ctx); + } match instruction { ServerInstruction::OpenFile(file_name) => { let path = PathBuf::from(file_name); - send_pty_instructions + clients[client.as_ref().unwrap()] + .send_pty_instructions .send(PtyInstruction::SpawnTerminal(Some(path))) .unwrap(); } ServerInstruction::SplitHorizontally => { - send_pty_instructions + clients[client.as_ref().unwrap()] + .send_pty_instructions .send(PtyInstruction::SpawnTerminalHorizontally(None)) .unwrap(); } ServerInstruction::SplitVertically => { - send_pty_instructions + clients[client.as_ref().unwrap()] + .send_pty_instructions .send(PtyInstruction::SpawnTerminalVertically(None)) .unwrap(); } ServerInstruction::MoveFocus => { - os_input.send_to_client(ClientInstruction::ToScreen( - ScreenInstruction::MoveFocus, - )); + clients[client.as_ref().unwrap()] + .send_screen_instructions + .send(ScreenInstruction::MoveFocus) + .unwrap(); } - ServerInstruction::NewClient(buffer_path) => { - send_pty_instructions.send(PtyInstruction::NewTab).unwrap(); + ServerInstruction::NewClient(buffer_path, full_screen_ws) => { + client = Some(buffer_path.clone()); + let client_data = init_client( + os_input.clone(), + opts.clone(), + send_server_instructions.clone(), + full_screen_ws, + ); + clients.insert(buffer_path.clone(), client_data); + clients[client.as_ref().unwrap()] + .send_pty_instructions + .send(PtyInstruction::NewTab) + .unwrap(); os_input.add_client_sender(buffer_path); } - ServerInstruction::ToScreen(instr) => { - os_input.send_to_client(ClientInstruction::ToScreen(instr)); + ServerInstruction::ToScreen(instruction) => { + clients[client.as_ref().unwrap()] + .send_screen_instructions + .send(instruction) + .unwrap(); + } + ServerInstruction::ToPty(instruction) => { + clients[client.as_ref().unwrap()] + .send_pty_instructions + .send(instruction) + .unwrap(); } ServerInstruction::DoneClosingPane => { os_input.send_to_client(ClientInstruction::DoneClosingPane); } - ServerInstruction::ClosePluginPane(pid) => { - os_input.send_to_client(ClientInstruction::ClosePluginPane(pid)); + ServerInstruction::DoneOpeningNewPane => { + os_input.send_to_client(ClientInstruction::DoneOpeningNewPane); + } + ServerInstruction::DoneUpdatingTabs => { + os_input.send_to_client(ClientInstruction::DoneUpdatingTabs); + } + ServerInstruction::ClientShouldExit => { + os_input.send_to_client(ClientInstruction::Exit); + } + ServerInstruction::PluginUpdate(pid, event) => { + clients[client.as_ref().unwrap()] + .send_plugin_instructions + .send(PluginInstruction::Update(pid, event)) + .unwrap(); } ServerInstruction::ClientExit => { - let _ = send_pty_instructions.send(PtyInstruction::Exit); - let _ = send_os_instructions.send(ServerOsApiInstruction::Exit); + clients.remove(client.as_ref().unwrap()).unwrap(); os_input.server_exit(); - let _ = pty_thread.join(); - let _ = os_thread.join(); let _ = router_thread.join(); let _ = os_input.send_to_client(ClientInstruction::Exit); break; } + ServerInstruction::Render(output) => { + os_input.send_to_client(ClientInstruction::Render(output)) + } _ => {} } } }) .unwrap() } + +fn init_client( + os_input: Box, + opts: CliArgs, + send_server_instructions: SenderWithContext, + full_screen_ws: PositionAndSize, +) -> ClientMetaData { + let err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); + let (send_screen_instructions, receive_screen_instructions): ChannelWithContext< + ScreenInstruction, + > = channel(); + let send_screen_instructions = + SenderWithContext::new(err_ctx, SenderType::Sender(send_screen_instructions)); + + let (send_plugin_instructions, receive_plugin_instructions): ChannelWithContext< + PluginInstruction, + > = channel(); + let send_plugin_instructions = + SenderWithContext::new(err_ctx, SenderType::Sender(send_plugin_instructions)); + let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = + channel(); + let send_pty_instructions = + SenderWithContext::new(err_ctx, SenderType::Sender(send_pty_instructions)); + + // Don't use default layouts in tests, but do everywhere else + #[cfg(not(test))] + let default_layout = Some(PathBuf::from("default")); + #[cfg(test)] + let default_layout = None; + let maybe_layout = opts.layout.or(default_layout); + + let mut pty_bus = PtyBus::new( + receive_pty_instructions, + os_input.clone(), + send_screen_instructions.clone(), + send_plugin_instructions.clone(), + opts.debug, + ); + + let pty_thread = thread::Builder::new() + .name("pty".to_string()) + .spawn({ + let send_server_instructions = send_server_instructions.clone(); + move || loop { + let (event, mut err_ctx) = pty_bus + .receive_pty_instructions + .recv() + .expect("failed to receive event on channel"); + err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); + match event { + PtyInstruction::SpawnTerminal(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_screen_instructions + .send(ScreenInstruction::NewPane(PaneId::Terminal(pid))) + .unwrap(); + } + PtyInstruction::SpawnTerminalVertically(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_screen_instructions + .send(ScreenInstruction::VerticalSplit(PaneId::Terminal(pid))) + .unwrap(); + } + PtyInstruction::SpawnTerminalHorizontally(file_to_open) => { + let pid = pty_bus.spawn_terminal(file_to_open); + pty_bus + .send_screen_instructions + .send(ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid))) + .unwrap(); + } + PtyInstruction::NewTab => { + if let Some(layout) = maybe_layout.clone() { + pty_bus.spawn_terminals_for_layout(layout); + } else { + let pid = pty_bus.spawn_terminal(None); + pty_bus + .send_screen_instructions + .send(ScreenInstruction::NewTab(pid)) + .unwrap(); + } + } + PtyInstruction::ClosePane(id) => { + pty_bus.close_pane(id); + send_server_instructions + .send(ServerInstruction::DoneClosingPane) + .unwrap(); + } + PtyInstruction::CloseTab(ids) => { + pty_bus.close_tab(ids); + send_server_instructions + .send(ServerInstruction::DoneClosingPane) + .unwrap(); + } + PtyInstruction::Exit => { + break; + } + } + } + }) + .unwrap(); + + let screen_thread = thread::Builder::new() + .name("screen".to_string()) + .spawn({ + let os_input = os_input.clone(); + let send_plugin_instructions = send_plugin_instructions.clone(); + let send_pty_instructions = send_pty_instructions.clone(); + let send_server_instructions = send_server_instructions.clone(); + let max_panes = opts.max_panes; + + move || { + let mut screen = Screen::new( + receive_screen_instructions, + send_plugin_instructions, + send_pty_instructions, + send_server_instructions, + &full_screen_ws, + os_input, + max_panes, + InputMode::Normal, + ); + loop { + let (event, mut err_ctx) = screen + .receiver + .recv() + .expect("failed to receive event on channel"); + err_ctx.add_call(ContextType::Screen(ScreenContext::from(&event))); + screen.send_server_instructions.update(err_ctx); + screen.send_pty_instructions.update(err_ctx); + screen.send_plugin_instructions.update(err_ctx); + match event { + ScreenInstruction::Pty(pid, vte_event) => { + screen + .get_active_tab_mut() + .unwrap() + .handle_pty_event(pid, vte_event); + } + ScreenInstruction::Render => { + screen.render(); + } + ScreenInstruction::NewPane(pid) => { + screen.get_active_tab_mut().unwrap().new_pane(pid); + screen + .send_server_instructions + .send(ServerInstruction::DoneOpeningNewPane) + .unwrap(); + } + ScreenInstruction::HorizontalSplit(pid) => { + screen.get_active_tab_mut().unwrap().horizontal_split(pid); + screen + .send_server_instructions + .send(ServerInstruction::DoneOpeningNewPane) + .unwrap(); + } + ScreenInstruction::VerticalSplit(pid) => { + screen.get_active_tab_mut().unwrap().vertical_split(pid); + screen + .send_server_instructions + .send(ServerInstruction::DoneOpeningNewPane) + .unwrap(); + } + ScreenInstruction::WriteCharacter(bytes) => { + screen + .get_active_tab_mut() + .unwrap() + .write_to_active_terminal(bytes); + } + ScreenInstruction::ResizeLeft => { + screen.get_active_tab_mut().unwrap().resize_left(); + } + ScreenInstruction::ResizeRight => { + screen.get_active_tab_mut().unwrap().resize_right(); + } + ScreenInstruction::ResizeDown => { + screen.get_active_tab_mut().unwrap().resize_down(); + } + ScreenInstruction::ResizeUp => { + screen.get_active_tab_mut().unwrap().resize_up(); + } + ScreenInstruction::MoveFocus => { + screen.get_active_tab_mut().unwrap().move_focus(); + } + ScreenInstruction::MoveFocusLeft => { + screen.get_active_tab_mut().unwrap().move_focus_left(); + } + ScreenInstruction::MoveFocusDown => { + screen.get_active_tab_mut().unwrap().move_focus_down(); + } + ScreenInstruction::MoveFocusRight => { + screen.get_active_tab_mut().unwrap().move_focus_right(); + } + ScreenInstruction::MoveFocusUp => { + screen.get_active_tab_mut().unwrap().move_focus_up(); + } + ScreenInstruction::ScrollUp => { + screen + .get_active_tab_mut() + .unwrap() + .scroll_active_terminal_up(); + } + ScreenInstruction::ScrollDown => { + screen + .get_active_tab_mut() + .unwrap() + .scroll_active_terminal_down(); + } + ScreenInstruction::ClearScroll => { + screen + .get_active_tab_mut() + .unwrap() + .clear_active_terminal_scroll(); + } + ScreenInstruction::CloseFocusedPane => { + screen.get_active_tab_mut().unwrap().close_focused_pane(); + screen.render(); + } + ScreenInstruction::SetSelectable(id, selectable) => { + screen + .get_active_tab_mut() + .unwrap() + .set_pane_selectable(id, selectable); + } + ScreenInstruction::SetMaxHeight(id, max_height) => { + screen + .get_active_tab_mut() + .unwrap() + .set_pane_max_height(id, max_height); + } + ScreenInstruction::SetInvisibleBorders(id, invisible_borders) => { + screen + .get_active_tab_mut() + .unwrap() + .set_pane_invisible_borders(id, invisible_borders); + screen.render(); + } + ScreenInstruction::ClosePane(id) => { + screen.get_active_tab_mut().unwrap().close_pane(id); + screen.render(); + } + ScreenInstruction::ToggleActiveTerminalFullscreen => { + screen + .get_active_tab_mut() + .unwrap() + .toggle_active_pane_fullscreen(); + } + ScreenInstruction::NewTab(pane_id) => { + screen.new_tab(pane_id); + screen + .send_server_instructions + .send(ServerInstruction::DoneUpdatingTabs) + .unwrap(); + } + ScreenInstruction::SwitchTabNext => { + screen.switch_tab_next(); + screen + .send_server_instructions + .send(ServerInstruction::DoneUpdatingTabs) + .unwrap(); + } + ScreenInstruction::SwitchTabPrev => { + screen.switch_tab_prev(); + screen + .send_server_instructions + .send(ServerInstruction::DoneUpdatingTabs) + .unwrap(); + } + ScreenInstruction::CloseTab => { + screen.close_tab(); + screen + .send_server_instructions + .send(ServerInstruction::DoneUpdatingTabs) + .unwrap(); + } + ScreenInstruction::ApplyLayout(layout, new_pane_pids) => { + screen.apply_layout(Layout::new(layout), new_pane_pids); + screen + .send_server_instructions + .send(ServerInstruction::DoneUpdatingTabs) + .unwrap(); + } + ScreenInstruction::GoToTab(tab_index) => { + screen.go_to_tab(tab_index as usize); + screen + .send_server_instructions + .send(ServerInstruction::DoneUpdatingTabs) + .unwrap(); + } + ScreenInstruction::UpdateTabName(c) => { + screen.update_active_tab_name(c); + screen + .send_server_instructions + .send(ServerInstruction::DoneUpdatingTabs) + .unwrap(); + } + ScreenInstruction::ChangeInputMode(input_mode) => { + screen.change_input_mode(input_mode); + } + ScreenInstruction::Exit => { + break; + } + } + } + } + }) + .unwrap(); + + let wasm_thread = thread::Builder::new() + .name("wasm".to_string()) + .spawn({ + let mut send_screen_instructions = send_screen_instructions.clone(); + let mut send_pty_instructions = send_pty_instructions.clone(); + + let store = Store::default(); + let mut plugin_id = 0; + let mut plugin_map = HashMap::new(); + move || loop { + let (event, mut err_ctx) = receive_plugin_instructions + .recv() + .expect("failed to receive event on channel"); + err_ctx.add_call(ContextType::Plugin(PluginContext::from(&event))); + send_screen_instructions.update(err_ctx); + send_pty_instructions.update(err_ctx); + match event { + PluginInstruction::Load(pid_tx, path) => { + let project_dirs = + ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); + let plugin_dir = project_dirs.data_dir().join("plugins/"); + let wasm_bytes = fs::read(&path) + .or_else(|_| fs::read(&path.with_extension("wasm"))) + .or_else(|_| fs::read(&plugin_dir.join(&path).with_extension("wasm"))) + .unwrap_or_else(|_| panic!("cannot find plugin {}", &path.display())); + + // FIXME: Cache this compiled module on disk. I could use `(de)serialize_to_file()` for that + let module = Module::new(&store, &wasm_bytes).unwrap(); + + let output = Pipe::new(); + let input = Pipe::new(); + let mut wasi_env = WasiState::new("Zellij") + .env("CLICOLOR_FORCE", "1") + .preopen(|p| { + p.directory(".") // FIXME: Change this to a more meaningful dir + .alias(".") + .read(true) + .write(true) + .create(true) + }) + .unwrap() + .stdin(Box::new(input)) + .stdout(Box::new(output)) + .finalize() + .unwrap(); + + let wasi = wasi_env.import_object(&module).unwrap(); + + let plugin_env = PluginEnv { + plugin_id, + send_screen_instructions: send_screen_instructions.clone(), + send_pty_instructions: send_pty_instructions.clone(), + wasi_env, + subscriptions: Arc::new(Mutex::new(HashSet::new())), + }; + + let zellij = zellij_imports(&store, &plugin_env); + let instance = Instance::new(&module, &zellij.chain_back(wasi)).unwrap(); + + let start = instance.exports.get_function("_start").unwrap(); + + // This eventually calls the `.init()` method + start.call(&[]).unwrap(); + + plugin_map.insert(plugin_id, (instance, plugin_env)); + pid_tx.send(plugin_id).unwrap(); + plugin_id += 1; + } + PluginInstruction::Update(pid, event) => { + for (&i, (instance, plugin_env)) in &plugin_map { + let subs = plugin_env.subscriptions.lock().unwrap(); + // FIXME: This is very janky... Maybe I should write my own macro for Event -> EventType? + let event_type = EventType::from_str(&event.to_string()).unwrap(); + if (pid.is_none() || pid == Some(i)) && subs.contains(&event_type) { + let update = instance.exports.get_function("update").unwrap(); + wasi_write_string( + &plugin_env.wasi_env, + &serde_json::to_string(&event).unwrap(), + ); + update.call(&[]).unwrap(); + } + } + drop(send_screen_instructions.send(ScreenInstruction::Render)); + } + PluginInstruction::Render(buf_tx, pid, rows, cols) => { + let (instance, plugin_env) = plugin_map.get(&pid).unwrap(); + + let render = instance.exports.get_function("render").unwrap(); + + render + .call(&[Value::I32(rows as i32), Value::I32(cols as i32)]) + .unwrap(); + + buf_tx.send(wasi_stdout(&plugin_env.wasi_env)).unwrap(); + } + PluginInstruction::Unload(pid) => drop(plugin_map.remove(&pid)), + PluginInstruction::Exit => break, + } + } + }) + .unwrap(); + ClientMetaData { + send_plugin_instructions, + send_screen_instructions, + send_pty_instructions, + screen_thread: Some(screen_thread), + pty_thread: Some(pty_thread), + wasm_thread: Some(wasm_thread), + } +} diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 7c4175bb..f5b03fde 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -190,8 +190,11 @@ impl ClientOsApi for FakeInputOutput { self.server_sender.update(new_ctx); self.client_sender.update(new_ctx); } - fn connect_to_server(&mut self) { - ClientOsApi::send_to_server(self, ServerInstruction::NewClient("zellij".into())); + fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) { + ClientOsApi::send_to_server( + self, + ServerInstruction::NewClient("zellij".into(), full_screen_ws), + ); } fn client_recv(&self) -> (ClientInstruction, ErrorContext) { self.client_receiver.lock().unwrap().recv().unwrap() From 2a648187fc8d4afc9b34d322b4f8394dcd39b6dd Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sun, 4 Apr 2021 01:24:46 +0530 Subject: [PATCH 44/64] Fix after rebase --- Cargo.lock | 12 +----- src/client/mod.rs | 17 ++++++++ src/client/pane_resizer.rs | 6 +-- src/client/tab.rs | 17 +++++--- src/common/errors.rs | 2 +- src/common/input/handler.rs | 2 +- src/common/os_input_output.rs | 16 +++++++ src/common/screen.rs | 7 ++-- src/server/mod.rs | 18 +++++--- src/tests/fakes.rs | 42 ++++++++++++++----- .../integration/terminal_window_resize.rs | 24 +++++++++-- 11 files changed, 117 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 72f684cc..38937d8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,7 +132,7 @@ dependencies = [ "event-listener", "futures-lite", "once_cell", - "signal-hook 0.3.6", + "signal-hook", "winapi", ] @@ -1561,16 +1561,6 @@ dependencies = [ "opaque-debug", ] -[[package]] -name = "signal-hook" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729" -dependencies = [ - "libc", - "signal-hook-registry", -] - [[package]] name = "signal-hook" version = "0.3.6" diff --git a/src/client/mod.rs b/src/client/mod.rs index ae298a5e..b6a0231a 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -69,6 +69,23 @@ pub fn start_client(mut os_input: Box) { move || input_loop(os_input, command_is_executing, send_client_instructions) }); + let _signal_thread = thread::Builder::new() + .name("signal_listener".to_string()) + .spawn({ + let os_input = os_input.clone(); + move || { + os_input.receive_sigwinch(Box::new({ + let os_api = os_input.clone(); + move || { + os_api.send_to_server(ServerInstruction::terminal_resize( + os_api.get_terminal_size_using_fd(0), + )); + } + })); + } + }) + .unwrap(); + let router_thread = thread::Builder::new() .name("router".to_string()) .spawn({ diff --git a/src/client/pane_resizer.rs b/src/client/pane_resizer.rs index f9ec71b8..73678499 100644 --- a/src/client/pane_resizer.rs +++ b/src/client/pane_resizer.rs @@ -1,4 +1,4 @@ -use crate::os_input_output::OsApi; +use crate::os_input_output::ServerOsApi; use crate::panes::{PaneId, PositionAndSize}; use crate::tab::Pane; use std::{ @@ -8,7 +8,7 @@ use std::{ pub struct PaneResizer<'a> { panes: &'a mut BTreeMap>, - os_api: &'a mut Box, + os_api: &'a mut Box, } // TODO: currently there are some functions here duplicated with Tab @@ -17,7 +17,7 @@ pub struct PaneResizer<'a> { impl<'a> PaneResizer<'a> { pub fn new( panes: &'a mut BTreeMap>, - os_api: &'a mut Box, + os_api: &'a mut Box, ) -> Self { PaneResizer { panes, os_api } } diff --git a/src/client/tab.rs b/src/client/tab.rs index 4eabab10..3817a327 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -2,22 +2,24 @@ //! as well as how they should be resized use crate::boundaries::colors; +use crate::client::pane_resizer::PaneResizer; use crate::common::{input::handler::parse_keys, SenderWithContext}; use crate::layout::Layout; use crate::os_input_output::ServerOsApi; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; use crate::pty_bus::{PtyInstruction, VteEvent}; use crate::server::ServerInstruction; -use crate::utils::shared::pad_to_size; +use crate::utils::shared::adjust_to_size; use crate::wasm_vm::PluginInstruction; use crate::{boundaries::Boundaries, panes::PluginPane}; +use serde::{Deserialize, Serialize}; use std::os::unix::io::RawFd; use std::sync::mpsc::channel; use std::{ cmp::Reverse, collections::{BTreeMap, HashSet}, }; -use zellij_tile::data::{Event, InputMode}; +use zellij_tile::data::{Event, ModeInfo}; const CURSOR_HEIGHT_WIDTH_RATIO: usize = 4; // this is not accurate and kind of a magic number, TODO: look into this @@ -729,9 +731,14 @@ impl Tab { ); let hide_cursor = "\u{1b}[?25l"; output.push_str(hide_cursor); - for (kind, terminal) in self.panes.iter_mut() { - if !self.panes_to_hide.contains(&terminal.pid()) { - match self.active_terminal.unwrap() == terminal.pid() { + if self.should_clear_display_before_rendering { + let clear_display = "\u{1b}[2J"; + output.push_str(clear_display); + self.should_clear_display_before_rendering = false; + } + for (kind, pane) in self.panes.iter_mut() { + if !self.panes_to_hide.contains(&pane.pid()) { + match self.active_terminal.unwrap() == pane.pid() { true => { pane.set_active_at(Instant::now()); boundaries.add_rect(pane.as_ref(), self.mode_info.mode, Some(self.colors)) diff --git a/src/common/errors.rs b/src/common/errors.rs index 720341a4..10b2165a 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -259,7 +259,7 @@ impl From<&ScreenInstruction> for ScreenContext { ScreenInstruction::CloseTab => ScreenContext::CloseTab, ScreenInstruction::GoToTab(_) => ScreenContext::GoToTab, ScreenInstruction::UpdateTabName(_) => ScreenContext::UpdateTabName, - ScreenInstruction::TerminalResize => ScreenContext::TerminalResize, + ScreenInstruction::TerminalResize(_) => ScreenContext::TerminalResize, ScreenInstruction::ChangeMode(_) => ScreenContext::ChangeMode, ScreenInstruction::ToggleActiveSyncPanes => ScreenContext::ToggleActiveSyncPanes, } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 4015938a..947a8d02 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -127,7 +127,7 @@ impl InputHandler { Event::ModeUpdate(get_mode_info(mode)), )); self.os_input - .send_to_server(ServerInstruction::change_input_mode(mode)); + .send_to_server(ServerInstruction::change_mode(get_mode_info(mode))); self.os_input.send_to_server(ServerInstruction::render()); } Action::Resize(direction) => { diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 53300424..66957a4a 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -7,6 +7,7 @@ use nix::sys::wait::waitpid; use nix::unistd; use nix::unistd::{ForkResult, Pid}; use serde::Serialize; +use signal_hook::{consts::signal::*, iterator::Signals}; use std::env; use std::io; use std::io::prelude::*; @@ -334,6 +335,7 @@ pub trait ClientOsApi: Send + Sync { fn client_recv(&self) -> (ClientInstruction, ErrorContext); /// Setup the client IpcChannel and notify server of new client fn connect_to_server(&mut self, full_screen_ws: PositionAndSize); + fn receive_sigwinch(&self, cb: Box); } impl ClientOsApi for ClientOsInputOutput { @@ -389,6 +391,20 @@ impl ClientOsApi for ClientOsInputOutput { .recv() .unwrap() } + fn receive_sigwinch(&self, cb: Box) { + let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); + for signal in signals.forever() { + match signal { + SIGWINCH => { + cb(); + } + SIGTERM | SIGINT | SIGQUIT => { + break; + } + _ => unreachable!(), + } + } + } } impl Clone for Box { diff --git a/src/common/screen.rs b/src/common/screen.rs index 8868febb..92e1075c 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -58,7 +58,7 @@ pub enum ScreenInstruction { CloseTab, GoToTab(u32), UpdateTabName(Vec), - TerminalResize, + TerminalResize(PositionAndSize), ChangeMode(ModeInfo), } @@ -83,7 +83,7 @@ pub struct Screen { active_tab_index: Option, /// The [`ClientOsApi`] this [`Screen`] uses. os_api: Box, - input_mode: InputMode, + mode_info: ModeInfo, } impl Screen { @@ -233,8 +233,7 @@ impl Screen { } } - pub fn resize_to_screen(&mut self) { - let new_screen_size = self.os_api.get_terminal_size_using_fd(0); + pub fn resize_to_screen(&mut self, new_screen_size: PositionAndSize) { self.full_screen_ws = new_screen_size; for (_, tab) in self.tabs.iter_mut() { tab.resize_whole_tab(new_screen_size); diff --git a/src/server/mod.rs b/src/server/mod.rs index 5f122799..2495c13d 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -12,7 +12,7 @@ use std::{ }; use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; -use zellij_tile::data::{Event, EventType, InputMode}; +use zellij_tile::data::{Event, EventType, ModeInfo}; use crate::cli::CliArgs; use crate::client::ClientInstruction; @@ -168,12 +168,15 @@ impl ServerInstruction { pub fn update_tab_name(tab_ids: Vec) -> Self { Self::ToScreen(ScreenInstruction::UpdateTabName(tab_ids)) } - pub fn change_input_mode(input_mode: InputMode) -> Self { - Self::ToScreen(ScreenInstruction::ChangeInputMode(input_mode)) + pub fn change_mode(mode_info: ModeInfo) -> Self { + Self::ToScreen(ScreenInstruction::ChangeMode(mode_info)) } pub fn pty(fd: RawFd, event: VteEvent) -> Self { Self::ToScreen(ScreenInstruction::Pty(fd, event)) } + pub fn terminal_resize(new_size: PositionAndSize) -> Self { + Self::ToScreen(ScreenInstruction::TerminalResize(new_size)) + } } struct ClientMetaData { @@ -450,7 +453,7 @@ fn init_client( &full_screen_ws, os_input, max_panes, - InputMode::Normal, + ModeInfo::default(), ); loop { let (event, mut err_ctx) = screen @@ -625,8 +628,11 @@ fn init_client( .send(ServerInstruction::DoneUpdatingTabs) .unwrap(); } - ScreenInstruction::ChangeInputMode(input_mode) => { - screen.change_input_mode(input_mode); + ScreenInstruction::ChangeMode(mode_info) => { + screen.change_mode(mode_info); + } + ScreenInstruction::TerminalResize(new_size) => { + screen.resize_to_screen(new_size); } ScreenInstruction::Exit => { break; diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index f5b03fde..8c608de3 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -3,8 +3,7 @@ use std::collections::{HashMap, VecDeque}; use std::io::Write; use std::os::unix::io::RawFd; use std::path::PathBuf; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::{mpsc, Arc, Mutex}; +use std::sync::{mpsc, Arc, Condvar, Mutex}; use std::time::{Duration, Instant}; use crate::client::ClientInstruction; @@ -13,8 +12,7 @@ use crate::errors::ErrorContext; use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::server::ServerInstruction; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; -use crate::utils::shared::default_palette; -use zellij_tile::data::Palette; +use crate::tests::utils::commands::{QUIT, SLEEP}; const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(150); @@ -76,11 +74,12 @@ pub struct FakeInputOutput { win_sizes: Arc>>, possible_tty_inputs: HashMap, last_snapshot_time: Arc>, - started_reading_from_pty: Arc, client_sender: SenderWithContext, client_receiver: Arc>>, server_sender: SenderWithContext, server_receiver: Arc>>, + should_trigger_sigwinch: Arc<(Mutex, Condvar)>, + sigwinch_event: Option, } impl FakeInputOutput { @@ -108,11 +107,12 @@ impl FakeInputOutput { io_events: Arc::new(Mutex::new(vec![])), win_sizes: Arc::new(Mutex::new(win_sizes)), possible_tty_inputs: get_possible_tty_inputs(), - started_reading_from_pty: Arc::new(AtomicBool::new(false)), server_receiver: Arc::new(Mutex::new(server_receiver)), server_sender, client_receiver: Arc::new(Mutex::new(client_receiver)), client_sender, + should_trigger_sigwinch: Arc::new((Mutex::new(false), Condvar::new())), + sigwinch_event: None, } } pub fn with_tty_inputs(mut self, tty_inputs: HashMap) -> Self { @@ -171,14 +171,24 @@ impl ClientOsApi for FakeInputOutput { ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS - last_snapshot_time.elapsed()); } } - if self.stdin_commands.lock().unwrap().len() == 1 { - std::thread::sleep(Duration::from_millis(100)); - } - self.stdin_commands + let command = self + .stdin_commands .lock() .unwrap() .pop_front() - .unwrap_or(vec![]) + .unwrap_or(vec![]); + if command == SLEEP { + std::thread::sleep(std::time::Duration::from_millis(200)); + } else if command == QUIT && self.sigwinch_event.is_some() { + let (lock, cvar) = &*self.should_trigger_sigwinch; + let mut should_trigger_sigwinch = lock.lock().unwrap(); + *should_trigger_sigwinch = true; + cvar.notify_one(); + ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS); // give some time for the app to resize before quitting + } else if command == QUIT { + ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS); + } + command } fn get_stdout_writer(&self) -> Box { Box::new(self.stdout_writer.clone()) @@ -199,6 +209,16 @@ impl ClientOsApi for FakeInputOutput { fn client_recv(&self) -> (ClientInstruction, ErrorContext) { self.client_receiver.lock().unwrap().recv().unwrap() } + fn receive_sigwinch(&self, cb: Box) { + if self.sigwinch_event.is_some() { + let (lock, cvar) = &*self.should_trigger_sigwinch; + let mut should_trigger_sigwinch = lock.lock().unwrap(); + while !*should_trigger_sigwinch { + should_trigger_sigwinch = cvar.wait(should_trigger_sigwinch).unwrap(); + } + cb(); + } + } } impl ServerOsApi for FakeInputOutput { diff --git a/src/tests/integration/terminal_window_resize.rs b/src/tests/integration/terminal_window_resize.rs index ebea82c0..5aa13e15 100644 --- a/src/tests/integration/terminal_window_resize.rs +++ b/src/tests/integration/terminal_window_resize.rs @@ -30,7 +30,11 @@ pub fn window_width_decrease_with_one_pane() { ..Default::default() }); let opts = CliArgs::default(); - start(Box::new(fake_input_output.clone()), opts, Config::default()); + start( + Box::new(fake_input_output.clone()), + opts, + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer .output_frames @@ -61,7 +65,11 @@ pub fn window_width_increase_with_one_pane() { ..Default::default() }); let opts = CliArgs::default(); - start(Box::new(fake_input_output.clone()), opts, Config::default()); + start( + Box::new(fake_input_output.clone()), + opts, + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer .output_frames @@ -92,7 +100,11 @@ pub fn window_height_increase_with_one_pane() { ..Default::default() }); let opts = CliArgs::default(); - start(Box::new(fake_input_output.clone()), opts, Config::default()); + start( + Box::new(fake_input_output.clone()), + opts, + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer .output_frames @@ -123,7 +135,11 @@ pub fn window_width_and_height_decrease_with_one_pane() { ..Default::default() }); let opts = CliArgs::default(); - start(Box::new(fake_input_output.clone()), opts, Config::default()); + start( + Box::new(fake_input_output.clone()), + opts, + Box::new(fake_input_output.clone()), + ); let output_frames = fake_input_output .stdout_writer .output_frames From 30d0ec2a40c3c955c301b4b4f978c0ff2b74881e Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sun, 4 Apr 2021 23:09:37 +0530 Subject: [PATCH 45/64] fix terminal window resize tests by restricting lifetime of locks --- src/tests/fakes.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 8c608de3..79511743 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -181,8 +181,10 @@ impl ClientOsApi for FakeInputOutput { std::thread::sleep(std::time::Duration::from_millis(200)); } else if command == QUIT && self.sigwinch_event.is_some() { let (lock, cvar) = &*self.should_trigger_sigwinch; - let mut should_trigger_sigwinch = lock.lock().unwrap(); - *should_trigger_sigwinch = true; + { + let mut should_trigger_sigwinch = lock.lock().unwrap(); + *should_trigger_sigwinch = true; + } cvar.notify_one(); ::std::thread::sleep(MIN_TIME_BETWEEN_SNAPSHOTS); // give some time for the app to resize before quitting } else if command == QUIT { @@ -212,9 +214,11 @@ impl ClientOsApi for FakeInputOutput { fn receive_sigwinch(&self, cb: Box) { if self.sigwinch_event.is_some() { let (lock, cvar) = &*self.should_trigger_sigwinch; - let mut should_trigger_sigwinch = lock.lock().unwrap(); - while !*should_trigger_sigwinch { - should_trigger_sigwinch = cvar.wait(should_trigger_sigwinch).unwrap(); + { + let mut should_trigger_sigwinch = lock.lock().unwrap(); + while !*should_trigger_sigwinch { + should_trigger_sigwinch = cvar.wait(should_trigger_sigwinch).unwrap(); + } } cb(); } From fedb588330713b815bdd2380c00f8c0762f4e859 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 14 Apr 2021 01:41:40 +0530 Subject: [PATCH 46/64] Fix after rebase --- Cargo.lock | 89 ++++++++++++------------ src/cli.rs | 4 +- src/client/mod.rs | 36 +++++++--- src/client/panes/terminal_pane.rs | 1 - src/client/tab.rs | 2 +- src/common/errors.rs | 2 +- src/common/input/handler.rs | 81 ++++++++++++--------- src/common/mod.rs | 13 +++- src/common/os_input_output.rs | 8 ++- src/common/pty_bus.rs | 112 +++--------------------------- src/common/screen.rs | 2 +- src/main.rs | 5 +- src/server/mod.rs | 85 +++++++++++------------ src/tests/fakes.rs | 19 ++--- 14 files changed, 194 insertions(+), 265 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 38937d8b..832ac842 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -209,9 +209,9 @@ dependencies = [ [[package]] name = "bincode" -version = "1.3.2" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d175dfa69e619905c4c3cdb7c3c203fa3bdd5d51184e3afdb2742c0280493772" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ "serde", ] @@ -265,9 +265,9 @@ checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" [[package]] name = "byteorder" -version = "1.3.4" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cache-padded" @@ -491,9 +491,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06d4a9551359071d1890820e3571252b91229e0712e7c36b08940e603c5a8fc" +checksum = "e9d6ddad5866bb2170686ed03f6839d31a76e5407d80b1c334a2c24618543ffa" dependencies = [ "darling_core", "darling_macro", @@ -501,9 +501,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b443e5fb0ddd56e0c9bfa47dc060c5306ee500cb731f2b91432dd65589a77684" +checksum = "a9ced1fd13dc386d5a8315899de465708cf34ee2a6d9394654515214e67bb846" dependencies = [ "fnv", "ident_case", @@ -515,9 +515,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0220073ce504f12a70efc4e7cdaea9e9b1b324872e7ad96a208056d7a638b81" +checksum = "0a7a1445d54b2f9792e3b31a3e715feabbace393f38dc4ffd49d94ee9bc487d5" dependencies = [ "darling_core", "quote", @@ -637,9 +637,9 @@ checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" [[package]] name = "futures" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1" +checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253" dependencies = [ "futures-channel", "futures-core", @@ -652,9 +652,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25" dependencies = [ "futures-core", "futures-sink", @@ -662,15 +662,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" +checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815" [[package]] name = "futures-executor" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1" +checksum = "10f6cb7042eda00f0049b1d2080aa4b93442997ee507eb3828e8bd7577f94c9d" dependencies = [ "futures-core", "futures-task", @@ -679,9 +679,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" +checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04" [[package]] name = "futures-lite" @@ -700,9 +700,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7" +checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b" dependencies = [ "proc-macro-hack", "proc-macro2", @@ -712,21 +712,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" +checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23" [[package]] name = "futures-task" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" +checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc" [[package]] name = "futures-util" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025" dependencies = [ "futures-channel", "futures-core", @@ -872,9 +872,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6cf41e31a7e7b78055b548826da45c7dc74e6a13a3fa6b897a17a01322f26" +checksum = "c4a1b21a2971cea49ca4613c0e9fe8225ecaf5de64090fddc6002284726e9244" dependencies = [ "console", "lazy_static", @@ -1030,9 +1030,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "lock_api" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" dependencies = [ "scopeguard", ] @@ -1108,9 +1108,9 @@ checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" [[package]] name = "nb-connect" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670361df1bc2399ee1ff50406a0d422587dd3bb0da596e1978fe8e05dabddf4f" +checksum = "a19900e7eee95eb2b3c2e26d12a874cc80aaf750e31be6fcbe743ead369fa45d" dependencies = [ "libc", "socket2", @@ -1563,9 +1563,9 @@ dependencies = [ [[package]] name = "signal-hook" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7f3f92a1da3d6b1d32245d0cbcbbab0cfc45996d8df619c42bccfa6d2bbb5f" +checksum = "ef33d6d0cd06e0840fba9985aab098c147e67e05cee14d412d3345ed14ff30ac" dependencies = [ "libc", "signal-hook-registry", @@ -1600,11 +1600,10 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "socket2" -version = "0.3.19" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" dependencies = [ - "cfg-if 1.0.0", "libc", "winapi", ] @@ -1844,9 +1843,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a9bd1db7706f2373a190b0d067146caa39350c486f3d455b0e33b431f94c07" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", @@ -2291,18 +2290,18 @@ checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" [[package]] name = "wast" -version = "35.0.0" +version = "35.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db5ae96da18bb5926341516fd409b5a8ce4e4714da7f0a1063d3b20ac9f9a1e1" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0fa059022c5dabe129f02b429d67086400deb8277f89c975555dacc1dadbcc" +checksum = "8ec280a739b69173e0ffd12c1658507996836ba4e992ed9bc1e5385a0bd72a02" dependencies = [ "wast", ] diff --git a/src/cli.rs b/src/cli.rs index d4c1c704..c3f76967 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -2,7 +2,7 @@ use super::common::utils::consts::{ZELLIJ_CONFIG_DIR_ENV, ZELLIJ_CONFIG_FILE_ENV use std::path::PathBuf; use structopt::StructOpt; -#[derive(StructOpt, Debug, Default, Clone)] +#[derive(StructOpt, Default, Debug, Clone)] #[structopt(name = "zellij")] pub struct CliArgs { /// Send "split (direction h == horizontal / v == vertical)" to active zellij session @@ -44,7 +44,7 @@ pub struct CliArgs { pub debug: bool, } -#[derive(Debug, StructOpt)] +#[derive(Debug, StructOpt, Clone)] pub enum ConfigCli { /// Change the behaviour of zellij #[structopt(name = "option")] diff --git a/src/client/mod.rs b/src/client/mod.rs index b6a0231a..6ba6df73 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -9,12 +9,14 @@ use std::io::Write; use std::sync::mpsc; use std::thread; +use crate::cli::CliArgs; use crate::common::{ command_is_executing::CommandIsExecuting, errors::{ClientContext, ContextType}, + input::config::Config, input::handler::input_loop, os_input_output::ClientOsApi, - SenderType, SenderWithContext, SyncChannelWithContext, OPENCALLS, + SenderType, SenderWithContext, SyncChannelWithContext, }; use crate::server::ServerInstruction; @@ -29,7 +31,7 @@ pub enum ClientInstruction { Exit, } -pub fn start_client(mut os_input: Box) { +pub fn start_client(mut os_input: Box, opts: CliArgs) { let take_snapshot = "\u{1b}[?1049h"; os_input.unset_raw_mode(0); let _ = os_input @@ -37,17 +39,23 @@ pub fn start_client(mut os_input: Box) { .write(take_snapshot.as_bytes()) .unwrap(); + let config = Config::from_cli_config(opts.config) + .map_err(|e| { + eprintln!("There was an error in the config file:\n{}", e); + std::process::exit(1); + }) + .unwrap(); + let mut command_is_executing = CommandIsExecuting::new(); let full_screen_ws = os_input.get_terminal_size_using_fd(0); os_input.set_raw_mode(0); - let err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); let (send_client_instructions, receive_client_instructions): SyncChannelWithContext< ClientInstruction, > = mpsc::sync_channel(500); - let mut send_client_instructions = - SenderWithContext::new(err_ctx, SenderType::SyncSender(send_client_instructions)); + let send_client_instructions = + SenderWithContext::new(SenderType::SyncSender(send_client_instructions)); os_input.connect_to_server(full_screen_ws); @@ -66,7 +74,14 @@ pub fn start_client(mut os_input: Box) { let send_client_instructions = send_client_instructions.clone(); let command_is_executing = command_is_executing.clone(); let os_input = os_input.clone(); - move || input_loop(os_input, command_is_executing, send_client_instructions) + move || { + input_loop( + os_input, + config, + command_is_executing, + send_client_instructions, + ) + } }); let _signal_thread = thread::Builder::new() @@ -92,8 +107,7 @@ pub fn start_client(mut os_input: Box) { let os_input = os_input.clone(); move || { loop { - let (instruction, err_ctx) = os_input.client_recv(); - send_client_instructions.update(err_ctx); + let (instruction, _err_ctx) = os_input.client_recv(); if let ClientInstruction::Exit = instruction { break; } @@ -122,7 +136,11 @@ pub fn start_client(mut os_input: Box) { let _ = os_input.send_to_server(ServerInstruction::ClientExit); os_input.unset_raw_mode(0); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); - let error = format!("{}\n{}", goto_start_of_last_line, backtrace); + let restore_snapshot = "\u{1b}[?1049l"; + let error = format!( + "{}\n{}{}", + goto_start_of_last_line, restore_snapshot, backtrace + ); let _ = os_input .get_stdout_writer() .write(error.as_bytes()) diff --git a/src/client/panes/terminal_pane.rs b/src/client/panes/terminal_pane.rs index 9fcddc82..f58c3a27 100644 --- a/src/client/panes/terminal_pane.rs +++ b/src/client/panes/terminal_pane.rs @@ -1,7 +1,6 @@ use crate::tab::Pane; use ::nix::pty::Winsize; use ::std::os::unix::io::RawFd; -use ::vte::Perform; use serde::{Deserialize, Serialize}; use std::fmt::Debug; use std::time::Instant; diff --git a/src/client/tab.rs b/src/client/tab.rs index 3817a327..42e19388 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -7,7 +7,7 @@ use crate::common::{input::handler::parse_keys, SenderWithContext}; use crate::layout::Layout; use crate::os_input_output::ServerOsApi; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; -use crate::pty_bus::{PtyInstruction, VteEvent}; +use crate::pty_bus::{PtyInstruction, VteBytes}; use crate::server::ServerInstruction; use crate::utils::shared::adjust_to_size; use crate::wasm_vm::PluginInstruction; diff --git a/src/common/errors.rs b/src/common/errors.rs index 10b2165a..5685f885 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -1,7 +1,7 @@ //! Error context system based on a thread-local representation of the call stack, itself based on //! the instructions that are sent between threads. -use super::{ServerInstruction, OPENCALLS}; +use super::{ServerInstruction, ASYNCOPENCALLS, OPENCALLS}; use crate::client::ClientInstruction; use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 947a8d02..2fba8537 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -1,12 +1,14 @@ //! Main input logic. use super::actions::Action; -use super::keybinds::get_default_keybinds; +use super::keybinds::Keybinds; use crate::client::ClientInstruction; +use crate::common::input::config::Config; use crate::common::{SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::ClientOsApi; use crate::pty_bus::PtyInstruction; +use crate::screen::ScreenInstruction; use crate::server::ServerInstruction; use crate::CommandIsExecuting; @@ -19,8 +21,10 @@ struct InputHandler { /// The current input mode mode: InputMode, os_input: Box, + config: Config, command_is_executing: CommandIsExecuting, send_client_instructions: SenderWithContext, + should_exit: bool, } impl InputHandler { @@ -28,6 +32,7 @@ impl InputHandler { fn new( os_input: Box, command_is_executing: CommandIsExecuting, + config: Config, send_client_instructions: SenderWithContext, ) -> Self { InputHandler { @@ -36,6 +41,7 @@ impl InputHandler { config, command_is_executing, send_client_instructions, + should_exit: false, } } @@ -44,34 +50,26 @@ impl InputHandler { fn handle_input(&mut self) { let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); err_ctx.add_call(ContextType::StdinHandler); - self.send_client_instructions.update(err_ctx); - self.os_input.update_senders(err_ctx); - if let Ok(keybinds) = get_default_keybinds() { - 'input_loop: loop { - //@@@ I think this should actually just iterate over stdin directly - let stdin_buffer = self.os_input.read_from_stdin(); - for key_result in stdin_buffer.events_and_raw() { - match key_result { - Ok((event, raw_bytes)) => match event { - termion::event::Event::Key(key) => { - let key = cast_termion_key(key); - // FIXME this explicit break is needed because the current test - // framework relies on it to not create dead threads that loop - // and eat up CPUs. Do not remove until the test framework has - // been revised. Sorry about this (@categorille) - let mut should_break = false; - for action in key_to_actions(&key, raw_bytes, &self.mode, &keybinds) - { - should_break |= self.dispatch_action(action); - } - if should_break { - break 'input_loop; - } - } - termion::event::Event::Mouse(_) - | termion::event::Event::Unsupported(_) => { - // Mouse and unsupported events aren't implemented yet, - // use a NoOp untill then. + let keybinds = self.config.keybinds.clone(); + let alt_left_bracket = vec![27, 91]; + loop { + if self.should_exit { + break; + } + let stdin_buffer = self.os_input.read_from_stdin(); + for key_result in stdin_buffer.events_and_raw() { + match key_result { + Ok((event, raw_bytes)) => match event { + termion::event::Event::Key(key) => { + let key = cast_termion_key(key); + self.handle_key(&key, raw_bytes, &keybinds); + } + termion::event::Event::Unsupported(unsupported_key) => { + // we have to do this because of a bug in termion + // this should be a key event and not an unsupported event + if unsupported_key == alt_left_bracket { + let key = Key::Alt('['); + self.handle_key(&key, raw_bytes, &keybinds); } } termion::event::Event::Mouse(_) => { @@ -139,8 +137,19 @@ impl InputHandler { }; self.os_input.send_to_server(screen_instr); } - Action::SwitchFocus(_) => { - self.os_input.send_to_server(ServerInstruction::MoveFocus); + Action::SwitchFocus => { + self.os_input + .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::SwitchFocus)); + } + Action::FocusNextPane => { + self.os_input.send_to_server(ServerInstruction::ToScreen( + ScreenInstruction::FocusNextPane, + )); + } + Action::FocusPreviousPane => { + self.os_input.send_to_server(ServerInstruction::ToScreen( + ScreenInstruction::FocusPreviousPane, + )); } Action::MoveFocus(direction) => { let screen_instr = match direction { @@ -299,11 +308,17 @@ pub fn get_mode_info(mode: InputMode, palette: Palette) -> ModeInfo { /// its [`InputHandler::handle_input()`] loop. pub fn input_loop( os_input: Box, + config: Config, command_is_executing: CommandIsExecuting, send_client_instructions: SenderWithContext, ) { - let _handler = - InputHandler::new(os_input, command_is_executing, send_client_instructions).handle_input(); + let _handler = InputHandler::new( + os_input, + command_is_executing, + config, + send_client_instructions, + ) + .handle_input(); } pub fn parse_keys(input_bytes: &[u8]) -> Vec { diff --git a/src/common/mod.rs b/src/common/mod.rs index d9b5e6cf..6061f1a6 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -11,7 +11,8 @@ pub mod wasm_vm; use crate::panes::PaneId; use crate::server::ServerInstruction; -use errors::ErrorContext; +use async_std::task_local; +use errors::{get_current_ctx, ErrorContext}; use std::cell::RefCell; use std::sync::mpsc; @@ -43,8 +44,8 @@ pub struct SenderWithContext { } impl SenderWithContext { - pub fn new(err_ctx: ErrorContext, sender: SenderType) -> Self { - Self { err_ctx, sender } + pub fn new(sender: SenderType) -> Self { + Self { sender } } /// Sends an event, along with the current [`ErrorContext`], on this @@ -66,3 +67,9 @@ thread_local!( /// stack in the form of an [`ErrorContext`]. pub static OPENCALLS: RefCell = RefCell::default() ); + +task_local! { + /// A key to some task local storage that holds a representation of the task's call + /// stack in the form of an [`ErrorContext`]. + static ASYNCOPENCALLS: RefCell = RefCell::default() +} diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 66957a4a..3d7b8918 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -256,7 +256,13 @@ impl ServerOsApi for ServerOsInputOutput { Box::new((*self).clone()) } fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error> { - kill(Pid::from_raw(pid), Some(Signal::SIGINT)).unwrap(); + // TODO: + // Ideally, we should be using SIGINT rather than SIGKILL here, but there are cases in which + // the terminal we're trying to kill hangs on SIGINT and so all the app gets stuck + // that's why we're sending SIGKILL here + // A better solution would be to send SIGINT here and not wait for it, and then have + // a background thread do the waitpid stuff and send SIGKILL if the process is stuck + kill(Pid::from_raw(pid), Some(Signal::SIGKILL)).unwrap(); waitpid(Pid::from_raw(pid), None).unwrap(); Ok(()) } diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index b9bb422b..b9f61d09 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -6,16 +6,15 @@ use ::std::os::unix::io::RawFd; use ::std::pin::*; use ::std::sync::mpsc::Receiver; use ::std::time::{Duration, Instant}; -use ::vte; use serde::{Deserialize, Serialize}; use std::path::PathBuf; -use super::{SenderWithContext, OPENCALLS}; +use super::SenderWithContext; use crate::layout::Layout; use crate::os_input_output::ServerOsApi; use crate::utils::logging::debug_to_file; use crate::{ - errors::{ContextType, ErrorContext}, + errors::{get_current_ctx, ContextType, ErrorContext}, panes::PaneId, screen::ScreenInstruction, wasm_vm::PluginInstruction, @@ -67,99 +66,7 @@ impl Stream for ReadFromPid { } } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum VteEvent { - // TODO: try not to allocate Vecs - Print(char), - Execute(u8), // byte - Hook(Vec, Vec, bool, char), // params, intermediates, ignore, char - Put(u8), // byte - Unhook, - OscDispatch(Vec>, bool), // params, bell_terminated - CsiDispatch(Vec, Vec, bool, char), // params, intermediates, ignore, char - EscDispatch(Vec, bool, u8), // intermediates, ignore, byte -} - -struct VteEventSender { - id: RawFd, - send_screen_instructions: SenderWithContext, -} - -impl VteEventSender { - pub fn new(id: RawFd, send_screen_instructions: SenderWithContext) -> Self { - VteEventSender { - id, - send_screen_instructions, - } - } -} - -impl vte::Perform for VteEventSender { - fn print(&mut self, c: char) { - self.send_screen_instructions - .send(ScreenInstruction::Pty(self.id, VteEvent::Print(c))) - .unwrap(); - } - fn execute(&mut self, byte: u8) { - self.send_screen_instructions - .send(ScreenInstruction::Pty(self.id, VteEvent::Execute(byte))) - .unwrap(); - } - - fn hook(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { - let params = params.iter().copied().collect(); - let intermediates = intermediates.iter().copied().collect(); - self.send_screen_instructions - .send(ScreenInstruction::Pty( - self.id, - VteEvent::Hook(params, intermediates, ignore, c), - )) - .unwrap(); - } - - fn put(&mut self, byte: u8) { - self.send_screen_instructions - .send(ScreenInstruction::Pty(self.id, VteEvent::Put(byte))) - .unwrap(); - } - - fn unhook(&mut self) { - self.send_screen_instructions - .send(ScreenInstruction::Pty(self.id, VteEvent::Unhook)) - .unwrap(); - } - - fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { - let params = params.iter().map(|p| p.to_vec()).collect(); - self.send_screen_instructions - .send(ScreenInstruction::Pty( - self.id, - VteEvent::OscDispatch(params, bell_terminated), - )) - .unwrap(); - } - - fn csi_dispatch(&mut self, params: &[i64], intermediates: &[u8], ignore: bool, c: char) { - let params = params.iter().copied().collect(); - let intermediates = intermediates.iter().copied().collect(); - self.send_screen_instructions - .send(ScreenInstruction::Pty( - self.id, - VteEvent::CsiDispatch(params, intermediates, ignore, c), - )) - .unwrap(); - } - - fn esc_dispatch(&mut self, intermediates: &[u8], ignore: bool, byte: u8) { - let intermediates = intermediates.iter().copied().collect(); - self.send_screen_instructions - .send(ScreenInstruction::Pty( - self.id, - VteEvent::EscDispatch(intermediates, ignore, byte), - )) - .unwrap(); - } -} +pub type VteBytes = Vec; /// Instructions related to PTYs (pseudoterminals). #[derive(Clone, Debug, Serialize, Deserialize)] @@ -185,18 +92,15 @@ pub struct PtyBus { fn stream_terminal_bytes( pid: RawFd, + send_screen_instructions: SenderWithContext, os_input: Box, - mut send_screen_instructions: SenderWithContext, debug: bool, ) -> JoinHandle<()> { - let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); + let mut err_ctx = get_current_ctx(); task::spawn({ async move { err_ctx.add_call(ContextType::AsyncTask); - send_screen_instructions.update(err_ctx); - let mut vte_parser = vte::Parser::new(); - let mut vte_event_sender = VteEventSender::new(pid, send_screen_instructions.clone()); - let mut terminal_bytes = ReadFromPid::new(&pid, os_input.clone()); + let mut terminal_bytes = ReadFromPid::new(&pid, os_input); let mut last_byte_receive_time: Option = None; let mut pending_render = false; @@ -282,8 +186,8 @@ impl PtyBus { self.os_input.spawn_terminal(file_to_open); let task_handle = stream_terminal_bytes( pid_primary, - self.os_input.clone(), self.send_screen_instructions.clone(), + self.os_input.clone(), self.debug_to_file, ); self.task_handles.insert(pid_primary, task_handle); @@ -308,8 +212,8 @@ impl PtyBus { for id in new_pane_pids { let task_handle = stream_terminal_bytes( id, - self.os_input.clone(), self.send_screen_instructions.clone(), + self.os_input.clone(), self.debug_to_file, ); self.task_handles.insert(id, task_handle); diff --git a/src/common/screen.rs b/src/common/screen.rs index 92e1075c..8c83f59e 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -10,7 +10,7 @@ use std::sync::mpsc::Receiver; use crate::common::SenderWithContext; use crate::os_input_output::ServerOsApi; use crate::panes::PositionAndSize; -use crate::pty_bus::{PtyInstruction, VteEvent}; +use crate::pty_bus::{PtyInstruction, VteBytes}; use crate::server::ServerInstruction; use crate::tab::Tab; use crate::{errors::ErrorContext, wasm_vm::PluginInstruction}; diff --git a/src/main.rs b/src/main.rs index d89ff577..b9a4575e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,7 +13,6 @@ use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; use crate::os_input_output::{get_client_os_input, get_server_os_input, ClientOsApi, ServerOsApi}; -use crate::pty_bus::VteEvent; use crate::utils::{ consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, logging::*, @@ -89,7 +88,7 @@ pub fn start( opts: CliArgs, server_os_input: Box, ) { - let ipc_thread = start_server(server_os_input, opts); - start_client(client_os_input); + let ipc_thread = start_server(server_os_input, opts.clone()); + start_client(client_os_input, opts); drop(ipc_thread.join()); } diff --git a/src/server/mod.rs b/src/server/mod.rs index 2495c13d..d8640836 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -16,14 +16,13 @@ use zellij_tile::data::{Event, EventType, ModeInfo}; use crate::cli::CliArgs; use crate::client::ClientInstruction; -use crate::common::pty_bus::VteEvent; use crate::common::{ - errors::{ContextType, ErrorContext, PluginContext, PtyContext, ScreenContext, ServerContext}, + errors::{ContextType, PluginContext, PtyContext, ScreenContext, ServerContext}, os_input_output::ServerOsApi, - pty_bus::{PtyBus, PtyInstruction}, + pty_bus::{PtyBus, PtyInstruction, VteBytes}, screen::{Screen, ScreenInstruction}, wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginEnv, PluginInstruction}, - ChannelWithContext, SenderType, SenderWithContext, OPENCALLS, + ChannelWithContext, SenderType, SenderWithContext, }; use crate::layout::Layout; use crate::panes::PaneId; @@ -102,9 +101,6 @@ impl ServerInstruction { 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) } @@ -171,8 +167,8 @@ impl ServerInstruction { pub fn change_mode(mode_info: ModeInfo) -> Self { Self::ToScreen(ScreenInstruction::ChangeMode(mode_info)) } - pub fn pty(fd: RawFd, event: VteEvent) -> Self { - Self::ToScreen(ScreenInstruction::Pty(fd, event)) + pub fn pty(fd: RawFd, bytes: VteBytes) -> Self { + Self::ToScreen(ScreenInstruction::PtyBytes(fd, bytes)) } pub fn terminal_resize(new_size: PositionAndSize) -> Self { Self::ToScreen(ScreenInstruction::TerminalResize(new_size)) @@ -188,14 +184,6 @@ struct ClientMetaData { wasm_thread: Option>, } -impl ClientMetaData { - fn update(&mut self, err_ctx: ErrorContext) { - self.send_plugin_instructions.update(err_ctx); - self.send_screen_instructions.update(err_ctx); - self.send_pty_instructions.update(err_ctx); - } -} - impl Drop for ClientMetaData { fn drop(&mut self) { let _ = self.send_pty_instructions.send(PtyInstruction::Exit); @@ -211,18 +199,15 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread let (send_server_instructions, receive_server_instructions): ChannelWithContext< ServerInstruction, > = channel(); - let send_server_instructions = SenderWithContext::new( - ErrorContext::new(), - SenderType::Sender(send_server_instructions), - ); + let send_server_instructions = + SenderWithContext::new(SenderType::Sender(send_server_instructions)); let router_thread = thread::Builder::new() .name("server_router".to_string()) .spawn({ let os_input = os_input.clone(); - let mut send_server_instructions = send_server_instructions.clone(); + let send_server_instructions = send_server_instructions.clone(); move || loop { - let (instruction, err_ctx) = os_input.server_recv(); - send_server_instructions.update(err_ctx); + let (instruction, _err_ctx) = os_input.server_recv(); match instruction { ServerInstruction::Exit => break, _ => { @@ -243,9 +228,6 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); os_input.update_senders(err_ctx); - if let Some(ref c) = client { - clients.get_mut(c).unwrap().update(err_ctx); - } match instruction { ServerInstruction::OpenFile(file_name) => { let path = PathBuf::from(file_name); @@ -269,7 +251,7 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread ServerInstruction::MoveFocus => { clients[client.as_ref().unwrap()] .send_screen_instructions - .send(ScreenInstruction::MoveFocus) + .send(ScreenInstruction::FocusNextPane) .unwrap(); } ServerInstruction::NewClient(buffer_path, full_screen_ws) => { @@ -340,22 +322,20 @@ fn init_client( send_server_instructions: SenderWithContext, full_screen_ws: PositionAndSize, ) -> ClientMetaData { - let err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); let (send_screen_instructions, receive_screen_instructions): ChannelWithContext< ScreenInstruction, > = channel(); let send_screen_instructions = - SenderWithContext::new(err_ctx, SenderType::Sender(send_screen_instructions)); + SenderWithContext::new(SenderType::Sender(send_screen_instructions)); let (send_plugin_instructions, receive_plugin_instructions): ChannelWithContext< PluginInstruction, > = channel(); let send_plugin_instructions = - SenderWithContext::new(err_ctx, SenderType::Sender(send_plugin_instructions)); + SenderWithContext::new(SenderType::Sender(send_plugin_instructions)); let (send_pty_instructions, receive_pty_instructions): ChannelWithContext = channel(); - let send_pty_instructions = - SenderWithContext::new(err_ctx, SenderType::Sender(send_pty_instructions)); + let send_pty_instructions = SenderWithContext::new(SenderType::Sender(send_pty_instructions)); // Don't use default layouts in tests, but do everywhere else #[cfg(not(test))] @@ -461,15 +441,24 @@ fn init_client( .recv() .expect("failed to receive event on channel"); err_ctx.add_call(ContextType::Screen(ScreenContext::from(&event))); - screen.send_server_instructions.update(err_ctx); - screen.send_pty_instructions.update(err_ctx); - screen.send_plugin_instructions.update(err_ctx); match event { - ScreenInstruction::Pty(pid, vte_event) => { - screen - .get_active_tab_mut() - .unwrap() - .handle_pty_event(pid, vte_event); + ScreenInstruction::PtyBytes(pid, vte_bytes) => { + let active_tab = screen.get_active_tab_mut().unwrap(); + if active_tab.has_terminal_pid(pid) { + // it's most likely that this event is directed at the active tab + // look there first + active_tab.handle_pty_bytes(pid, vte_bytes); + } else { + // if this event wasn't directed at the active tab, start looking + // in other tabs + let all_tabs = screen.get_tabs_mut(); + for tab in all_tabs.values_mut() { + if tab.has_terminal_pid(pid) { + tab.handle_pty_bytes(pid, vte_bytes); + break; + } + } + } } ScreenInstruction::Render => { screen.render(); @@ -513,9 +502,15 @@ fn init_client( ScreenInstruction::ResizeUp => { screen.get_active_tab_mut().unwrap().resize_up(); } - ScreenInstruction::MoveFocus => { + ScreenInstruction::SwitchFocus => { screen.get_active_tab_mut().unwrap().move_focus(); } + ScreenInstruction::FocusNextPane => { + screen.get_active_tab_mut().unwrap().focus_next_pane(); + } + ScreenInstruction::FocusPreviousPane => { + screen.get_active_tab_mut().unwrap().focus_previous_pane(); + } ScreenInstruction::MoveFocusLeft => { screen.get_active_tab_mut().unwrap().move_focus_left(); } @@ -646,8 +641,8 @@ fn init_client( let wasm_thread = thread::Builder::new() .name("wasm".to_string()) .spawn({ - let mut send_screen_instructions = send_screen_instructions.clone(); - let mut send_pty_instructions = send_pty_instructions.clone(); + let send_screen_instructions = send_screen_instructions.clone(); + let send_pty_instructions = send_pty_instructions.clone(); let store = Store::default(); let mut plugin_id = 0; @@ -657,8 +652,6 @@ fn init_client( .recv() .expect("failed to receive event on channel"); err_ctx.add_call(ContextType::Plugin(PluginContext::from(&event))); - send_screen_instructions.update(err_ctx); - send_pty_instructions.update(err_ctx); match event { PluginInstruction::Load(pid_tx, path) => { let project_dirs = diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 79511743..271edde0 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -89,12 +89,10 @@ impl FakeInputOutput { let stdout_writer = FakeStdoutWriter::new(last_snapshot_time.clone()); let (client_sender, client_receiver): ChannelWithContext = mpsc::channel(); - let client_sender = - SenderWithContext::new(ErrorContext::new(), SenderType::Sender(client_sender)); + let client_sender = SenderWithContext::new(SenderType::Sender(client_sender)); let (server_sender, server_receiver): ChannelWithContext = mpsc::channel(); - let server_sender = - SenderWithContext::new(ErrorContext::new(), SenderType::Sender(server_sender)); + let server_sender = SenderWithContext::new(SenderType::Sender(server_sender)); win_sizes.insert(0, winsize); // 0 is the current terminal FakeInputOutput { @@ -198,10 +196,7 @@ impl ClientOsApi for FakeInputOutput { fn send_to_server(&self, msg: ServerInstruction) { self.server_sender.send(msg).unwrap(); } - fn update_senders(&mut self, new_ctx: ErrorContext) { - self.server_sender.update(new_ctx); - self.client_sender.update(new_ctx); - } + fn update_senders(&mut self, new_ctx: ErrorContext) {} fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) { ClientOsApi::send_to_server( self, @@ -293,11 +288,5 @@ impl ServerOsApi for FakeInputOutput { self.client_sender.send(msg).unwrap(); } fn add_client_sender(&mut self, _buffer_path: String) {} - fn update_senders(&mut self, new_ctx: ErrorContext) { - self.server_sender.update(new_ctx); - self.client_sender.update(new_ctx); - } - fn load_palette(&self) -> Palette { - default_palette() - } + fn update_senders(&mut self, new_ctx: ErrorContext) {} } From 246899a1ddb0a517846be57d04aaa7b5283710f9 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 15 Apr 2021 14:57:09 +0530 Subject: [PATCH 47/64] Remove ErrorContext from IpcSender and nit fixes --- src/client/mod.rs | 4 +-- src/common/os_input_output.rs | 56 ++++++++--------------------------- src/server/mod.rs | 9 +++--- src/tests/fakes.rs | 4 +-- 4 files changed, 19 insertions(+), 54 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 6ba6df73..7dc38f5e 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -107,7 +107,8 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { let os_input = os_input.clone(); move || { loop { - let (instruction, _err_ctx) = os_input.client_recv(); + let (instruction, mut err_ctx) = os_input.client_recv(); + err_ctx.add_call(ContextType::Client(ClientContext::from(&instruction))); if let ClientInstruction::Exit = instruction { break; } @@ -129,7 +130,6 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { err_ctx.add_call(ContextType::Client(ClientContext::from( &client_instruction, ))); - os_input.update_senders(err_ctx); match client_instruction { ClientInstruction::Exit => break, ClientInstruction::Error(backtrace) => { diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 3d7b8918..b830bd70 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -18,7 +18,7 @@ use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; use crate::client::ClientInstruction; -use crate::errors::ErrorContext; +use crate::errors::{get_current_ctx, ErrorContext}; use crate::panes::PositionAndSize; use crate::server::ServerInstruction; use crate::utils::consts::ZELLIJ_IPC_PIPE; @@ -164,7 +164,6 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) /// Sends messages on an [ipmpsc](ipmpsc) channel, along with an [`ErrorContext`]. #[derive(Clone)] struct IpcSenderWithContext { - err_ctx: ErrorContext, sender: IpcSender, _phantom: PhantomData, } @@ -173,25 +172,16 @@ impl IpcSenderWithContext { /// Returns a sender to the given [SharedRingBuffer](ipmpsc::SharedRingBuffer). fn new(buffer: SharedRingBuffer) -> Self { Self { - err_ctx: ErrorContext::new(), sender: IpcSender::new(buffer), _phantom: PhantomData, } } - /// Updates this [`IpcSenderWithContext`]'s [`ErrorContext`]. This is the way one adds - /// a call to the error context. - /// - /// Updating [`ErrorContext`]s works in this way so that these contexts are only ever - /// allocated on the stack (which is thread-specific), and not on the heap. - fn update(&mut self, ctx: ErrorContext) { - self.err_ctx = ctx; - } - /// Sends an event, along with the current [`ErrorContext`], on this /// [`IpcSenderWithContext`]'s channel. fn send(&self, msg: T) -> ipmpsc::Result<()> { - self.sender.send(&(msg, self.err_ctx)) + let err_ctx = get_current_ctx(); + self.sender.send(&(msg, err_ctx)) } } @@ -199,7 +189,7 @@ impl IpcSenderWithContext { pub struct ServerOsInputOutput { orig_termios: Arc>, server_sender: IpcSenderWithContext, - server_receiver: Arc>, + server_receiver: Arc, // Should this be Arc> ? client_sender: Option>, } @@ -228,11 +218,9 @@ pub trait ServerOsApi: Send + Sync { /// Receives a message on server-side IPC channel fn server_recv(&self) -> (ServerInstruction, ErrorContext); /// Sends a message to client - fn send_to_client(&mut self, msg: ClientInstruction); + fn send_to_client(&self, msg: ClientInstruction); /// Adds a sender to client fn add_client_sender(&mut self, buffer_path: String); - /// Update ErrorContext of senders - fn update_senders(&mut self, new_ctx: ErrorContext); } impl ServerOsApi for ServerOsInputOutput { @@ -270,21 +258,15 @@ impl ServerOsApi for ServerOsInputOutput { self.server_sender.send(ServerInstruction::Exit).unwrap(); } fn server_recv(&self) -> (ServerInstruction, ErrorContext) { - self.server_receiver.lock().unwrap().recv().unwrap() + self.server_receiver.recv().unwrap() } - fn send_to_client(&mut self, msg: ClientInstruction) { - self.client_sender.as_mut().unwrap().send(msg).unwrap(); + fn send_to_client(&self, msg: ClientInstruction) { + self.client_sender.as_ref().unwrap().send(msg).unwrap(); } fn add_client_sender(&mut self, buffer_path: String) { let buffer = SharedRingBuffer::open(buffer_path.as_str()).unwrap(); self.client_sender = Some(IpcSenderWithContext::new(buffer)); } - fn update_senders(&mut self, new_ctx: ErrorContext) { - self.server_sender.update(new_ctx); - if let Some(ref mut s) = self.client_sender { - s.update(new_ctx); - } - } } impl Clone for Box { @@ -298,7 +280,7 @@ pub fn get_server_os_input() -> ServerOsInputOutput { let orig_termios = Arc::new(Mutex::new(current_termios)); let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, IPC_BUFFER_SIZE).unwrap(); let server_sender = IpcSenderWithContext::new(server_buffer.clone()); - let server_receiver = Arc::new(Mutex::new(IpcReceiver::new(server_buffer.clone()))); + let server_receiver = Arc::new(IpcReceiver::new(server_buffer)); ServerOsInputOutput { orig_termios, server_sender, @@ -311,8 +293,7 @@ pub fn get_server_os_input() -> ServerOsInputOutput { pub struct ClientOsInputOutput { orig_termios: Arc>, server_sender: IpcSenderWithContext, - // This is used by router thread only hence lock resolves immediately. - client_receiver: Option>>, + client_receiver: Option>, // Should this be Option>> ? } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -334,8 +315,6 @@ pub trait ClientOsApi: Send + Sync { fn box_clone(&self) -> Box; /// Sends a message to the server. fn send_to_server(&self, msg: ServerInstruction); - /// Update ErrorContext of senders - fn update_senders(&mut self, new_ctx: ErrorContext); /// Receives a message on client-side IPC channel // This should be called from the client-side router thread only. fn client_recv(&self) -> (ClientInstruction, ErrorContext); @@ -374,28 +353,17 @@ impl ClientOsApi for ClientOsInputOutput { fn send_to_server(&self, msg: ServerInstruction) { self.server_sender.send(msg).unwrap(); } - fn update_senders(&mut self, new_ctx: ErrorContext) { - self.server_sender.update(new_ctx); - } fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) { let (client_buffer_path, client_buffer) = SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); - self.client_receiver = Some(Arc::new(Mutex::new(IpcReceiver::new( - client_buffer.clone(), - )))); + self.client_receiver = Some(Arc::new(IpcReceiver::new(client_buffer))); self.send_to_server(ServerInstruction::NewClient( client_buffer_path, full_screen_ws, )); } fn client_recv(&self) -> (ClientInstruction, ErrorContext) { - self.client_receiver - .as_ref() - .unwrap() - .lock() - .unwrap() - .recv() - .unwrap() + self.client_receiver.as_ref().unwrap().recv().unwrap() } fn receive_sigwinch(&self, cb: Box) { let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); diff --git a/src/server/mod.rs b/src/server/mod.rs index d8640836..af89ab67 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -207,7 +207,8 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread let os_input = os_input.clone(); let send_server_instructions = send_server_instructions.clone(); move || loop { - let (instruction, _err_ctx) = os_input.server_recv(); + let (instruction, mut err_ctx) = os_input.server_recv(); + err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); match instruction { ServerInstruction::Exit => break, _ => { @@ -227,13 +228,11 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread move || loop { let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); - os_input.update_senders(err_ctx); match instruction { ServerInstruction::OpenFile(file_name) => { - let path = PathBuf::from(file_name); clients[client.as_ref().unwrap()] .send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(path))) + .send(PtyInstruction::SpawnTerminal(Some(file_name))) .unwrap(); } ServerInstruction::SplitHorizontally => { @@ -421,7 +420,7 @@ fn init_client( let os_input = os_input.clone(); let send_plugin_instructions = send_plugin_instructions.clone(); let send_pty_instructions = send_pty_instructions.clone(); - let send_server_instructions = send_server_instructions.clone(); + let send_server_instructions = send_server_instructions; let max_panes = opts.max_panes; move || { diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 271edde0..7b4589c3 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -196,7 +196,6 @@ impl ClientOsApi for FakeInputOutput { fn send_to_server(&self, msg: ServerInstruction) { self.server_sender.send(msg).unwrap(); } - fn update_senders(&mut self, new_ctx: ErrorContext) {} fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) { ClientOsApi::send_to_server( self, @@ -284,9 +283,8 @@ impl ServerOsApi for FakeInputOutput { fn server_recv(&self) -> (ServerInstruction, ErrorContext) { self.server_receiver.lock().unwrap().recv().unwrap() } - fn send_to_client(&mut self, msg: ClientInstruction) { + fn send_to_client(&self, msg: ClientInstruction) { self.client_sender.send(msg).unwrap(); } fn add_client_sender(&mut self, _buffer_path: String) {} - fn update_senders(&mut self, new_ctx: ErrorContext) {} } From 27393dfcf31262c664acdb5edd63c3d668a0f3d2 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 15 Apr 2021 20:41:57 +0530 Subject: [PATCH 48/64] Share SessionMetadata between the server_router and the ipc_server thread --- src/server/mod.rs | 130 ++++++++++++++++++++++++++-------------------- 1 file changed, 73 insertions(+), 57 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index af89ab67..e5a61f81 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -8,7 +8,7 @@ use std::{collections::HashMap, fs}; use std::{ collections::HashSet, str::FromStr, - sync::{Arc, Mutex}, + sync::{Arc, Mutex, RwLock}, }; use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; @@ -175,7 +175,7 @@ impl ServerInstruction { } } -struct ClientMetaData { +struct SessionMetaData { pub send_pty_instructions: SenderWithContext, pub send_screen_instructions: SenderWithContext, pub send_plugin_instructions: SenderWithContext, @@ -184,7 +184,7 @@ struct ClientMetaData { wasm_thread: Option>, } -impl Drop for ClientMetaData { +impl Drop for SessionMetaData { fn drop(&mut self) { let _ = self.send_pty_instructions.send(PtyInstruction::Exit); let _ = self.send_screen_instructions.send(ScreenInstruction::Exit); @@ -201,16 +201,67 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread > = channel(); let send_server_instructions = SenderWithContext::new(SenderType::Sender(send_server_instructions)); + + let sessions: Arc>> = + Arc::new(RwLock::new(HashMap::new())); + // We handle only single client for now + let session: Arc> = Arc::new(RwLock::new("session1".into())); let router_thread = thread::Builder::new() .name("server_router".to_string()) .spawn({ let os_input = os_input.clone(); + let session = session.clone(); + let sessions = sessions.clone(); let send_server_instructions = send_server_instructions.clone(); move || loop { let (instruction, mut err_ctx) = os_input.server_recv(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); + let rlocked_session = &*session.read().unwrap(); + let rlocked_sessions = sessions.read().unwrap(); match instruction { ServerInstruction::Exit => break, + ServerInstruction::OpenFile(file_name) => { + rlocked_sessions[rlocked_session] + .send_pty_instructions + .send(PtyInstruction::SpawnTerminal(Some(file_name))) + .unwrap(); + } + ServerInstruction::SplitHorizontally => { + rlocked_sessions[rlocked_session] + .send_pty_instructions + .send(PtyInstruction::SpawnTerminalHorizontally(None)) + .unwrap(); + } + ServerInstruction::SplitVertically => { + rlocked_sessions[rlocked_session] + .send_pty_instructions + .send(PtyInstruction::SpawnTerminalVertically(None)) + .unwrap(); + } + ServerInstruction::MoveFocus => { + rlocked_sessions[rlocked_session] + .send_screen_instructions + .send(ScreenInstruction::FocusNextPane) + .unwrap(); + } + ServerInstruction::ToScreen(instruction) => { + rlocked_sessions[rlocked_session] + .send_screen_instructions + .send(instruction) + .unwrap(); + } + ServerInstruction::ToPty(instruction) => { + rlocked_sessions[rlocked_session] + .send_pty_instructions + .send(instruction) + .unwrap(); + } + ServerInstruction::PluginUpdate(pid, event) => { + rlocked_sessions[rlocked_session] + .send_plugin_instructions + .send(PluginInstruction::Update(pid, event)) + .unwrap(); + } _ => { send_server_instructions.send(instruction).unwrap(); } @@ -222,64 +273,29 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread thread::Builder::new() .name("ipc_server".to_string()) .spawn({ - let mut clients: HashMap = HashMap::new(); - // We handle only single client for now - let mut client: Option = None; move || loop { let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); match instruction { - ServerInstruction::OpenFile(file_name) => { - clients[client.as_ref().unwrap()] - .send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(file_name))) - .unwrap(); - } - ServerInstruction::SplitHorizontally => { - clients[client.as_ref().unwrap()] - .send_pty_instructions - .send(PtyInstruction::SpawnTerminalHorizontally(None)) - .unwrap(); - } - ServerInstruction::SplitVertically => { - clients[client.as_ref().unwrap()] - .send_pty_instructions - .send(PtyInstruction::SpawnTerminalVertically(None)) - .unwrap(); - } - ServerInstruction::MoveFocus => { - clients[client.as_ref().unwrap()] - .send_screen_instructions - .send(ScreenInstruction::FocusNextPane) - .unwrap(); - } ServerInstruction::NewClient(buffer_path, full_screen_ws) => { - client = Some(buffer_path.clone()); - let client_data = init_client( + let session_data = init_session( os_input.clone(), opts.clone(), send_server_instructions.clone(), full_screen_ws, ); - clients.insert(buffer_path.clone(), client_data); - clients[client.as_ref().unwrap()] + drop( + sessions + .write() + .unwrap() + .insert(session.read().unwrap().clone(), session_data), + ); + sessions.read().unwrap()[&*session.read().unwrap()] .send_pty_instructions .send(PtyInstruction::NewTab) .unwrap(); os_input.add_client_sender(buffer_path); } - ServerInstruction::ToScreen(instruction) => { - clients[client.as_ref().unwrap()] - .send_screen_instructions - .send(instruction) - .unwrap(); - } - ServerInstruction::ToPty(instruction) => { - clients[client.as_ref().unwrap()] - .send_pty_instructions - .send(instruction) - .unwrap(); - } ServerInstruction::DoneClosingPane => { os_input.send_to_client(ClientInstruction::DoneClosingPane); } @@ -292,14 +308,14 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread ServerInstruction::ClientShouldExit => { os_input.send_to_client(ClientInstruction::Exit); } - ServerInstruction::PluginUpdate(pid, event) => { - clients[client.as_ref().unwrap()] - .send_plugin_instructions - .send(PluginInstruction::Update(pid, event)) - .unwrap(); - } ServerInstruction::ClientExit => { - clients.remove(client.as_ref().unwrap()).unwrap(); + drop( + sessions + .write() + .unwrap() + .remove(&*session.read().unwrap()) + .unwrap(), + ); os_input.server_exit(); let _ = router_thread.join(); let _ = os_input.send_to_client(ClientInstruction::Exit); @@ -308,19 +324,19 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread ServerInstruction::Render(output) => { os_input.send_to_client(ClientInstruction::Render(output)) } - _ => {} + _ => panic!("Received unexpected instruction."), } } }) .unwrap() } -fn init_client( +fn init_session( os_input: Box, opts: CliArgs, send_server_instructions: SenderWithContext, full_screen_ws: PositionAndSize, -) -> ClientMetaData { +) -> SessionMetaData { let (send_screen_instructions, receive_screen_instructions): ChannelWithContext< ScreenInstruction, > = channel(); @@ -736,7 +752,7 @@ fn init_client( } }) .unwrap(); - ClientMetaData { + SessionMetaData { send_plugin_instructions, send_screen_instructions, send_pty_instructions, From 9fc1f0038e665724a3e93d0fa01cbc7fa15b5b1c Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 16 Apr 2021 00:31:08 +0530 Subject: [PATCH 49/64] Refactor ServerInstruction enum to use Action enum --- src/client/mod.rs | 9 +- src/client/tab.rs | 2 +- src/common/errors.rs | 12 +- src/common/input/handler.rs | 138 ++-------------- src/common/pty_bus.rs | 3 +- src/common/screen.rs | 5 +- src/server/mod.rs | 303 ++++++++++++++++++------------------ 7 files changed, 181 insertions(+), 291 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 7dc38f5e..01459736 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -24,7 +24,7 @@ use crate::server::ServerInstruction; #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ClientInstruction { Error(String), - Render(String), + Render(Option), DoneClosingPane, DoneOpeningNewPane, DoneUpdatingTabs, @@ -92,7 +92,7 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { os_input.receive_sigwinch(Box::new({ let os_api = os_input.clone(); move || { - os_api.send_to_server(ServerInstruction::terminal_resize( + os_api.send_to_server(ServerInstruction::TerminalResize( os_api.get_terminal_size_using_fd(0), )); } @@ -148,9 +148,12 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { std::process::exit(1); } ClientInstruction::Render(output) => { + if output.is_none() { + break; + } let mut stdout = os_input.get_stdout_writer(); stdout - .write_all(&output.as_bytes()) + .write_all(&output.unwrap().as_bytes()) .expect("cannot write to stdout"); stdout.flush().expect("could not flush"); } diff --git a/src/client/tab.rs b/src/client/tab.rs index 42e19388..36d03e87 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -783,7 +783,7 @@ impl Tab { } self.send_server_instructions - .send(ServerInstruction::Render(output)) + .send(ServerInstruction::Render(Some(output))) .unwrap(); } fn get_panes(&self) -> impl Iterator)> { diff --git a/src/common/errors.rs b/src/common/errors.rs index 5685f885..e98bec92 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -350,15 +350,13 @@ pub enum ServerContext { SplitVertically, MoveFocus, NewClient, - ToPty, - ToScreen, + Action, Render, - PluginUpdate, + TerminalResize, DoneClosingPane, DoneOpeningNewPane, DoneUpdatingTabs, ClientExit, - ClientShouldExit, Exit, } @@ -370,15 +368,13 @@ impl From<&ServerInstruction> for ServerContext { ServerInstruction::SplitVertically => ServerContext::SplitVertically, ServerInstruction::MoveFocus => ServerContext::MoveFocus, ServerInstruction::NewClient(..) => ServerContext::NewClient, - ServerInstruction::ToPty(_) => ServerContext::ToPty, - ServerInstruction::ToScreen(_) => ServerContext::ToScreen, - ServerInstruction::PluginUpdate(..) => ServerContext::PluginUpdate, + ServerInstruction::Action(_) => ServerContext::Action, + ServerInstruction::TerminalResize(_) => ServerContext::TerminalResize, ServerInstruction::Render(_) => ServerContext::Render, ServerInstruction::DoneClosingPane => ServerContext::DoneClosingPane, ServerInstruction::DoneOpeningNewPane => ServerContext::DoneOpeningNewPane, ServerInstruction::DoneUpdatingTabs => ServerContext::DoneUpdatingTabs, ServerInstruction::ClientExit => ServerContext::ClientExit, - ServerInstruction::ClientShouldExit => ServerContext::ClientShouldExit, ServerInstruction::Exit => ServerContext::Exit, } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 2fba8537..509b77fa 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -7,13 +7,11 @@ use crate::common::input::config::Config; use crate::common::{SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::ClientOsApi; -use crate::pty_bus::PtyInstruction; -use crate::screen::ScreenInstruction; use crate::server::ServerInstruction; use crate::CommandIsExecuting; use termion::input::{TermRead, TermReadEventsAndRaw}; -use zellij_tile::data::{Event, InputMode, Key, ModeInfo, Palette}; +use zellij_tile::data::{InputMode, Key, ModeInfo}; /// Handles the dispatching of [`Action`]s according to the current /// [`InputMode`], and keep tracks of the current [`InputMode`]. @@ -107,12 +105,6 @@ impl InputHandler { let mut should_break = false; match action { - Action::Write(val) => { - self.os_input - .send_to_server(ServerInstruction::clear_scroll()); - self.os_input - .send_to_server(ServerInstruction::write_character(val)); - } Action::Quit => { self.exit(); should_break = true; @@ -120,135 +112,33 @@ impl InputHandler { Action::SwitchToMode(mode) => { self.mode = mode; self.os_input - .send_to_server(ServerInstruction::PluginUpdate( - None, - Event::ModeUpdate(get_mode_info(mode)), - )); - self.os_input - .send_to_server(ServerInstruction::change_mode(get_mode_info(mode))); - self.os_input.send_to_server(ServerInstruction::render()); + .send_to_server(ServerInstruction::Action(action.clone())); } - Action::Resize(direction) => { - let screen_instr = match direction { - super::actions::Direction::Left => ServerInstruction::resize_left(), - super::actions::Direction::Right => ServerInstruction::resize_right(), - super::actions::Direction::Up => ServerInstruction::resize_up(), - super::actions::Direction::Down => ServerInstruction::resize_down(), - }; - self.os_input.send_to_server(screen_instr); - } - Action::SwitchFocus => { - self.os_input - .send_to_server(ServerInstruction::ToScreen(ScreenInstruction::SwitchFocus)); - } - Action::FocusNextPane => { - self.os_input.send_to_server(ServerInstruction::ToScreen( - ScreenInstruction::FocusNextPane, - )); - } - Action::FocusPreviousPane => { - self.os_input.send_to_server(ServerInstruction::ToScreen( - ScreenInstruction::FocusPreviousPane, - )); - } - Action::MoveFocus(direction) => { - let screen_instr = match direction { - super::actions::Direction::Left => ServerInstruction::move_focus_left(), - super::actions::Direction::Right => ServerInstruction::move_focus_right(), - super::actions::Direction::Up => ServerInstruction::move_focus_up(), - super::actions::Direction::Down => ServerInstruction::move_focus_down(), - }; - self.os_input.send_to_server(screen_instr); - } - Action::ScrollUp => { - self.os_input.send_to_server(ServerInstruction::scroll_up()); - } - Action::ScrollDown => { - self.os_input - .send_to_server(ServerInstruction::scroll_down()); - } - Action::PageScrollUp => { - self.send_screen_instructions - .send(ScreenInstruction::PageScrollUp) - .unwrap(); - } - Action::PageScrollDown => { - self.send_screen_instructions - .send(ScreenInstruction::PageScrollDown) - .unwrap(); - } - Action::ToggleFocusFullscreen => { - self.os_input - .send_to_server(ServerInstruction::toggle_active_terminal_fullscreen()); - } - Action::NewPane(direction) => { - let pty_instr = match direction { - Some(super::actions::Direction::Left) => { - PtyInstruction::SpawnTerminalVertically(None) - } - Some(super::actions::Direction::Right) => { - PtyInstruction::SpawnTerminalVertically(None) - } - Some(super::actions::Direction::Up) => { - PtyInstruction::SpawnTerminalHorizontally(None) - } - Some(super::actions::Direction::Down) => { - PtyInstruction::SpawnTerminalHorizontally(None) - } - // No direction specified - try to put it in the biggest available spot - None => PtyInstruction::SpawnTerminal(None), - }; + Action::NewPane(_) => { self.command_is_executing.opening_new_pane(); self.os_input - .send_to_server(ServerInstruction::ToPty(pty_instr)); + .send_to_server(ServerInstruction::Action(action)); self.command_is_executing.wait_until_new_pane_is_opened(); } Action::CloseFocus => { self.command_is_executing.closing_pane(); self.os_input - .send_to_server(ServerInstruction::close_focused_pane()); + .send_to_server(ServerInstruction::Action(action)); self.command_is_executing.wait_until_pane_is_closed(); } - Action::NewTab => { + Action::NewTab + | Action::GoToNextTab + | Action::GoToPreviousTab + | Action::CloseTab + | Action::GoToTab(_) => { self.command_is_executing.updating_tabs(); self.os_input - .send_to_server(ServerInstruction::pty_new_tab()); + .send_to_server(ServerInstruction::Action(action)); self.command_is_executing.wait_until_tabs_are_updated(); } - Action::GoToNextTab => { - self.command_is_executing.updating_tabs(); - self.os_input - .send_to_server(ServerInstruction::switch_tab_next()); - self.command_is_executing.wait_until_tabs_are_updated(); - } - Action::GoToPreviousTab => { - self.command_is_executing.updating_tabs(); - self.os_input - .send_to_server(ServerInstruction::switch_tab_prev()); - self.command_is_executing.wait_until_tabs_are_updated(); - } - Action::ToggleActiveSyncPanes => { - self.send_screen_instructions - .send(ScreenInstruction::ToggleActiveSyncPanes) - .unwrap(); - } - Action::CloseTab => { - self.command_is_executing.updating_tabs(); - self.os_input - .send_to_server(ServerInstruction::screen_close_tab()); - self.command_is_executing.wait_until_tabs_are_updated(); - } - Action::GoToTab(i) => { - self.command_is_executing.updating_tabs(); - self.os_input - .send_to_server(ServerInstruction::go_to_tab(i)); - self.command_is_executing.wait_until_tabs_are_updated(); - } - Action::TabNameInput(c) => { - self.os_input - .send_to_server(ServerInstruction::update_tab_name(c)); - } - Action::NoOp => {} + _ => self + .os_input + .send_to_server(ServerInstruction::Action(action)), } should_break diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index b9f61d09..10be6d52 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -6,7 +6,6 @@ use ::std::os::unix::io::RawFd; use ::std::pin::*; use ::std::sync::mpsc::Receiver; use ::std::time::{Duration, Instant}; -use serde::{Deserialize, Serialize}; use std::path::PathBuf; use super::SenderWithContext; @@ -69,7 +68,7 @@ impl Stream for ReadFromPid { pub type VteBytes = Vec; /// Instructions related to PTYs (pseudoterminals). -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Debug)] pub enum PtyInstruction { SpawnTerminal(Option), SpawnTerminalVertically(Option), diff --git a/src/common/screen.rs b/src/common/screen.rs index 8c83f59e..c30cf251 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -1,6 +1,5 @@ //! Things related to [`Screen`]s. -use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::os::unix::io::RawFd; use std::path::PathBuf; @@ -19,7 +18,7 @@ use crate::{layout::Layout, panes::PaneId}; use zellij_tile::data::{Event, InputMode, ModeInfo, Palette, TabInfo}; /// Instructions that can be sent to the [`Screen`]. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone)] pub enum ScreenInstruction { PtyBytes(RawFd, VteBytes), Render, @@ -221,7 +220,7 @@ impl Screen { if self.tabs.is_empty() { self.active_tab_index = None; self.send_server_instructions - .send(ServerInstruction::ClientShouldExit) + .send(ServerInstruction::Render(None)) .unwrap(); } else { for t in self.tabs.values_mut() { diff --git a/src/server/mod.rs b/src/server/mod.rs index e5a61f81..adf3c9b2 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,6 +1,5 @@ use directories_next::ProjectDirs; use serde::{Deserialize, Serialize}; -use std::os::unix::io::RawFd; use std::path::PathBuf; use std::sync::mpsc::channel; use std::thread; @@ -18,8 +17,10 @@ use crate::cli::CliArgs; use crate::client::ClientInstruction; use crate::common::{ errors::{ContextType, PluginContext, PtyContext, ScreenContext, ServerContext}, + input::actions::{Action, Direction}, + input::handler::get_mode_info, os_input_output::ServerOsApi, - pty_bus::{PtyBus, PtyInstruction, VteBytes}, + pty_bus::{PtyBus, PtyInstruction}, screen::{Screen, ScreenInstruction}, wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginEnv, PluginInstruction}, ChannelWithContext, SenderType, SenderWithContext, @@ -36,144 +37,17 @@ pub enum ServerInstruction { SplitHorizontally, SplitVertically, MoveFocus, + TerminalResize(PositionAndSize), NewClient(String, PositionAndSize), - ToPty(PtyInstruction), - ToScreen(ScreenInstruction), - Render(String), - PluginUpdate(Option, Event), + Action(Action), + Render(Option), DoneClosingPane, DoneOpeningNewPane, DoneUpdatingTabs, ClientExit, - ClientShouldExit, // notify router thread to exit Exit, } -impl ServerInstruction { - // ToPty - pub fn spawn_terminal(path: Option) -> Self { - Self::ToPty(PtyInstruction::SpawnTerminal(path)) - } - pub fn spawn_terminal_vertically(path: Option) -> Self { - Self::ToPty(PtyInstruction::SpawnTerminalVertically(path)) - } - pub fn spawn_terminal_horizontally(path: Option) -> 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) -> 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) -> 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_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, pids: Vec) -> Self { - Self::ToScreen(ScreenInstruction::ApplyLayout(layout, pids)) - } - 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) -> Self { - Self::ToScreen(ScreenInstruction::UpdateTabName(tab_ids)) - } - pub fn change_mode(mode_info: ModeInfo) -> Self { - Self::ToScreen(ScreenInstruction::ChangeMode(mode_info)) - } - pub fn pty(fd: RawFd, bytes: VteBytes) -> Self { - Self::ToScreen(ScreenInstruction::PtyBytes(fd, bytes)) - } - pub fn terminal_resize(new_size: PositionAndSize) -> Self { - Self::ToScreen(ScreenInstruction::TerminalResize(new_size)) - } -} struct SessionMetaData { pub send_pty_instructions: SenderWithContext, @@ -244,22 +118,13 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread .send(ScreenInstruction::FocusNextPane) .unwrap(); } - ServerInstruction::ToScreen(instruction) => { + ServerInstruction::Action(action) => { + route_action(action, &rlocked_sessions[rlocked_session]); + } + ServerInstruction::TerminalResize(new_size) => { rlocked_sessions[rlocked_session] .send_screen_instructions - .send(instruction) - .unwrap(); - } - ServerInstruction::ToPty(instruction) => { - rlocked_sessions[rlocked_session] - .send_pty_instructions - .send(instruction) - .unwrap(); - } - ServerInstruction::PluginUpdate(pid, event) => { - rlocked_sessions[rlocked_session] - .send_plugin_instructions - .send(PluginInstruction::Update(pid, event)) + .send(ScreenInstruction::TerminalResize(new_size)) .unwrap(); } _ => { @@ -305,9 +170,6 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread ServerInstruction::DoneUpdatingTabs => { os_input.send_to_client(ClientInstruction::DoneUpdatingTabs); } - ServerInstruction::ClientShouldExit => { - os_input.send_to_client(ClientInstruction::Exit); - } ServerInstruction::ClientExit => { drop( sessions @@ -316,9 +178,9 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread .remove(&*session.read().unwrap()) .unwrap(), ); + os_input.send_to_client(ClientInstruction::Exit); os_input.server_exit(); let _ = router_thread.join(); - let _ = os_input.send_to_client(ClientInstruction::Exit); break; } ServerInstruction::Render(output) => { @@ -761,3 +623,144 @@ fn init_session( wasm_thread: Some(wasm_thread), } } + +fn route_action(action: Action, session: &SessionMetaData) { + match action { + Action::Write(val) => { + session + .send_screen_instructions + .send(ScreenInstruction::ClearScroll) + .unwrap(); + session + .send_screen_instructions + .send(ScreenInstruction::WriteCharacter(val)) + .unwrap(); + } + Action::SwitchToMode(mode) => { + session + .send_plugin_instructions + .send(PluginInstruction::Update( + None, + Event::ModeUpdate(get_mode_info(mode)), + )) + .unwrap(); + session + .send_screen_instructions + .send(ScreenInstruction::ChangeMode(get_mode_info(mode))) + .unwrap(); + session + .send_screen_instructions + .send(ScreenInstruction::Render) + .unwrap(); + } + Action::Resize(direction) => { + let screen_instr = match direction { + Direction::Left => ScreenInstruction::ResizeLeft, + Direction::Right => ScreenInstruction::ResizeRight, + Direction::Up => ScreenInstruction::ResizeUp, + Direction::Down => ScreenInstruction::ResizeDown, + }; + session.send_screen_instructions.send(screen_instr).unwrap(); + } + Action::SwitchFocus => { + session + .send_screen_instructions + .send(ScreenInstruction::SwitchFocus) + .unwrap(); + } + Action::FocusNextPane => { + session + .send_screen_instructions + .send(ScreenInstruction::FocusNextPane) + .unwrap(); + } + Action::FocusPreviousPane => { + session + .send_screen_instructions + .send(ScreenInstruction::FocusPreviousPane) + .unwrap(); + } + Action::MoveFocus(direction) => { + let screen_instr = match direction { + Direction::Left => ScreenInstruction::MoveFocusLeft, + Direction::Right => ScreenInstruction::MoveFocusRight, + Direction::Up => ScreenInstruction::MoveFocusUp, + Direction::Down => ScreenInstruction::MoveFocusDown, + }; + session.send_screen_instructions.send(screen_instr).unwrap(); + } + Action::ScrollUp => { + session + .send_screen_instructions + .send(ScreenInstruction::ScrollUp) + .unwrap(); + } + Action::ScrollDown => { + session + .send_screen_instructions + .send(ScreenInstruction::ScrollDown) + .unwrap(); + } + Action::ToggleFocusFullscreen => { + session + .send_screen_instructions + .send(ScreenInstruction::ToggleActiveTerminalFullscreen) + .unwrap(); + } + Action::NewPane(direction) => { + let pty_instr = match direction { + Some(Direction::Left) => PtyInstruction::SpawnTerminalVertically(None), + Some(Direction::Right) => PtyInstruction::SpawnTerminalVertically(None), + Some(Direction::Up) => PtyInstruction::SpawnTerminalHorizontally(None), + Some(Direction::Down) => PtyInstruction::SpawnTerminalHorizontally(None), + // No direction specified - try to put it in the biggest available spot + None => PtyInstruction::SpawnTerminal(None), + }; + session.send_pty_instructions.send(pty_instr).unwrap(); + } + Action::CloseFocus => { + session + .send_screen_instructions + .send(ScreenInstruction::CloseFocusedPane) + .unwrap(); + } + Action::NewTab => { + session + .send_pty_instructions + .send(PtyInstruction::NewTab) + .unwrap(); + } + Action::GoToNextTab => { + session + .send_screen_instructions + .send(ScreenInstruction::SwitchTabNext) + .unwrap(); + } + Action::GoToPreviousTab => { + session + .send_screen_instructions + .send(ScreenInstruction::SwitchTabPrev) + .unwrap(); + } + Action::CloseTab => { + session + .send_screen_instructions + .send(ScreenInstruction::CloseTab) + .unwrap(); + } + Action::GoToTab(i) => { + session + .send_screen_instructions + .send(ScreenInstruction::GoToTab(i)) + .unwrap(); + } + Action::TabNameInput(c) => { + session + .send_screen_instructions + .send(ScreenInstruction::UpdateTabName(c)) + .unwrap(); + } + Action::NoOp => {} + Action::Quit => panic!("Received unexpected action"), + } +} From b7aa3fc21a0e0b13d8293814d7218a8262015fd1 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 28 Apr 2021 19:00:09 +0530 Subject: [PATCH 50/64] Use interprocess crate for IPC --- Cargo.lock | 179 -------------------------------- Cargo.toml | 3 +- src/client/mod.rs | 4 +- src/common/errors.rs | 2 - src/common/os_input_output.rs | 131 ++++++++++++++--------- src/main.rs | 23 ++-- src/server/mod.rs | 190 ++++++++++++++++++++-------------- src/tests/fakes.rs | 14 +-- 8 files changed, 217 insertions(+), 329 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 832ac842..d596b981 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -234,15 +234,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "blocking" version = "1.0.2" @@ -293,19 +284,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time", - "winapi", -] - [[package]] name = "clap" version = "2.33.3" @@ -354,12 +332,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cpuid-bool" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" - [[package]] name = "cranelift-bforest" version = "0.68.0" @@ -524,15 +496,6 @@ dependencies = [ "syn", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "directories-next" version = "2.0.0" @@ -752,16 +715,6 @@ dependencies = [ "serde", ] -[[package]] -name = "generic-array" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "getopts" version = "0.2.21" @@ -847,12 +800,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "ident_case" version = "1.0.1" @@ -939,24 +886,6 @@ dependencies = [ "syn", ] -[[package]] -name = "ipmpsc" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36cf1ebb87bae3dbbf0a91b80463831de213b2921f28c325b22026f318f17a3" -dependencies = [ - "bincode", - "hex", - "libc", - "memmap", - "serde", - "sha2", - "tempfile", - "thiserror", - "vergen", - "winapi", -] - [[package]] name = "itoa" version = "0.4.7" @@ -1062,16 +991,6 @@ version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "memmap2" version = "0.2.2" @@ -1141,25 +1060,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" -dependencies = [ - "autocfg", -] - [[package]] name = "num_cpus" version = "1.13.0" @@ -1198,27 +1098,12 @@ version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "parking" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - [[package]] name = "pin-project-lite" version = "0.2.6" @@ -1457,15 +1342,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver", -] - [[package]] name = "ryu" version = "1.0.5" @@ -1478,24 +1354,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - [[package]] name = "serde" version = "1.0.125" @@ -1548,19 +1406,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "sha2" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de" -dependencies = [ - "block-buffer", - "cfg-if 1.0.0", - "cpuid-bool", - "digest", - "opaque-debug", -] - [[package]] name = "signal-hook" version = "0.3.8" @@ -1861,12 +1706,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "typenum" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" - [[package]] name = "typetag" version = "0.1.7" @@ -1891,12 +1730,6 @@ dependencies = [ "syn", ] -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - [[package]] name = "unicode-segmentation" version = "1.7.1" @@ -1963,17 +1796,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" -[[package]] -name = "vergen" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" -dependencies = [ - "bitflags", - "chrono", - "rustc_version", -] - [[package]] name = "version_check" version = "0.9.3" @@ -2384,7 +2206,6 @@ dependencies = [ "futures", "insta", "interprocess", - "ipmpsc", "lazy_static", "libc", "nix", diff --git a/Cargo.toml b/Cargo.toml index e1439dc2..d75f3e45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,6 @@ backtrace = "0.3.55" bincode = "1.3.1" directories-next = "2.0" futures = "0.3.5" -ipmpsc = "0.5.0" libc = "0.2" nix = "0.19.1" nom = "6.0.1" @@ -36,7 +35,7 @@ strum = "0.20.0" lazy_static = "1.4.0" wasmer = "1.0.0" wasmer-wasi = "1.0.0" -interprocess = "1.0.1" +interprocess = "1.1.1" zellij-tile = { path = "zellij-tile/", version = "0.5.0" } [dependencies.async-std] diff --git a/src/client/mod.rs b/src/client/mod.rs index 01459736..0a0f0793 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -49,6 +49,8 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { let mut command_is_executing = CommandIsExecuting::new(); let full_screen_ws = os_input.get_terminal_size_using_fd(0); + os_input.connect_to_server(); + os_input.send_to_server(ServerInstruction::NewClient(full_screen_ws)); os_input.set_raw_mode(0); let (send_client_instructions, receive_client_instructions): SyncChannelWithContext< @@ -57,8 +59,6 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { let send_client_instructions = SenderWithContext::new(SenderType::SyncSender(send_client_instructions)); - os_input.connect_to_server(full_screen_ws); - #[cfg(not(test))] std::panic::set_hook({ use crate::errors::handle_panic; diff --git a/src/common/errors.rs b/src/common/errors.rs index e98bec92..a96a5354 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -357,7 +357,6 @@ pub enum ServerContext { DoneOpeningNewPane, DoneUpdatingTabs, ClientExit, - Exit, } impl From<&ServerInstruction> for ServerContext { @@ -375,7 +374,6 @@ impl From<&ServerInstruction> for ServerContext { ServerInstruction::DoneOpeningNewPane => ServerContext::DoneOpeningNewPane, ServerInstruction::DoneUpdatingTabs => ServerContext::DoneUpdatingTabs, ServerInstruction::ClientExit => ServerContext::ClientExit, - ServerInstruction::Exit => ServerContext::Exit, } } } diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index b830bd70..a99a0d16 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -1,18 +1,17 @@ -use ipmpsc::{Receiver as IpcReceiver, Sender as IpcSender, SharedRingBuffer}; +use interprocess::local_socket::LocalSocketStream; use nix::fcntl::{fcntl, FcntlArg, OFlag}; use nix::pty::{forkpty, Winsize}; use nix::sys::signal::{kill, Signal}; use nix::sys::termios; use nix::sys::wait::waitpid; -use nix::unistd; -use nix::unistd::{ForkResult, Pid}; +use nix::unistd::{self, ForkResult, Pid}; use serde::Serialize; use signal_hook::{consts::signal::*, iterator::Signals}; use std::env; use std::io; use std::io::prelude::*; use std::marker::PhantomData; -use std::os::unix::io::RawFd; +use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; @@ -23,7 +22,7 @@ use crate::panes::PositionAndSize; use crate::server::ServerInstruction; use crate::utils::consts::ZELLIJ_IPC_PIPE; -const IPC_BUFFER_SIZE: u32 = 8388608; +const IPC_BUFFER_SIZE: usize = 262144; fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); @@ -162,35 +161,34 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) } /// Sends messages on an [ipmpsc](ipmpsc) channel, along with an [`ErrorContext`]. -#[derive(Clone)] struct IpcSenderWithContext { - sender: IpcSender, + sender: LocalSocketStream, _phantom: PhantomData, } impl IpcSenderWithContext { /// Returns a sender to the given [SharedRingBuffer](ipmpsc::SharedRingBuffer). - fn new(buffer: SharedRingBuffer) -> Self { + fn new(sender: LocalSocketStream) -> Self { Self { - sender: IpcSender::new(buffer), + sender, _phantom: PhantomData, } } /// Sends an event, along with the current [`ErrorContext`], on this /// [`IpcSenderWithContext`]'s channel. - fn send(&self, msg: T) -> ipmpsc::Result<()> { + fn send(&mut self, msg: T) -> Result<(), std::io::Error> { let err_ctx = get_current_ctx(); - self.sender.send(&(msg, err_ctx)) + self.sender + .write_all(&bincode::serialize(&(msg, err_ctx)).unwrap()) } } #[derive(Clone)] pub struct ServerOsInputOutput { orig_termios: Arc>, - server_sender: IpcSenderWithContext, - server_receiver: Arc, // Should this be Arc> ? - client_sender: Option>, + recv_socket: Option>>, + sender_socket: Arc>>>, } /// The `ServerOsApi` trait represents an abstract interface to the features of an operating system that @@ -213,14 +211,14 @@ pub trait ServerOsApi: Send + Sync { fn kill(&mut self, pid: RawFd) -> Result<(), nix::Error>; /// Returns a [`Box`] pointer to this [`ServerOsApi`] struct. fn box_clone(&self) -> Box; - /// Sends an `Exit` message to the server router thread. - fn server_exit(&mut self); /// Receives a message on server-side IPC channel fn server_recv(&self) -> (ServerInstruction, ErrorContext); /// Sends a message to client fn send_to_client(&self, msg: ClientInstruction); /// Adds a sender to client - fn add_client_sender(&mut self, buffer_path: String); + fn add_client_sender(&mut self); + /// Update the receiver socket for the client + fn update_receiver(&mut self, stream: LocalSocketStream); } impl ServerOsApi for ServerOsInputOutput { @@ -254,18 +252,42 @@ impl ServerOsApi for ServerOsInputOutput { waitpid(Pid::from_raw(pid), None).unwrap(); Ok(()) } - fn server_exit(&mut self) { - self.server_sender.send(ServerInstruction::Exit).unwrap(); - } fn server_recv(&self) -> (ServerInstruction, ErrorContext) { - self.server_receiver.recv().unwrap() + let mut buf = [0; IPC_BUFFER_SIZE]; + let bytes = self + .recv_socket + .as_ref() + .unwrap() + .lock() + .unwrap() + .read(&mut buf) + .unwrap(); + bincode::deserialize(&buf[..bytes]).unwrap() } fn send_to_client(&self, msg: ClientInstruction) { - self.client_sender.as_ref().unwrap().send(msg).unwrap(); + self.sender_socket + .lock() + .unwrap() + .as_mut() + .unwrap() + .send(msg) + .unwrap(); } - fn add_client_sender(&mut self, buffer_path: String) { - let buffer = SharedRingBuffer::open(buffer_path.as_str()).unwrap(); - self.client_sender = Some(IpcSenderWithContext::new(buffer)); + fn add_client_sender(&mut self) { + assert!(self.sender_socket.lock().unwrap().is_none()); + let sock_fd = self + .recv_socket + .as_ref() + .unwrap() + .lock() + .unwrap() + .as_raw_fd(); + let dup_fd = unistd::dup(sock_fd).unwrap(); + let dup_sock = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; + *self.sender_socket.lock().unwrap() = Some(IpcSenderWithContext::new(dup_sock)); + } + fn update_receiver(&mut self, stream: LocalSocketStream) { + self.recv_socket = Some(Arc::new(Mutex::new(stream))); } } @@ -278,22 +300,18 @@ impl Clone for Box { pub fn get_server_os_input() -> ServerOsInputOutput { let current_termios = termios::tcgetattr(0).unwrap(); let orig_termios = Arc::new(Mutex::new(current_termios)); - let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, IPC_BUFFER_SIZE).unwrap(); - let server_sender = IpcSenderWithContext::new(server_buffer.clone()); - let server_receiver = Arc::new(IpcReceiver::new(server_buffer)); ServerOsInputOutput { orig_termios, - server_sender, - server_receiver, - client_sender: None, + recv_socket: None, + sender_socket: Arc::new(Mutex::new(None)), } } #[derive(Clone)] pub struct ClientOsInputOutput { orig_termios: Arc>, - server_sender: IpcSenderWithContext, - client_receiver: Option>, // Should this be Option>> ? + server_sender: Arc>>>, + receiver: Arc>>, } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -318,9 +336,9 @@ pub trait ClientOsApi: Send + Sync { /// Receives a message on client-side IPC channel // This should be called from the client-side router thread only. fn client_recv(&self) -> (ClientInstruction, ErrorContext); - /// Setup the client IpcChannel and notify server of new client - fn connect_to_server(&mut self, full_screen_ws: PositionAndSize); fn receive_sigwinch(&self, cb: Box); + /// Establish a connection with the server socket. + fn connect_to_server(&self); } impl ClientOsApi for ClientOsInputOutput { @@ -351,19 +369,25 @@ impl ClientOsApi for ClientOsInputOutput { Box::new(stdout) } fn send_to_server(&self, msg: ServerInstruction) { - self.server_sender.send(msg).unwrap(); - } - fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) { - let (client_buffer_path, client_buffer) = - SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap(); - self.client_receiver = Some(Arc::new(IpcReceiver::new(client_buffer))); - self.send_to_server(ServerInstruction::NewClient( - client_buffer_path, - full_screen_ws, - )); + self.server_sender + .lock() + .unwrap() + .as_mut() + .unwrap() + .send(msg) + .unwrap(); } fn client_recv(&self) -> (ClientInstruction, ErrorContext) { - self.client_receiver.as_ref().unwrap().recv().unwrap() + let mut buf = [0; IPC_BUFFER_SIZE]; + let bytes = self + .receiver + .lock() + .unwrap() + .as_mut() + .unwrap() + .read(&mut buf) + .unwrap(); + bincode::deserialize(&buf[..bytes]).unwrap() } fn receive_sigwinch(&self, cb: Box) { let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); @@ -379,6 +403,15 @@ impl ClientOsApi for ClientOsInputOutput { } } } + fn connect_to_server(&self) { + let socket = LocalSocketStream::connect(ZELLIJ_IPC_PIPE).unwrap(); + let sock_fd = socket.as_raw_fd(); + let dup_fd = unistd::dup(sock_fd).unwrap(); + let receiver = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; + let sender = IpcSenderWithContext::new(socket); + *self.server_sender.lock().unwrap() = Some(sender); + *self.receiver.lock().unwrap() = Some(receiver); + } } impl Clone for Box { @@ -390,11 +423,9 @@ impl Clone for Box { pub fn get_client_os_input() -> ClientOsInputOutput { let current_termios = termios::tcgetattr(0).unwrap(); let orig_termios = Arc::new(Mutex::new(current_termios)); - let server_buffer = SharedRingBuffer::open(ZELLIJ_IPC_PIPE).unwrap(); - let server_sender = IpcSenderWithContext::new(server_buffer); ClientOsInputOutput { orig_termios, - server_sender, - client_receiver: None, + server_sender: Arc::new(Mutex::new(None)), + receiver: Arc::new(Mutex::new(None)), } } diff --git a/src/main.rs b/src/main.rs index b9a4575e..e8aa39f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -60,23 +60,30 @@ pub fn main() { if let Some(split_dir) = opts.split { match split_dir { 'h' => { - get_client_os_input().send_to_server(ServerInstruction::SplitHorizontally); + let os_input = get_client_os_input(); + os_input.connect_to_server(); + os_input.send_to_server(ServerInstruction::SplitHorizontally); } 'v' => { - get_client_os_input().send_to_server(ServerInstruction::SplitVertically); + let os_input = get_client_os_input(); + os_input.connect_to_server(); + os_input.send_to_server(ServerInstruction::SplitVertically); } _ => {} }; } else if opts.move_focus { - get_client_os_input().send_to_server(ServerInstruction::MoveFocus); - } else if let Some(file_to_open) = opts.open_file { - get_client_os_input().send_to_server(ServerInstruction::OpenFile(file_to_open)); - } else { - // Mind the order: server_os_input should be created before client_os_input - let server_os_input = get_server_os_input(); let os_input = get_client_os_input(); + os_input.connect_to_server(); + os_input.send_to_server(ServerInstruction::MoveFocus); + } else if let Some(file_to_open) = opts.open_file { + let os_input = get_client_os_input(); + os_input.connect_to_server(); + os_input.send_to_server(ServerInstruction::OpenFile(file_to_open)); + } else { atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); + let server_os_input = get_server_os_input(); + let os_input = get_client_os_input(); start(Box::new(os_input), opts, Box::new(server_os_input)); } } diff --git a/src/server/mod.rs b/src/server/mod.rs index adf3c9b2..7164930c 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,4 +1,5 @@ use directories_next::ProjectDirs; +use interprocess::local_socket::LocalSocketListener; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::sync::mpsc::channel; @@ -28,6 +29,7 @@ use crate::common::{ use crate::layout::Layout; use crate::panes::PaneId; use crate::panes::PositionAndSize; +use crate::utils::consts::ZELLIJ_IPC_PIPE; /// Instructions related to server-side application including the /// ones sent by client to server @@ -38,15 +40,13 @@ pub enum ServerInstruction { SplitVertically, MoveFocus, TerminalResize(PositionAndSize), - NewClient(String, PositionAndSize), + NewClient(PositionAndSize), Action(Action), Render(Option), DoneClosingPane, DoneOpeningNewPane, DoneUpdatingTabs, ClientExit, - // notify router thread to exit - Exit, } struct SessionMetaData { @@ -69,71 +69,44 @@ impl Drop for SessionMetaData { } } -pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { +pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { let (send_server_instructions, receive_server_instructions): ChannelWithContext< ServerInstruction, > = channel(); let send_server_instructions = SenderWithContext::new(SenderType::Sender(send_server_instructions)); + let sessions: Arc>> = Arc::new(RwLock::new(None)); - let sessions: Arc>> = - Arc::new(RwLock::new(HashMap::new())); - // We handle only single client for now - let session: Arc> = Arc::new(RwLock::new("session1".into())); - let router_thread = thread::Builder::new() - .name("server_router".to_string()) - .spawn({ - let os_input = os_input.clone(); - let session = session.clone(); - let sessions = sessions.clone(); - let send_server_instructions = send_server_instructions.clone(); - move || loop { - let (instruction, mut err_ctx) = os_input.server_recv(); - err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); - let rlocked_session = &*session.read().unwrap(); - let rlocked_sessions = sessions.read().unwrap(); - match instruction { - ServerInstruction::Exit => break, - ServerInstruction::OpenFile(file_name) => { - rlocked_sessions[rlocked_session] - .send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(file_name))) - .unwrap(); + #[cfg(test)] + handle_client( + sessions.clone(), + os_input.clone(), + send_server_instructions.clone(), + ); + #[cfg(not(test))] + let _ = thread::Builder::new().name("listener".to_string()).spawn({ + let os_input = os_input.clone(); + let sessions = sessions.clone(); + let send_server_instructions = send_server_instructions.clone(); + move || { + drop(std::fs::remove_file(ZELLIJ_IPC_PIPE)); + let listener = LocalSocketListener::bind(ZELLIJ_IPC_PIPE).unwrap(); + for stream in listener.incoming() { + match stream { + Ok(stream) => { + let mut os_input = os_input.clone(); + os_input.update_receiver(stream); + let sessions = sessions.clone(); + let send_server_instructions = send_server_instructions.clone(); + handle_client(sessions, os_input, send_server_instructions); } - ServerInstruction::SplitHorizontally => { - rlocked_sessions[rlocked_session] - .send_pty_instructions - .send(PtyInstruction::SpawnTerminalHorizontally(None)) - .unwrap(); - } - ServerInstruction::SplitVertically => { - rlocked_sessions[rlocked_session] - .send_pty_instructions - .send(PtyInstruction::SpawnTerminalVertically(None)) - .unwrap(); - } - ServerInstruction::MoveFocus => { - rlocked_sessions[rlocked_session] - .send_screen_instructions - .send(ScreenInstruction::FocusNextPane) - .unwrap(); - } - ServerInstruction::Action(action) => { - route_action(action, &rlocked_sessions[rlocked_session]); - } - ServerInstruction::TerminalResize(new_size) => { - rlocked_sessions[rlocked_session] - .send_screen_instructions - .send(ScreenInstruction::TerminalResize(new_size)) - .unwrap(); - } - _ => { - send_server_instructions.send(instruction).unwrap(); + Err(err) => { + panic!("err {:?}", err); } } } - }) - .unwrap(); + } + }); thread::Builder::new() .name("ipc_server".to_string()) @@ -142,24 +115,22 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); match instruction { - ServerInstruction::NewClient(buffer_path, full_screen_ws) => { + ServerInstruction::NewClient(full_screen_ws) => { let session_data = init_session( os_input.clone(), opts.clone(), send_server_instructions.clone(), full_screen_ws, ); - drop( - sessions - .write() - .unwrap() - .insert(session.read().unwrap().clone(), session_data), - ); - sessions.read().unwrap()[&*session.read().unwrap()] + *sessions.write().unwrap() = Some(session_data); + sessions + .read() + .unwrap() + .as_ref() + .unwrap() .send_pty_instructions .send(PtyInstruction::NewTab) .unwrap(); - os_input.add_client_sender(buffer_path); } ServerInstruction::DoneClosingPane => { os_input.send_to_client(ClientInstruction::DoneClosingPane); @@ -171,16 +142,8 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread os_input.send_to_client(ClientInstruction::DoneUpdatingTabs); } ServerInstruction::ClientExit => { - drop( - sessions - .write() - .unwrap() - .remove(&*session.read().unwrap()) - .unwrap(), - ); + *sessions.write().unwrap() = None; os_input.send_to_client(ClientInstruction::Exit); - os_input.server_exit(); - let _ = router_thread.join(); break; } ServerInstruction::Render(output) => { @@ -193,6 +156,81 @@ pub fn start_server(mut os_input: Box, opts: CliArgs) -> thread .unwrap() } +fn handle_client( + sessions: Arc>>, + mut os_input: Box, + send_server_instructions: SenderWithContext, +) { + thread::Builder::new() + .name("router".to_string()) + .spawn(move || loop { + let (instruction, mut err_ctx) = os_input.server_recv(); + err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); + let rlocked_sessions = sessions.read().unwrap(); + match instruction { + ServerInstruction::ClientExit => { + send_server_instructions.send(instruction).unwrap(); + break; + } + ServerInstruction::OpenFile(file_name) => { + rlocked_sessions + .as_ref() + .unwrap() + .send_pty_instructions + .send(PtyInstruction::SpawnTerminal(Some(file_name))) + .unwrap(); + break; + } + ServerInstruction::SplitHorizontally => { + rlocked_sessions + .as_ref() + .unwrap() + .send_pty_instructions + .send(PtyInstruction::SpawnTerminalHorizontally(None)) + .unwrap(); + break; + } + ServerInstruction::SplitVertically => { + rlocked_sessions + .as_ref() + .unwrap() + .send_pty_instructions + .send(PtyInstruction::SpawnTerminalVertically(None)) + .unwrap(); + break; + } + ServerInstruction::MoveFocus => { + rlocked_sessions + .as_ref() + .unwrap() + .send_screen_instructions + .send(ScreenInstruction::FocusNextPane) + .unwrap(); + break; + } + ServerInstruction::Action(action) => { + route_action(action, rlocked_sessions.as_ref().unwrap()); + } + ServerInstruction::TerminalResize(new_size) => { + rlocked_sessions + .as_ref() + .unwrap() + .send_screen_instructions + .send(ScreenInstruction::TerminalResize(new_size)) + .unwrap(); + } + ServerInstruction::NewClient(_) => { + os_input.add_client_sender(); + send_server_instructions.send(instruction).unwrap(); + } + _ => { + send_server_instructions.send(instruction).unwrap(); + } + } + }) + .unwrap(); +} + fn init_session( os_input: Box, opts: CliArgs, diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 7b4589c3..c4bdc57f 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -1,4 +1,5 @@ use crate::panes::PositionAndSize; +use interprocess::local_socket::LocalSocketStream; use std::collections::{HashMap, VecDeque}; use std::io::Write; use std::os::unix::io::RawFd; @@ -196,12 +197,6 @@ impl ClientOsApi for FakeInputOutput { fn send_to_server(&self, msg: ServerInstruction) { self.server_sender.send(msg).unwrap(); } - fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) { - ClientOsApi::send_to_server( - self, - ServerInstruction::NewClient("zellij".into(), full_screen_ws), - ); - } fn client_recv(&self) -> (ClientInstruction, ErrorContext) { self.client_receiver.lock().unwrap().recv().unwrap() } @@ -217,6 +212,7 @@ impl ClientOsApi for FakeInputOutput { cb(); } } + fn connect_to_server(&self) {} } impl ServerOsApi for FakeInputOutput { @@ -277,14 +273,12 @@ impl ServerOsApi for FakeInputOutput { self.io_events.lock().unwrap().push(IoEvent::Kill(fd)); Ok(()) } - fn server_exit(&mut self) { - self.server_sender.send(ServerInstruction::Exit).unwrap(); - } fn server_recv(&self) -> (ServerInstruction, ErrorContext) { self.server_receiver.lock().unwrap().recv().unwrap() } fn send_to_client(&self, msg: ClientInstruction) { self.client_sender.send(msg).unwrap(); } - fn add_client_sender(&mut self, _buffer_path: String) {} + fn add_client_sender(&mut self) {} + fn update_receiver(&mut self, stream: LocalSocketStream) {} } From 42079f8d048fc2ec4dad9b135efb93e31cf2ecb6 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 28 Apr 2021 21:13:19 +0530 Subject: [PATCH 51/64] Refactor CommandIsExecuting to have a single variant --- src/client/mod.rs | 10 ++--- src/common/command_is_executing.rs | 70 +++++++----------------------- src/common/errors.rs | 16 ++----- src/common/input/handler.rs | 21 +++------ src/server/mod.rs | 38 +++++++--------- src/tests/fakes.rs | 2 +- 6 files changed, 45 insertions(+), 112 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 0a0f0793..bbde8c35 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -25,9 +25,7 @@ use crate::server::ServerInstruction; pub enum ClientInstruction { Error(String), Render(Option), - DoneClosingPane, - DoneOpeningNewPane, - DoneUpdatingTabs, + UnblockInputThread, Exit, } @@ -157,9 +155,9 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { .expect("cannot write to stdout"); stdout.flush().expect("could not flush"); } - ClientInstruction::DoneClosingPane => command_is_executing.done_closing_pane(), - ClientInstruction::DoneOpeningNewPane => command_is_executing.done_opening_new_pane(), - ClientInstruction::DoneUpdatingTabs => command_is_executing.done_updating_tabs(), + ClientInstruction::UnblockInputThread => { + command_is_executing.unblock_input_thread(); + } } } diff --git a/src/common/command_is_executing.rs b/src/common/command_is_executing.rs index fdce0429..ad032557 100644 --- a/src/common/command_is_executing.rs +++ b/src/common/command_is_executing.rs @@ -3,71 +3,31 @@ use std::sync::{Arc, Condvar, Mutex}; #[derive(Clone)] pub struct CommandIsExecuting { - opening_new_pane: Arc<(Mutex, Condvar)>, - closing_pane: Arc<(Mutex, Condvar)>, - updating_tabs: Arc<(Mutex, Condvar)>, + input_thread: Arc<(Mutex, Condvar)>, } impl CommandIsExecuting { pub fn new() -> Self { CommandIsExecuting { - opening_new_pane: Arc::new((Mutex::new(false), Condvar::new())), - closing_pane: Arc::new((Mutex::new(false), Condvar::new())), - updating_tabs: Arc::new((Mutex::new(false), Condvar::new())), + input_thread: Arc::new((Mutex::new(false), Condvar::new())), } } - pub fn closing_pane(&mut self) { - let (lock, _cvar) = &*self.closing_pane; - let mut closing_pane = lock.lock().unwrap(); - *closing_pane = true; + pub fn blocking_input_thread(&mut self) { + let (lock, _cvar) = &*self.input_thread; + let mut input_thread = lock.lock().unwrap(); + *input_thread = true; } - pub fn done_closing_pane(&mut self) { - let (lock, cvar) = &*self.closing_pane; - let mut closing_pane = lock.lock().unwrap(); - *closing_pane = false; + pub fn unblock_input_thread(&mut self) { + let (lock, cvar) = &*self.input_thread; + let mut input_thread = lock.lock().unwrap(); + *input_thread = false; cvar.notify_all(); } - pub fn opening_new_pane(&mut self) { - let (lock, _cvar) = &*self.opening_new_pane; - let mut opening_new_pane = lock.lock().unwrap(); - *opening_new_pane = true; - } - pub fn done_opening_new_pane(&mut self) { - let (lock, cvar) = &*self.opening_new_pane; - let mut opening_new_pane = lock.lock().unwrap(); - *opening_new_pane = false; - cvar.notify_all(); - } - pub fn updating_tabs(&mut self) { - let (lock, _cvar) = &*self.updating_tabs; - let mut updating_tabs = lock.lock().unwrap(); - *updating_tabs = true; - } - pub fn done_updating_tabs(&self) { - let (lock, cvar) = &*self.updating_tabs; - let mut updating_tabs = lock.lock().unwrap(); - *updating_tabs = false; - cvar.notify_one(); - } - pub fn wait_until_pane_is_closed(&self) { - let (lock, cvar) = &*self.closing_pane; - let mut closing_pane = lock.lock().unwrap(); - while *closing_pane { - closing_pane = cvar.wait(closing_pane).unwrap(); - } - } - pub fn wait_until_new_pane_is_opened(&self) { - let (lock, cvar) = &*self.opening_new_pane; - let mut opening_new_pane = lock.lock().unwrap(); - while *opening_new_pane { - opening_new_pane = cvar.wait(opening_new_pane).unwrap(); - } - } - pub fn wait_until_tabs_are_updated(&self) { - let (lock, cvar) = &*self.updating_tabs; - let mut updating_tabs = lock.lock().unwrap(); - while *updating_tabs { - updating_tabs = cvar.wait(updating_tabs).unwrap(); + pub fn wait_until_input_thread_is_unblocked(&self) { + let (lock, cvar) = &*self.input_thread; + let mut input_thread = lock.lock().unwrap(); + while *input_thread { + input_thread = cvar.wait(input_thread).unwrap(); } } } diff --git a/src/common/errors.rs b/src/common/errors.rs index a96a5354..0b91a09d 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -323,9 +323,7 @@ impl From<&PluginInstruction> for PluginContext { pub enum ClientContext { Exit, Error, - DoneClosingPane, - DoneOpeningNewPane, - DoneUpdatingTabs, + UnblockInputThread, Render, } @@ -335,9 +333,7 @@ impl From<&ClientInstruction> for ClientContext { ClientInstruction::Exit => ClientContext::Exit, ClientInstruction::Error(_) => ClientContext::Error, ClientInstruction::Render(_) => ClientContext::Render, - ClientInstruction::DoneClosingPane => ClientContext::DoneClosingPane, - ClientInstruction::DoneOpeningNewPane => ClientContext::DoneOpeningNewPane, - ClientInstruction::DoneUpdatingTabs => ClientContext::DoneUpdatingTabs, + ClientInstruction::UnblockInputThread => ClientContext::UnblockInputThread, } } } @@ -353,9 +349,7 @@ pub enum ServerContext { Action, Render, TerminalResize, - DoneClosingPane, - DoneOpeningNewPane, - DoneUpdatingTabs, + UnblockInputThread, ClientExit, } @@ -370,9 +364,7 @@ impl From<&ServerInstruction> for ServerContext { ServerInstruction::Action(_) => ServerContext::Action, ServerInstruction::TerminalResize(_) => ServerContext::TerminalResize, ServerInstruction::Render(_) => ServerContext::Render, - ServerInstruction::DoneClosingPane => ServerContext::DoneClosingPane, - ServerInstruction::DoneOpeningNewPane => ServerContext::DoneOpeningNewPane, - ServerInstruction::DoneUpdatingTabs => ServerContext::DoneUpdatingTabs, + ServerInstruction::UnblockInputThread => ServerContext::UnblockInputThread, ServerInstruction::ClientExit => ServerContext::ClientExit, } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 509b77fa..64e4fbe3 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -114,27 +114,18 @@ impl InputHandler { self.os_input .send_to_server(ServerInstruction::Action(action.clone())); } - Action::NewPane(_) => { - self.command_is_executing.opening_new_pane(); - self.os_input - .send_to_server(ServerInstruction::Action(action)); - self.command_is_executing.wait_until_new_pane_is_opened(); - } - Action::CloseFocus => { - self.command_is_executing.closing_pane(); - self.os_input - .send_to_server(ServerInstruction::Action(action)); - self.command_is_executing.wait_until_pane_is_closed(); - } - Action::NewTab + Action::CloseFocus + | Action::NewPane(_) + | Action::NewTab | Action::GoToNextTab | Action::GoToPreviousTab | Action::CloseTab | Action::GoToTab(_) => { - self.command_is_executing.updating_tabs(); + self.command_is_executing.blocking_input_thread(); self.os_input .send_to_server(ServerInstruction::Action(action)); - self.command_is_executing.wait_until_tabs_are_updated(); + self.command_is_executing + .wait_until_input_thread_is_unblocked(); } _ => self .os_input diff --git a/src/server/mod.rs b/src/server/mod.rs index 7164930c..904093f0 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -43,9 +43,7 @@ pub enum ServerInstruction { NewClient(PositionAndSize), Action(Action), Render(Option), - DoneClosingPane, - DoneOpeningNewPane, - DoneUpdatingTabs, + UnblockInputThread, ClientExit, } @@ -132,14 +130,8 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo .send(PtyInstruction::NewTab) .unwrap(); } - ServerInstruction::DoneClosingPane => { - os_input.send_to_client(ClientInstruction::DoneClosingPane); - } - ServerInstruction::DoneOpeningNewPane => { - os_input.send_to_client(ClientInstruction::DoneOpeningNewPane); - } - ServerInstruction::DoneUpdatingTabs => { - os_input.send_to_client(ClientInstruction::DoneUpdatingTabs); + ServerInstruction::UnblockInputThread => { + os_input.send_to_client(ClientInstruction::UnblockInputThread); } ServerInstruction::ClientExit => { *sessions.write().unwrap() = None; @@ -313,13 +305,13 @@ fn init_session( PtyInstruction::ClosePane(id) => { pty_bus.close_pane(id); send_server_instructions - .send(ServerInstruction::DoneClosingPane) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } PtyInstruction::CloseTab(ids) => { pty_bus.close_tab(ids); send_server_instructions - .send(ServerInstruction::DoneClosingPane) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } PtyInstruction::Exit => { @@ -382,21 +374,21 @@ fn init_session( screen.get_active_tab_mut().unwrap().new_pane(pid); screen .send_server_instructions - .send(ServerInstruction::DoneOpeningNewPane) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::HorizontalSplit(pid) => { screen.get_active_tab_mut().unwrap().horizontal_split(pid); screen .send_server_instructions - .send(ServerInstruction::DoneOpeningNewPane) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::VerticalSplit(pid) => { screen.get_active_tab_mut().unwrap().vertical_split(pid); screen .send_server_instructions - .send(ServerInstruction::DoneOpeningNewPane) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::WriteCharacter(bytes) => { @@ -493,49 +485,49 @@ fn init_session( screen.new_tab(pane_id); screen .send_server_instructions - .send(ServerInstruction::DoneUpdatingTabs) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::SwitchTabNext => { screen.switch_tab_next(); screen .send_server_instructions - .send(ServerInstruction::DoneUpdatingTabs) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::SwitchTabPrev => { screen.switch_tab_prev(); screen .send_server_instructions - .send(ServerInstruction::DoneUpdatingTabs) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::CloseTab => { screen.close_tab(); screen .send_server_instructions - .send(ServerInstruction::DoneUpdatingTabs) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::ApplyLayout(layout, new_pane_pids) => { screen.apply_layout(Layout::new(layout), new_pane_pids); screen .send_server_instructions - .send(ServerInstruction::DoneUpdatingTabs) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::GoToTab(tab_index) => { screen.go_to_tab(tab_index as usize); screen .send_server_instructions - .send(ServerInstruction::DoneUpdatingTabs) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::UpdateTabName(c) => { screen.update_active_tab_name(c); screen .send_server_instructions - .send(ServerInstruction::DoneUpdatingTabs) + .send(ServerInstruction::UnblockInputThread) .unwrap(); } ScreenInstruction::ChangeMode(mode_info) => { diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index c4bdc57f..99bd008a 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -280,5 +280,5 @@ impl ServerOsApi for FakeInputOutput { self.client_sender.send(msg).unwrap(); } fn add_client_sender(&mut self) {} - fn update_receiver(&mut self, stream: LocalSocketStream) {} + fn update_receiver(&mut self, _stream: LocalSocketStream) {} } From 9110e444b8ef2f96a0386b7c5e65283a2b5456c0 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 29 Apr 2021 15:25:55 +0530 Subject: [PATCH 52/64] remove Split, OpenFile and MoveFocus from CliArgs --- src/cli.rs | 12 ----------- src/common/errors.rs | 8 ------- src/common/input/handler.rs | 2 +- src/main.rs | 43 ++++++------------------------------- src/server/mod.rs | 40 ---------------------------------- 5 files changed, 7 insertions(+), 98 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index c3f76967..9f2bfd36 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -5,18 +5,6 @@ use structopt::StructOpt; #[derive(StructOpt, Default, Debug, Clone)] #[structopt(name = "zellij")] pub struct CliArgs { - /// Send "split (direction h == horizontal / v == vertical)" to active zellij session - #[structopt(short, long)] - pub split: Option, - - /// Send "move focused pane" to active zellij session - #[structopt(short, long)] - pub move_focus: bool, - - /// Send "open file in new pane" to active zellij session - #[structopt(short, long)] - pub open_file: Option, - /// Maximum panes on screen, caution: opening more panes will close old ones #[structopt(long)] pub max_panes: Option, diff --git a/src/common/errors.rs b/src/common/errors.rs index 0b91a09d..411e0225 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -341,10 +341,6 @@ impl From<&ClientInstruction> for ClientContext { /// Stack call representations corresponding to the different types of [`ServerInstruction`]s. #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum ServerContext { - OpenFile, - SplitHorizontally, - SplitVertically, - MoveFocus, NewClient, Action, Render, @@ -356,10 +352,6 @@ pub enum ServerContext { impl From<&ServerInstruction> for ServerContext { fn from(server_instruction: &ServerInstruction) -> Self { match *server_instruction { - ServerInstruction::OpenFile(_) => ServerContext::OpenFile, - ServerInstruction::SplitHorizontally => ServerContext::SplitHorizontally, - ServerInstruction::SplitVertically => ServerContext::SplitVertically, - ServerInstruction::MoveFocus => ServerContext::MoveFocus, ServerInstruction::NewClient(..) => ServerContext::NewClient, ServerInstruction::Action(_) => ServerContext::Action, ServerInstruction::TerminalResize(_) => ServerContext::TerminalResize, diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 64e4fbe3..7a4a4e52 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -112,7 +112,7 @@ impl InputHandler { Action::SwitchToMode(mode) => { self.mode = mode; self.os_input - .send_to_server(ServerInstruction::Action(action.clone())); + .send_to_server(ServerInstruction::Action(action)); } Action::CloseFocus | Action::NewPane(_) diff --git a/src/main.rs b/src/main.rs index e8aa39f7..e6edfdfd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ mod server; use client::{boundaries, layout, panes, start_client, tab}; use common::{command_is_executing, errors, os_input_output, pty_bus, screen, utils, wasm_vm}; use directories_next::ProjectDirs; -use server::{start_server, ServerInstruction}; +use server::start_server; use structopt::StructOpt; @@ -50,42 +50,11 @@ pub fn main() { } let opts = CliArgs::from_args(); - let config = match Config::try_from(&opts) { - Ok(config) => config, - Err(e) => { - eprintln!("There was an error in the config file:\n{}", e); - std::process::exit(1); - } - }; - if let Some(split_dir) = opts.split { - match split_dir { - 'h' => { - let os_input = get_client_os_input(); - os_input.connect_to_server(); - os_input.send_to_server(ServerInstruction::SplitHorizontally); - } - 'v' => { - let os_input = get_client_os_input(); - os_input.connect_to_server(); - os_input.send_to_server(ServerInstruction::SplitVertically); - } - _ => {} - }; - } else if opts.move_focus { - let os_input = get_client_os_input(); - os_input.connect_to_server(); - os_input.send_to_server(ServerInstruction::MoveFocus); - } else if let Some(file_to_open) = opts.open_file { - let os_input = get_client_os_input(); - os_input.connect_to_server(); - os_input.send_to_server(ServerInstruction::OpenFile(file_to_open)); - } else { - atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); - atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); - let server_os_input = get_server_os_input(); - let os_input = get_client_os_input(); - start(Box::new(os_input), opts, Box::new(server_os_input)); - } + atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); + atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); + let server_os_input = get_server_os_input(); + let os_input = get_client_os_input(); + start(Box::new(os_input), opts, Box::new(server_os_input)); } /// Start Zellij with the specified [`ClientOsApi`], [`ServerOsApi`] and command-line arguments. diff --git a/src/server/mod.rs b/src/server/mod.rs index 904093f0..ca34861b 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -35,10 +35,6 @@ use crate::utils::consts::ZELLIJ_IPC_PIPE; /// ones sent by client to server #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ServerInstruction { - OpenFile(PathBuf), - SplitHorizontally, - SplitVertically, - MoveFocus, TerminalResize(PositionAndSize), NewClient(PositionAndSize), Action(Action), @@ -164,42 +160,6 @@ fn handle_client( send_server_instructions.send(instruction).unwrap(); break; } - ServerInstruction::OpenFile(file_name) => { - rlocked_sessions - .as_ref() - .unwrap() - .send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(file_name))) - .unwrap(); - break; - } - ServerInstruction::SplitHorizontally => { - rlocked_sessions - .as_ref() - .unwrap() - .send_pty_instructions - .send(PtyInstruction::SpawnTerminalHorizontally(None)) - .unwrap(); - break; - } - ServerInstruction::SplitVertically => { - rlocked_sessions - .as_ref() - .unwrap() - .send_pty_instructions - .send(PtyInstruction::SpawnTerminalVertically(None)) - .unwrap(); - break; - } - ServerInstruction::MoveFocus => { - rlocked_sessions - .as_ref() - .unwrap() - .send_screen_instructions - .send(ScreenInstruction::FocusNextPane) - .unwrap(); - break; - } ServerInstruction::Action(action) => { route_action(action, rlocked_sessions.as_ref().unwrap()); } From 1eb732773aa583305353a1e63ffbac879f29f2d8 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 29 Apr 2021 16:27:14 +0530 Subject: [PATCH 53/64] use Uuid to generate unique server socket names --- Cargo.lock | 4 ++++ Cargo.toml | 1 + src/common/mod.rs | 7 +++++++ src/common/os_input_output.rs | 4 ++-- src/server/mod.rs | 7 ++++--- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d596b981..60cb7d6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1774,6 +1774,9 @@ name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] [[package]] name = "value-bag" @@ -2222,6 +2225,7 @@ dependencies = [ "termios", "unicode-truncate", "unicode-width", + "uuid", "vte 0.8.0", "wasmer", "wasmer-wasi", diff --git a/Cargo.toml b/Cargo.toml index d75f3e45..4f71667b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ lazy_static = "1.4.0" wasmer = "1.0.0" wasmer-wasi = "1.0.0" interprocess = "1.1.1" +uuid = { version = "0.8.2", features = ["v4"] } zellij-tile = { path = "zellij-tile/", version = "0.5.0" } [dependencies.async-std] diff --git a/src/common/mod.rs b/src/common/mod.rs index 6061f1a6..4baf503f 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -11,8 +11,10 @@ pub mod wasm_vm; use crate::panes::PaneId; use crate::server::ServerInstruction; +use crate::utils::consts::ZELLIJ_IPC_PIPE; use async_std::task_local; use errors::{get_current_ctx, ErrorContext}; +use lazy_static::lazy_static; use std::cell::RefCell; use std::sync::mpsc; @@ -73,3 +75,8 @@ task_local! { /// stack in the form of an [`ErrorContext`]. static ASYNCOPENCALLS: RefCell = RefCell::default() } + +lazy_static! { + pub static ref UNIQUE_ZELLIJ_IPC_PIPE: String = + ZELLIJ_IPC_PIPE.to_string() + uuid::Uuid::new_v4().to_string().as_str(); +} diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index a99a0d16..d8ef45f9 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -17,10 +17,10 @@ use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; use crate::client::ClientInstruction; +use crate::common::UNIQUE_ZELLIJ_IPC_PIPE; use crate::errors::{get_current_ctx, ErrorContext}; use crate::panes::PositionAndSize; use crate::server::ServerInstruction; -use crate::utils::consts::ZELLIJ_IPC_PIPE; const IPC_BUFFER_SIZE: usize = 262144; @@ -404,7 +404,7 @@ impl ClientOsApi for ClientOsInputOutput { } } fn connect_to_server(&self) { - let socket = LocalSocketStream::connect(ZELLIJ_IPC_PIPE).unwrap(); + let socket = LocalSocketStream::connect(UNIQUE_ZELLIJ_IPC_PIPE.as_str()).unwrap(); let sock_fd = socket.as_raw_fd(); let dup_fd = unistd::dup(sock_fd).unwrap(); let receiver = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; diff --git a/src/server/mod.rs b/src/server/mod.rs index ca34861b..3e0500b0 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -16,6 +16,7 @@ use zellij_tile::data::{Event, EventType, ModeInfo}; use crate::cli::CliArgs; use crate::client::ClientInstruction; +use crate::common::UNIQUE_ZELLIJ_IPC_PIPE; use crate::common::{ errors::{ContextType, PluginContext, PtyContext, ScreenContext, ServerContext}, input::actions::{Action, Direction}, @@ -29,7 +30,6 @@ use crate::common::{ use crate::layout::Layout; use crate::panes::PaneId; use crate::panes::PositionAndSize; -use crate::utils::consts::ZELLIJ_IPC_PIPE; /// Instructions related to server-side application including the /// ones sent by client to server @@ -83,8 +83,8 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo let sessions = sessions.clone(); let send_server_instructions = send_server_instructions.clone(); move || { - drop(std::fs::remove_file(ZELLIJ_IPC_PIPE)); - let listener = LocalSocketListener::bind(ZELLIJ_IPC_PIPE).unwrap(); + drop(std::fs::remove_file(UNIQUE_ZELLIJ_IPC_PIPE.as_str())); + let listener = LocalSocketListener::bind(UNIQUE_ZELLIJ_IPC_PIPE.as_str()).unwrap(); for stream in listener.incoming() { match stream { Ok(stream) => { @@ -132,6 +132,7 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo ServerInstruction::ClientExit => { *sessions.write().unwrap() = None; os_input.send_to_client(ClientInstruction::Exit); + drop(std::fs::remove_file(UNIQUE_ZELLIJ_IPC_PIPE.as_str())); break; } ServerInstruction::Render(output) => { From 3f70c585c22947c5d8e91bf9cd63187228e4ba5d Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 29 Apr 2021 17:52:14 +0530 Subject: [PATCH 54/64] nit fixes --- src/common/os_input_output.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index d8ef45f9..3f532741 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -180,7 +180,8 @@ impl IpcSenderWithContext { fn send(&mut self, msg: T) -> Result<(), std::io::Error> { let err_ctx = get_current_ctx(); self.sender - .write_all(&bincode::serialize(&(msg, err_ctx)).unwrap()) + .write_all(&bincode::serialize(&(msg, err_ctx)).unwrap())?; + self.sender.flush() } } @@ -404,7 +405,13 @@ impl ClientOsApi for ClientOsInputOutput { } } fn connect_to_server(&self) { - let socket = LocalSocketStream::connect(UNIQUE_ZELLIJ_IPC_PIPE.as_str()).unwrap(); + let socket = match LocalSocketStream::connect(UNIQUE_ZELLIJ_IPC_PIPE.as_str()) { + Ok(sock) => sock, + Err(_) => { + std::thread::sleep(std::time::Duration::from_millis(20)); + LocalSocketStream::connect(UNIQUE_ZELLIJ_IPC_PIPE.as_str()).unwrap() + } + }; let sock_fd = socket.as_raw_fd(); let dup_fd = unistd::dup(sock_fd).unwrap(); let receiver = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; From da9b6fd607035c54ec3e541747c244cd2e719a09 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 29 Apr 2021 19:05:20 +0530 Subject: [PATCH 55/64] use BufRead and BufWrite with sockets --- src/common/os_input_output.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 3f532741..4e7c5df1 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -162,7 +162,7 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) /// Sends messages on an [ipmpsc](ipmpsc) channel, along with an [`ErrorContext`]. struct IpcSenderWithContext { - sender: LocalSocketStream, + sender: io::BufWriter, _phantom: PhantomData, } @@ -170,7 +170,7 @@ impl IpcSenderWithContext { /// Returns a sender to the given [SharedRingBuffer](ipmpsc::SharedRingBuffer). fn new(sender: LocalSocketStream) -> Self { Self { - sender, + sender: io::BufWriter::new(sender), _phantom: PhantomData, } } @@ -188,7 +188,7 @@ impl IpcSenderWithContext { #[derive(Clone)] pub struct ServerOsInputOutput { orig_termios: Arc>, - recv_socket: Option>>, + recv_socket: Option>>>, sender_socket: Arc>>>, } @@ -282,13 +282,14 @@ impl ServerOsApi for ServerOsInputOutput { .unwrap() .lock() .unwrap() + .get_ref() .as_raw_fd(); let dup_fd = unistd::dup(sock_fd).unwrap(); let dup_sock = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; *self.sender_socket.lock().unwrap() = Some(IpcSenderWithContext::new(dup_sock)); } fn update_receiver(&mut self, stream: LocalSocketStream) { - self.recv_socket = Some(Arc::new(Mutex::new(stream))); + self.recv_socket = Some(Arc::new(Mutex::new(io::BufReader::new(stream)))); } } @@ -312,7 +313,7 @@ pub fn get_server_os_input() -> ServerOsInputOutput { pub struct ClientOsInputOutput { orig_termios: Arc>, server_sender: Arc>>>, - receiver: Arc>>, + receiver: Arc>>>, } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -417,7 +418,7 @@ impl ClientOsApi for ClientOsInputOutput { let receiver = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; let sender = IpcSenderWithContext::new(socket); *self.server_sender.lock().unwrap() = Some(sender); - *self.receiver.lock().unwrap() = Some(receiver); + *self.receiver.lock().unwrap() = Some(io::BufReader::new(receiver)); } } From 93956bdcca0e2998cf4a914db23051387b4f5841 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 30 Apr 2021 10:24:01 +0530 Subject: [PATCH 56/64] use bincode::deserialize_from() to prevent data loss. --- src/common/os_input_output.rs | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 4e7c5df1..b14b89b8 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -22,8 +22,6 @@ use crate::errors::{get_current_ctx, ErrorContext}; use crate::panes::PositionAndSize; use crate::server::ServerInstruction; -const IPC_BUFFER_SIZE: usize = 262144; - fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); termios::cfmakeraw(&mut tio); @@ -254,16 +252,7 @@ impl ServerOsApi for ServerOsInputOutput { Ok(()) } fn server_recv(&self) -> (ServerInstruction, ErrorContext) { - let mut buf = [0; IPC_BUFFER_SIZE]; - let bytes = self - .recv_socket - .as_ref() - .unwrap() - .lock() - .unwrap() - .read(&mut buf) - .unwrap(); - bincode::deserialize(&buf[..bytes]).unwrap() + bincode::deserialize_from(&mut *self.recv_socket.as_ref().unwrap().lock().unwrap()).unwrap() } fn send_to_client(&self, msg: ClientInstruction) { self.sender_socket @@ -380,16 +369,7 @@ impl ClientOsApi for ClientOsInputOutput { .unwrap(); } fn client_recv(&self) -> (ClientInstruction, ErrorContext) { - let mut buf = [0; IPC_BUFFER_SIZE]; - let bytes = self - .receiver - .lock() - .unwrap() - .as_mut() - .unwrap() - .read(&mut buf) - .unwrap(); - bincode::deserialize(&buf[..bytes]).unwrap() + bincode::deserialize_from(&mut self.receiver.lock().unwrap().as_mut().unwrap()).unwrap() } fn receive_sigwinch(&self, cb: Box) { let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); From 913697b1442169c5ac20f553b8c255a1114720f5 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 30 Apr 2021 20:22:09 +0530 Subject: [PATCH 57/64] Place socket file in runtime directory or cache directory and use names crate for socket file name --- Cargo.lock | 75 +++++++++++++++++++++++++++++++---- Cargo.toml | 2 +- src/common/mod.rs | 15 +++++-- src/common/os_input_output.rs | 6 +-- src/common/utils/consts.rs | 7 ---- src/server/mod.rs | 8 ++-- 6 files changed, 87 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 60cb7d6b..c71bef9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -592,6 +592,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "funty" version = "1.1.0" @@ -1025,6 +1031,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "names" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" +dependencies = [ + "rand 0.3.23", +] + [[package]] name = "nb-connect" version = "1.1.0" @@ -1205,6 +1220,29 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" +[[package]] +name = "rand" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +dependencies = [ + "libc", + "rand 0.4.6", +] + +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + [[package]] name = "rand" version = "0.8.3" @@ -1213,7 +1251,7 @@ checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.2", "rand_hc", ] @@ -1224,9 +1262,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.2", ] +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + [[package]] name = "rand_core" version = "0.6.2" @@ -1242,7 +1295,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" dependencies = [ - "rand_core", + "rand_core 0.6.2", ] [[package]] @@ -1270,6 +1323,15 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + [[package]] name = "redox_syscall" version = "0.2.5" @@ -1597,7 +1659,7 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ "cfg-if 1.0.0", "libc", - "rand", + "rand 0.8.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1774,9 +1836,6 @@ name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom", -] [[package]] name = "value-bag" @@ -2211,6 +2270,7 @@ dependencies = [ "interprocess", "lazy_static", "libc", + "names", "nix", "nom", "serde", @@ -2225,7 +2285,6 @@ dependencies = [ "termios", "unicode-truncate", "unicode-width", - "uuid", "vte 0.8.0", "wasmer", "wasmer-wasi", diff --git a/Cargo.toml b/Cargo.toml index 4f71667b..8b8ccc17 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ lazy_static = "1.4.0" wasmer = "1.0.0" wasmer-wasi = "1.0.0" interprocess = "1.1.1" -uuid = { version = "0.8.2", features = ["v4"] } +names = "0.11.0" zellij-tile = { path = "zellij-tile/", version = "0.5.0" } [dependencies.async-std] diff --git a/src/common/mod.rs b/src/common/mod.rs index 4baf503f..10147a2c 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -11,11 +11,12 @@ pub mod wasm_vm; use crate::panes::PaneId; use crate::server::ServerInstruction; -use crate::utils::consts::ZELLIJ_IPC_PIPE; use async_std::task_local; +use directories_next::ProjectDirs; use errors::{get_current_ctx, ErrorContext}; use lazy_static::lazy_static; use std::cell::RefCell; +use std::path::PathBuf; use std::sync::mpsc; /// An [MPSC](mpsc) asynchronous channel with added error context. @@ -77,6 +78,14 @@ task_local! { } lazy_static! { - pub static ref UNIQUE_ZELLIJ_IPC_PIPE: String = - ZELLIJ_IPC_PIPE.to_string() + uuid::Uuid::new_v4().to_string().as_str(); + pub static ref ZELLIJ_IPC_PIPE: PathBuf = { + let project_dir = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); + let ipc_dir = project_dir + .runtime_dir() + .unwrap_or_else(|| project_dir.cache_dir()); + std::fs::create_dir_all(ipc_dir).unwrap(); + let session_name = names::Generator::default().next().unwrap(); + let x = ipc_dir.join(session_name); + x + }; } diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index b14b89b8..5dfda264 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -17,7 +17,7 @@ use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; use crate::client::ClientInstruction; -use crate::common::UNIQUE_ZELLIJ_IPC_PIPE; +use crate::common::ZELLIJ_IPC_PIPE; use crate::errors::{get_current_ctx, ErrorContext}; use crate::panes::PositionAndSize; use crate::server::ServerInstruction; @@ -386,11 +386,11 @@ impl ClientOsApi for ClientOsInputOutput { } } fn connect_to_server(&self) { - let socket = match LocalSocketStream::connect(UNIQUE_ZELLIJ_IPC_PIPE.as_str()) { + let socket = match LocalSocketStream::connect(ZELLIJ_IPC_PIPE.clone()) { Ok(sock) => sock, Err(_) => { std::thread::sleep(std::time::Duration::from_millis(20)); - LocalSocketStream::connect(UNIQUE_ZELLIJ_IPC_PIPE.as_str()).unwrap() + LocalSocketStream::connect(ZELLIJ_IPC_PIPE.clone()).unwrap() } }; let sock_fd = socket.as_raw_fd(); diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index 4bd1b5b1..f031dd38 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -3,10 +3,3 @@ pub const ZELLIJ_TMP_DIR: &str = "/tmp/zellij"; pub const ZELLIJ_TMP_LOG_DIR: &str = "/tmp/zellij/zellij-log"; pub const ZELLIJ_TMP_LOG_FILE: &str = "/tmp/zellij/zellij-log/log.txt"; -pub const ZELLIJ_IPC_PIPE: &str = "/tmp/zellij/ipc"; - -pub const ZELLIJ_CONFIG_FILE_ENV: &str = "ZELLIJ_CONFIG_FILE"; -pub const ZELLIJ_CONFIG_DIR_ENV: &str = "ZELLIJ_CONFIG_DIR"; - -// TODO: ${PREFIX} argument in makefile -pub const SYSTEM_DEFAULT_CONFIG_DIR: &str = "/etc/zellij"; diff --git a/src/server/mod.rs b/src/server/mod.rs index 3e0500b0..bcfbd091 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -16,7 +16,7 @@ use zellij_tile::data::{Event, EventType, ModeInfo}; use crate::cli::CliArgs; use crate::client::ClientInstruction; -use crate::common::UNIQUE_ZELLIJ_IPC_PIPE; +use crate::common::ZELLIJ_IPC_PIPE; use crate::common::{ errors::{ContextType, PluginContext, PtyContext, ScreenContext, ServerContext}, input::actions::{Action, Direction}, @@ -83,8 +83,8 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo let sessions = sessions.clone(); let send_server_instructions = send_server_instructions.clone(); move || { - drop(std::fs::remove_file(UNIQUE_ZELLIJ_IPC_PIPE.as_str())); - let listener = LocalSocketListener::bind(UNIQUE_ZELLIJ_IPC_PIPE.as_str()).unwrap(); + drop(std::fs::remove_file(ZELLIJ_IPC_PIPE.clone())); + let listener = LocalSocketListener::bind(ZELLIJ_IPC_PIPE.clone()).unwrap(); for stream in listener.incoming() { match stream { Ok(stream) => { @@ -132,7 +132,7 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo ServerInstruction::ClientExit => { *sessions.write().unwrap() = None; os_input.send_to_client(ClientInstruction::Exit); - drop(std::fs::remove_file(UNIQUE_ZELLIJ_IPC_PIPE.as_str())); + drop(std::fs::remove_file(ZELLIJ_IPC_PIPE.clone())); break; } ServerInstruction::Render(output) => { From c6f93ba0d231c12d528e33315a4fdb5d46a1355f Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Fri, 30 Apr 2021 20:40:32 +0530 Subject: [PATCH 58/64] use better names for senders, receivers and threads --- src/client/mod.rs | 2 +- src/common/mod.rs | 3 +- src/common/os_input_output.rs | 62 ++++++++++++++++++++++------------- src/server/mod.rs | 48 ++++++++++++++------------- src/tests/fakes.rs | 40 +++++++++++++--------- 5 files changed, 91 insertions(+), 64 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index bbde8c35..2bf814c2 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -105,7 +105,7 @@ pub fn start_client(mut os_input: Box, opts: CliArgs) { let os_input = os_input.clone(); move || { loop { - let (instruction, mut err_ctx) = os_input.client_recv(); + let (instruction, mut err_ctx) = os_input.recv_from_server(); err_ctx.add_call(ContextType::Client(ClientContext::from(&instruction))); if let ClientInstruction::Exit = instruction { break; diff --git a/src/common/mod.rs b/src/common/mod.rs index 10147a2c..bf4c3ae6 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -85,7 +85,6 @@ lazy_static! { .unwrap_or_else(|| project_dir.cache_dir()); std::fs::create_dir_all(ipc_dir).unwrap(); let session_name = names::Generator::default().next().unwrap(); - let x = ipc_dir.join(session_name); - x + ipc_dir.join(session_name) }; } diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 5dfda264..9a124011 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -186,8 +186,8 @@ impl IpcSenderWithContext { #[derive(Clone)] pub struct ServerOsInputOutput { orig_termios: Arc>, - recv_socket: Option>>>, - sender_socket: Arc>>>, + receive_instructions_from_client: Option>>>, + send_instructions_to_client: Arc>>>, } /// The `ServerOsApi` trait represents an abstract interface to the features of an operating system that @@ -211,7 +211,7 @@ pub trait ServerOsApi: Send + Sync { /// Returns a [`Box`] pointer to this [`ServerOsApi`] struct. fn box_clone(&self) -> Box; /// Receives a message on server-side IPC channel - fn server_recv(&self) -> (ServerInstruction, ErrorContext); + fn recv_from_client(&self) -> (ServerInstruction, ErrorContext); /// Sends a message to client fn send_to_client(&self, msg: ClientInstruction); /// Adds a sender to client @@ -251,11 +251,19 @@ impl ServerOsApi for ServerOsInputOutput { waitpid(Pid::from_raw(pid), None).unwrap(); Ok(()) } - fn server_recv(&self) -> (ServerInstruction, ErrorContext) { - bincode::deserialize_from(&mut *self.recv_socket.as_ref().unwrap().lock().unwrap()).unwrap() + fn recv_from_client(&self) -> (ServerInstruction, ErrorContext) { + bincode::deserialize_from( + &mut *self + .receive_instructions_from_client + .as_ref() + .unwrap() + .lock() + .unwrap(), + ) + .unwrap() } fn send_to_client(&self, msg: ClientInstruction) { - self.sender_socket + self.send_instructions_to_client .lock() .unwrap() .as_mut() @@ -264,9 +272,9 @@ impl ServerOsApi for ServerOsInputOutput { .unwrap(); } fn add_client_sender(&mut self) { - assert!(self.sender_socket.lock().unwrap().is_none()); + assert!(self.send_instructions_to_client.lock().unwrap().is_none()); let sock_fd = self - .recv_socket + .receive_instructions_from_client .as_ref() .unwrap() .lock() @@ -275,10 +283,12 @@ impl ServerOsApi for ServerOsInputOutput { .as_raw_fd(); let dup_fd = unistd::dup(sock_fd).unwrap(); let dup_sock = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; - *self.sender_socket.lock().unwrap() = Some(IpcSenderWithContext::new(dup_sock)); + *self.send_instructions_to_client.lock().unwrap() = + Some(IpcSenderWithContext::new(dup_sock)); } fn update_receiver(&mut self, stream: LocalSocketStream) { - self.recv_socket = Some(Arc::new(Mutex::new(io::BufReader::new(stream)))); + self.receive_instructions_from_client = + Some(Arc::new(Mutex::new(io::BufReader::new(stream)))); } } @@ -293,16 +303,16 @@ pub fn get_server_os_input() -> ServerOsInputOutput { let orig_termios = Arc::new(Mutex::new(current_termios)); ServerOsInputOutput { orig_termios, - recv_socket: None, - sender_socket: Arc::new(Mutex::new(None)), + receive_instructions_from_client: None, + send_instructions_to_client: Arc::new(Mutex::new(None)), } } #[derive(Clone)] pub struct ClientOsInputOutput { orig_termios: Arc>, - server_sender: Arc>>>, - receiver: Arc>>>, + send_instructions_to_server: Arc>>>, + receive_instructions_from_server: Arc>>>, } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -326,7 +336,7 @@ pub trait ClientOsApi: Send + Sync { fn send_to_server(&self, msg: ServerInstruction); /// Receives a message on client-side IPC channel // This should be called from the client-side router thread only. - fn client_recv(&self) -> (ClientInstruction, ErrorContext); + fn recv_from_server(&self) -> (ClientInstruction, ErrorContext); fn receive_sigwinch(&self, cb: Box); /// Establish a connection with the server socket. fn connect_to_server(&self); @@ -360,7 +370,7 @@ impl ClientOsApi for ClientOsInputOutput { Box::new(stdout) } fn send_to_server(&self, msg: ServerInstruction) { - self.server_sender + self.send_instructions_to_server .lock() .unwrap() .as_mut() @@ -368,8 +378,16 @@ impl ClientOsApi for ClientOsInputOutput { .send(msg) .unwrap(); } - fn client_recv(&self) -> (ClientInstruction, ErrorContext) { - bincode::deserialize_from(&mut self.receiver.lock().unwrap().as_mut().unwrap()).unwrap() + fn recv_from_server(&self) -> (ClientInstruction, ErrorContext) { + bincode::deserialize_from( + &mut self + .receive_instructions_from_server + .lock() + .unwrap() + .as_mut() + .unwrap(), + ) + .unwrap() } fn receive_sigwinch(&self, cb: Box) { let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); @@ -397,8 +415,8 @@ impl ClientOsApi for ClientOsInputOutput { let dup_fd = unistd::dup(sock_fd).unwrap(); let receiver = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; let sender = IpcSenderWithContext::new(socket); - *self.server_sender.lock().unwrap() = Some(sender); - *self.receiver.lock().unwrap() = Some(io::BufReader::new(receiver)); + *self.send_instructions_to_server.lock().unwrap() = Some(sender); + *self.receive_instructions_from_server.lock().unwrap() = Some(io::BufReader::new(receiver)); } } @@ -413,7 +431,7 @@ pub fn get_client_os_input() -> ClientOsInputOutput { let orig_termios = Arc::new(Mutex::new(current_termios)); ClientOsInputOutput { orig_termios, - server_sender: Arc::new(Mutex::new(None)), - receiver: Arc::new(Mutex::new(None)), + send_instructions_to_server: Arc::new(Mutex::new(None)), + receive_instructions_from_server: Arc::new(Mutex::new(None)), } } diff --git a/src/server/mod.rs b/src/server/mod.rs index bcfbd091..c1f93d5b 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -78,32 +78,34 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo send_server_instructions.clone(), ); #[cfg(not(test))] - let _ = thread::Builder::new().name("listener".to_string()).spawn({ - let os_input = os_input.clone(); - let sessions = sessions.clone(); - let send_server_instructions = send_server_instructions.clone(); - move || { - drop(std::fs::remove_file(ZELLIJ_IPC_PIPE.clone())); - let listener = LocalSocketListener::bind(ZELLIJ_IPC_PIPE.clone()).unwrap(); - for stream in listener.incoming() { - match stream { - Ok(stream) => { - let mut os_input = os_input.clone(); - os_input.update_receiver(stream); - let sessions = sessions.clone(); - let send_server_instructions = send_server_instructions.clone(); - handle_client(sessions, os_input, send_server_instructions); - } - Err(err) => { - panic!("err {:?}", err); + let _ = thread::Builder::new() + .name("server_listener".to_string()) + .spawn({ + let os_input = os_input.clone(); + let sessions = sessions.clone(); + let send_server_instructions = send_server_instructions.clone(); + move || { + drop(std::fs::remove_file(ZELLIJ_IPC_PIPE.clone())); + let listener = LocalSocketListener::bind(ZELLIJ_IPC_PIPE.clone()).unwrap(); + for stream in listener.incoming() { + match stream { + Ok(stream) => { + let mut os_input = os_input.clone(); + os_input.update_receiver(stream); + let sessions = sessions.clone(); + let send_server_instructions = send_server_instructions.clone(); + handle_client(sessions, os_input, send_server_instructions); + } + Err(err) => { + panic!("err {:?}", err); + } } } } - } - }); + }); thread::Builder::new() - .name("ipc_server".to_string()) + .name("server_thread".to_string()) .spawn({ move || loop { let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap(); @@ -151,9 +153,9 @@ fn handle_client( send_server_instructions: SenderWithContext, ) { thread::Builder::new() - .name("router".to_string()) + .name("server_router".to_string()) .spawn(move || loop { - let (instruction, mut err_ctx) = os_input.server_recv(); + let (instruction, mut err_ctx) = os_input.recv_from_client(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); let rlocked_sessions = sessions.read().unwrap(); match instruction { diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 99bd008a..bc18d6fd 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -75,10 +75,10 @@ pub struct FakeInputOutput { win_sizes: Arc>>, possible_tty_inputs: HashMap, last_snapshot_time: Arc>, - client_sender: SenderWithContext, - client_receiver: Arc>>, - server_sender: SenderWithContext, - server_receiver: Arc>>, + send_instructions_to_client: SenderWithContext, + receive_instructions_from_server: Arc>>, + send_instructions_to_server: SenderWithContext, + receive_instructions_from_client: Arc>>, should_trigger_sigwinch: Arc<(Mutex, Condvar)>, sigwinch_event: Option, } @@ -90,10 +90,10 @@ impl FakeInputOutput { let stdout_writer = FakeStdoutWriter::new(last_snapshot_time.clone()); let (client_sender, client_receiver): ChannelWithContext = mpsc::channel(); - let client_sender = SenderWithContext::new(SenderType::Sender(client_sender)); + let send_instructions_to_client = SenderWithContext::new(SenderType::Sender(client_sender)); let (server_sender, server_receiver): ChannelWithContext = mpsc::channel(); - let server_sender = SenderWithContext::new(SenderType::Sender(server_sender)); + let send_instructions_to_server = SenderWithContext::new(SenderType::Sender(server_sender)); win_sizes.insert(0, winsize); // 0 is the current terminal FakeInputOutput { @@ -106,10 +106,10 @@ impl FakeInputOutput { io_events: Arc::new(Mutex::new(vec![])), win_sizes: Arc::new(Mutex::new(win_sizes)), possible_tty_inputs: get_possible_tty_inputs(), - server_receiver: Arc::new(Mutex::new(server_receiver)), - server_sender, - client_receiver: Arc::new(Mutex::new(client_receiver)), - client_sender, + receive_instructions_from_client: Arc::new(Mutex::new(server_receiver)), + send_instructions_to_server, + receive_instructions_from_server: Arc::new(Mutex::new(client_receiver)), + send_instructions_to_client, should_trigger_sigwinch: Arc::new((Mutex::new(false), Condvar::new())), sigwinch_event: None, } @@ -195,10 +195,14 @@ impl ClientOsApi for FakeInputOutput { Box::new(self.stdout_writer.clone()) } fn send_to_server(&self, msg: ServerInstruction) { - self.server_sender.send(msg).unwrap(); + self.send_instructions_to_server.send(msg).unwrap(); } - fn client_recv(&self) -> (ClientInstruction, ErrorContext) { - self.client_receiver.lock().unwrap().recv().unwrap() + fn recv_from_server(&self) -> (ClientInstruction, ErrorContext) { + self.receive_instructions_from_server + .lock() + .unwrap() + .recv() + .unwrap() } fn receive_sigwinch(&self, cb: Box) { if self.sigwinch_event.is_some() { @@ -273,11 +277,15 @@ impl ServerOsApi for FakeInputOutput { self.io_events.lock().unwrap().push(IoEvent::Kill(fd)); Ok(()) } - fn server_recv(&self) -> (ServerInstruction, ErrorContext) { - self.server_receiver.lock().unwrap().recv().unwrap() + fn recv_from_client(&self) -> (ServerInstruction, ErrorContext) { + self.receive_instructions_from_client + .lock() + .unwrap() + .recv() + .unwrap() } fn send_to_client(&self, msg: ClientInstruction) { - self.client_sender.send(msg).unwrap(); + self.send_instructions_to_client.send(msg).unwrap(); } fn add_client_sender(&mut self) {} fn update_receiver(&mut self, _stream: LocalSocketStream) {} From ea552d71e4b1d4a72d30f4481079cb0e30b0fc58 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Mon, 3 May 2021 17:23:32 +0530 Subject: [PATCH 59/64] Introduce IpcReceiverWIthContext and move ipc stuff to common/ipc.rs Fall back to /tmp/zellij-{uid} directory if runtime_dir is not available. Use serialize_into() to avoid Vec allocation. And some cleanup --- src/common/ipc.rs | 72 +++++++++++++++++++++++++++ src/common/mod.rs | 15 ------ src/common/os_input_output.rs | 94 +++++++++++------------------------ src/common/utils/consts.rs | 20 ++++++++ src/server/mod.rs | 2 +- 5 files changed, 121 insertions(+), 82 deletions(-) diff --git a/src/common/ipc.rs b/src/common/ipc.rs index 68aa676b..190680dc 100644 --- a/src/common/ipc.rs +++ b/src/common/ipc.rs @@ -1,7 +1,13 @@ //! IPC stuff for starting to split things into a client and server model. +use crate::common::errors::{get_current_ctx, ErrorContext}; +use interprocess::local_socket::LocalSocketStream; +use nix::unistd::dup; use serde::{Deserialize, Serialize}; use std::collections::HashSet; +use std::io::{self, Write}; +use std::marker::PhantomData; +use std::os::unix::io::{AsRawFd, FromRawFd}; type SessionId = u64; @@ -45,3 +51,69 @@ pub enum _ServerToClientMsg { // A list of sessions SessionList(HashSet), } + +/// Sends messages on a stream socket, along with an [`ErrorContext`]. +pub struct IpcSenderWithContext { + sender: io::BufWriter, + _phantom: PhantomData, +} + +impl IpcSenderWithContext { + /// Returns a sender to the given [LocalSocketStream](interprocess::local_socket::LocalSocketStream). + pub fn new(sender: LocalSocketStream) -> Self { + Self { + sender: io::BufWriter::new(sender), + _phantom: PhantomData, + } + } + + /// Sends an event, along with the current [`ErrorContext`], on this [`IpcSenderWithContext`]'s socket. + pub fn send(&mut self, msg: T) { + let err_ctx = get_current_ctx(); + bincode::serialize_into(&mut self.sender, &(msg, err_ctx)).unwrap(); + self.sender.flush().unwrap(); + } + + /// Returns an [`IpcReceiverWithContext`] with the same socket as this sender. + pub fn get_receiver(&self) -> IpcReceiverWithContext + where + F: for<'de> Deserialize<'de> + Serialize, + { + let sock_fd = self.sender.get_ref().as_raw_fd(); + let dup_sock = dup(sock_fd).unwrap(); + let socket = unsafe { LocalSocketStream::from_raw_fd(dup_sock) }; + IpcReceiverWithContext::new(socket) + } +} + +/// Receives messages on a stream socket, along with an [`ErrorContext`]. +pub struct IpcReceiverWithContext { + receiver: io::BufReader, + _phantom: PhantomData, +} + +impl IpcReceiverWithContext +where + T: for<'de> Deserialize<'de> + Serialize, +{ + /// Returns a receiver to the given [LocalSocketStream](interprocess::local_socket::LocalSocketStream). + pub fn new(receiver: LocalSocketStream) -> Self { + Self { + receiver: io::BufReader::new(receiver), + _phantom: PhantomData, + } + } + + /// Receives an event, along with the current [`ErrorContext`], on this [`IpcReceiverWithContext`]'s socket. + pub fn recv(&mut self) -> (T, ErrorContext) { + bincode::deserialize_from(&mut self.receiver).unwrap() + } + + /// Returns an [`IpcSenderWithContext`] with the same socket as this receiver. + pub fn get_sender(&self) -> IpcSenderWithContext { + let sock_fd = self.receiver.get_ref().as_raw_fd(); + let dup_sock = dup(sock_fd).unwrap(); + let socket = unsafe { LocalSocketStream::from_raw_fd(dup_sock) }; + IpcSenderWithContext::new(socket) + } +} diff --git a/src/common/mod.rs b/src/common/mod.rs index bf4c3ae6..6061f1a6 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -12,11 +12,8 @@ pub mod wasm_vm; use crate::panes::PaneId; use crate::server::ServerInstruction; use async_std::task_local; -use directories_next::ProjectDirs; use errors::{get_current_ctx, ErrorContext}; -use lazy_static::lazy_static; use std::cell::RefCell; -use std::path::PathBuf; use std::sync::mpsc; /// An [MPSC](mpsc) asynchronous channel with added error context. @@ -76,15 +73,3 @@ task_local! { /// stack in the form of an [`ErrorContext`]. static ASYNCOPENCALLS: RefCell = RefCell::default() } - -lazy_static! { - pub static ref ZELLIJ_IPC_PIPE: PathBuf = { - let project_dir = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); - let ipc_dir = project_dir - .runtime_dir() - .unwrap_or_else(|| project_dir.cache_dir()); - std::fs::create_dir_all(ipc_dir).unwrap(); - let session_name = names::Generator::default().next().unwrap(); - ipc_dir.join(session_name) - }; -} diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 9a124011..a339b08d 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -5,20 +5,21 @@ use nix::sys::signal::{kill, Signal}; use nix::sys::termios; use nix::sys::wait::waitpid; use nix::unistd::{self, ForkResult, Pid}; -use serde::Serialize; use signal_hook::{consts::signal::*, iterator::Signals}; use std::env; use std::io; use std::io::prelude::*; -use std::marker::PhantomData; -use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; +use std::os::unix::io::RawFd; use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; use crate::client::ClientInstruction; -use crate::common::ZELLIJ_IPC_PIPE; -use crate::errors::{get_current_ctx, ErrorContext}; +use crate::common::{ + ipc::{IpcReceiverWithContext, IpcSenderWithContext}, + utils::consts::ZELLIJ_IPC_PIPE, +}; +use crate::errors::ErrorContext; use crate::panes::PositionAndSize; use crate::server::ServerInstruction; @@ -158,35 +159,10 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) (pid_primary, pid_secondary) } -/// Sends messages on an [ipmpsc](ipmpsc) channel, along with an [`ErrorContext`]. -struct IpcSenderWithContext { - sender: io::BufWriter, - _phantom: PhantomData, -} - -impl IpcSenderWithContext { - /// Returns a sender to the given [SharedRingBuffer](ipmpsc::SharedRingBuffer). - fn new(sender: LocalSocketStream) -> Self { - Self { - sender: io::BufWriter::new(sender), - _phantom: PhantomData, - } - } - - /// Sends an event, along with the current [`ErrorContext`], on this - /// [`IpcSenderWithContext`]'s channel. - fn send(&mut self, msg: T) -> Result<(), std::io::Error> { - let err_ctx = get_current_ctx(); - self.sender - .write_all(&bincode::serialize(&(msg, err_ctx)).unwrap())?; - self.sender.flush() - } -} - #[derive(Clone)] pub struct ServerOsInputOutput { orig_termios: Arc>, - receive_instructions_from_client: Option>>>, + receive_instructions_from_client: Option>>>, send_instructions_to_client: Arc>>>, } @@ -252,15 +228,12 @@ impl ServerOsApi for ServerOsInputOutput { Ok(()) } fn recv_from_client(&self) -> (ServerInstruction, ErrorContext) { - bincode::deserialize_from( - &mut *self - .receive_instructions_from_client - .as_ref() - .unwrap() - .lock() - .unwrap(), - ) - .unwrap() + self.receive_instructions_from_client + .as_ref() + .unwrap() + .lock() + .unwrap() + .recv() } fn send_to_client(&self, msg: ClientInstruction) { self.send_instructions_to_client @@ -268,27 +241,22 @@ impl ServerOsApi for ServerOsInputOutput { .unwrap() .as_mut() .unwrap() - .send(msg) - .unwrap(); + .send(msg); } fn add_client_sender(&mut self) { assert!(self.send_instructions_to_client.lock().unwrap().is_none()); - let sock_fd = self + let sender = self .receive_instructions_from_client .as_ref() .unwrap() .lock() .unwrap() - .get_ref() - .as_raw_fd(); - let dup_fd = unistd::dup(sock_fd).unwrap(); - let dup_sock = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; - *self.send_instructions_to_client.lock().unwrap() = - Some(IpcSenderWithContext::new(dup_sock)); + .get_sender(); + *self.send_instructions_to_client.lock().unwrap() = Some(sender); } fn update_receiver(&mut self, stream: LocalSocketStream) { self.receive_instructions_from_client = - Some(Arc::new(Mutex::new(io::BufReader::new(stream)))); + Some(Arc::new(Mutex::new(IpcReceiverWithContext::new(stream)))); } } @@ -312,7 +280,7 @@ pub fn get_server_os_input() -> ServerOsInputOutput { pub struct ClientOsInputOutput { orig_termios: Arc>, send_instructions_to_server: Arc>>>, - receive_instructions_from_server: Arc>>>, + receive_instructions_from_server: Arc>>>, } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -375,19 +343,15 @@ impl ClientOsApi for ClientOsInputOutput { .unwrap() .as_mut() .unwrap() - .send(msg) - .unwrap(); + .send(msg); } fn recv_from_server(&self) -> (ClientInstruction, ErrorContext) { - bincode::deserialize_from( - &mut self - .receive_instructions_from_server - .lock() - .unwrap() - .as_mut() - .unwrap(), - ) - .unwrap() + self.receive_instructions_from_server + .lock() + .unwrap() + .as_mut() + .unwrap() + .recv() } fn receive_sigwinch(&self, cb: Box) { let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); @@ -411,12 +375,10 @@ impl ClientOsApi for ClientOsInputOutput { LocalSocketStream::connect(ZELLIJ_IPC_PIPE.clone()).unwrap() } }; - let sock_fd = socket.as_raw_fd(); - let dup_fd = unistd::dup(sock_fd).unwrap(); - let receiver = unsafe { LocalSocketStream::from_raw_fd(dup_fd) }; let sender = IpcSenderWithContext::new(socket); + let receiver = sender.get_receiver(); *self.send_instructions_to_server.lock().unwrap() = Some(sender); - *self.receive_instructions_from_server.lock().unwrap() = Some(io::BufReader::new(receiver)); + *self.receive_instructions_from_server.lock().unwrap() = Some(receiver); } } diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index f031dd38..c21e3029 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -1,5 +1,25 @@ //! Zellij program-wide constants. +use directories_next::ProjectDirs; +use lazy_static::lazy_static; +use nix::unistd::Uid; +use std::path::PathBuf; + pub const ZELLIJ_TMP_DIR: &str = "/tmp/zellij"; pub const ZELLIJ_TMP_LOG_DIR: &str = "/tmp/zellij/zellij-log"; pub const ZELLIJ_TMP_LOG_FILE: &str = "/tmp/zellij/zellij-log/log.txt"; + +lazy_static! { + static ref UID: Uid = Uid::current(); + pub static ref SESSION_NAME: String = names::Generator::default().next().unwrap(); + pub static ref ZELLIJ_IPC_PIPE: PathBuf = { + let project_dir = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); + let mut ipc_dir = project_dir + .runtime_dir() + .map(|p| p.to_owned()) + .unwrap_or_else(|| PathBuf::from("/tmp/zellij-".to_string() + &format!("{}", *UID))); + std::fs::create_dir_all(&ipc_dir).unwrap(); + ipc_dir.push(&*SESSION_NAME); + ipc_dir + }; +} diff --git a/src/server/mod.rs b/src/server/mod.rs index c1f93d5b..25a95222 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -16,7 +16,6 @@ use zellij_tile::data::{Event, EventType, ModeInfo}; use crate::cli::CliArgs; use crate::client::ClientInstruction; -use crate::common::ZELLIJ_IPC_PIPE; use crate::common::{ errors::{ContextType, PluginContext, PtyContext, ScreenContext, ServerContext}, input::actions::{Action, Direction}, @@ -24,6 +23,7 @@ use crate::common::{ os_input_output::ServerOsApi, pty_bus::{PtyBus, PtyInstruction}, screen::{Screen, ScreenInstruction}, + utils::consts::ZELLIJ_IPC_PIPE, wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginEnv, PluginInstruction}, ChannelWithContext, SenderType, SenderWithContext, }; From d33106431dd22759b133a838337427a388f6008f Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 4 May 2021 01:13:16 +0530 Subject: [PATCH 60/64] Fix after rebase --- Cargo.lock | 51 ++++++-- Cargo.toml | 5 +- src/cli.rs | 5 +- src/client/mod.rs | 14 +-- src/client/tab.rs | 14 ++- src/common/input/handler.rs | 7 +- src/common/os_input_output.rs | 66 ++++++++-- src/common/pty_bus.rs | 7 +- src/common/screen.rs | 5 +- src/common/utils/consts.rs | 11 +- src/common/wasm_vm.rs | 11 +- src/main.rs | 82 ++++++------- src/server/mod.rs | 115 +++++++++++++----- src/tests/fakes.rs | 37 ++++++ src/tests/integration/basic.rs | 84 +++++++++++++ src/tests/integration/close_pane.rs | 13 ++ src/tests/integration/compatibility.rs | 20 +++ src/tests/integration/layouts.rs | 1 + src/tests/integration/move_focus_down.rs | 2 + src/tests/integration/move_focus_left.rs | 2 + src/tests/integration/move_focus_right.rs | 2 + src/tests/integration/move_focus_up.rs | 2 + src/tests/integration/resize_down.rs | 13 ++ src/tests/integration/resize_left.rs | 13 ++ src/tests/integration/resize_right.rs | 13 ++ src/tests/integration/resize_up.rs | 13 ++ src/tests/integration/tabs.rs | 8 ++ .../integration/terminal_window_resize.rs | 4 + src/tests/integration/toggle_fullscreen.rs | 2 + 29 files changed, 489 insertions(+), 133 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c71bef9d..fe7883f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -310,6 +310,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "colors-transform" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9226dbc05df4fb986f48d730b001532580883c4c06c5d1c213f4b34c1c157178" + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -1040,16 +1046,6 @@ dependencies = [ "rand 0.3.23", ] -[[package]] -name = "nb-connect" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19900e7eee95eb2b3c2e26d12a874cc80aaf750e31be6fcbe743ead369fa45d" -dependencies = [ - "libc", - "socket2", -] - [[package]] name = "nix" version = "0.19.1" @@ -1131,6 +1127,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" + [[package]] name = "polling" version = "2.0.3" @@ -1334,9 +1336,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +checksum = "8270314b5ccceb518e7e578952f0b72b88222d02e8f77f5ecf7abbb673539041" dependencies = [ "bitflags", ] @@ -2247,6 +2249,27 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" +[[package]] +name = "x11" +version = "2.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ecd092546cb16f25783a5451538e73afc8d32e242648d54f4ae5459ba1e773" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "xrdb" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2dd91a21c92e87678e22f95956a03bfd314ce3232f39dbedd49dddb50f0c6d" +dependencies = [ + "libc", + "scopeguard", + "x11", +] + [[package]] name = "yaml-rust" version = "0.4.5" @@ -2264,6 +2287,7 @@ dependencies = [ "async-std", "backtrace", "bincode", + "colors-transform", "directories-next", "futures", "insta", @@ -2288,6 +2312,9 @@ dependencies = [ "vte 0.8.0", "wasmer", "wasmer-wasi", + "xrdb", + "zellij-tile", + "zellij-tile-extra", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8b8ccc17..3b3064c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,10 @@ wasmer = "1.0.0" wasmer-wasi = "1.0.0" interprocess = "1.1.1" names = "0.11.0" -zellij-tile = { path = "zellij-tile/", version = "0.5.0" } +xrdb = "0.1.1" +colors-transform = "0.2.5" +zellij-tile = { path = "zellij-tile/", version = "1.1.0" } +zellij-tile-extra = { path = "zellij-tile-extra/", version="1.0.0" } [dependencies.async-std] version = "1.3.0" diff --git a/src/cli.rs b/src/cli.rs index 9f2bfd36..91b0ed39 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,8 +1,9 @@ use super::common::utils::consts::{ZELLIJ_CONFIG_DIR_ENV, ZELLIJ_CONFIG_FILE_ENV}; +use serde::{Deserialize, Serialize}; use std::path::PathBuf; use structopt::StructOpt; -#[derive(StructOpt, Default, Debug, Clone)] +#[derive(StructOpt, Default, Debug, Clone, Serialize, Deserialize)] #[structopt(name = "zellij")] pub struct CliArgs { /// Maximum panes on screen, caution: opening more panes will close old ones @@ -32,7 +33,7 @@ pub struct CliArgs { pub debug: bool, } -#[derive(Debug, StructOpt, Clone)] +#[derive(Debug, StructOpt, Clone, Serialize, Deserialize)] pub enum ConfigCli { /// Change the behaviour of zellij #[structopt(name = "option")] diff --git a/src/client/mod.rs b/src/client/mod.rs index 2bf814c2..8a5834f0 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -29,31 +29,25 @@ pub enum ClientInstruction { Exit, } -pub fn start_client(mut os_input: Box, opts: CliArgs) { +pub fn start_client(mut os_input: Box, opts: CliArgs, config: Config) { let take_snapshot = "\u{1b}[?1049h"; os_input.unset_raw_mode(0); let _ = os_input .get_stdout_writer() .write(take_snapshot.as_bytes()) .unwrap(); - - let config = Config::from_cli_config(opts.config) - .map_err(|e| { - eprintln!("There was an error in the config file:\n{}", e); - std::process::exit(1); - }) - .unwrap(); + std::env::set_var(&"ZELLIJ", "0"); let mut command_is_executing = CommandIsExecuting::new(); let full_screen_ws = os_input.get_terminal_size_using_fd(0); os_input.connect_to_server(); - os_input.send_to_server(ServerInstruction::NewClient(full_screen_ws)); + os_input.send_to_server(ServerInstruction::NewClient(full_screen_ws, opts)); os_input.set_raw_mode(0); let (send_client_instructions, receive_client_instructions): SyncChannelWithContext< ClientInstruction, - > = mpsc::sync_channel(500); + > = mpsc::sync_channel(50); let send_client_instructions = SenderWithContext::new(SenderType::SyncSender(send_client_instructions)); diff --git a/src/client/tab.rs b/src/client/tab.rs index 36d03e87..0098d78b 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -1,7 +1,6 @@ //! `Tab`s holds multiple panes. It tracks their coordinates (x/y) and size, //! as well as how they should be resized -use crate::boundaries::colors; use crate::client::pane_resizer::PaneResizer; use crate::common::{input::handler::parse_keys, SenderWithContext}; use crate::layout::Layout; @@ -15,11 +14,12 @@ use crate::{boundaries::Boundaries, panes::PluginPane}; use serde::{Deserialize, Serialize}; use std::os::unix::io::RawFd; use std::sync::mpsc::channel; +use std::time::Instant; use std::{ cmp::Reverse, collections::{BTreeMap, HashSet}, }; -use zellij_tile::data::{Event, ModeInfo}; +use zellij_tile::data::{Event, InputMode, ModeInfo, Palette}; const CURSOR_HEIGHT_WIDTH_RATIO: usize = 4; // this is not accurate and kind of a magic number, TODO: look into this @@ -72,7 +72,7 @@ pub struct Tab { send_plugin_instructions: SenderWithContext, send_pty_instructions: SenderWithContext, send_server_instructions: SenderWithContext, - expansion_boundary: Option, + synchronize_is_active: bool, should_clear_display_before_rendering: bool, pub mode_info: ModeInfo, pub input_mode: InputMode, @@ -264,7 +264,6 @@ impl Tab { send_plugin_instructions, send_pty_instructions, send_server_instructions, - expansion_boundary: None, should_clear_display_before_rendering: false, mode_info, input_mode, @@ -492,6 +491,7 @@ impl Tab { y: active_pane.y(), rows: active_pane.rows(), columns: active_pane.columns(), + ..Default::default() }; let (top_winsize, bottom_winsize) = split_horizontally_with_gap(&terminal_ws); @@ -548,6 +548,7 @@ impl Tab { y: active_pane.y(), rows: active_pane.rows(), columns: active_pane.columns(), + ..Default::default() }; let (left_winsize, right_winsize) = split_vertically_with_gap(&terminal_ws); @@ -724,6 +725,11 @@ impl Tab { // in that case, we should not render as the app is exiting return; } + // if any pane contain widechar, all pane in the same row will messup. We should render them every time + // FIXME: remove this when we can handle widechars correctly + if self.panes_contain_widechar() { + self.set_force_render() + } let mut output = String::new(); let mut boundaries = Boundaries::new( self.full_screen_ws.columns as u16, diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 7a4a4e52..75f9f8b1 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -11,7 +11,7 @@ use crate::server::ServerInstruction; use crate::CommandIsExecuting; use termion::input::{TermRead, TermReadEventsAndRaw}; -use zellij_tile::data::{InputMode, Key, ModeInfo}; +use zellij_tile::data::{InputMode, Key, ModeInfo, Palette}; /// Handles the dispatching of [`Action`]s according to the current /// [`InputMode`], and keep tracks of the current [`InputMode`]. @@ -48,7 +48,6 @@ impl InputHandler { fn handle_input(&mut self) { let mut err_ctx = OPENCALLS.with(|ctx| *ctx.borrow()); err_ctx.add_call(ContextType::StdinHandler); - let keybinds = self.config.keybinds.clone(); let alt_left_bracket = vec![27, 91]; loop { if self.should_exit { @@ -60,14 +59,14 @@ impl InputHandler { Ok((event, raw_bytes)) => match event { termion::event::Event::Key(key) => { let key = cast_termion_key(key); - self.handle_key(&key, raw_bytes, &keybinds); + self.handle_key(&key, raw_bytes); } termion::event::Event::Unsupported(unsupported_key) => { // we have to do this because of a bug in termion // this should be a key event and not an unsupported event if unsupported_key == alt_left_bracket { let key = Key::Alt('['); - self.handle_key(&key, raw_bytes, &keybinds); + self.handle_key(&key, raw_bytes); } } termion::event::Event::Mouse(_) => { diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index a339b08d..7bf39757 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -1,3 +1,12 @@ +use crate::client::ClientInstruction; +use crate::common::{ + ipc::{IpcReceiverWithContext, IpcSenderWithContext}, + utils::consts::ZELLIJ_IPC_PIPE, +}; +use crate::errors::ErrorContext; +use crate::panes::PositionAndSize; +use crate::server::ServerInstruction; +use crate::utils::shared::{default_palette, detect_theme, hex_to_rgb}; use interprocess::local_socket::LocalSocketStream; use nix::fcntl::{fcntl, FcntlArg, OFlag}; use nix::pty::{forkpty, Winsize}; @@ -13,15 +22,8 @@ use std::os::unix::io::RawFd; use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; - -use crate::client::ClientInstruction; -use crate::common::{ - ipc::{IpcReceiverWithContext, IpcSenderWithContext}, - utils::consts::ZELLIJ_IPC_PIPE, -}; -use crate::errors::ErrorContext; -use crate::panes::PositionAndSize; -use crate::server::ServerInstruction; +use xrdb::Colors; +use zellij_tile::data::{Palette, PaletteSource}; fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); @@ -194,6 +196,7 @@ pub trait ServerOsApi: Send + Sync { fn add_client_sender(&mut self); /// Update the receiver socket for the client fn update_receiver(&mut self, stream: LocalSocketStream); + fn load_palette(&self) -> Palette; } impl ServerOsApi for ServerOsInputOutput { @@ -258,6 +261,51 @@ impl ServerOsApi for ServerOsInputOutput { self.receive_instructions_from_client = Some(Arc::new(Mutex::new(IpcReceiverWithContext::new(stream)))); } + fn load_palette(&self) -> Palette { + let palette = match Colors::new("xresources") { + Some(palette) => { + let fg = if let Some(foreground) = palette.fg.as_deref().map(hex_to_rgb) { + foreground + } else { + return default_palette(); + }; + + let bg = if let Some(background) = palette.bg.as_deref().map(hex_to_rgb) { + background + } else { + return default_palette(); + }; + + // NOTE: `16` is the same as the length of `palette.colors`. + let mut colors: [(u8, u8, u8); 16] = [(0, 0, 0); 16]; + for (idx, color) in palette.colors.iter().enumerate() { + if let Some(c) = color { + colors[idx] = hex_to_rgb(c); + } else { + return default_palette(); + } + } + let theme = detect_theme(bg); + Palette { + source: PaletteSource::Xresources, + theme, + fg, + bg, + black: colors[0], + red: colors[1], + green: colors[2], + yellow: colors[3], + blue: colors[4], + magenta: colors[5], + cyan: colors[6], + white: colors[7], + orange: colors[9], + } + } + None => default_palette(), + }; + palette + } } impl Clone for Box { diff --git a/src/common/pty_bus.rs b/src/common/pty_bus.rs index 10be6d52..31696186 100644 --- a/src/common/pty_bus.rs +++ b/src/common/pty_bus.rs @@ -165,9 +165,9 @@ fn stream_terminal_bytes( impl PtyBus { pub fn new( receive_pty_instructions: Receiver<(PtyInstruction, ErrorContext)>, - os_input: Box, send_screen_instructions: SenderWithContext, send_plugin_instructions: SenderWithContext, + os_input: Box, debug_to_file: bool, ) -> Self { PtyBus { @@ -193,8 +193,7 @@ impl PtyBus { self.id_to_child_pid.insert(pid_primary, pid_secondary); pid_primary } - pub fn spawn_terminals_for_layout(&mut self, layout_path: PathBuf) { - let layout = Layout::new(layout_path.clone()); + pub fn spawn_terminals_for_layout(&mut self, layout: Layout) { let total_panes = layout.total_terminal_panes(); let mut new_pane_pids = vec![]; for _ in 0..total_panes { @@ -204,7 +203,7 @@ impl PtyBus { } self.send_screen_instructions .send(ScreenInstruction::ApplyLayout( - layout_path, + layout, new_pane_pids.clone(), )) .unwrap(); diff --git a/src/common/screen.rs b/src/common/screen.rs index c30cf251..c5e4f9a5 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -2,7 +2,6 @@ use std::collections::BTreeMap; use std::os::unix::io::RawFd; -use std::path::PathBuf; use std::str; use std::sync::mpsc::Receiver; @@ -49,7 +48,7 @@ pub enum ScreenInstruction { SetMaxHeight(PaneId, usize), SetInvisibleBorders(PaneId, bool), ClosePane(PaneId), - ApplyLayout(PathBuf, Vec), + ApplyLayout(Layout, Vec), NewTab(RawFd), SwitchTabNext, SwitchTabPrev, @@ -83,6 +82,8 @@ pub struct Screen { /// The [`ClientOsApi`] this [`Screen`] uses. os_api: Box, mode_info: ModeInfo, + input_mode: InputMode, + colors: Palette, } impl Screen { diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index c21e3029..3a783914 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -9,12 +9,19 @@ pub const ZELLIJ_TMP_DIR: &str = "/tmp/zellij"; pub const ZELLIJ_TMP_LOG_DIR: &str = "/tmp/zellij/zellij-log"; pub const ZELLIJ_TMP_LOG_FILE: &str = "/tmp/zellij/zellij-log/log.txt"; +pub const ZELLIJ_CONFIG_FILE_ENV: &str = "ZELLIJ_CONFIG_FILE"; +pub const ZELLIJ_CONFIG_DIR_ENV: &str = "ZELLIJ_CONFIG_DIR"; + +// TODO: ${PREFIX} argument in makefile +pub const SYSTEM_DEFAULT_CONFIG_DIR: &str = "/etc/zellij"; + lazy_static! { static ref UID: Uid = Uid::current(); pub static ref SESSION_NAME: String = names::Generator::default().next().unwrap(); + pub static ref ZELLIJ_PROJ_DIR: ProjectDirs = + ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); pub static ref ZELLIJ_IPC_PIPE: PathBuf = { - let project_dir = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); - let mut ipc_dir = project_dir + let mut ipc_dir = ZELLIJ_PROJ_DIR .runtime_dir() .map(|p| p.to_owned()) .unwrap_or_else(|| PathBuf::from("/tmp/zellij-".to_string() + &format!("{}", *UID))); diff --git a/src/common/wasm_vm.rs b/src/common/wasm_vm.rs index 5c234403..db52c2bb 100644 --- a/src/common/wasm_vm.rs +++ b/src/common/wasm_vm.rs @@ -27,7 +27,8 @@ pub struct PluginEnv { pub plugin_id: u32, // FIXME: This should be a big bundle of all of the channels pub send_screen_instructions: SenderWithContext, - pub send_pty_instructions: SenderWithContext, // FIXME: This should be a big bundle of all of the channels + pub send_pty_instructions: SenderWithContext, + pub send_plugin_instructions: SenderWithContext, pub wasi_env: WasiEnv, pub subscriptions: Arc>>, } @@ -70,14 +71,6 @@ fn host_unsubscribe(plugin_env: &PluginEnv) { subscriptions.retain(|k| !old.contains(k)); } -fn host_open_file(plugin_env: &PluginEnv) { - let path = PathBuf::from(wasi_stdout(&plugin_env.wasi_env).lines().next().unwrap()); - plugin_env - .send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(path))) - .unwrap(); -} - fn host_set_selectable(plugin_env: &PluginEnv, selectable: i32) { let selectable = selectable != 0; plugin_env diff --git a/src/main.rs b/src/main.rs index e6edfdfd..6ee344bc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,69 +2,67 @@ mod cli; mod client; mod common; mod server; +#[cfg(test)] +mod tests; use client::{boundaries, layout, panes, start_client, tab}; -use common::{command_is_executing, errors, os_input_output, pty_bus, screen, utils, wasm_vm}; -use directories_next::ProjectDirs; +use common::{ + command_is_executing, errors, os_input_output, pty_bus, screen, setup, utils, wasm_vm, +}; use server::start_server; - use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; +use crate::common::input::config::Config; use crate::os_input_output::{get_client_os_input, get_server_os_input, ClientOsApi, ServerOsApi}; use crate::utils::{ consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, logging::*, }; -use client::{boundaries, layout, panes, tab}; -use common::{ - command_is_executing, errors, os_input_output, pty_bus, screen, setup, start, utils, wasm_vm, - ApiCommand, -}; use std::convert::TryFrom; -use std::io::Write; -use std::os::unix::net::UnixStream; -use structopt::StructOpt; pub fn main() { - // First run installation of default plugins & layouts - let project_dirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); - let data_dir = project_dirs.data_dir(); - let mut assets = asset_map! { - "assets/layouts/default.yaml" => "layouts/default.yaml", - "assets/layouts/strider.yaml" => "layouts/strider.yaml", - }; - assets.extend(asset_map! { - "assets/plugins/status-bar.wasm" => "plugins/status-bar.wasm", - "assets/plugins/tab-bar.wasm" => "plugins/tab-bar.wasm", - "assets/plugins/strider.wasm" => "plugins/strider.wasm", - }); - - for (path, bytes) in assets { - let path = data_dir.join(path); - std::fs::create_dir_all(path.parent().unwrap()).unwrap(); - if !path.exists() { - std::fs::write(path, bytes).expect("Failed to install default assets!"); - } - } - let opts = CliArgs::from_args(); - atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); - atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); - let server_os_input = get_server_os_input(); - let os_input = get_client_os_input(); - start(Box::new(os_input), opts, Box::new(server_os_input)); + let config = match Config::try_from(&opts) { + Ok(config) => config, + Err(e) => { + eprintln!("There was an error in the config file:\n{}", e); + std::process::exit(1); + } + }; + if let Some(crate::cli::ConfigCli::GenerateCompletion { shell }) = opts.option { + let shell = match shell.as_ref() { + "bash" => structopt::clap::Shell::Bash, + "fish" => structopt::clap::Shell::Fish, + "zsh" => structopt::clap::Shell::Zsh, + "powerShell" => structopt::clap::Shell::PowerShell, + "elvish" => structopt::clap::Shell::Elvish, + other => { + eprintln!("Unsupported shell: {}", other); + std::process::exit(1); + } + }; + let mut out = std::io::stdout(); + CliArgs::clap().gen_completions_to("zellij", shell, &mut out); + } else if let Some(crate::cli::ConfigCli::Setup { .. }) = opts.option { + setup::dump_default_config().expect("Failed to print to stdout"); + std::process::exit(1); + } else { + atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); + atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); + let server_os_input = get_server_os_input(); + let os_input = get_client_os_input(); + start(Box::new(os_input), opts, Box::new(server_os_input), config); + } } - -/// Start Zellij with the specified [`ClientOsApi`], [`ServerOsApi`] and command-line arguments. -// FIXME this should definitely be modularized and split into different functions. pub fn start( client_os_input: Box, opts: CliArgs, server_os_input: Box, + config: Config, ) { - let ipc_thread = start_server(server_os_input, opts.clone()); - start_client(client_os_input, opts); + let ipc_thread = start_server(server_os_input); + start_client(client_os_input, opts, config); drop(ipc_thread.join()); } diff --git a/src/server/mod.rs b/src/server/mod.rs index 25a95222..27539c09 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,4 +1,3 @@ -use directories_next::ProjectDirs; use interprocess::local_socket::LocalSocketListener; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -12,7 +11,7 @@ use std::{ }; use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; -use zellij_tile::data::{Event, EventType, ModeInfo}; +use zellij_tile::data::{Event, EventType, InputMode, ModeInfo}; use crate::cli::CliArgs; use crate::client::ClientInstruction; @@ -23,8 +22,9 @@ use crate::common::{ os_input_output::ServerOsApi, pty_bus::{PtyBus, PtyInstruction}, screen::{Screen, ScreenInstruction}, - utils::consts::ZELLIJ_IPC_PIPE, - wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginEnv, PluginInstruction}, + setup::install::populate_data_dir, + utils::consts::{ZELLIJ_IPC_PIPE, ZELLIJ_PROJ_DIR}, + wasm_vm::{wasi_read_string, wasi_write_object, zellij_exports, PluginEnv, PluginInstruction}, ChannelWithContext, SenderType, SenderWithContext, }; use crate::layout::Layout; @@ -36,7 +36,7 @@ use crate::panes::PositionAndSize; #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ServerInstruction { TerminalResize(PositionAndSize), - NewClient(PositionAndSize), + NewClient(PositionAndSize, CliArgs), Action(Action), Render(Option), UnblockInputThread, @@ -63,7 +63,7 @@ impl Drop for SessionMetaData { } } -pub fn start_server(os_input: Box, opts: CliArgs) -> thread::JoinHandle<()> { +pub fn start_server(os_input: Box) -> thread::JoinHandle<()> { let (send_server_instructions, receive_server_instructions): ChannelWithContext< ServerInstruction, > = channel(); @@ -111,10 +111,10 @@ pub fn start_server(os_input: Box, opts: CliArgs) -> thread::Jo let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); match instruction { - ServerInstruction::NewClient(full_screen_ws) => { + ServerInstruction::NewClient(full_screen_ws, opts) => { let session_data = init_session( os_input.clone(), - opts.clone(), + opts, send_server_instructions.clone(), full_screen_ws, ); @@ -164,7 +164,7 @@ fn handle_client( break; } ServerInstruction::Action(action) => { - route_action(action, rlocked_sessions.as_ref().unwrap()); + route_action(action, rlocked_sessions.as_ref().unwrap(), &*os_input); } ServerInstruction::TerminalResize(new_size) => { rlocked_sessions @@ -174,7 +174,7 @@ fn handle_client( .send(ScreenInstruction::TerminalResize(new_size)) .unwrap(); } - ServerInstruction::NewClient(_) => { + ServerInstruction::NewClient(..) => { os_input.add_client_sender(); send_server_instructions.send(instruction).unwrap(); } @@ -207,18 +207,27 @@ fn init_session( channel(); let send_pty_instructions = SenderWithContext::new(SenderType::Sender(send_pty_instructions)); + // Determine and initialize the data directory + let data_dir = opts + .data_dir + .unwrap_or_else(|| ZELLIJ_PROJ_DIR.data_dir().to_path_buf()); + populate_data_dir(&data_dir); + // Don't use default layouts in tests, but do everywhere else #[cfg(not(test))] let default_layout = Some(PathBuf::from("default")); #[cfg(test)] let default_layout = None; - let maybe_layout = opts.layout.or(default_layout); + let maybe_layout = opts + .layout + .map(|p| Layout::new(&p, &data_dir)) + .or_else(|| default_layout.map(|p| Layout::from_defaults(&p, &data_dir))); let mut pty_bus = PtyBus::new( receive_pty_instructions, - os_input.clone(), send_screen_instructions.clone(), send_plugin_instructions.clone(), + os_input.clone(), opts.debug, ); @@ -293,6 +302,7 @@ fn init_session( let send_pty_instructions = send_pty_instructions.clone(); let send_server_instructions = send_server_instructions; let max_panes = opts.max_panes; + let colors = os_input.load_palette(); move || { let mut screen = Screen::new( @@ -303,7 +313,12 @@ fn init_session( &full_screen_ws, os_input, max_panes, - ModeInfo::default(), + ModeInfo { + palette: colors, + ..ModeInfo::default() + }, + InputMode::Normal, + colors, ); loop { let (event, mut err_ctx) = screen @@ -355,10 +370,11 @@ fn init_session( .unwrap(); } ScreenInstruction::WriteCharacter(bytes) => { - screen - .get_active_tab_mut() - .unwrap() - .write_to_active_terminal(bytes); + let active_tab = screen.get_active_tab_mut().unwrap(); + match active_tab.is_sync_panes_active() { + true => active_tab.write_to_terminals_on_current_tab(bytes), + false => active_tab.write_to_active_terminal(bytes), + } } ScreenInstruction::ResizeLeft => { screen.get_active_tab_mut().unwrap().resize_left(); @@ -405,6 +421,18 @@ fn init_session( .unwrap() .scroll_active_terminal_down(); } + ScreenInstruction::PageScrollUp => { + screen + .get_active_tab_mut() + .unwrap() + .scroll_active_terminal_up_page(); + } + ScreenInstruction::PageScrollDown => { + screen + .get_active_tab_mut() + .unwrap() + .scroll_active_terminal_down_page(); + } ScreenInstruction::ClearScroll => { screen .get_active_tab_mut() @@ -473,7 +501,7 @@ fn init_session( .unwrap(); } ScreenInstruction::ApplyLayout(layout, new_pane_pids) => { - screen.apply_layout(Layout::new(layout), new_pane_pids); + screen.apply_layout(layout, new_pane_pids); screen .send_server_instructions .send(ServerInstruction::UnblockInputThread) @@ -493,11 +521,18 @@ fn init_session( .send(ServerInstruction::UnblockInputThread) .unwrap(); } + ScreenInstruction::TerminalResize(new_size) => { + screen.resize_to_screen(new_size); + } ScreenInstruction::ChangeMode(mode_info) => { screen.change_mode(mode_info); } - ScreenInstruction::TerminalResize(new_size) => { - screen.resize_to_screen(new_size); + ScreenInstruction::ToggleActiveSyncPanes => { + screen + .get_active_tab_mut() + .unwrap() + .toggle_sync_panes_is_active(); + screen.update_tabs(); } ScreenInstruction::Exit => { break; @@ -513,6 +548,7 @@ fn init_session( .spawn({ let send_screen_instructions = send_screen_instructions.clone(); let send_pty_instructions = send_pty_instructions.clone(); + let send_plugin_instructions = send_plugin_instructions.clone(); let store = Store::default(); let mut plugin_id = 0; @@ -524,9 +560,7 @@ fn init_session( err_ctx.add_call(ContextType::Plugin(PluginContext::from(&event))); match event { PluginInstruction::Load(pid_tx, path) => { - let project_dirs = - ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); - let plugin_dir = project_dirs.data_dir().join("plugins/"); + let plugin_dir = data_dir.join("plugins/"); let wasm_bytes = fs::read(&path) .or_else(|_| fs::read(&path.with_extension("wasm"))) .or_else(|_| fs::read(&plugin_dir.join(&path).with_extension("wasm"))) @@ -558,11 +592,12 @@ fn init_session( plugin_id, send_screen_instructions: send_screen_instructions.clone(), send_pty_instructions: send_pty_instructions.clone(), + send_plugin_instructions: send_plugin_instructions.clone(), wasi_env, subscriptions: Arc::new(Mutex::new(HashSet::new())), }; - let zellij = zellij_imports(&store, &plugin_env); + let zellij = zellij_exports(&store, &plugin_env); let instance = Instance::new(&module, &zellij.chain_back(wasi)).unwrap(); let start = instance.exports.get_function("_start").unwrap(); @@ -581,10 +616,7 @@ fn init_session( let event_type = EventType::from_str(&event.to_string()).unwrap(); if (pid.is_none() || pid == Some(i)) && subs.contains(&event_type) { let update = instance.exports.get_function("update").unwrap(); - wasi_write_string( - &plugin_env.wasi_env, - &serde_json::to_string(&event).unwrap(), - ); + wasi_write_object(&plugin_env.wasi_env, &event); update.call(&[]).unwrap(); } } @@ -599,7 +631,7 @@ fn init_session( .call(&[Value::I32(rows as i32), Value::I32(cols as i32)]) .unwrap(); - buf_tx.send(wasi_stdout(&plugin_env.wasi_env)).unwrap(); + buf_tx.send(wasi_read_string(&plugin_env.wasi_env)).unwrap(); } PluginInstruction::Unload(pid) => drop(plugin_map.remove(&pid)), PluginInstruction::Exit => break, @@ -617,7 +649,7 @@ fn init_session( } } -fn route_action(action: Action, session: &SessionMetaData) { +fn route_action(action: Action, session: &SessionMetaData, os_input: &dyn ServerOsApi) { match action { Action::Write(val) => { session @@ -630,16 +662,17 @@ fn route_action(action: Action, session: &SessionMetaData) { .unwrap(); } Action::SwitchToMode(mode) => { + let palette = os_input.load_palette(); session .send_plugin_instructions .send(PluginInstruction::Update( None, - Event::ModeUpdate(get_mode_info(mode)), + Event::ModeUpdate(get_mode_info(mode, palette)), )) .unwrap(); session .send_screen_instructions - .send(ScreenInstruction::ChangeMode(get_mode_info(mode))) + .send(ScreenInstruction::ChangeMode(get_mode_info(mode, palette))) .unwrap(); session .send_screen_instructions @@ -694,6 +727,18 @@ fn route_action(action: Action, session: &SessionMetaData) { .send(ScreenInstruction::ScrollDown) .unwrap(); } + Action::PageScrollUp => { + session + .send_screen_instructions + .send(ScreenInstruction::PageScrollUp) + .unwrap(); + } + Action::PageScrollDown => { + session + .send_screen_instructions + .send(ScreenInstruction::PageScrollDown) + .unwrap(); + } Action::ToggleFocusFullscreen => { session .send_screen_instructions @@ -735,6 +780,12 @@ fn route_action(action: Action, session: &SessionMetaData) { .send(ScreenInstruction::SwitchTabPrev) .unwrap(); } + Action::ToggleActiveSyncPanes => { + session + .send_screen_instructions + .send(ScreenInstruction::ToggleActiveSyncPanes) + .unwrap(); + } Action::CloseTab => { session .send_screen_instructions diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index bc18d6fd..711d48ad 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -14,6 +14,8 @@ use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::server::ServerInstruction; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::tests::utils::commands::{QUIT, SLEEP}; +use crate::utils::shared::colors; +use zellij_tile::data::{Palette, PaletteSource, Theme}; const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(150); @@ -81,6 +83,7 @@ pub struct FakeInputOutput { receive_instructions_from_client: Arc>>, should_trigger_sigwinch: Arc<(Mutex, Condvar)>, sigwinch_event: Option, + palette: Arc>, } impl FakeInputOutput { @@ -96,6 +99,21 @@ impl FakeInputOutput { let send_instructions_to_server = SenderWithContext::new(SenderType::Sender(server_sender)); win_sizes.insert(0, winsize); // 0 is the current terminal + let palette: Palette = Palette { + source: PaletteSource::Default, + theme: Theme::Dark, + fg: colors::BRIGHT_GRAY, + bg: colors::GRAY, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE, + orange: colors::ORANGE, + }; FakeInputOutput { read_buffers: Arc::new(Mutex::new(HashMap::new())), stdin_writes: Arc::new(Mutex::new(HashMap::new())), @@ -112,6 +130,7 @@ impl FakeInputOutput { send_instructions_to_client, should_trigger_sigwinch: Arc::new((Mutex::new(false), Condvar::new())), sigwinch_event: None, + palette: Arc::new(Mutex::new(palette)), } } pub fn with_tty_inputs(mut self, tty_inputs: HashMap) -> Self { @@ -289,4 +308,22 @@ impl ServerOsApi for FakeInputOutput { } fn add_client_sender(&mut self) {} fn update_receiver(&mut self, _stream: LocalSocketStream) {} + fn load_palette(&self) -> Palette { + let palette: Palette = Palette { + source: PaletteSource::Default, + theme: Theme::Dark, + fg: colors::BRIGHT_GRAY, + bg: colors::GRAY, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE, + orange: colors::ORANGE, + }; + palette + } } diff --git a/src/tests/integration/basic.rs b/src/tests/integration/basic.rs index 406e6174..c8305cab 100644 --- a/src/tests/integration/basic.rs +++ b/src/tests/integration/basic.rs @@ -31,6 +31,7 @@ pub fn starts_with_one_terminal() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -58,6 +59,7 @@ pub fn split_terminals_vertically() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -85,6 +87,7 @@ pub fn split_terminals_horizontally() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -119,6 +122,7 @@ pub fn split_largest_terminal() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -146,6 +150,7 @@ pub fn cannot_split_terminals_vertically_when_active_terminal_is_too_small() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -173,6 +178,7 @@ pub fn cannot_split_terminals_horizontally_when_active_terminal_is_too_small() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -200,6 +206,7 @@ pub fn cannot_split_largest_terminal_when_there_is_no_room() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -235,6 +242,7 @@ pub fn scrolling_up_inside_a_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -272,6 +280,80 @@ pub fn scrolling_down_inside_a_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), + ); + let output_frames = fake_input_output + .stdout_writer + .output_frames + .lock() + .unwrap(); + let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); + let snapshot_before_quit = + get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); + assert_snapshot!(snapshot_before_quit); +} + +#[test] +pub fn scrolling_page_up_inside_a_pane() { + let fake_win_size = PositionAndSize { + columns: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut fake_input_output = get_fake_os_input(&fake_win_size); + fake_input_output.add_terminal_input(&[ + &PANE_MODE, + &SPLIT_DOWN_IN_PANE_MODE, + &SPLIT_RIGHT_IN_PANE_MODE, + &SCROLL_MODE, + &SCROLL_PAGE_UP_IN_SCROLL_MODE, + &QUIT, + ]); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + Config::default(), + ); + let output_frames = fake_input_output + .stdout_writer + .output_frames + .lock() + .unwrap(); + let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); + let snapshot_before_quit = + get_next_to_last_snapshot(snapshots).expect("could not find snapshot"); + assert_snapshot!(snapshot_before_quit); +} + +#[test] +pub fn scrolling_page_down_inside_a_pane() { + let fake_win_size = PositionAndSize { + columns: 121, + rows: 20, + x: 0, + y: 0, + ..Default::default() + }; + let mut fake_input_output = get_fake_os_input(&fake_win_size); + fake_input_output.add_terminal_input(&[ + &PANE_MODE, + &SPLIT_DOWN_IN_PANE_MODE, + &SPLIT_RIGHT_IN_PANE_MODE, + &SCROLL_MODE, + &SCROLL_PAGE_UP_IN_SCROLL_MODE, + &SCROLL_PAGE_UP_IN_SCROLL_MODE, + &SCROLL_PAGE_DOWN_IN_SCROLL_MODE, + &SCROLL_PAGE_DOWN_IN_SCROLL_MODE, + &QUIT, + ]); + start( + Box::new(fake_input_output.clone()), + CliArgs::default(), + Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -310,6 +392,7 @@ pub fn max_panes() { Box::new(fake_input_output.clone()), opts, Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -346,6 +429,7 @@ pub fn toggle_focused_pane_fullscreen() { Box::new(fake_input_output.clone()), opts, Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/close_pane.rs b/src/tests/integration/close_pane.rs index 5feee241..869debed 100644 --- a/src/tests/integration/close_pane.rs +++ b/src/tests/integration/close_pane.rs @@ -44,6 +44,7 @@ pub fn close_pane_with_another_pane_above_it() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -86,6 +87,7 @@ pub fn close_pane_with_another_pane_below_it() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -125,6 +127,7 @@ pub fn close_pane_with_another_pane_to_the_left() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -165,6 +168,7 @@ pub fn close_pane_with_another_pane_to_the_right() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -210,6 +214,7 @@ pub fn close_pane_with_multiple_panes_above_it() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -253,6 +258,7 @@ pub fn close_pane_with_multiple_panes_below_it() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -298,6 +304,7 @@ pub fn close_pane_with_multiple_panes_to_the_left() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -341,6 +348,7 @@ pub fn close_pane_with_multiple_panes_to_the_right() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -406,6 +414,7 @@ pub fn close_pane_with_multiple_panes_above_it_away_from_screen_edges() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -467,6 +476,7 @@ pub fn close_pane_with_multiple_panes_below_it_away_from_screen_edges() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -530,6 +540,7 @@ pub fn close_pane_with_multiple_panes_to_the_left_away_from_screen_edges() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -593,6 +604,7 @@ pub fn close_pane_with_multiple_panes_to_the_right_away_from_screen_edges() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -629,6 +641,7 @@ pub fn closing_last_pane_exits_app() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs index 861d5a05..77d3b67e 100644 --- a/src/tests/integration/compatibility.rs +++ b/src/tests/integration/compatibility.rs @@ -47,6 +47,7 @@ pub fn run_bandwhich_from_fish_shell() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -75,6 +76,7 @@ pub fn fish_tab_completion_options() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -108,6 +110,7 @@ pub fn fish_select_tab_completion_options() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -145,6 +148,7 @@ pub fn vim_scroll_region_down() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -179,6 +183,7 @@ pub fn vim_ctrl_d() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -212,6 +217,7 @@ pub fn vim_ctrl_u() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -240,6 +246,7 @@ pub fn htop() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -268,6 +275,7 @@ pub fn htop_scrolling() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -296,6 +304,7 @@ pub fn htop_right_scrolling() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -332,6 +341,7 @@ pub fn vim_overwrite() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -363,6 +373,7 @@ pub fn clear_scroll_region() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -391,6 +402,7 @@ pub fn display_tab_characters_properly() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -419,6 +431,7 @@ pub fn neovim_insert_mode() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -449,6 +462,7 @@ pub fn bash_cursor_linewrap() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -479,6 +493,7 @@ pub fn fish_paste_multiline() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -507,6 +522,7 @@ pub fn git_log() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -537,6 +553,7 @@ pub fn git_diff_scrollup() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -565,6 +582,7 @@ pub fn emacs_longbuf() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -593,6 +611,7 @@ pub fn top_and_quit() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -627,6 +646,7 @@ pub fn exa_plus_omf_theme() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/layouts.rs b/src/tests/integration/layouts.rs index 753453c9..a07995f6 100644 --- a/src/tests/integration/layouts.rs +++ b/src/tests/integration/layouts.rs @@ -32,6 +32,7 @@ pub fn accepts_basic_layout() { Box::new(fake_input_output.clone()), opts, Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/move_focus_down.rs b/src/tests/integration/move_focus_down.rs index ca487be5..8ea953c6 100644 --- a/src/tests/integration/move_focus_down.rs +++ b/src/tests/integration/move_focus_down.rs @@ -36,6 +36,7 @@ pub fn move_focus_down() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -72,6 +73,7 @@ pub fn move_focus_down_to_the_most_recently_used_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_left.rs b/src/tests/integration/move_focus_left.rs index 60f89ffd..3b87bb95 100644 --- a/src/tests/integration/move_focus_left.rs +++ b/src/tests/integration/move_focus_left.rs @@ -35,6 +35,7 @@ pub fn move_focus_left() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -72,6 +73,7 @@ pub fn move_focus_left_to_the_most_recently_used_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_right.rs b/src/tests/integration/move_focus_right.rs index 22f09136..c6c17a75 100644 --- a/src/tests/integration/move_focus_right.rs +++ b/src/tests/integration/move_focus_right.rs @@ -36,6 +36,7 @@ pub fn move_focus_right() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -72,6 +73,7 @@ pub fn move_focus_right_to_the_most_recently_used_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_up.rs b/src/tests/integration/move_focus_up.rs index 4f0416d4..62b64ed1 100644 --- a/src/tests/integration/move_focus_up.rs +++ b/src/tests/integration/move_focus_up.rs @@ -35,6 +35,7 @@ pub fn move_focus_up() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -72,6 +73,7 @@ pub fn move_focus_up_to_the_most_recently_used_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_down.rs b/src/tests/integration/resize_down.rs index 745ba109..58104fe1 100644 --- a/src/tests/integration/resize_down.rs +++ b/src/tests/integration/resize_down.rs @@ -47,6 +47,7 @@ pub fn resize_down_with_pane_above() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -91,6 +92,7 @@ pub fn resize_down_with_pane_below() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -141,6 +143,7 @@ pub fn resize_down_with_panes_above_and_below() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -190,6 +193,7 @@ pub fn resize_down_with_multiple_panes_above() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -241,6 +245,7 @@ pub fn resize_down_with_panes_above_aligned_left_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -291,6 +296,7 @@ pub fn resize_down_with_panes_below_aligned_left_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -339,6 +345,7 @@ pub fn resize_down_with_panes_above_aligned_right_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -388,6 +395,7 @@ pub fn resize_down_with_panes_below_aligned_right_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -440,6 +448,7 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -494,6 +503,7 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -565,6 +575,7 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_lef Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -638,6 +649,7 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_ Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -679,6 +691,7 @@ pub fn cannot_resize_down_when_pane_below_is_at_minimum_height() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_left.rs b/src/tests/integration/resize_left.rs index 307198b1..d31dd6d2 100644 --- a/src/tests/integration/resize_left.rs +++ b/src/tests/integration/resize_left.rs @@ -43,6 +43,7 @@ pub fn resize_left_with_pane_to_the_left() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -85,6 +86,7 @@ pub fn resize_left_with_pane_to_the_right() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -129,6 +131,7 @@ pub fn resize_left_with_panes_to_the_left_and_right() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -176,6 +179,7 @@ pub fn resize_left_with_multiple_panes_to_the_left() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -225,6 +229,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -271,6 +276,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -319,6 +325,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -366,6 +373,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -418,6 +426,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pa Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -472,6 +481,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_p Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -543,6 +553,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_abov Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -617,6 +628,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_abo Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -658,6 +670,7 @@ pub fn cannot_resize_left_when_pane_to_the_left_is_at_minimum_width() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_right.rs b/src/tests/integration/resize_right.rs index 05553de1..e5ea1b9d 100644 --- a/src/tests/integration/resize_right.rs +++ b/src/tests/integration/resize_right.rs @@ -43,6 +43,7 @@ pub fn resize_right_with_pane_to_the_left() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -85,6 +86,7 @@ pub fn resize_right_with_pane_to_the_right() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -129,6 +131,7 @@ pub fn resize_right_with_panes_to_the_left_and_right() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -176,6 +179,7 @@ pub fn resize_right_with_multiple_panes_to_the_left() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -225,6 +229,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -271,6 +276,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -319,6 +325,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -366,6 +373,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -418,6 +426,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_p Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -472,6 +481,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_ Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -543,6 +553,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_abo Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -616,6 +627,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_ab Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -657,6 +669,7 @@ pub fn cannot_resize_right_when_pane_to_the_left_is_at_minimum_width() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_up.rs b/src/tests/integration/resize_up.rs index 6330b074..14819331 100644 --- a/src/tests/integration/resize_up.rs +++ b/src/tests/integration/resize_up.rs @@ -45,6 +45,7 @@ pub fn resize_up_with_pane_above() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -89,6 +90,7 @@ pub fn resize_up_with_pane_below() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -138,6 +140,7 @@ pub fn resize_up_with_panes_above_and_below() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -186,6 +189,7 @@ pub fn resize_up_with_multiple_panes_above() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -235,6 +239,7 @@ pub fn resize_up_with_panes_above_aligned_left_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -285,6 +290,7 @@ pub fn resize_up_with_panes_below_aligned_left_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -333,6 +339,7 @@ pub fn resize_up_with_panes_above_aligned_right_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -382,6 +389,7 @@ pub fn resize_up_with_panes_below_aligned_right_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -434,6 +442,7 @@ pub fn resize_up_with_panes_above_aligned_left_and_right_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -488,6 +497,7 @@ pub fn resize_up_with_panes_below_aligned_left_and_right_with_current_pane() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -559,6 +569,7 @@ pub fn resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_ Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -632,6 +643,7 @@ pub fn resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_ri Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -673,6 +685,7 @@ pub fn cannot_resize_up_when_pane_above_is_at_minimum_height() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/tabs.rs b/src/tests/integration/tabs.rs index d45ec18a..0c751634 100644 --- a/src/tests/integration/tabs.rs +++ b/src/tests/integration/tabs.rs @@ -37,6 +37,7 @@ pub fn open_new_tab() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -72,6 +73,7 @@ pub fn switch_to_prev_tab() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -107,6 +109,7 @@ pub fn switch_to_next_tab() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -142,6 +145,7 @@ pub fn close_tab() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -178,6 +182,7 @@ pub fn close_last_pane_in_a_tab() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -216,6 +221,7 @@ pub fn close_the_middle_tab() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -259,6 +265,7 @@ pub fn close_the_tab_that_has_a_pane_in_fullscreen() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -294,6 +301,7 @@ pub fn closing_last_tab_exits_the_app() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/terminal_window_resize.rs b/src/tests/integration/terminal_window_resize.rs index 5aa13e15..057c2523 100644 --- a/src/tests/integration/terminal_window_resize.rs +++ b/src/tests/integration/terminal_window_resize.rs @@ -34,6 +34,7 @@ pub fn window_width_decrease_with_one_pane() { Box::new(fake_input_output.clone()), opts, Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -69,6 +70,7 @@ pub fn window_width_increase_with_one_pane() { Box::new(fake_input_output.clone()), opts, Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -104,6 +106,7 @@ pub fn window_height_increase_with_one_pane() { Box::new(fake_input_output.clone()), opts, Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer @@ -139,6 +142,7 @@ pub fn window_width_and_height_decrease_with_one_pane() { Box::new(fake_input_output.clone()), opts, Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/toggle_fullscreen.rs b/src/tests/integration/toggle_fullscreen.rs index 83a8f215..0e967bd2 100644 --- a/src/tests/integration/toggle_fullscreen.rs +++ b/src/tests/integration/toggle_fullscreen.rs @@ -36,6 +36,7 @@ pub fn adding_new_terminal_in_fullscreen() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output @@ -70,6 +71,7 @@ pub fn move_focus_is_disabled_in_fullscreen() { Box::new(fake_input_output.clone()), CliArgs::default(), Box::new(fake_input_output.clone()), + Config::default(), ); let output_frames = fake_input_output From a05a12dbec77bc381054cf245ce2f4696eaf1727 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 4 May 2021 11:15:59 +0530 Subject: [PATCH 61/64] Add version to socket path to avoid problems after version update --- src/common/utils/consts.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index 3a783914..244845da 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -21,10 +21,12 @@ lazy_static! { pub static ref ZELLIJ_PROJ_DIR: ProjectDirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); pub static ref ZELLIJ_IPC_PIPE: PathBuf = { + let version = std::env::var("CARGO_PKG_VERSION").unwrap(); let mut ipc_dir = ZELLIJ_PROJ_DIR .runtime_dir() .map(|p| p.to_owned()) .unwrap_or_else(|| PathBuf::from("/tmp/zellij-".to_string() + &format!("{}", *UID))); + ipc_dir.push(&version); std::fs::create_dir_all(&ipc_dir).unwrap(); ipc_dir.push(&*SESSION_NAME); ipc_dir From 585b225290df3e44a86555490dc9170f88148fa6 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 4 May 2021 13:48:19 +0530 Subject: [PATCH 62/64] Use ZELLIJ_SOCKET_DIR env variable and make user specific tmp dir --- src/common/utils/consts.rs | 25 +++++++++++++++---------- src/common/utils/logging.rs | 20 ++++++++++---------- src/main.rs | 4 ++-- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index 244845da..4c219fed 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -4,10 +4,7 @@ use directories_next::ProjectDirs; use lazy_static::lazy_static; use nix::unistd::Uid; use std::path::PathBuf; - -pub const ZELLIJ_TMP_DIR: &str = "/tmp/zellij"; -pub const ZELLIJ_TMP_LOG_DIR: &str = "/tmp/zellij/zellij-log"; -pub const ZELLIJ_TMP_LOG_FILE: &str = "/tmp/zellij/zellij-log/log.txt"; +use std::{env, fs}; pub const ZELLIJ_CONFIG_FILE_ENV: &str = "ZELLIJ_CONFIG_FILE"; pub const ZELLIJ_CONFIG_DIR_ENV: &str = "ZELLIJ_CONFIG_DIR"; @@ -21,14 +18,22 @@ lazy_static! { pub static ref ZELLIJ_PROJ_DIR: ProjectDirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); pub static ref ZELLIJ_IPC_PIPE: PathBuf = { - let version = std::env::var("CARGO_PKG_VERSION").unwrap(); - let mut ipc_dir = ZELLIJ_PROJ_DIR - .runtime_dir() - .map(|p| p.to_owned()) - .unwrap_or_else(|| PathBuf::from("/tmp/zellij-".to_string() + &format!("{}", *UID))); + let version = env::var("CARGO_PKG_VERSION").unwrap(); + let mut ipc_dir = env::var("ZELLIJ_SOCKET_DIR").map_or_else( + |_| { + ZELLIJ_PROJ_DIR + .runtime_dir() + .map_or_else(|| ZELLIJ_TMP_DIR.clone(), |p| p.to_owned()) + }, + PathBuf::from, + ); ipc_dir.push(&version); - std::fs::create_dir_all(&ipc_dir).unwrap(); + fs::create_dir_all(&ipc_dir).unwrap(); ipc_dir.push(&*SESSION_NAME); ipc_dir }; + pub static ref ZELLIJ_TMP_DIR: PathBuf = + PathBuf::from("/tmp/zellij-".to_string() + &format!("{}", *UID)); + pub static ref ZELLIJ_TMP_LOG_DIR: PathBuf = ZELLIJ_TMP_DIR.join("zellij-log"); + pub static ref ZELLIJ_TMP_LOG_FILE: PathBuf = ZELLIJ_TMP_LOG_DIR.join("log.txt"); } diff --git a/src/common/utils/logging.rs b/src/common/utils/logging.rs index 06827bfc..d99a2428 100644 --- a/src/common/utils/logging.rs +++ b/src/common/utils/logging.rs @@ -4,16 +4,16 @@ use std::{ fs, io::{self, prelude::*}, os::unix::io::RawFd, - path::PathBuf, + path::{Path, PathBuf}, }; use crate::utils::consts::{ZELLIJ_TMP_LOG_DIR, ZELLIJ_TMP_LOG_FILE}; -pub fn atomic_create_file(file_name: &str) { +pub fn atomic_create_file(file_name: &Path) { let _ = fs::OpenOptions::new().create(true).open(file_name); } -pub fn atomic_create_dir(dir_name: &str) -> io::Result<()> { +pub fn atomic_create_dir(dir_name: &Path) -> io::Result<()> { if let Err(e) = fs::create_dir(dir_name) { if e.kind() == std::io::ErrorKind::AlreadyExists { Ok(()) @@ -31,11 +31,11 @@ pub fn debug_log_to_file(mut message: String) -> io::Result<()> { } pub fn debug_log_to_file_without_newline(message: String) -> io::Result<()> { - atomic_create_file(ZELLIJ_TMP_LOG_FILE); + atomic_create_file(&*ZELLIJ_TMP_LOG_FILE); let mut file = fs::OpenOptions::new() .append(true) .create(true) - .open(ZELLIJ_TMP_LOG_FILE)?; + .open(&*ZELLIJ_TMP_LOG_FILE)?; file.write_all(message.as_bytes()) } @@ -48,16 +48,16 @@ pub fn _debug_log_to_file_pid_3(message: String, pid: RawFd) -> io::Result<()> { } pub fn _delete_log_file() -> io::Result<()> { - if fs::metadata(ZELLIJ_TMP_LOG_FILE).is_ok() { - fs::remove_file(ZELLIJ_TMP_LOG_FILE) + if fs::metadata(&*ZELLIJ_TMP_LOG_FILE).is_ok() { + fs::remove_file(&*ZELLIJ_TMP_LOG_FILE) } else { Ok(()) } } pub fn _delete_log_dir() -> io::Result<()> { - if fs::metadata(ZELLIJ_TMP_LOG_DIR).is_ok() { - fs::remove_dir_all(ZELLIJ_TMP_LOG_DIR) + if fs::metadata(&*ZELLIJ_TMP_LOG_DIR).is_ok() { + fs::remove_dir_all(&*ZELLIJ_TMP_LOG_DIR) } else { Ok(()) } @@ -65,7 +65,7 @@ pub fn _delete_log_dir() -> io::Result<()> { pub fn debug_to_file(message: u8, pid: RawFd) -> io::Result<()> { let mut path = PathBuf::new(); - path.push(ZELLIJ_TMP_LOG_DIR); + path.push(&*ZELLIJ_TMP_LOG_DIR); path.push(format!("zellij-{}.log", pid.to_string())); let mut file = fs::OpenOptions::new() diff --git a/src/main.rs b/src/main.rs index 6ee344bc..44b98549 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,8 +49,8 @@ pub fn main() { setup::dump_default_config().expect("Failed to print to stdout"); std::process::exit(1); } else { - atomic_create_dir(ZELLIJ_TMP_DIR).unwrap(); - atomic_create_dir(ZELLIJ_TMP_LOG_DIR).unwrap(); + atomic_create_dir(&*ZELLIJ_TMP_DIR).unwrap(); + atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap(); let server_os_input = get_server_os_input(); let os_input = get_client_os_input(); start(Box::new(os_input), opts, Box::new(server_os_input), config); From c1dd2c588e9bad58a760a06076c6689776d7d43d Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 4 May 2021 20:48:28 +0530 Subject: [PATCH 63/64] Fix after rebase --- Cargo.lock | 28 -------------------- Cargo.toml | 1 - src/common/os_input_output.rs | 49 +++-------------------------------- src/common/utils/shared.rs | 4 +-- src/tests/fakes.rs | 39 +++------------------------- 5 files changed, 8 insertions(+), 113 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fe7883f3..6f5de9d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1127,12 +1127,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkg-config" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - [[package]] name = "polling" version = "2.0.3" @@ -2249,27 +2243,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" -[[package]] -name = "x11" -version = "2.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ecd092546cb16f25783a5451538e73afc8d32e242648d54f4ae5459ba1e773" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "xrdb" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2dd91a21c92e87678e22f95956a03bfd314ce3232f39dbedd49dddb50f0c6d" -dependencies = [ - "libc", - "scopeguard", - "x11", -] - [[package]] name = "yaml-rust" version = "0.4.5" @@ -2312,7 +2285,6 @@ dependencies = [ "vte 0.8.0", "wasmer", "wasmer-wasi", - "xrdb", "zellij-tile", "zellij-tile-extra", ] diff --git a/Cargo.toml b/Cargo.toml index 3b3064c3..fb02f2be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,6 @@ wasmer = "1.0.0" wasmer-wasi = "1.0.0" interprocess = "1.1.1" names = "0.11.0" -xrdb = "0.1.1" colors-transform = "0.2.5" zellij-tile = { path = "zellij-tile/", version = "1.1.0" } zellij-tile-extra = { path = "zellij-tile-extra/", version="1.0.0" } diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 7bf39757..9e19f0ee 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -6,7 +6,7 @@ use crate::common::{ use crate::errors::ErrorContext; use crate::panes::PositionAndSize; use crate::server::ServerInstruction; -use crate::utils::shared::{default_palette, detect_theme, hex_to_rgb}; +use crate::utils::shared::default_palette; use interprocess::local_socket::LocalSocketStream; use nix::fcntl::{fcntl, FcntlArg, OFlag}; use nix::pty::{forkpty, Winsize}; @@ -22,8 +22,7 @@ use std::os::unix::io::RawFd; use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; -use xrdb::Colors; -use zellij_tile::data::{Palette, PaletteSource}; +use zellij_tile::data::Palette; fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); @@ -262,49 +261,7 @@ impl ServerOsApi for ServerOsInputOutput { Some(Arc::new(Mutex::new(IpcReceiverWithContext::new(stream)))); } fn load_palette(&self) -> Palette { - let palette = match Colors::new("xresources") { - Some(palette) => { - let fg = if let Some(foreground) = palette.fg.as_deref().map(hex_to_rgb) { - foreground - } else { - return default_palette(); - }; - - let bg = if let Some(background) = palette.bg.as_deref().map(hex_to_rgb) { - background - } else { - return default_palette(); - }; - - // NOTE: `16` is the same as the length of `palette.colors`. - let mut colors: [(u8, u8, u8); 16] = [(0, 0, 0); 16]; - for (idx, color) in palette.colors.iter().enumerate() { - if let Some(c) = color { - colors[idx] = hex_to_rgb(c); - } else { - return default_palette(); - } - } - let theme = detect_theme(bg); - Palette { - source: PaletteSource::Xresources, - theme, - fg, - bg, - black: colors[0], - red: colors[1], - green: colors[2], - yellow: colors[3], - blue: colors[4], - magenta: colors[5], - cyan: colors[6], - white: colors[7], - orange: colors[9], - } - } - None => default_palette(), - }; - palette + default_palette() } } diff --git a/src/common/utils/shared.rs b/src/common/utils/shared.rs index 7b4cbcb5..ace5674b 100644 --- a/src/common/utils/shared.rs +++ b/src/common/utils/shared.rs @@ -43,7 +43,7 @@ pub mod colors { pub const BLACK: u8 = 16; } -pub fn hex_to_rgb(hex: &str) -> (u8, u8, u8) { +pub fn _hex_to_rgb(hex: &str) -> (u8, u8, u8) { let rgb = Rgb::from_hex_str(hex) .expect("The passed argument must be a valid hex color") .as_tuple(); @@ -69,7 +69,7 @@ pub fn default_palette() -> Palette { } // Dark magic -pub fn detect_theme(bg: PaletteColor) -> Theme { +pub fn _detect_theme(bg: PaletteColor) -> Theme { match bg { PaletteColor::Rgb((r, g, b)) => { // HSP, P stands for perceived brightness diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 711d48ad..4c780410 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -14,8 +14,8 @@ use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::server::ServerInstruction; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::tests::utils::commands::{QUIT, SLEEP}; -use crate::utils::shared::colors; -use zellij_tile::data::{Palette, PaletteSource, Theme}; +use crate::utils::shared::default_palette; +use zellij_tile::data::Palette; const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(150); @@ -83,7 +83,6 @@ pub struct FakeInputOutput { receive_instructions_from_client: Arc>>, should_trigger_sigwinch: Arc<(Mutex, Condvar)>, sigwinch_event: Option, - palette: Arc>, } impl FakeInputOutput { @@ -98,22 +97,6 @@ impl FakeInputOutput { mpsc::channel(); let send_instructions_to_server = SenderWithContext::new(SenderType::Sender(server_sender)); win_sizes.insert(0, winsize); // 0 is the current terminal - - let palette: Palette = Palette { - source: PaletteSource::Default, - theme: Theme::Dark, - fg: colors::BRIGHT_GRAY, - bg: colors::GRAY, - black: colors::BLACK, - red: colors::RED, - green: colors::GREEN, - yellow: colors::GRAY, - blue: colors::GRAY, - magenta: colors::GRAY, - cyan: colors::GRAY, - white: colors::WHITE, - orange: colors::ORANGE, - }; FakeInputOutput { read_buffers: Arc::new(Mutex::new(HashMap::new())), stdin_writes: Arc::new(Mutex::new(HashMap::new())), @@ -130,7 +113,6 @@ impl FakeInputOutput { send_instructions_to_client, should_trigger_sigwinch: Arc::new((Mutex::new(false), Condvar::new())), sigwinch_event: None, - palette: Arc::new(Mutex::new(palette)), } } pub fn with_tty_inputs(mut self, tty_inputs: HashMap) -> Self { @@ -309,21 +291,6 @@ impl ServerOsApi for FakeInputOutput { fn add_client_sender(&mut self) {} fn update_receiver(&mut self, _stream: LocalSocketStream) {} fn load_palette(&self) -> Palette { - let palette: Palette = Palette { - source: PaletteSource::Default, - theme: Theme::Dark, - fg: colors::BRIGHT_GRAY, - bg: colors::GRAY, - black: colors::BLACK, - red: colors::RED, - green: colors::GREEN, - yellow: colors::GRAY, - blue: colors::GRAY, - magenta: colors::GRAY, - cyan: colors::GRAY, - white: colors::WHITE, - orange: colors::ORANGE, - }; - palette + default_palette() } } From 7982636741df86e7323f73726631ef15745b15fc Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 5 May 2021 02:00:02 +0530 Subject: [PATCH 64/64] explicitly set file and directory permissions --- src/common/os_input_output.rs | 19 +++++++++++++------ src/common/screen.rs | 2 +- src/common/setup.rs | 8 +++++--- src/common/utils/consts.rs | 6 ++++-- src/common/utils/logging.rs | 9 ++++++++- src/server/mod.rs | 9 +++++---- 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 9e19f0ee..5539ae70 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -15,15 +15,22 @@ use nix::sys::termios; use nix::sys::wait::waitpid; use nix::unistd::{self, ForkResult, Pid}; use signal_hook::{consts::signal::*, iterator::Signals}; -use std::env; -use std::io; use std::io::prelude::*; -use std::os::unix::io::RawFd; -use std::path::PathBuf; +use std::os::unix::{fs::PermissionsExt, io::RawFd}; +use std::path::{Path, PathBuf}; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; +use std::{env, fs, io}; use zellij_tile::data::Palette; +const UNIX_PERMISSIONS: u32 = 0o700; + +pub fn set_permissions(path: &Path) { + let mut permissions = fs::metadata(path).unwrap().permissions(); + permissions.set_mode(UNIX_PERMISSIONS); + fs::set_permissions(path, permissions).unwrap(); +} + fn into_raw_mode(pid: RawFd) { let mut tio = termios::tcgetattr(pid).expect("could not get terminal attribute"); termios::cfmakeraw(&mut tio); @@ -373,11 +380,11 @@ impl ClientOsApi for ClientOsInputOutput { } } fn connect_to_server(&self) { - let socket = match LocalSocketStream::connect(ZELLIJ_IPC_PIPE.clone()) { + let socket = match LocalSocketStream::connect(&**ZELLIJ_IPC_PIPE) { Ok(sock) => sock, Err(_) => { std::thread::sleep(std::time::Duration::from_millis(20)); - LocalSocketStream::connect(ZELLIJ_IPC_PIPE.clone()).unwrap() + LocalSocketStream::connect(&**ZELLIJ_IPC_PIPE).unwrap() } }; let sender = IpcSenderWithContext::new(socket); diff --git a/src/common/screen.rs b/src/common/screen.rs index c5e4f9a5..562b0ffe 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -79,7 +79,7 @@ pub struct Screen { full_screen_ws: PositionAndSize, /// The index of this [`Screen`]'s active [`Tab`]. active_tab_index: Option, - /// The [`ClientOsApi`] this [`Screen`] uses. + /// The [`ServerOsApi`] this [`Screen`] uses. os_api: Box, mode_info: ModeInfo, input_mode: InputMode, diff --git a/src/common/setup.rs b/src/common/setup.rs index 70e0ded4..edfa858a 100644 --- a/src/common/setup.rs +++ b/src/common/setup.rs @@ -1,9 +1,9 @@ -use crate::common::utils::consts::SYSTEM_DEFAULT_CONFIG_DIR; +use crate::common::utils::consts::{SYSTEM_DEFAULT_CONFIG_DIR, VERSION}; +use crate::os_input_output::set_permissions; use directories_next::{BaseDirs, ProjectDirs}; use std::io::Write; use std::{fs, path::Path, path::PathBuf}; -const VERSION: &str = env!("CARGO_PKG_VERSION"); const CONFIG_LOCATION: &str = "/.config/zellij"; #[macro_export] @@ -40,7 +40,9 @@ pub mod install { for (path, bytes) in assets { let path = data_dir.join(path); - fs::create_dir_all(path.parent().unwrap()).unwrap(); + let parent_path = path.parent().unwrap(); + fs::create_dir_all(parent_path).unwrap(); + set_permissions(parent_path); if out_of_date || !path.exists() { fs::write(path, bytes).expect("Failed to install default assets!"); } diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index 4c219fed..a46f8243 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -1,5 +1,6 @@ //! Zellij program-wide constants. +use crate::os_input_output::set_permissions; use directories_next::ProjectDirs; use lazy_static::lazy_static; use nix::unistd::Uid; @@ -8,6 +9,7 @@ use std::{env, fs}; pub const ZELLIJ_CONFIG_FILE_ENV: &str = "ZELLIJ_CONFIG_FILE"; pub const ZELLIJ_CONFIG_DIR_ENV: &str = "ZELLIJ_CONFIG_DIR"; +pub const VERSION: &str = env!("CARGO_PKG_VERSION"); // TODO: ${PREFIX} argument in makefile pub const SYSTEM_DEFAULT_CONFIG_DIR: &str = "/etc/zellij"; @@ -18,7 +20,6 @@ lazy_static! { pub static ref ZELLIJ_PROJ_DIR: ProjectDirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); pub static ref ZELLIJ_IPC_PIPE: PathBuf = { - let version = env::var("CARGO_PKG_VERSION").unwrap(); let mut ipc_dir = env::var("ZELLIJ_SOCKET_DIR").map_or_else( |_| { ZELLIJ_PROJ_DIR @@ -27,8 +28,9 @@ lazy_static! { }, PathBuf::from, ); - ipc_dir.push(&version); + ipc_dir.push(VERSION); fs::create_dir_all(&ipc_dir).unwrap(); + set_permissions(&ipc_dir); ipc_dir.push(&*SESSION_NAME); ipc_dir }; diff --git a/src/common/utils/logging.rs b/src/common/utils/logging.rs index d99a2428..ff3fb44c 100644 --- a/src/common/utils/logging.rs +++ b/src/common/utils/logging.rs @@ -7,14 +7,17 @@ use std::{ path::{Path, PathBuf}, }; +use crate::os_input_output::set_permissions; use crate::utils::consts::{ZELLIJ_TMP_LOG_DIR, ZELLIJ_TMP_LOG_FILE}; pub fn atomic_create_file(file_name: &Path) { let _ = fs::OpenOptions::new().create(true).open(file_name); + #[cfg(not(test))] + set_permissions(file_name); } pub fn atomic_create_dir(dir_name: &Path) -> io::Result<()> { - if let Err(e) = fs::create_dir(dir_name) { + let result = if let Err(e) = fs::create_dir(dir_name) { if e.kind() == std::io::ErrorKind::AlreadyExists { Ok(()) } else { @@ -22,7 +25,11 @@ pub fn atomic_create_dir(dir_name: &Path) -> io::Result<()> { } } else { Ok(()) + }; + if result.is_ok() { + set_permissions(dir_name); } + result } pub fn debug_log_to_file(mut message: String) -> io::Result<()> { diff --git a/src/server/mod.rs b/src/server/mod.rs index 27539c09..6eb2455b 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -19,7 +19,7 @@ use crate::common::{ errors::{ContextType, PluginContext, PtyContext, ScreenContext, ServerContext}, input::actions::{Action, Direction}, input::handler::get_mode_info, - os_input_output::ServerOsApi, + os_input_output::{set_permissions, ServerOsApi}, pty_bus::{PtyBus, PtyInstruction}, screen::{Screen, ScreenInstruction}, setup::install::populate_data_dir, @@ -85,8 +85,9 @@ pub fn start_server(os_input: Box) -> thread::JoinHandle<()> { let sessions = sessions.clone(); let send_server_instructions = send_server_instructions.clone(); move || { - drop(std::fs::remove_file(ZELLIJ_IPC_PIPE.clone())); - let listener = LocalSocketListener::bind(ZELLIJ_IPC_PIPE.clone()).unwrap(); + drop(std::fs::remove_file(&*ZELLIJ_IPC_PIPE)); + let listener = LocalSocketListener::bind(&**ZELLIJ_IPC_PIPE).unwrap(); + set_permissions(&*ZELLIJ_IPC_PIPE); for stream in listener.incoming() { match stream { Ok(stream) => { @@ -134,7 +135,7 @@ pub fn start_server(os_input: Box) -> thread::JoinHandle<()> { ServerInstruction::ClientExit => { *sessions.write().unwrap() = None; os_input.send_to_client(ClientInstruction::Exit); - drop(std::fs::remove_file(ZELLIJ_IPC_PIPE.clone())); + drop(std::fs::remove_file(&*ZELLIJ_IPC_PIPE)); break; } ServerInstruction::Render(output) => {