diff options
| author | Mroik <mroik@delayed.space> | 2025-01-28 00:59:37 +0100 |
|---|---|---|
| committer | Mroik <mroik@delayed.space> | 2025-02-01 19:33:04 +0100 |
| commit | a8e4918d8c7b9cfd7dfbd5e2771c3c52cbaaf601 (patch) | |
| tree | 939d5bfcf6f5f414d928eb6ffe60b3898de2ecc4 /src | |
| parent | 8d31f8c910c426cb146c833dd89f75abd2f7c076 (diff) | |
Fix caret position on line wrap
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.rs | 10 | ||||
| -rw-r--r-- | src/event.rs | 2 |
2 files changed, 10 insertions, 2 deletions
@@ -8,7 +8,7 @@ use crossterm::{ cursor::MoveTo, style::{Color, Print, SetForegroundColor}, terminal::{ - disable_raw_mode, enable_raw_mode, Clear, ClearType, EnterAlternateScreen, + self, disable_raw_mode, enable_raw_mode, Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen, }, ExecutableCommand, QueueableCommand, @@ -102,6 +102,10 @@ impl App { Event::KeyPress(k) => self.handle_keypress(k).await?, Event::Backspace => self.handle_backspace().await, Event::Render => self.render().await?, + Event::ForceRender => { + self.should_render = true; + self.render().await?; + } } if event != Event::Render { @@ -137,6 +141,7 @@ impl App { return Ok(()); } + let (col, _) = terminal::size()?; self.stdout .queue(Clear(ClearType::All)) .unwrap() @@ -188,7 +193,8 @@ impl App { let to_do = self.quote[self.state.current + 1..].join(" "); self.stdout.queue(Print(&to_do))?.queue(Print("\n"))?; - self.stdout.queue(MoveTo(cur_loc as u16, 0))?; + self.stdout + .queue(MoveTo(cur_loc as u16 % col, cur_loc as u16 / col))?; self.stdout.flush()?; self.should_render = false; diff --git a/src/event.rs b/src/event.rs index 400fcb6..d21d7b6 100644 --- a/src/event.rs +++ b/src/event.rs @@ -11,6 +11,7 @@ pub enum Event { KeyPress(char), Backspace, Render, + ForceRender, } // TODO @@ -22,6 +23,7 @@ pub async fn handle_input(sender: &Sender<Event>) -> Result<(), Box<dyn Error>> //crossterm::event::Event::FocusGained => todo!(), //crossterm::event::Event::FocusLost => todo!(), //crossterm::event::Event::Paste(_) => todo!(), + crossterm::event::Event::Resize(_, _) => sender.send(Event::ForceRender).await?, crossterm::event::Event::Key(key_event) => { if key_event.code == KeyCode::Char('c') && key_event.modifiers == KeyModifiers::CONTROL |
