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 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 gpui::{
@ -361,7 +368,7 @@ impl TerminalBuilder {
let terminal = Terminal {
pty_tx: Notifier(pty_tx),
term,
events: vec![],
events: VecDeque::with_capacity(10), //Should never get this high.
title: shell_txt.clone(),
default_title: shell_txt,
last_mode: TermMode::NONE,
@ -433,7 +440,7 @@ impl TerminalBuilder {
pub struct Terminal {
pty_tx: Notifier,
term: Arc<FairMutex<Term<ZedListener>>>,
events: Vec<InternalEvent>,
events: VecDeque<InternalEvent>,
default_title: String,
title: String,
cur_size: TerminalSize,
@ -480,9 +487,9 @@ impl Terminal {
cx.emit(Event::Wakeup);
cx.notify();
}
AlacTermEvent::ColorRequest(_, _) => {
self.events.push(InternalEvent::TermEvent(event.clone()))
}
AlacTermEvent::ColorRequest(_, _) => self
.events
.push_back(InternalEvent::TermEvent(event.clone())),
}
}
@ -538,33 +545,35 @@ impl Terminal {
fn begin_select(&mut self, sel: Selection) {
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) {
self.events.push(InternalEvent::UpdateSelection(location))
self.events
.push_back(InternalEvent::UpdateSelection(location))
}
fn end_select(&mut self) {
self.current_selection = false;
self.events.push(InternalEvent::SetSelection(None));
self.events.push_back(InternalEvent::SetSelection(None));
}
fn scroll(&mut self, scroll: Scroll) {
self.events.push(InternalEvent::Scroll(scroll));
self.events.push_back(InternalEvent::Scroll(scroll));
}
pub fn copy(&mut self) {
self.events.push(InternalEvent::Copy);
self.events.push_back(InternalEvent::Copy);
}
pub fn clear(&mut self) {
self.events.push(InternalEvent::Clear)
self.events.push_back(InternalEvent::Clear)
}
///Resize the terminal and the PTY.
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.
@ -605,7 +614,8 @@ impl Terminal {
let m = self.term.clone(); //Arc clone
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)
}
@ -670,23 +680,20 @@ impl Terminal {
let position = e.position.sub(origin);
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
// then scrolling 15ms later
self.continue_selection(position);
// Doesn't make sense to scroll the alt screen
if !self.last_mode.contains(TermMode::ALT_SCREEN) {
let top = bounds.origin_y() + self.cur_size.line_height;
let bottom = bounds.lower_left().y() - self.cur_size.line_height;
//TODO: Why do these need to be doubled?
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 {
top - e.position.y()
(top - e.position.y()).powf(1.1)
} else if e.position.y() > bottom {
-(e.position.y() - bottom)
-((e.position.y() - bottom).powf(1.1))
} else {
return; //Nothing to do
};