diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2023-12-27 10:18:24 -0800 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2023-12-27 10:18:24 -0800 |
| commit | 82094d878c73532d9ca7b6d2d6fcf91696d59ee8 (patch) | |
| tree | 3170d253859af590bf88d7b49d9c9ab59634ef32 /src | |
| parent | c280882749e4126e8863e1e9869e16c5c46197a7 (diff) | |
| download | editor-82094d878c73532d9ca7b6d2d6fcf91696d59ee8.tar.zst | |
Put the terminal in raw mode.
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 2 | ||||
| -rw-r--r-- | src/term.rs | 65 |
2 files changed, 56 insertions, 11 deletions
diff --git a/src/main.rs b/src/main.rs index a516ea4..63ae538 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,8 @@ use std::ffi::{OsStr, OsString}; use std::path::Path; fn edit(file: &OsStr) -> Result<(), String> { + let _raw_handle = term::raw(); + let r = match Rope::open(Path::new(file)) { Ok(r) => r, Err(err) => { diff --git a/src/term.rs b/src/term.rs index f8246fd..149f00f 100644 --- a/src/term.rs +++ b/src/term.rs @@ -1,18 +1,61 @@ -use libc::{c_int, winsize}; +use libc::{termios, winsize}; pub fn size() -> Option<winsize> { - let mut window: winsize = winsize { - ws_row: 0, - ws_col: 0, - ws_xpixel: 0, - ws_ypixel: 0, - }; - let result: c_int; unsafe { - result = libc::ioctl(1, libc::TIOCGWINSZ, &mut window); + let mut window: winsize = std::mem::zeroed(); + if libc::ioctl(1, libc::TIOCGWINSZ, &mut window) < 0 { + return None; + } + return Some(window); + } +} + +fn get_attr() -> Option<termios> { + unsafe { + let mut attr: termios = std::mem::zeroed(); + if libc::tcgetattr(1, &mut attr) < 0 { + return None; + } + return Some(attr); } - if result < 0 { +} + +fn set_attr(attrs: &termios) -> Option<()> { + unsafe { + if libc::tcsetattr(1, libc::TCSANOW, attrs) < 0 { + return None; + } + return Some(()); + } +} + +fn make_raw() -> termios { + unsafe { + let mut attr: termios = std::mem::zeroed(); + libc::cfmakeraw(&mut attr); + return attr; + } +} + +pub struct RawHandle { + old: termios, +} + +impl Drop for RawHandle { + fn drop(&mut self) { + set_attr(&self.old); + } +} + +pub fn raw() -> Option<RawHandle> { + let old = match get_attr() { + Some(old) => old, + None => { + return None; + } + }; + if let None = set_attr(&make_raw()) { return None; } - return Some(window); + return Some(RawHandle { old: old }); } |
