finished drag and scrolling

This commit is contained in:
Mikayla Maki 2022-08-23 15:26:08 -07:00
parent fa10b44673
commit c0db1ad5ef

View file

@ -28,7 +28,14 @@ use mappings::mouse::{
}; };
use modal::deploy_modal; use modal::deploy_modal;
use settings::{AlternateScroll, Settings, Shell, TerminalBlink}; use settings::{AlternateScroll, Settings, Shell, TerminalBlink};
use std::{collections::HashMap, fmt::Display, ops::Sub, path::PathBuf, sync::Arc, time::Duration}; use std::{
collections::{HashMap, VecDeque},
fmt::Display,
ops::Sub,
path::PathBuf,
sync::Arc,
time::Duration,
};
use thiserror::Error; use thiserror::Error;
use gpui::{ use gpui::{
@ -361,7 +368,7 @@ impl TerminalBuilder {
let terminal = Terminal { let terminal = Terminal {
pty_tx: Notifier(pty_tx), pty_tx: Notifier(pty_tx),
term, term,
events: vec![], events: VecDeque::with_capacity(10), //Should never get this high.
title: shell_txt.clone(), title: shell_txt.clone(),
default_title: shell_txt, default_title: shell_txt,
last_mode: TermMode::NONE, last_mode: TermMode::NONE,
@ -433,7 +440,7 @@ impl TerminalBuilder {
pub struct Terminal { pub struct Terminal {
pty_tx: Notifier, pty_tx: Notifier,
term: Arc<FairMutex<Term<ZedListener>>>, term: Arc<FairMutex<Term<ZedListener>>>,
events: Vec<InternalEvent>, events: VecDeque<InternalEvent>,
default_title: String, default_title: String,
title: String, title: String,
cur_size: TerminalSize, cur_size: TerminalSize,
@ -480,9 +487,9 @@ impl Terminal {
cx.emit(Event::Wakeup); cx.emit(Event::Wakeup);
cx.notify(); cx.notify();
} }
AlacTermEvent::ColorRequest(_, _) => { AlacTermEvent::ColorRequest(_, _) => self
self.events.push(InternalEvent::TermEvent(event.clone())) .events
} .push_back(InternalEvent::TermEvent(event.clone())),
} }
} }
@ -538,33 +545,35 @@ impl Terminal {
fn begin_select(&mut self, sel: Selection) { fn begin_select(&mut self, sel: Selection) {
self.current_selection = true; self.current_selection = true;
self.events.push(InternalEvent::SetSelection(Some(sel))); self.events
.push_back(InternalEvent::SetSelection(Some(sel)));
} }
fn continue_selection(&mut self, location: Vector2F) { fn continue_selection(&mut self, location: Vector2F) {
self.events.push(InternalEvent::UpdateSelection(location)) self.events
.push_back(InternalEvent::UpdateSelection(location))
} }
fn end_select(&mut self) { fn end_select(&mut self) {
self.current_selection = false; self.current_selection = false;
self.events.push(InternalEvent::SetSelection(None)); self.events.push_back(InternalEvent::SetSelection(None));
} }
fn scroll(&mut self, scroll: Scroll) { fn scroll(&mut self, scroll: Scroll) {
self.events.push(InternalEvent::Scroll(scroll)); self.events.push_back(InternalEvent::Scroll(scroll));
} }
pub fn copy(&mut self) { pub fn copy(&mut self) {
self.events.push(InternalEvent::Copy); self.events.push_back(InternalEvent::Copy);
} }
pub fn clear(&mut self) { pub fn clear(&mut self) {
self.events.push(InternalEvent::Clear) self.events.push_back(InternalEvent::Clear)
} }
///Resize the terminal and the PTY. ///Resize the terminal and the PTY.
pub fn set_size(&mut self, new_size: TerminalSize) { pub fn set_size(&mut self, new_size: TerminalSize) {
self.events.push(InternalEvent::Resize(new_size)) self.events.push_back(InternalEvent::Resize(new_size))
} }
///Write the Input payload to the tty. ///Write the Input payload to the tty.
@ -605,7 +614,8 @@ impl Terminal {
let m = self.term.clone(); //Arc clone let m = self.term.clone(); //Arc clone
let mut term = m.lock(); let mut term = m.lock();
while let Some(e) = self.events.pop() { //Note that this ordering matters for
while let Some(e) = self.events.pop_front() {
self.process_terminal_event(&e, &mut term, cx) self.process_terminal_event(&e, &mut term, cx)
} }
@ -670,23 +680,20 @@ impl Terminal {
let position = e.position.sub(origin); let position = e.position.sub(origin);
if !self.mouse_mode(e.shift) { if !self.mouse_mode(e.shift) {
//TODO: Check that dragging still works as expected
// let point = mouse_point(position, self.cur_size, self.last_offset);
// let side = mouse_side(position, self.cur_size);
// Alacritty has the same ordering, of first updating the selection // Alacritty has the same ordering, of first updating the selection
// then scrolling 15ms later // then scrolling 15ms later
self.continue_selection(position); self.continue_selection(position);
// Doesn't make sense to scroll the alt screen // Doesn't make sense to scroll the alt screen
if !self.last_mode.contains(TermMode::ALT_SCREEN) { if !self.last_mode.contains(TermMode::ALT_SCREEN) {
let top = bounds.origin_y() + self.cur_size.line_height; //TODO: Why do these need to be doubled?
let bottom = bounds.lower_left().y() - self.cur_size.line_height; let top = bounds.origin_y() + (self.cur_size.line_height * 2.);
let bottom = bounds.lower_left().y() - (self.cur_size.line_height * 2.);
let scroll_delta = if e.position.y() < top { let scroll_delta = if e.position.y() < top {
top - e.position.y() (top - e.position.y()).powf(1.1)
} else if e.position.y() > bottom { } else if e.position.y() > bottom {
-(e.position.y() - bottom) -((e.position.y() - bottom).powf(1.1))
} else { } else {
return; //Nothing to do return; //Nothing to do
}; };