mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-12 21:32:40 +00:00
finished drag and scrolling
This commit is contained in:
parent
fa10b44673
commit
c0db1ad5ef
1 changed files with 29 additions and 22 deletions
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue