Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 99 |
1 files changed, 75 insertions, 24 deletions
diff --git a/src/main.rs b/src/main.rs index 95d2c5e..9ac477a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ #![feature( -unsized_const_params, + const_convert, + unsized_const_params, exact_div, yeet_expr, const_array, @@ -45,13 +46,15 @@ mod edi; mod error; mod git; mod gotolist; +mod killring; mod meta; mod rnd; +#[cfg(target_family = "unix")] mod runnables; mod sym; +#[cfg(target_family = "unix")] mod trm; -use std::any::TypeId; use std::fmt::{Debug, Display}; use std::hash::Hash; use std::mem::MaybeUninit; @@ -62,8 +65,10 @@ use Default::default; use NamedKey::*; use dsb::cell::Style; use dsb::{Cell, F}; +use env_logger::{Env, TimestampPrecision}; use fimg::Image; use libc::{atexit, signal}; +use log::LevelFilter; use lsp::Rq; use lsp_types::*; use rust_fsm::StateMachine; @@ -83,6 +88,7 @@ use winit::window::{ }; use crate::edi::Editor; +use crate::edi::lsp_mn::LSPM; use crate::edi::st::*; use crate::lsp::RqS; use crate::text::{TextArea, col, is_word}; @@ -100,10 +106,15 @@ fn main() { let _x = 4; // let x = HashMap::new(); unsafe { std::env::set_var("CARGO_UNSTABLE_RUSTC_UNICODE", "true") }; - env_logger::builder() - .filter_level(log::LevelFilter::Info) - .parse_env("GRA_LOG") - .init(); + env_logger::builder().filter_level(LevelFilter::Error).init(); + // .format_timestamp(Some(TimestampPrecision::Seconds)) + // .filter(Some("regex_cursor"), LevelFilter::Error) + // .filter(Some("calloop"), LevelFilter::Error) + // .filter(Some("tracing::span"), LevelFilter::Error) + // .parse_env(Env::new().default_filter_or("info")) + // .filter_level(log::LevelFilter::Info) + // .parse_env("G"RA_LOG") + // .init(); // lsp::x(); entry(EventLoop::new().unwrap()) } @@ -113,35 +124,55 @@ static mut CLICKING: bool = false; const BG: [u8; 3] = col!("#1f2430"); const FG: [u8; 3] = [204, 202, 194]; const BORDER: [u8; 3] = col!("#ffffff"); - +type KillRing = Vec<Box<[String]>>; +static mut __KR: MaybeUninit<KillRing> = MaybeUninit::uninit(); static mut __ED: MaybeUninit<Editor> = MaybeUninit::uninit(); +static mut __FREQ: MaybeUninit<Freq> = MaybeUninit::uninit(); +static mut __CLEAN: bool = false; extern "C" fn cleanup() { - unsafe { __ED.assume_init_mut().store().unwrap() }; + unsafe { + if __CLEAN == false { + __CLEAN = true; + + match __ED + .assume_init_read() + .store(__FREQ.assume_init_mut(), __KR.assume_init_mut()) + { + Ok(_) => {} + Err(e) => eprintln!("{e}"), + }; + } + } } extern "C" fn sigint(_: i32) { cleanup(); std::process::exit(12); } -type Freq = FxHashMap<TypeId, FxHashMap<u64, u16>>; +type FID = u8; +type Freq = FxHashMap<FID, FxHashMap<u64, u16>>; pub(crate) fn entry(event_loop: EventLoop) { + let mut lsp_mn = LSPM { four: default() }; + unsafe { - __ED.write(match Editor::new() { + let (ed, freq, kr) = match Editor::new(&mut lsp_mn) { Err(e) => { eprintln!("failure to launch: {e}"); return; } Ok(x) => x, - }) + }; + __ED.write(ed); + __FREQ.write(freq); + __KR.write(kr); }; assert_eq!(unsafe { atexit(cleanup) }, 0); unsafe { signal(libc::SIGINT, sigint as *const () as usize) }; let ed: &'static mut Editor = unsafe { __ED.assume_init_mut() }; - - let mut freq: Freq = default(); + let freq = unsafe { __FREQ.assume_init_mut() }; + let kr = unsafe { __KR.assume_init_mut() }; let ppem = 18.0; let ls = 20.0; // let ed = Box::leak(Box::new(ed)); - let mut fonts = dsb::Fonts::new( F::FontRef(*FONT, &[]), F::FontRef(*BFONT, &[]), @@ -161,9 +192,11 @@ pub(crate) fn entry(event_loop: EventLoop) { let app = winit_app::WinitAppBuilder::with_init( move |elwt| { let window = winit_app::make_window(elwt, |x| { + #[cfg(target_family = "unix")] + let x = x.with_platform_attributes( + Box::new(winit::platform::wayland::WindowAttributesWayland::default().with_name("com.bendn.gracilaria", "com.bendn.gracilaria")) + ).with_decorations(false); x.with_title("gracilaria") - .with_platform_attributes(Box::new(winit::platform::wayland::WindowAttributesWayland::default().with_name("com.bendn.gracilaria", "com.bendn.gracilaria"))) - .with_decorations(false) // .with_name("com.bendn.gracilaria", "") // .with_resize_increments(PhysicalSize::new(fw, fh)) .with_window_icon(Some( @@ -175,6 +208,7 @@ pub(crate) fn entry(event_loop: EventLoop) { .unwrap().into() )) }); + if let Some(x) = w.take() { x.send(window.clone()).unwrap(); } @@ -207,6 +241,15 @@ pub(crate) fn entry(event_loop: EventLoop) { .with_event_handler( move |(window, _context), surface, window_id, event, elwt| { elwt.set_control_flow(ControlFlow::Wait); + if let Some((.., c)) = &mut ed.lsp && let Some(c) = c.take() { + c.send(window.clone()).unwrap(); + } + + let lsp_mn = &mut lsp_mn; + for lem in &lsp_mn.four { + lem.1.status(); + // dbg!(lem.1); + } let (fw, fh) = dsb::dims(&FONT, ppem); let (c, r) = dsb::fit( &FONT, @@ -307,13 +350,13 @@ pub(crate) fn entry(event_loop: EventLoop) { if button == MouseButton::Left { unsafe { CLICKING = true }; } - ed.click(button, cursor_position, window.clone()); + ed.click(button, cursor_position, window.clone(), lsp_mn); window.request_redraw(); } WindowEvent::PointerButton { button: ButtonSource::Mouse(MouseButton::Left), .. - } => unsafe { CLICKING = false }, + } => unsafe { CLICKING = false }, WindowEvent::MouseWheel { device_id: _, delta: MouseScrollDelta::LineDelta(_, rows), @@ -322,6 +365,14 @@ pub(crate) fn entry(event_loop: EventLoop) { ed.scroll(rows); window.request_redraw(); } + WindowEvent::MouseWheel { + device_id: _, + delta: MouseScrollDelta::PixelDelta(PhysicalPosition { x:_, y }), + phase: _, + } => { + ed.scroll(y as f32 *5.0); + window.request_redraw(); + } WindowEvent::ModifiersChanged(modifiers) => { unsafe { MODIFIERS = modifiers.state() }; window.request_redraw(); @@ -342,7 +393,7 @@ pub(crate) fn entry(event_loop: EventLoop) { ) { return; } - if ed.keyboard(event, window,&mut freq).is_break() { + if ed.keyboard(event, window, freq, kr, lsp_mn).is_break() { elwt.exit(); } window.request_redraw(); @@ -466,11 +517,11 @@ rust_fsm::state_machine! { pub(crate) CompletionState => #[derive(Debug)] pub(crate) CompletionAction<'i> => pub(crate) CDo None => Click => None, None => K(Key<&'i str> => Key::Character(k @ ("." | ":"))) => Complete( - RqS<Complete, lsp_types::request::Completion, usize> => default() - ) [Request(CompletionContext => CompletionContext {trigger_kind: CompletionTriggerKind::TRIGGER_CHARACTER, trigger_character:Some(k.to_string()) })], - None => K(Key::Character(" ") if ctrl()) => Complete(default()) [Request(CompletionContext { trigger_kind: CompletionTriggerKind::INVOKED, trigger_character:None })], + RqS<Complete, lsp_types::CompletionRequest, usize> => default() + ) [Request(CompletionContext => CompletionContext {trigger_kind: CompletionTriggerKind::TriggerCharacter, trigger_character:Some(k.to_string()) })], + None => K(Key::Character(" ") if ctrl()) => Complete(default()) [Request(CompletionContext { trigger_kind: CompletionTriggerKind::Invoked, trigger_character:None })], None => K(Key::Character(x) if x.chars().all(char::is_alphabetic) - && !matches!(x, "w"|"a"|"s"|"d" if alt())) => Complete(default()) [Request(CompletionContext { trigger_kind: CompletionTriggerKind::INVOKED, trigger_character:None })], + && !matches!(x, "w"|"a"|"s"|"d" if alt())) => Complete(default()) [Request(CompletionContext { trigger_kind: CompletionTriggerKind::Invoked, trigger_character:None })], None => K(_) => _, // when @@ -488,7 +539,7 @@ rust_fsm::state_machine! { Complete(Rq { result: Some(x), .. }) => K(Key::Named(NamedKey::Enter)) => None [Finish(Complete => x)], - Complete(_x) => K(_) => _ [Request(CompletionContext { trigger_kind: CompletionTriggerKind::TRIGGER_FOR_INCOMPLETE_COMPLETIONS, trigger_character:None })], + Complete(_x) => K(_) => _ [Request(CompletionContext { trigger_kind: CompletionTriggerKind::TriggerForIncompleteCompletions, trigger_character:None })], } use complete::Complete; |