use std::{error::Error, rc::Rc};
use winit::{
application::ApplicationHandler,
event::{Modifiers, WindowEvent},
event_loop::{ActiveEventLoop, ControlFlow, EventLoop, EventLoopProxy},
keyboard::{Key, ModifiersState, NamedKey},
};
use crate::{
json_ui::{Request, Response, Rpc},
kakoune::Kakoune,
render::Renderer,
};
mod json_ui;
mod kakoune;
mod render;
const WIDTH: u32 = 600;
const HEIGHT: u32 = 400;
Exit,
line_face: json_ui::Face,
modifiers: Modifiers,
kakoune: Kakoune,
ui: Ui,
}
struct App {
render_state: Option<Renderer>,
kakoune: Kakoune::new(evp),
ui: Default::default(),
let lines = (size.height / render.line_height()) - 1;
let cols = 512;
_ = self.kakoune.send_response(Response::Resize(lines, cols));
}
}
self.kakoune
.send_response(Response::Keys(vec![key]))
.unwrap();
WindowEvent::ModifiersChanged(modifiers) => {
self.modifiers = modifiers;
}
WindowEvent::KeyboardInput { event, .. } => {
if !event.state.is_pressed() {
return;
}
if let Some(key) = make_kakoune_key(event.logical_key, self.modifiers.state()) {
}
}
AppMessage::Exit => {
event_loop.exit();
}
}
}
_ => {}
},
self.ui.line_face = default_face;
if let Some(render) = &self.render_state {
render.window.request_redraw();
self.ui.prompt_line = prompt_line.into();
self.ui.mode_line = mode_line.into();
Request::DrawStatus(prompt_line, mode_line, default_face) => {
}
}
self.ui.default_face = default_face;
if let Some(render) = &self.render_state {
render.window.request_redraw();
self.ui.lines = lines.into_iter().map(From::from).collect();
AppMessage::Kakoune(kak) => match kak {
Request::Draw(lines, default_face, _padding_face) => {
match event {
fn user_event(&mut self, event_loop: &ActiveEventLoop, event: AppMessage) {
}
app.kakoune.join();
event_loop.run_app(&mut app).unwrap();
let mut app = App::new(event_loop.create_proxy()).unwrap();
event_loop.set_control_flow(ControlFlow::Wait);
let event_loop = EventLoop::<AppMessage>::with_user_event().build().unwrap();
}
fn main() {
_ => {}
}
}
}
}
if let Some(render) = self.render_state.as_mut() {
render
.pixels
.resize_buffer(size.width, size.height)
.unwrap();
render
.pixels
.resize_surface(size.width, size.height)
.unwrap();
render.size = size.into();
WindowEvent::Resized(size) => {
}
}
WindowEvent::CloseRequested => {
event_loop.exit();
}
if let Some(render) = self.render_state.as_mut() {
render.render(&self.ui).unwrap();
_window_id: winit::window::WindowId,
event: winit::event::WindowEvent,
) {
match event {
WindowEvent::RedrawRequested => {
event_loop: &ActiveEventLoop,
}
fn window_event(
&mut self,
self.render_state = Renderer::new(event_loop).ok();
fn resumed(&mut self, event_loop: &ActiveEventLoop) {
impl ApplicationHandler<AppMessage> for App {
_ => None,
}
}
Key::Character(c) if c == "+" => Some(add_modifiers("plus", state, false)),
Key::Character(c) if c == "-" => Some(add_modifiers("minus", state, false)),
Key::Character(c) if c == "<" => Some(add_modifiers("lt", state, false)),
Key::Character(c) if c == ">" => Some(add_modifiers("gt", state, false)),
Key::Character(c) => Some(add_modifiers(&c, state, false)),
Key::Named(NamedKey::F1) => Some(add_modifiers("F1", state, true)),
Key::Named(NamedKey::F2) => Some(add_modifiers("F2", state, true)),
Key::Named(NamedKey::F3) => Some(add_modifiers("F3", state, true)),
Key::Named(NamedKey::F4) => Some(add_modifiers("F4", state, true)),
Key::Named(NamedKey::F5) => Some(add_modifiers("F5", state, true)),
Key::Named(NamedKey::F6) => Some(add_modifiers("F6", state, true)),
Key::Named(NamedKey::F7) => Some(add_modifiers("F7", state, true)),
Key::Named(NamedKey::F8) => Some(add_modifiers("F8", state, true)),
Key::Named(NamedKey::F9) => Some(add_modifiers("F9", state, true)),
Key::Named(NamedKey::F10) => Some(add_modifiers("F10", state, true)),
Key::Named(NamedKey::F11) => Some(add_modifiers("F11", state, true)),
Key::Named(NamedKey::F12) => Some(add_modifiers("F12", state, true)),
Key::Named(NamedKey::PageUp) => Some(add_modifiers("pageup", state, true)),
Key::Named(NamedKey::PageDown) => Some(add_modifiers("pagedown", state, true)),
Key::Named(NamedKey::Home) => Some(add_modifiers("home", state, true)),
Key::Named(NamedKey::End) => Some(add_modifiers("end", state, true)),
Key::Named(NamedKey::Insert) => Some(add_modifiers("ins", state, true)),
Key::Named(NamedKey::ArrowUp) => Some(add_modifiers("up", state, true)),
Key::Named(NamedKey::ArrowDown) => Some(add_modifiers("down", state, true)),
Key::Named(NamedKey::ArrowLeft) => Some(add_modifiers("left", state, true)),
Key::Named(NamedKey::ArrowRight) => Some(add_modifiers("right", state, true)),
Key::Named(NamedKey::Space) => Some(add_modifiers("space", state, true)),
Key::Named(NamedKey::Enter) => Some(add_modifiers("ret", state, true)),
Key::Named(NamedKey::Tab) => Some(add_modifiers("tab", state, true)),
Key::Named(NamedKey::Backspace) => Some(add_modifiers("backspace", state, true)),
Key::Named(NamedKey::Delete) => Some(add_modifiers("del", state, true)),
Key::Named(NamedKey::Escape) => Some(add_modifiers("esc", state, true)),
fn make_kakoune_key(key: Key, state: ModifiersState) -> Option<String> {
match key {
}
res.push('>');
res
res.push_str(key_name);
}
res.push_str("s-");
}
if state.alt_key() {
res.push_str("a-")
if use_shift && state.shift_key() {
let mut res = String::new();
res.push('<');
if state.control_key() {
res.push_str("c-");
}
fn add_modifiers(key_name: &str, state: ModifiersState, use_shift: bool) -> String {
}
}
})
modifiers: Modifiers::default(),
Ok(Self {
render_state: None,
fn new(evp: EventLoopProxy<AppMessage>) -> Result<Self, Box<dyn Error>> {
impl App {
}
default_face: json_ui::Face,
lines: Vec<RcLine>,
prompt_line: RcLine,
mode_line: RcLine,
#[derive(Default)]
struct Ui {
}
Kakoune(json_ui::Request),
#[derive(Debug)]
enum AppMessage {
type RcLine = Rc<[json_ui::Atom]>;