Fixed scrolling and cursor location
This commit is contained in:
parent
24d671ed3f
commit
f28fb5797f
1 changed files with 19 additions and 45 deletions
|
@ -6,7 +6,7 @@ use alacritty_terminal::{
|
||||||
sync::FairMutex,
|
sync::FairMutex,
|
||||||
term::{
|
term::{
|
||||||
cell::{Cell, Flags},
|
cell::{Cell, Flags},
|
||||||
RenderableCursor, SizeInfo,
|
SizeInfo,
|
||||||
},
|
},
|
||||||
Term,
|
Term,
|
||||||
};
|
};
|
||||||
|
@ -17,7 +17,7 @@ use gpui::{
|
||||||
geometry::{rect::RectF, vector::vec2f},
|
geometry::{rect::RectF, vector::vec2f},
|
||||||
json::json,
|
json::json,
|
||||||
text_layout::Line,
|
text_layout::Line,
|
||||||
Event, PaintContext, Quad,
|
Event, Quad,
|
||||||
};
|
};
|
||||||
use mio_extras::channel::Sender;
|
use mio_extras::channel::Sender;
|
||||||
use ordered_float::OrderedFloat;
|
use ordered_float::OrderedFloat;
|
||||||
|
@ -26,7 +26,6 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use crate::{Input, ZedListener};
|
use crate::{Input, ZedListener};
|
||||||
|
|
||||||
const DEBUG_GRID: bool = false;
|
|
||||||
const ALACRITTY_SCROLL_MULTIPLIER: f32 = 3.;
|
const ALACRITTY_SCROLL_MULTIPLIER: f32 = 3.;
|
||||||
|
|
||||||
pub struct TerminalEl {
|
pub struct TerminalEl {
|
||||||
|
@ -105,7 +104,6 @@ impl Element for TerminalEl {
|
||||||
//Start rendering
|
//Start rendering
|
||||||
let content = term.renderable_content();
|
let content = term.renderable_content();
|
||||||
|
|
||||||
let mut cursor = None;
|
|
||||||
let mut lines: Vec<(String, Option<HighlightStyle>)> = vec![];
|
let mut lines: Vec<(String, Option<HighlightStyle>)> = vec![];
|
||||||
let mut last_line = 0;
|
let mut last_line = 0;
|
||||||
let mut line_count = 1;
|
let mut line_count = 1;
|
||||||
|
@ -124,10 +122,6 @@ impl Element for TerminalEl {
|
||||||
}, //TODO: Learn what 'CellExtra does'
|
}, //TODO: Learn what 'CellExtra does'
|
||||||
} = cell;
|
} = cell;
|
||||||
|
|
||||||
if cell.point == content.cursor.point {
|
|
||||||
cursor = make_cursor(em_width, line_height, content.cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
let new_highlight = make_style_from_cell(fg, flags);
|
let new_highlight = make_style_from_cell(fg, flags);
|
||||||
|
|
||||||
if line != last_line {
|
if line != last_line {
|
||||||
|
@ -154,6 +148,20 @@ impl Element for TerminalEl {
|
||||||
line_count,
|
line_count,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let cursor_line = content.cursor.point.line.0 + content.display_offset as i32;
|
||||||
|
let mut cursor = None;
|
||||||
|
if let Some(layout_line) = cursor_line
|
||||||
|
.try_into()
|
||||||
|
.ok()
|
||||||
|
.and_then(|cursor_line: usize| shaped_lines.get(cursor_line))
|
||||||
|
{
|
||||||
|
let cursor_x = layout_line.x_for_index(content.cursor.point.column.0);
|
||||||
|
cursor = Some(RectF::new(
|
||||||
|
vec2f(cursor_x, cursor_line as f32 * line_height),
|
||||||
|
vec2f(em_width, line_height),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
(
|
(
|
||||||
constraint.max,
|
constraint.max,
|
||||||
LayoutState {
|
LayoutState {
|
||||||
|
@ -172,6 +180,7 @@ impl Element for TerminalEl {
|
||||||
layout: &mut Self::LayoutState,
|
layout: &mut Self::LayoutState,
|
||||||
cx: &mut gpui::PaintContext,
|
cx: &mut gpui::PaintContext,
|
||||||
) -> Self::PaintState {
|
) -> Self::PaintState {
|
||||||
|
cx.scene.push_layer(Some(visible_bounds));
|
||||||
let origin = bounds.origin() + vec2f(layout.em_width, 0.);
|
let origin = bounds.origin() + vec2f(layout.em_width, 0.);
|
||||||
|
|
||||||
let mut line_origin = origin;
|
let mut line_origin = origin;
|
||||||
|
@ -190,15 +199,13 @@ impl Element for TerminalEl {
|
||||||
let new_cursor = RectF::new(new_origin, c.size());
|
let new_cursor = RectF::new(new_origin, c.size());
|
||||||
cx.scene.push_quad(Quad {
|
cx.scene.push_quad(Quad {
|
||||||
bounds: new_cursor,
|
bounds: new_cursor,
|
||||||
background: Some(Color::red()),
|
background: Some(Color::white()),
|
||||||
border: Default::default(),
|
border: Default::default(),
|
||||||
corner_radius: 0.,
|
corner_radius: 0.,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if DEBUG_GRID {
|
cx.scene.pop_layer();
|
||||||
draw_debug_grid(bounds, layout, cx);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dispatch_event(
|
fn dispatch_event(
|
||||||
|
@ -296,36 +303,3 @@ fn alac_color_to_gpui_color(allac_color: &AnsiColor) -> Color {
|
||||||
alacritty_terminal::ansi::Color::Indexed(_) => Color::white(), //Color cube weirdness
|
alacritty_terminal::ansi::Color::Indexed(_) => Color::white(), //Color cube weirdness
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_cursor(em_width: f32, line_height: f32, cursor: RenderableCursor) -> Option<RectF> {
|
|
||||||
Some(RectF::new(
|
|
||||||
vec2f(
|
|
||||||
cursor.point.column.0 as f32 * em_width,
|
|
||||||
cursor.point.line.0 as f32 * line_height,
|
|
||||||
),
|
|
||||||
vec2f(em_width, line_height),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn draw_debug_grid(bounds: RectF, layout: &mut LayoutState, cx: &mut PaintContext) {
|
|
||||||
for col in 0..(bounds.0[2] / layout.em_width) as usize {
|
|
||||||
let rect_origin = bounds.origin() + vec2f(col as f32 * layout.em_width, 0.);
|
|
||||||
let line = RectF::new(rect_origin, vec2f(1., bounds.0[3]));
|
|
||||||
cx.scene.push_quad(Quad {
|
|
||||||
bounds: line,
|
|
||||||
background: Some(Color::green()),
|
|
||||||
border: Default::default(),
|
|
||||||
corner_radius: 0.,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
for row in 0..(bounds.0[3] / layout.line_height) as usize {
|
|
||||||
let rect_origin = bounds.origin() + vec2f(0., row as f32 * layout.line_height);
|
|
||||||
let line = RectF::new(rect_origin, vec2f(bounds.0[2], 1.));
|
|
||||||
cx.scene.push_quad(Quad {
|
|
||||||
bounds: line,
|
|
||||||
background: Some(Color::green()),
|
|
||||||
border: Default::default(),
|
|
||||||
corner_radius: 0.,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue