diff --git a/src/window.rs b/src/window.rs index c362202..56e0b00 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,13 +1,9 @@ use std::sync::Arc; use std::sync::atomic::Ordering; use std::time::{Duration, Instant}; +use std::thread::sleep; use image::{load_from_memory, GenericImageView, Pixel}; -use skulpin::{CoordinateSystem, RendererBuilder, PresentMode}; -use skulpin::winit::dpi::{LogicalSize, LogicalPosition}; -use skulpin::winit::event::{ElementState, Event, MouseScrollDelta, StartCause, WindowEvent, ModifiersState}; -use skulpin::winit::event_loop::{ControlFlow, EventLoop}; -use skulpin::winit::window::{Icon, WindowBuilder}; use log::{info, debug, trace, error}; use crate::bridge::{construct_keybinding_string, BRIDGE, UiCommand}; @@ -31,34 +27,37 @@ fn handle_new_grid_size(new_size: LogicalSize, renderer: &Renderer) { } pub fn ui_loop() { + let sdl_context = sdl2::init()?; + let video_subsystem = sdl_context.video()?; + + let (width, height) = INITIAL_DIMENSIONS; + + let event_loop = EventLoop::<()>::with_user_event(); let mut renderer = Renderer::new(); - let (width, height) = INITIAL_DIMENSIONS; let logical_size = LogicalSize::new( (width as f32 * renderer.font_width) as f64, (height as f32 * renderer.font_height + 1.0) as f64 ); - let icon = { - let icon_data = Asset::get("nvim.ico").expect("Failed to read icon data"); - let icon = load_from_memory(&icon_data).expect("Failed to parse icon data"); - let (width, height) = icon.dimensions(); - let mut rgba = Vec::with_capacity((width * height) as usize * 4); - for (_, _, pixel) in icon.pixels() { - rgba.extend_from_slice(&pixel.to_rgba().0); - } - Icon::from_rgba(rgba, width, height).expect("Failed to create icon object") - }; - info!("icon created"); - - let mut title = "Neovide".to_string(); - let window = Arc::new(WindowBuilder::new() - .with_title(&title) - .with_inner_size(logical_size) - .with_window_icon(Some(icon)) - .build(&event_loop) - .expect("Failed to create window")); + // let icon = { + // let icon_data = Asset::get("nvim.ico").expect("Failed to read icon data"); + // let icon = load_from_memory(&icon_data).expect("Failed to parse icon data"); + // let (width, height) = icon.dimensions(); + // let mut rgba = Vec::with_capacity((width * height) as usize * 4); + // for (_, _, pixel) in icon.pixels() { + // rgba.extend_from_slice(&pixel.to_rgba().0); + // } + // Icon::from_rgba(rgba, width, height).expect("Failed to create icon object") + // }; + // info!("icon created"); + + let mut window = video_subsystem.window("Neovide", width, height) + .position_centered() + .vulkan() + .build() + .expect("Failed to create window"); info!("window created"); let mut skulpin_renderer = RendererBuilder::new() @@ -77,6 +76,36 @@ pub fn ui_loop() { let mut next_char_modifiers = ModifiersState::empty(); info!("Starting window event loop"); + let mut event_pump = sdl_context.event_pump()?; + loop { + let frame_start = Instant::now(); + + let editor_title = { EDITOR.lock().title.clone() }; + if title != editor_title { + title = editor_title; + window.set_title(&title); + } + + if REDRAW_SCHEDULER.should_draw() || SETTINGS.get("no_idle").read_bool() { + debug!("Render Triggered"); + if skulpin_renderer.draw(&window, |canvas, coordinate_system_helper| { + if renderer.draw(canvas, coordinate_system_helper) { + handle_new_grid_size(window.inner_size().to_logical(window.scale_factor()), &renderer) + } + }).is_err() { + error!("Render failed. Closing"); + *control_flow = ControlFlow::Exit; + return; + } + } + + let elapsed = frame_start.since(); + let frame_length = Duration::from_secs_f32(1.0 / 60.0); + if elapsed < frame_length { + sleep(frame_length - elapsed); + } + } + event_loop.run(move |event, _window_target, control_flow| { trace!("Window Event: {:?}", event); match event { @@ -206,26 +235,6 @@ pub fn ui_loop() { } Event::RedrawRequested { .. } => { - let frame_start = Instant::now(); - - let editor_title = { EDITOR.lock().title.clone() }; - if title != editor_title { - title = editor_title; - window.set_title(&title); - } - - if REDRAW_SCHEDULER.should_draw() || SETTINGS.get("no_idle").read_bool() { - debug!("Render Triggered"); - if skulpin_renderer.draw(&window, |canvas, coordinate_system_helper| { - if renderer.draw(canvas, coordinate_system_helper) { - handle_new_grid_size(window.inner_size().to_logical(window.scale_factor()), &renderer) - } - }).is_err() { - error!("Render failed. Closing"); - *control_flow = ControlFlow::Exit; - return; - } - } *control_flow = ControlFlow::WaitUntil(frame_start + Duration::from_secs_f32(1.0 / 60.0)); },