Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs99
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;