aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordenis <denismaximov98@gmail.com>2021-03-20 16:54:18 +0200
committerdenis <denismaximov98@gmail.com>2021-03-20 16:54:18 +0200
commit021c8608c8d8a0cd43328d9c0bede5259bd14261 (patch)
treee51b4ac728b573c01e71905815097a03ecfda7e0
parentwip: active pane color, able to type / not able to type inside a pane distinc... (diff)
downloadsl0ppij-021c8608c8d8a0cd43328d9c0bede5259bd14261.tar.gz
sl0ppij-021c8608c8d8a0cd43328d9c0bede5259bd14261.tar.xz
sl0ppij-021c8608c8d8a0cd43328d9c0bede5259bd14261.zip
wip: not sure about updating the input_mode and tab switches for now
-rw-r--r--src/client/boundaries.rs1
-rw-r--r--src/client/tab.rs25
-rw-r--r--src/common/errors.rs2
-rw-r--r--src/common/input/handler.rs3
-rw-r--r--src/common/mod.rs6
-rw-r--r--src/common/screen.rs16
6 files changed, 41 insertions, 12 deletions
diff --git a/src/client/boundaries.rs b/src/client/boundaries.rs
index 1a8174e3..a5f5965b 100644
--- a/src/client/boundaries.rs
+++ b/src/client/boundaries.rs
@@ -1,4 +1,3 @@
-use crate::common::utils::logging::debug_log_to_file;
use crate::{common::input::handler::InputMode, tab::Pane};
use ansi_term::Colour::{self, Fixed};
use std::collections::HashMap;
diff --git a/src/client/tab.rs b/src/client/tab.rs
index ecb94eb2..dad75e30 100644
--- a/src/client/tab.rs
+++ b/src/client/tab.rs
@@ -22,13 +22,7 @@ const MIN_TERMINAL_HEIGHT: usize = 2;
const MIN_TERMINAL_WIDTH: usize = 4;
type BorderAndPaneIds = (usize, Vec<PaneId>);
-fn get_state(app_tx: &SenderWithContext<AppInstruction>) -> InputMode {
- let (state_tx, state_rx) = channel();
- drop(app_tx.send(AppInstruction::GetState(state_tx)));
- let state = state_rx.recv().unwrap();
- state.input_mode
-}
fn split_vertically_with_gap(rect: &PositionAndSize) -> (PositionAndSize, PositionAndSize) {
let width_of_each_half = (rect.columns - 1) / 2;
let mut first_rect = *rect;
@@ -72,6 +66,7 @@ pub struct Tab {
pub send_plugin_instructions: SenderWithContext<PluginInstruction>,
pub send_app_instructions: SenderWithContext<AppInstruction>,
expansion_boundary: Option<PositionAndSize>,
+ pub input_mode: InputMode
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
@@ -80,6 +75,7 @@ pub struct TabData {
pub position: usize,
pub name: String,
pub active: bool,
+ pub input_mode: InputMode
}
// FIXME: Use a struct that has a pane_type enum, to reduce all of the duplication
@@ -199,6 +195,7 @@ impl Tab {
send_app_instructions: SenderWithContext<AppInstruction>,
max_panes: Option<usize>,
pane_id: Option<PaneId>,
+ input_mode: InputMode
) -> Self {
let panes = if let Some(PaneId::Terminal(pid)) = pane_id {
let new_terminal = TerminalPane::new(pid, *full_screen_ws);
@@ -228,6 +225,7 @@ impl Tab {
send_pty_instructions,
send_plugin_instructions,
expansion_boundary: None,
+ input_mode
}
}
@@ -638,7 +636,6 @@ impl Tab {
pub fn toggle_fullscreen_is_active(&mut self) {
self.fullscreen_is_active = !self.fullscreen_is_active;
}
-
pub fn render(&mut self) {
if self.active_terminal.is_none() {
// we might not have an active terminal if we closed the last pane
@@ -651,15 +648,23 @@ impl Tab {
self.full_screen_ws.rows as u16,
);
let hide_cursor = "\u{1b}[?25l";
- let input_mode = get_state(&self.send_app_instructions);
+ //let input_mode = self.get_state(&self.send_app_instructions);
stdout
.write_all(&hide_cursor.as_bytes())
.expect("cannot write to stdout");
for (kind, terminal) in self.panes.iter_mut() {
if !self.panes_to_hide.contains(&terminal.pid()) {
match self.active_terminal.unwrap() == terminal.pid() {
- true => boundaries.add_rect(terminal.as_ref(), true, input_mode),
- false => boundaries.add_rect(terminal.as_ref(), false, input_mode),
+ true => boundaries.add_rect(
+ terminal.as_ref(),
+ true,
+ self.input_mode
+ ),
+ false => boundaries.add_rect(
+ terminal.as_ref(),
+ false,
+ self.input_mode
+ ),
}
if let Some(vte_output) = terminal.render() {
let vte_output = if let PaneId::Terminal(_) = kind {
diff --git a/src/common/errors.rs b/src/common/errors.rs
index df741629..a2e05e30 100644
--- a/src/common/errors.rs
+++ b/src/common/errors.rs
@@ -199,6 +199,7 @@ pub enum ScreenContext {
CloseTab,
GoToTab,
UpdateTabName,
+ ChangeInputMode
}
impl From<&ScreenInstruction> for ScreenContext {
@@ -238,6 +239,7 @@ impl From<&ScreenInstruction> for ScreenContext {
ScreenInstruction::CloseTab => ScreenContext::CloseTab,
ScreenInstruction::GoToTab(_) => ScreenContext::GoToTab,
ScreenInstruction::UpdateTabName(_) => ScreenContext::UpdateTabName,
+ ScreenInstruction::ChangeInputMode(_) => ScreenContext::ChangeInputMode
}
}
}
diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs
index 57bb46fb..2d5e965f 100644
--- a/src/common/input/handler.rs
+++ b/src/common/input/handler.rs
@@ -134,6 +134,9 @@ impl InputHandler {
input_mode: self.mode,
});
self.send_screen_instructions
+ .send(ScreenInstruction::ChangeInputMode(self.mode))
+ .unwrap();
+ self.send_screen_instructions
.send(ScreenInstruction::Render)
.unwrap();
}
diff --git a/src/common/mod.rs b/src/common/mod.rs
index 7b19bcef..87f56567 100644
--- a/src/common/mod.rs
+++ b/src/common/mod.rs
@@ -37,6 +37,7 @@ use utils::consts::{ZELLIJ_IPC_PIPE, ZELLIJ_ROOT_PLUGIN_DIR};
use wasm_vm::{
wasi_stdout, wasi_write_string, zellij_imports, EventType, PluginInputType, PluginInstruction,
};
+use crate::common::utils::logging::debug_log_to_file;
#[derive(Serialize, Deserialize, Debug)]
pub enum ApiCommand {
@@ -290,6 +291,7 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: CliArgs) {
&full_screen_ws,
os_input,
max_panes,
+ InputMode::Normal
);
loop {
let (event, mut err_ctx) = screen
@@ -424,6 +426,10 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: CliArgs) {
ScreenInstruction::UpdateTabName(c) => {
screen.update_active_tab_name(c);
}
+ ScreenInstruction::ChangeInputMode(input_mode) => {
+ debug_log_to_file(format!("{} {:?}", "switched mode to: ".to_string(), input_mode));
+ screen.change_input_mode(input_mode);
+ }
ScreenInstruction::Quit => {
break;
}
diff --git a/src/common/screen.rs b/src/common/screen.rs
index 57bb0e0f..a675ee07 100644
--- a/src/common/screen.rs
+++ b/src/common/screen.rs
@@ -5,7 +5,9 @@ use std::os::unix::io::RawFd;
use std::str;
use std::sync::mpsc::Receiver;
-use super::{AppInstruction, SenderWithContext};
+use wasmer::wasmparser::WasmFuncType;
+
+use super::{AppInstruction, SenderWithContext, input::handler::InputMode};
use crate::os_input_output::OsApi;
use crate::panes::PositionAndSize;
use crate::pty_bus::{PtyInstruction, VteEvent};
@@ -48,6 +50,7 @@ pub enum ScreenInstruction {
CloseTab,
GoToTab(u32),
UpdateTabName(Vec<u8>),
+ ChangeInputMode(InputMode)
}
/// A [`Screen`] holds multiple [`Tab`]s, each one holding multiple [`panes`](crate::client::panes).
@@ -72,6 +75,7 @@ pub struct Screen {
/// The [`OsApi`] this [`Screen`] uses.
os_api: Box<dyn OsApi>,
tabname_buf: String,
+ input_mode: InputMode
}
impl Screen {
@@ -84,6 +88,7 @@ impl Screen {
full_screen_ws: &PositionAndSize,
os_api: Box<dyn OsApi>,
max_panes: Option<usize>,
+ input_mode: InputMode
) -> Self {
Screen {
receiver: receive_screen_instructions,
@@ -96,6 +101,7 @@ impl Screen {
tabs: BTreeMap::new(),
os_api,
tabname_buf: String::new(),
+ input_mode
}
}
@@ -115,6 +121,7 @@ impl Screen {
self.send_app_instructions.clone(),
self.max_panes,
Some(PaneId::Terminal(pane_id)),
+ self.input_mode
);
self.active_tab_index = Some(tab_index);
self.tabs.insert(tab_index, tab);
@@ -259,6 +266,7 @@ impl Screen {
self.send_app_instructions.clone(),
self.max_panes,
None,
+ self.input_mode
);
tab.apply_layout(layout, new_pids);
self.active_tab_index = Some(tab_index);
@@ -274,6 +282,7 @@ impl Screen {
position: tab.position,
name: tab.name.clone(),
active: active_tab_index == tab.index,
+ input_mode: self.input_mode
});
}
self.send_plugin_instructions
@@ -303,4 +312,9 @@ impl Screen {
}
}
}
+ pub fn change_input_mode(&mut self, input_mode: InputMode) {
+ self.input_mode = input_mode;
+ self.get_active_tab_mut().unwrap().input_mode = self.input_mode;
+ self.render();
+ }
}