From f582818387839079a2395754c701b831ec3701e1 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Tue, 4 Feb 2020 20:54:38 +0900 Subject: [PATCH] Set the cursor position appropriately. This makes international input popups get placed correctly for terminals that do that. --- src/term_ui/mod.rs | 3 +++ src/term_ui/screen.rs | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/term_ui/mod.rs b/src/term_ui/mod.rs index ef21de7..e5deac2 100644 --- a/src/term_ui/mod.rs +++ b/src/term_ui/mod.rs @@ -357,6 +357,7 @@ impl TermUI { &line[..], STYLE_INFO, ); + self.screen.set_cursor(prefix.len() + 1, 0); }, // Handle input @@ -551,6 +552,7 @@ impl TermUI { for c in editor.cursors.iter() { if char_index >= c.range.0 && char_index <= c.range.1 { at_cursor = true; + self.screen.set_cursor(px as usize, py as usize); } } @@ -639,6 +641,7 @@ impl TermUI { { self.screen .draw(px as usize, py as usize, " ", STYLE_CURSOR); + self.screen.set_cursor(px as usize, py as usize); } } } diff --git a/src/term_ui/screen.rs b/src/term_ui/screen.rs index 32169a2..7409716 100644 --- a/src/term_ui/screen.rs +++ b/src/term_ui/screen.rs @@ -1,5 +1,5 @@ use std; -use std::cell::RefCell; +use std::cell::{Cell, RefCell}; use std::io; use std::io::{BufWriter, Write}; @@ -15,6 +15,7 @@ use super::smallstring::SmallString; pub(crate) struct Screen { out: RefCell>, buf: RefCell>>, + main_cursor: Cell<(u16, u16)>, w: usize, h: usize, } @@ -40,6 +41,7 @@ impl Screen { Screen { out: RefCell::new(out), buf: RefCell::new(buf), + main_cursor: Cell::new((0, 0)), w: w as usize, h: h as usize, } @@ -113,10 +115,21 @@ impl Screen { } } + let cursor_pos = self.main_cursor.get(); + queue!(out, crossterm::cursor::MoveTo(cursor_pos.0, cursor_pos.1)).unwrap(); + self.main_cursor.set((0, 0)); + // Make sure everything is written out from the buffer. out.flush().unwrap(); } + pub(crate) fn set_cursor(&self, x: usize, y: usize) { + self.main_cursor.set(( + x.min(self.w.saturating_sub(1)) as u16, + y.min(self.h.saturating_sub(1)) as u16, + )); + } + pub(crate) fn draw(&self, x: usize, y: usize, text: &str, style: Style) { if y < self.h { let mut buf = self.buf.borrow_mut();