summaryrefslogtreecommitdiff
path: root/glfw
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2023-10-25 22:02:59 +0200
committerHampusM <hampus@hampusmat.com>2023-10-25 22:02:59 +0200
commitc4a427f73256f0ce4f067dcf2f970936d01bfdc6 (patch)
treefa78da9c1771d315090c5cf377301b8995200413 /glfw
parent9bac81e6be543139a7120c7a47c5299a8b72b445 (diff)
feat(glfw): add get keyboard input
Diffstat (limited to 'glfw')
-rw-r--r--glfw/src/window.rs159
1 files changed, 159 insertions, 0 deletions
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<KeyState, Error>
+ {
+ // 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<dyn Fn(Size)>;
thread_local! {