Set the cursor position appropriately.
This makes international input popups get placed correctly for terminals that do that.
This commit is contained in:
parent
0b8c590dea
commit
f582818387
|
@ -357,6 +357,7 @@ impl TermUI {
|
||||||
&line[..],
|
&line[..],
|
||||||
STYLE_INFO,
|
STYLE_INFO,
|
||||||
);
|
);
|
||||||
|
self.screen.set_cursor(prefix.len() + 1, 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Handle input
|
// Handle input
|
||||||
|
@ -551,6 +552,7 @@ impl TermUI {
|
||||||
for c in editor.cursors.iter() {
|
for c in editor.cursors.iter() {
|
||||||
if char_index >= c.range.0 && char_index <= c.range.1 {
|
if char_index >= c.range.0 && char_index <= c.range.1 {
|
||||||
at_cursor = true;
|
at_cursor = true;
|
||||||
|
self.screen.set_cursor(px as usize, py as usize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -639,6 +641,7 @@ impl TermUI {
|
||||||
{
|
{
|
||||||
self.screen
|
self.screen
|
||||||
.draw(px as usize, py as usize, " ", STYLE_CURSOR);
|
.draw(px as usize, py as usize, " ", STYLE_CURSOR);
|
||||||
|
self.screen.set_cursor(px as usize, py as usize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use std;
|
use std;
|
||||||
use std::cell::RefCell;
|
use std::cell::{Cell, RefCell};
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::{BufWriter, Write};
|
use std::io::{BufWriter, Write};
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ use super::smallstring::SmallString;
|
||||||
pub(crate) struct Screen {
|
pub(crate) struct Screen {
|
||||||
out: RefCell<BufWriter<io::Stdout>>,
|
out: RefCell<BufWriter<io::Stdout>>,
|
||||||
buf: RefCell<Vec<Option<(Style, SmallString)>>>,
|
buf: RefCell<Vec<Option<(Style, SmallString)>>>,
|
||||||
|
main_cursor: Cell<(u16, u16)>,
|
||||||
w: usize,
|
w: usize,
|
||||||
h: usize,
|
h: usize,
|
||||||
}
|
}
|
||||||
|
@ -40,6 +41,7 @@ impl Screen {
|
||||||
Screen {
|
Screen {
|
||||||
out: RefCell::new(out),
|
out: RefCell::new(out),
|
||||||
buf: RefCell::new(buf),
|
buf: RefCell::new(buf),
|
||||||
|
main_cursor: Cell::new((0, 0)),
|
||||||
w: w as usize,
|
w: w as usize,
|
||||||
h: h 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.
|
// Make sure everything is written out from the buffer.
|
||||||
out.flush().unwrap();
|
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) {
|
pub(crate) fn draw(&self, x: usize, y: usize, text: &str, style: Style) {
|
||||||
if y < self.h {
|
if y < self.h {
|
||||||
let mut buf = self.buf.borrow_mut();
|
let mut buf = self.buf.borrow_mut();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user