diff --git a/src/bridge/keybindings.rs b/src/bridge/keybindings.rs index 5c8d878..692cd65 100644 --- a/src/bridge/keybindings.rs +++ b/src/bridge/keybindings.rs @@ -2,7 +2,7 @@ use log::trace; // use skulpin::winit::event::{ElementState, KeyboardInput, ModifiersState, VirtualKeyCode}; use skulpin::sdl2::keyboard::{Keycode, Mod}; -fn parse_keycode(keycode: Keycode) -> Option<(&'static str, bool)> { +pub fn parse_keycode(keycode: Keycode) -> Option<(&'static str, bool)> { macro_rules! unsupported_key { ($name: ident) => {{ if cfg!(debug_assertions) { @@ -15,10 +15,10 @@ fn parse_keycode(keycode: Keycode) -> Option<(&'static str, bool)> { // Documentation: https://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlkey.html match keycode { Keycode::Backspace => Some(("BS", true)), - Keycode::Tab => Some((" ", false)), - Keycode::Return => Some(("\n", false)), - Keycode::Escape => Some(("ESC", true)), - Keycode::Space => Some((" ", true)), + Keycode::Tab => Some(("Tab", true)), + Keycode::Return => Some(("Enter", true)), + Keycode::Escape => Some(("Esc", true)), + Keycode::Space => Some((" ", false)), Keycode::Exclaim => Some(("!", false)), Keycode::Quotedbl => Some(("\"", false)), Keycode::Hash => Some(("#", false)), @@ -114,7 +114,7 @@ fn parse_keycode(keycode: Keycode) -> Option<(&'static str, bool)> { Keycode::KpMultiply => Some(("*", true)), Keycode::KpMinus => Some(("-", true)), Keycode::KpPlus => Some(("+", true)), - Keycode::KpEnter => Some(("\n", true)), + Keycode::KpEnter => Some(("Enter", true)), Keycode::Kp0 => Some(("0", false)), Keycode::Kp1 => Some(("1", false)), Keycode::Kp2 => Some(("2", false)), @@ -179,7 +179,7 @@ fn parse_keycode(keycode: Keycode) -> Option<(&'static str, bool)> { Keycode::KpRightParen => Some((")", false)), Keycode::KpLeftBrace => Some(("[", false)), Keycode::KpRightBrace => Some(("]", false)), - Keycode::KpTab => Some((" ", false)), + Keycode::KpTab => Some(("TAB", true)), Keycode::KpBackspace => Some(("BS", true)), Keycode::KpA => Some(("A", false)), Keycode::KpB => Some(("B", false)), @@ -248,7 +248,7 @@ fn parse_keycode(keycode: Keycode) -> Option<(&'static str, bool)> { Keycode::KbdIllumDown => unsupported_key!(KbdIllumDown), Keycode::KbdIllumUp => unsupported_key!(KbdIllumUp), Keycode::Eject => unsupported_key!(Eject), - Keycode::Sleep => unsupported_key!(Sleep), + Keycode::Sleep => unsupported_key!(Sleep) } } diff --git a/src/window.rs b/src/window.rs index 8d1b9f2..3400619 100644 --- a/src/window.rs +++ b/src/window.rs @@ -6,9 +6,10 @@ use skulpin::LogicalSize; use skulpin::sdl2; use skulpin::sdl2::EventPump; use skulpin::sdl2::event::Event; +use skulpin::sdl2::keyboard::Mod; use skulpin::{RendererBuilder, PresentMode, CoordinateSystem}; -use crate::bridge::{construct_keybinding_string, BRIDGE, UiCommand}; +use crate::bridge::{parse_keycode, append_modifiers, BRIDGE, UiCommand}; use crate::renderer::Renderer; use crate::redraw_scheduler::REDRAW_SCHEDULER; use crate::editor::EDITOR; @@ -54,6 +55,7 @@ pub fn ui_loop() { let mut window = video_subsystem.window("Neovide", logical_size.width, logical_size.height) .position_centered() + .allow_highdpi() .vulkan() .build() .expect("Failed to create window"); @@ -63,7 +65,7 @@ pub fn ui_loop() { .prefer_integrated_gpu() .use_vulkan_debug_layer(true) .present_mode_priority(vec![PresentMode::Mailbox, PresentMode::Immediate]) - .coordinate_system(CoordinateSystem::Logical) + .coordinate_system(CoordinateSystem::Physical) .build(&window) .expect("Failed to create renderer"); info!("renderer created"); @@ -90,12 +92,37 @@ pub fn ui_loop() { for event in event_pump.poll_iter() { match event { Event::Quit {..} => break 'running, + Event::KeyDown { + keycode: Some(keycode), + keymod: modifiers, + .. + } => { + dbg!(keycode); + if let Some((key_text, special)) = parse_keycode(keycode) { + let will_text_input = + !modifiers.contains(Mod::LCTRLMOD) && + !modifiers.contains(Mod::RCTRLMOD) && + !modifiers.contains(Mod::LALTMOD) && + !modifiers.contains(Mod::RALTMOD) && + !modifiers.contains(Mod::LGUIMOD) && + !modifiers.contains(Mod::RGUIMOD); + if will_text_input && !special { + break; + } + + BRIDGE.queue_command(UiCommand::Keyboard(append_modifiers(modifiers, key_text, special))); + } + }, + Event::TextInput { + text, + .. + } => BRIDGE.queue_command(UiCommand::Keyboard(text)), _ => {} } } + debug!("Render Triggered"); 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.vulkan_drawable_size().into(), &renderer) @@ -107,7 +134,7 @@ pub fn ui_loop() { } let elapsed = frame_start.elapsed(); - let frame_length = Duration::from_secs_f32(1.0 / 60.0); + let frame_length = Duration::from_secs_f32(1.0 / 30.0); if elapsed < frame_length { sleep(frame_length - elapsed); }