From c4a427f73256f0ce4f067dcf2f970936d01bfdc6 Mon Sep 17 00:00:00 2001 From: HampusM Date: Wed, 25 Oct 2023 22:02:59 +0200 Subject: feat(glfw): add get keyboard input --- glfw/src/window.rs | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/glfw/src/window.rs b/glfw/src/window.rs index 879d17e..a492c20 100644 --- a/glfw/src/window.rs +++ b/glfw/src/window.rs @@ -1,5 +1,6 @@ use std::cell::RefCell; use std::ffi::{c_int, CStr, CString}; +use std::hint::unreachable_unchecked; use std::panic::catch_unwind; use std::ptr::null_mut; @@ -125,6 +126,30 @@ impl Window ); } } + + /// Returns the last reported state of a keyboard key. + /// + /// # Errors + /// Will return `Err` if a GLFW error occurs. + pub fn get_key(&self, key: Key) -> Result + { + // SAFETY: The initialize function (called when the window is created) makes sure + // the current thread is the main thread + let state = unsafe { crate::ffi::glfwGetKey(self.handle, key as i32) }; + + get_glfw_error()?; + + Ok(match state { + crate::ffi::GLFW_PRESS => KeyState::Pressed, + crate::ffi::GLFW_RELEASE => KeyState::Released, + _ => { + // SAFETY: glfwGetKey can only return GLFW_PRESS or GLFW_RELEASE + unsafe { + unreachable_unchecked(); + } + } + }) + } } /// [`Window`] builder. @@ -227,6 +252,140 @@ pub struct Size pub height: u32, } +#[derive(Debug, Clone, Copy)] +#[repr(i32)] +pub enum Key +{ + // Unknown = crate::ffi::GLFW_KEY_UNKNOWN, + Space = crate::ffi::GLFW_KEY_SPACE, + Apostrophe = crate::ffi::GLFW_KEY_APOSTROPHE, + Comma = crate::ffi::GLFW_KEY_COMMA, + Minus = crate::ffi::GLFW_KEY_MINUS, + Period = crate::ffi::GLFW_KEY_PERIOD, + Slash = crate::ffi::GLFW_KEY_SLASH, + Digit0 = crate::ffi::GLFW_KEY_0, + Digit1 = crate::ffi::GLFW_KEY_1, + Digit2 = crate::ffi::GLFW_KEY_2, + Digit3 = crate::ffi::GLFW_KEY_3, + Digit4 = crate::ffi::GLFW_KEY_4, + Digit5 = crate::ffi::GLFW_KEY_5, + Digit6 = crate::ffi::GLFW_KEY_6, + Digit7 = crate::ffi::GLFW_KEY_7, + Digit8 = crate::ffi::GLFW_KEY_8, + Digit9 = crate::ffi::GLFW_KEY_9, + Semicolon = crate::ffi::GLFW_KEY_SEMICOLON, + Equal = crate::ffi::GLFW_KEY_EQUAL, + A = crate::ffi::GLFW_KEY_A, + B = crate::ffi::GLFW_KEY_B, + C = crate::ffi::GLFW_KEY_C, + D = crate::ffi::GLFW_KEY_D, + E = crate::ffi::GLFW_KEY_E, + F = crate::ffi::GLFW_KEY_F, + G = crate::ffi::GLFW_KEY_G, + H = crate::ffi::GLFW_KEY_H, + I = crate::ffi::GLFW_KEY_I, + J = crate::ffi::GLFW_KEY_J, + K = crate::ffi::GLFW_KEY_K, + L = crate::ffi::GLFW_KEY_L, + M = crate::ffi::GLFW_KEY_M, + N = crate::ffi::GLFW_KEY_N, + O = crate::ffi::GLFW_KEY_O, + P = crate::ffi::GLFW_KEY_P, + Q = crate::ffi::GLFW_KEY_Q, + R = crate::ffi::GLFW_KEY_R, + S = crate::ffi::GLFW_KEY_S, + T = crate::ffi::GLFW_KEY_T, + U = crate::ffi::GLFW_KEY_U, + V = crate::ffi::GLFW_KEY_V, + W = crate::ffi::GLFW_KEY_W, + X = crate::ffi::GLFW_KEY_X, + Y = crate::ffi::GLFW_KEY_Y, + Z = crate::ffi::GLFW_KEY_Z, + LeftBracket = crate::ffi::GLFW_KEY_LEFT_BRACKET, + Backslash = crate::ffi::GLFW_KEY_BACKSLASH, + RightBracket = crate::ffi::GLFW_KEY_RIGHT_BRACKET, + GraveAccent = crate::ffi::GLFW_KEY_GRAVE_ACCENT, + World1 = crate::ffi::GLFW_KEY_WORLD_1, + World2 = crate::ffi::GLFW_KEY_WORLD_2, + Escape = crate::ffi::GLFW_KEY_ESCAPE, + Enter = crate::ffi::GLFW_KEY_ENTER, + Tab = crate::ffi::GLFW_KEY_TAB, + Backspace = crate::ffi::GLFW_KEY_BACKSPACE, + Insert = crate::ffi::GLFW_KEY_INSERT, + Delete = crate::ffi::GLFW_KEY_DELETE, + Right = crate::ffi::GLFW_KEY_RIGHT, + Left = crate::ffi::GLFW_KEY_LEFT, + Down = crate::ffi::GLFW_KEY_DOWN, + Up = crate::ffi::GLFW_KEY_UP, + PageUp = crate::ffi::GLFW_KEY_PAGE_UP, + PageDown = crate::ffi::GLFW_KEY_PAGE_DOWN, + Home = crate::ffi::GLFW_KEY_HOME, + End = crate::ffi::GLFW_KEY_END, + CapsLock = crate::ffi::GLFW_KEY_CAPS_LOCK, + ScrollLock = crate::ffi::GLFW_KEY_SCROLL_LOCK, + NumLock = crate::ffi::GLFW_KEY_NUM_LOCK, + PrintScreen = crate::ffi::GLFW_KEY_PRINT_SCREEN, + Pause = crate::ffi::GLFW_KEY_PAUSE, + F1 = crate::ffi::GLFW_KEY_F1, + F2 = crate::ffi::GLFW_KEY_F2, + F3 = crate::ffi::GLFW_KEY_F3, + F4 = crate::ffi::GLFW_KEY_F4, + F5 = crate::ffi::GLFW_KEY_F5, + F6 = crate::ffi::GLFW_KEY_F6, + F7 = crate::ffi::GLFW_KEY_F7, + F8 = crate::ffi::GLFW_KEY_F8, + F9 = crate::ffi::GLFW_KEY_F9, + F10 = crate::ffi::GLFW_KEY_F10, + F11 = crate::ffi::GLFW_KEY_F11, + F12 = crate::ffi::GLFW_KEY_F12, + F13 = crate::ffi::GLFW_KEY_F13, + F14 = crate::ffi::GLFW_KEY_F14, + F15 = crate::ffi::GLFW_KEY_F15, + F16 = crate::ffi::GLFW_KEY_F16, + F17 = crate::ffi::GLFW_KEY_F17, + F18 = crate::ffi::GLFW_KEY_F18, + F19 = crate::ffi::GLFW_KEY_F19, + F20 = crate::ffi::GLFW_KEY_F20, + F21 = crate::ffi::GLFW_KEY_F21, + F22 = crate::ffi::GLFW_KEY_F22, + F23 = crate::ffi::GLFW_KEY_F23, + F24 = crate::ffi::GLFW_KEY_F24, + F25 = crate::ffi::GLFW_KEY_F25, + Kp0 = crate::ffi::GLFW_KEY_KP_0, + Kp1 = crate::ffi::GLFW_KEY_KP_1, + Kp2 = crate::ffi::GLFW_KEY_KP_2, + Kp3 = crate::ffi::GLFW_KEY_KP_3, + Kp4 = crate::ffi::GLFW_KEY_KP_4, + Kp5 = crate::ffi::GLFW_KEY_KP_5, + Kp6 = crate::ffi::GLFW_KEY_KP_6, + Kp7 = crate::ffi::GLFW_KEY_KP_7, + Kp8 = crate::ffi::GLFW_KEY_KP_8, + Kp9 = crate::ffi::GLFW_KEY_KP_9, + KpDecimal = crate::ffi::GLFW_KEY_KP_DECIMAL, + KpDivide = crate::ffi::GLFW_KEY_KP_DIVIDE, + KpMultiply = crate::ffi::GLFW_KEY_KP_MULTIPLY, + KpSubtract = crate::ffi::GLFW_KEY_KP_SUBTRACT, + KpAdd = crate::ffi::GLFW_KEY_KP_ADD, + KpEnter = crate::ffi::GLFW_KEY_KP_ENTER, + KpEqual = crate::ffi::GLFW_KEY_KP_EQUAL, + LeftShift = crate::ffi::GLFW_KEY_LEFT_SHIFT, + LeftControl = crate::ffi::GLFW_KEY_LEFT_CONTROL, + LeftAlt = crate::ffi::GLFW_KEY_LEFT_ALT, + LeftSuper = crate::ffi::GLFW_KEY_LEFT_SUPER, + RightShift = crate::ffi::GLFW_KEY_RIGHT_SHIFT, + RightControl = crate::ffi::GLFW_KEY_RIGHT_CONTROL, + RightAlt = crate::ffi::GLFW_KEY_RIGHT_ALT, + RightSuper = crate::ffi::GLFW_KEY_RIGHT_SUPER, + Menu = crate::ffi::GLFW_KEY_MENU, +} + +#[derive(Debug, Clone, Copy)] +pub enum KeyState +{ + Pressed, + Released, +} + type FramebufferSizeCb = Box; thread_local! { -- cgit v1.2.3-18-g5258