fix(plugins): send events to plugins properly in a multiuser env (#986)
This commit is contained in:
parent
7dad61e529
commit
153ed175af
6 changed files with 46 additions and 43 deletions
|
|
@ -306,20 +306,20 @@ impl Pane for PluginPane {
|
|||
self.geom.y -= count;
|
||||
self.should_render = true;
|
||||
}
|
||||
fn scroll_up(&mut self, count: usize) {
|
||||
fn scroll_up(&mut self, count: usize, client_id: ClientId) {
|
||||
self.send_plugin_instructions
|
||||
.send(PluginInstruction::Update(
|
||||
Some(self.pid),
|
||||
None,
|
||||
Some(client_id),
|
||||
Event::Mouse(Mouse::ScrollUp(count)),
|
||||
))
|
||||
.unwrap();
|
||||
}
|
||||
fn scroll_down(&mut self, count: usize) {
|
||||
fn scroll_down(&mut self, count: usize, client_id: ClientId) {
|
||||
self.send_plugin_instructions
|
||||
.send(PluginInstruction::Update(
|
||||
Some(self.pid),
|
||||
None,
|
||||
Some(client_id),
|
||||
Event::Mouse(Mouse::ScrollDown(count)),
|
||||
))
|
||||
.unwrap();
|
||||
|
|
@ -327,29 +327,30 @@ impl Pane for PluginPane {
|
|||
fn clear_scroll(&mut self) {
|
||||
unimplemented!();
|
||||
}
|
||||
fn start_selection(&mut self, start: &Position) {
|
||||
fn start_selection(&mut self, start: &Position, client_id: ClientId) {
|
||||
log::info!("plugin pane send left click plugin instruction");
|
||||
self.send_plugin_instructions
|
||||
.send(PluginInstruction::Update(
|
||||
Some(self.pid),
|
||||
None,
|
||||
Some(client_id),
|
||||
Event::Mouse(Mouse::LeftClick(start.line.0, start.column.0)),
|
||||
))
|
||||
.unwrap();
|
||||
}
|
||||
fn update_selection(&mut self, position: &Position) {
|
||||
fn update_selection(&mut self, position: &Position, client_id: ClientId) {
|
||||
self.send_plugin_instructions
|
||||
.send(PluginInstruction::Update(
|
||||
Some(self.pid),
|
||||
None,
|
||||
Some(client_id),
|
||||
Event::Mouse(Mouse::Hold(position.line.0, position.column.0)),
|
||||
))
|
||||
.unwrap();
|
||||
}
|
||||
fn end_selection(&mut self, end: Option<&Position>) {
|
||||
fn end_selection(&mut self, end: Option<&Position>, client_id: ClientId) {
|
||||
self.send_plugin_instructions
|
||||
.send(PluginInstruction::Update(
|
||||
Some(self.pid),
|
||||
None,
|
||||
Some(client_id),
|
||||
Event::Mouse(Mouse::Release(
|
||||
end.map(|Position { line, column }| (line.0, column.0)),
|
||||
)),
|
||||
|
|
@ -379,11 +380,11 @@ impl Pane for PluginPane {
|
|||
fn borderless(&self) -> bool {
|
||||
self.borderless
|
||||
}
|
||||
fn handle_right_click(&mut self, to: &Position) {
|
||||
fn handle_right_click(&mut self, to: &Position, client_id: ClientId) {
|
||||
self.send_plugin_instructions
|
||||
.send(PluginInstruction::Update(
|
||||
Some(self.pid),
|
||||
None,
|
||||
Some(client_id),
|
||||
Event::Mouse(Mouse::RightClick(to.line.0, to.column.0)),
|
||||
))
|
||||
.unwrap();
|
||||
|
|
|
|||
|
|
@ -414,11 +414,11 @@ impl Pane for TerminalPane {
|
|||
self.geom.y -= count;
|
||||
self.reflow_lines();
|
||||
}
|
||||
fn scroll_up(&mut self, count: usize) {
|
||||
fn scroll_up(&mut self, count: usize, _client_id: ClientId) {
|
||||
self.grid.move_viewport_up(count);
|
||||
self.set_should_render(true);
|
||||
}
|
||||
fn scroll_down(&mut self, count: usize) {
|
||||
fn scroll_down(&mut self, count: usize, _client_id: ClientId) {
|
||||
self.grid.move_viewport_down(count);
|
||||
self.set_should_render(true);
|
||||
}
|
||||
|
|
@ -452,12 +452,12 @@ impl Pane for TerminalPane {
|
|||
self.grid.pending_messages_to_pty.drain(..).collect()
|
||||
}
|
||||
|
||||
fn start_selection(&mut self, start: &Position) {
|
||||
fn start_selection(&mut self, start: &Position, client_id: ClientId) {
|
||||
self.grid.start_selection(start);
|
||||
self.set_should_render(true);
|
||||
}
|
||||
|
||||
fn update_selection(&mut self, to: &Position) {
|
||||
fn update_selection(&mut self, to: &Position, _client_id: ClientId) {
|
||||
let should_scroll = self.selection_scrolled_at.elapsed()
|
||||
>= time::Duration::from_millis(SELECTION_SCROLL_INTERVAL_MS);
|
||||
// TODO: check how far up/down mouse is relative to pane, to increase scroll lines?
|
||||
|
|
@ -474,7 +474,7 @@ impl Pane for TerminalPane {
|
|||
self.set_should_render(true);
|
||||
}
|
||||
|
||||
fn end_selection(&mut self, end: Option<&Position>) {
|
||||
fn end_selection(&mut self, end: Option<&Position>, _client_id: ClientId) {
|
||||
self.grid.end_selection(end);
|
||||
self.set_should_render(true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use std::fmt::Write;
|
|||
|
||||
#[test]
|
||||
pub fn scrolling_inside_a_pane() {
|
||||
let fake_client_id = 1;
|
||||
let mut fake_win_size = PaneGeom::default();
|
||||
fake_win_size.cols.set_inner(121);
|
||||
fake_win_size.rows.set_inner(20);
|
||||
|
|
@ -20,9 +21,9 @@ pub fn scrolling_inside_a_pane() {
|
|||
writeln!(&mut text_to_fill_pane, "\rline {}", i + 1).unwrap();
|
||||
}
|
||||
terminal_pane.handle_pty_bytes(text_to_fill_pane.into_bytes());
|
||||
terminal_pane.scroll_up(10);
|
||||
terminal_pane.scroll_up(10, fake_client_id);
|
||||
assert_snapshot!(format!("{:?}", terminal_pane.grid));
|
||||
terminal_pane.scroll_down(3);
|
||||
terminal_pane.scroll_down(3, fake_client_id);
|
||||
assert_snapshot!(format!("{:?}", terminal_pane.grid));
|
||||
terminal_pane.clear_scroll();
|
||||
assert_snapshot!(format!("{:?}", terminal_pane.grid));
|
||||
|
|
|
|||
|
|
@ -931,7 +931,7 @@ pub(crate) fn screen_thread_main(
|
|||
screen
|
||||
.get_active_tab_mut(client_id)
|
||||
.unwrap()
|
||||
.scroll_terminal_up(&point, 3);
|
||||
.scroll_terminal_up(&point, 3, client_id);
|
||||
|
||||
screen.render();
|
||||
}
|
||||
|
|
@ -947,7 +947,7 @@ pub(crate) fn screen_thread_main(
|
|||
screen
|
||||
.get_active_tab_mut(client_id)
|
||||
.unwrap()
|
||||
.scroll_terminal_down(&point, 3);
|
||||
.scroll_terminal_down(&point, 3, client_id);
|
||||
|
||||
screen.render();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -177,8 +177,8 @@ pub trait Pane {
|
|||
fn push_right(&mut self, count: usize);
|
||||
fn pull_left(&mut self, count: usize);
|
||||
fn pull_up(&mut self, count: usize);
|
||||
fn scroll_up(&mut self, count: usize);
|
||||
fn scroll_down(&mut self, count: usize);
|
||||
fn scroll_up(&mut self, count: usize, client_id: ClientId);
|
||||
fn scroll_down(&mut self, count: usize, client_id: ClientId);
|
||||
fn clear_scroll(&mut self);
|
||||
fn is_scrolled(&self) -> bool;
|
||||
fn active_at(&self) -> Instant;
|
||||
|
|
@ -194,9 +194,9 @@ pub trait Pane {
|
|||
None => self.position_and_size().contains(position),
|
||||
}
|
||||
}
|
||||
fn start_selection(&mut self, _start: &Position) {}
|
||||
fn update_selection(&mut self, _position: &Position) {}
|
||||
fn end_selection(&mut self, _end: Option<&Position>) {}
|
||||
fn start_selection(&mut self, _start: &Position, _client_id: ClientId) {}
|
||||
fn update_selection(&mut self, _position: &Position, _client_id: ClientId) {}
|
||||
fn end_selection(&mut self, _end: Option<&Position>, _client_id: ClientId) {}
|
||||
fn reset_selection(&mut self) {}
|
||||
fn get_selected_text(&self) -> Option<String> {
|
||||
None
|
||||
|
|
@ -265,7 +265,7 @@ pub trait Pane {
|
|||
}
|
||||
fn set_borderless(&mut self, borderless: bool);
|
||||
fn borderless(&self) -> bool;
|
||||
fn handle_right_click(&mut self, _to: &Position) {}
|
||||
fn handle_right_click(&mut self, _to: &Position, _client_id: ClientId) {}
|
||||
}
|
||||
|
||||
macro_rules! resize_pty {
|
||||
|
|
@ -1696,7 +1696,7 @@ impl Tab {
|
|||
.panes
|
||||
.get_mut(&PaneId::Terminal(active_terminal_id))
|
||||
.unwrap();
|
||||
active_terminal.scroll_up(1);
|
||||
active_terminal.scroll_up(1, client_id);
|
||||
}
|
||||
}
|
||||
pub fn scroll_active_terminal_down(&mut self, client_id: ClientId) {
|
||||
|
|
@ -1705,7 +1705,7 @@ impl Tab {
|
|||
.panes
|
||||
.get_mut(&PaneId::Terminal(active_terminal_id))
|
||||
.unwrap();
|
||||
active_terminal.scroll_down(1);
|
||||
active_terminal.scroll_down(1, client_id);
|
||||
if !active_terminal.is_scrolled() {
|
||||
self.process_pending_vte_events(active_terminal_id);
|
||||
}
|
||||
|
|
@ -1719,7 +1719,7 @@ impl Tab {
|
|||
.unwrap();
|
||||
// prevent overflow when row == 0
|
||||
let scroll_rows = active_terminal.rows().max(1) - 1;
|
||||
active_terminal.scroll_up(scroll_rows);
|
||||
active_terminal.scroll_up(scroll_rows, client_id);
|
||||
}
|
||||
}
|
||||
pub fn scroll_active_terminal_down_page(&mut self, client_id: ClientId) {
|
||||
|
|
@ -1730,7 +1730,7 @@ impl Tab {
|
|||
.unwrap();
|
||||
// prevent overflow when row == 0
|
||||
let scroll_rows = active_terminal.rows().max(1) - 1;
|
||||
active_terminal.scroll_down(scroll_rows);
|
||||
active_terminal.scroll_down(scroll_rows, client_id);
|
||||
if !active_terminal.is_scrolled() {
|
||||
self.process_pending_vte_events(active_terminal_id);
|
||||
}
|
||||
|
|
@ -1744,7 +1744,7 @@ impl Tab {
|
|||
.unwrap();
|
||||
// prevent overflow when row == 0
|
||||
let scroll_rows = (active_terminal.rows().max(1) - 1) / 2;
|
||||
active_terminal.scroll_up(scroll_rows);
|
||||
active_terminal.scroll_up(scroll_rows, client_id);
|
||||
}
|
||||
}
|
||||
pub fn scroll_active_terminal_down_half_page(&mut self, client_id: ClientId) {
|
||||
|
|
@ -1755,7 +1755,7 @@ impl Tab {
|
|||
.unwrap();
|
||||
// prevent overflow when row == 0
|
||||
let scroll_rows = (active_terminal.rows().max(1) - 1) / 2;
|
||||
active_terminal.scroll_down(scroll_rows);
|
||||
active_terminal.scroll_down(scroll_rows, client_id);
|
||||
if !active_terminal.is_scrolled() {
|
||||
self.process_pending_vte_events(active_terminal_id);
|
||||
}
|
||||
|
|
@ -1785,14 +1785,14 @@ impl Tab {
|
|||
}
|
||||
}
|
||||
}
|
||||
pub fn scroll_terminal_up(&mut self, point: &Position, lines: usize) {
|
||||
pub fn scroll_terminal_up(&mut self, point: &Position, lines: usize, client_id: ClientId) {
|
||||
if let Some(pane) = self.get_pane_at(point, false) {
|
||||
pane.scroll_up(lines);
|
||||
pane.scroll_up(lines, client_id);
|
||||
}
|
||||
}
|
||||
pub fn scroll_terminal_down(&mut self, point: &Position, lines: usize) {
|
||||
pub fn scroll_terminal_down(&mut self, point: &Position, lines: usize, client_id: ClientId) {
|
||||
if let Some(pane) = self.get_pane_at(point, false) {
|
||||
pane.scroll_down(lines);
|
||||
pane.scroll_down(lines, client_id);
|
||||
if !pane.is_scrolled() {
|
||||
if let PaneId::Terminal(pid) = pane.pid() {
|
||||
self.process_pending_vte_events(pid);
|
||||
|
|
@ -1832,7 +1832,7 @@ impl Tab {
|
|||
|
||||
if let Some(pane) = self.get_pane_at(position, false) {
|
||||
let relative_position = pane.relative_position(position);
|
||||
pane.start_selection(&relative_position);
|
||||
pane.start_selection(&relative_position, client_id);
|
||||
self.selecting_with_mouse = true;
|
||||
};
|
||||
}
|
||||
|
|
@ -1841,7 +1841,7 @@ impl Tab {
|
|||
|
||||
if let Some(pane) = self.get_pane_at(position, false) {
|
||||
let relative_position = pane.relative_position(position);
|
||||
pane.handle_right_click(&relative_position);
|
||||
pane.handle_right_click(&relative_position, client_id);
|
||||
};
|
||||
}
|
||||
fn focus_pane_at(&mut self, point: &Position, client_id: ClientId) {
|
||||
|
|
@ -1869,14 +1869,14 @@ impl Tab {
|
|||
if active_pane_id != self.get_pane_id_at(position, true) {
|
||||
if let Some(active_pane_id) = active_pane_id {
|
||||
if let Some(active_pane) = self.panes.get_mut(&active_pane_id) {
|
||||
active_pane.end_selection(None);
|
||||
active_pane.end_selection(None, client_id);
|
||||
selected_text = active_pane.get_selected_text();
|
||||
active_pane.reset_selection();
|
||||
}
|
||||
}
|
||||
} else if let Some(pane) = self.get_pane_at(position, true) {
|
||||
let relative_position = pane.relative_position(position);
|
||||
pane.end_selection(Some(&relative_position));
|
||||
pane.end_selection(Some(&relative_position), client_id);
|
||||
selected_text = pane.get_selected_text();
|
||||
pane.reset_selection();
|
||||
}
|
||||
|
|
@ -1890,7 +1890,7 @@ impl Tab {
|
|||
if let Some(active_pane_id) = self.get_active_pane_id(client_id) {
|
||||
if let Some(active_pane) = self.panes.get_mut(&active_pane_id) {
|
||||
let relative_position = active_pane.relative_position(position_on_screen);
|
||||
active_pane.update_selection(&relative_position);
|
||||
active_pane.update_selection(&relative_position, client_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,7 +141,8 @@ pub(crate) fn wasm_thread_main(
|
|||
if subs.contains(&event_type)
|
||||
&& ((pid.is_none() && cid.is_none())
|
||||
|| (pid.is_none() && cid == Some(client_id))
|
||||
|| (cid.is_none() && pid == Some(plugin_id)))
|
||||
|| (cid.is_none() && pid == Some(plugin_id))
|
||||
|| (cid == Some(client_id) && pid == Some(plugin_id)))
|
||||
{
|
||||
let update = instance.exports.get_function("update").unwrap();
|
||||
wasi_write_object(&plugin_env.wasi_env, &event);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue