diff --git a/src/input.rs b/src/input.rs
index ada150b..d150754 100644
--- a/src/input.rs
+++ b/src/input.rs
@@ -27,32 +27,28 @@ pub enum ActionId {
 	StopSim,
 	StepSim,
 	// just like in C, because this way doesn't need more dependencies
-	_ActionIdSize,
+	_EnumSize,
 }
 
 impl Default for Input {
 	fn default() -> Self {
-		use KeyboardKey::*;
+		use Button::*;
 		let mut bindings = [(); ActionId::SIZE].map(|_| Vec::new());
-		let mut bind_key = |action, mods, key| {
+		let mut bind_key = |action, mods, trigger| {
 			bindings[action as usize].push(Binding {
 				modifiers: mods,
-				trigger: InputTrigger::Key(key),
+				trigger,
 			});
 		};
-		bind_key(ActionId::Undo, vec![KEY_LEFT_CONTROL], KEY_Z);
-		bind_key(ActionId::Redo, vec![KEY_LEFT_CONTROL], KEY_Y);
-		bind_key(
-			ActionId::Redo,
-			vec![KEY_LEFT_CONTROL, KEY_LEFT_SHIFT],
-			KEY_Z,
-		);
-		bind_key(ActionId::Copy, vec![KEY_LEFT_CONTROL], KEY_C);
-		bind_key(ActionId::Paste, vec![KEY_LEFT_CONTROL], KEY_V);
-		bind_key(ActionId::ToggleMenu, vec![], KEY_ESCAPE);
-		bind_key(ActionId::StartSim, vec![], KEY_ENTER);
-		bind_key(ActionId::StopSim, vec![], KEY_ENTER);
-		bind_key(ActionId::StepSim, vec![], KEY_SPACE);
+		bind_key(ActionId::Undo, vec![LCtrl], Z);
+		bind_key(ActionId::Redo, vec![LCtrl], Y);
+		bind_key(ActionId::Redo, vec![LCtrl, LShift], Z);
+		bind_key(ActionId::Copy, vec![LCtrl], C);
+		bind_key(ActionId::Paste, vec![LCtrl], V);
+		bind_key(ActionId::ToggleMenu, vec![], Escape);
+		bind_key(ActionId::StartSim, vec![], Enter);
+		bind_key(ActionId::StopSim, vec![], Enter);
+		bind_key(ActionId::StepSim, vec![], Space);
 
 		Self {
 			bindings,
@@ -137,11 +133,8 @@ impl Input {
 			let bindings = &self.bindings[i];
 			let mut is_active = false;
 			for binding in bindings {
-				if binding.modifiers.iter().all(|&m| rl.is_key_down(m)) {
-					is_active |= match binding.trigger {
-						InputTrigger::Mouse(btn) => rl.is_mouse_button_down(btn),
-						InputTrigger::Key(key) => rl.is_key_down(key),
-					}
+				if binding.modifiers.iter().all(|&m| m.is_down(rl)) {
+					is_active |= binding.trigger.is_down(rl);
 				}
 			}
 			let state = &mut self.states[i];
@@ -174,11 +167,11 @@ impl Input {
 }
 
 impl ActionId {
-	pub const SIZE: usize = Self::_ActionIdSize as usize;
+	pub const SIZE: usize = Self::_EnumSize as usize;
 
 	fn from_usize(val: usize) -> Option<Self> {
 		if val < Self::SIZE {
-			Some(unsafe { transmute::<u8, ActionId>(val as u8) })
+			Some(unsafe { transmute::<u8, Self>(val as u8) })
 		} else {
 			None
 		}
@@ -186,20 +179,11 @@ impl ActionId {
 }
 
 #[derive(Clone, Debug, Serialize, Deserialize)]
-#[serde(from = "BindingSerde", into = "BindingSerde")]
 pub struct Binding {
-	modifiers: Vec<KeyboardKey>,
-	trigger: InputTrigger,
+	modifiers: Vec<Button>,
+	trigger: Button,
 }
 
-#[derive(Clone, Debug)]
-pub enum InputTrigger {
-	Mouse(MouseButton),
-	Key(KeyboardKey),
-}
-
-// ###### everything below is for serialization of key bindings ######
-
 impl From<InputMap> for Input {
 	fn from(value: InputMap) -> Self {
 		let mut new = Self::default();
@@ -222,178 +206,270 @@ impl From<Input> for InputMap {
 	}
 }
 
-#[derive(Clone, Debug, Serialize, Deserialize)]
-struct BindingSerde {
-	modifiers: Vec<String>,
-	trigger: InputTriggerSerde,
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+enum Button {
+	MouseLeft,
+	MouseRight,
+	MouseMiddle,
+	Mouse3,
+	Mouse4,
+	Mouse5,
+	Mouse6,
+	Apostrophe,
+	Comma,
+	Minus,
+	Period,
+	Slash,
+	Zero,
+	One,
+	Two,
+	Three,
+	Four,
+	Five,
+	Six,
+	Seven,
+	Eight,
+	Nine,
+	Semicolon,
+	Equal,
+	A,
+	B,
+	C,
+	D,
+	E,
+	F,
+	G,
+	H,
+	I,
+	J,
+	K,
+	L,
+	M,
+	N,
+	O,
+	P,
+	Q,
+	R,
+	S,
+	T,
+	U,
+	V,
+	W,
+	X,
+	Y,
+	Z,
+	LeftBracket,
+	Backslash,
+	RightBracket,
+	Grave,
+	Space,
+	Escape,
+	Enter,
+	Tab,
+	Backspace,
+	Insert,
+	Delete,
+	Right,
+	Left,
+	Down,
+	Up,
+	PageUp,
+	PageDown,
+	Home,
+	End,
+	CapsLock,
+	ScrollLock,
+	NumLock,
+	PrintScreen,
+	Pause,
+	F1,
+	F2,
+	F3,
+	F4,
+	F5,
+	F6,
+	F7,
+	F8,
+	F9,
+	F10,
+	F11,
+	F12,
+	LShift,
+	LCtrl,
+	LAlt,
+	LeftSuper,
+	RShift,
+	RCtrl,
+	RAlt,
+	RightSuper,
+	Menu,
+	Kp0,
+	Kp1,
+	Kp2,
+	Kp3,
+	Kp4,
+	Kp5,
+	Kp6,
+	Kp7,
+	Kp8,
+	Kp9,
+	KpDecimal,
+	KpDivide,
+	KpMultiply,
+	KpSubtract,
+	KpAdd,
+	KpEnter,
+	KpEqual,
+	Back,
+	VolumeUp,
+	VolumeDown,
+	//
+	_EnumSize,
 }
 
-#[derive(Clone, Debug, Serialize, Deserialize)]
-enum InputTriggerSerde {
-	Mouse(String),
-	Key(String),
+enum RlInput {
+	Key(KeyboardKey),
+	Mouse(MouseButton),
 }
 
-impl From<BindingSerde> for Binding {
-	fn from(value: BindingSerde) -> Self {
-		Self {
-			modifiers: value
-				.modifiers
-				.iter()
-				.map(|s| key_string_to_enum(s))
-				.collect(),
-			trigger: value.trigger.into(),
+impl Button {
+	const SIZE: usize = Self::_EnumSize as usize;
+
+	fn from_usize(val: usize) -> Option<Self> {
+		if val < Self::SIZE {
+			Some(unsafe { transmute::<u8, Self>(val as u8) })
+		} else {
+			None
+		}
+	}
+
+	fn is_down(self, rl: &RaylibHandle) -> bool {
+		match self.to_raylib() {
+			RlInput::Key(key) => rl.is_key_down(key),
+			RlInput::Mouse(btn) => rl.is_mouse_button_down(btn),
+		}
+	}
+
+	fn to_raylib(self) -> RlInput {
+		use KeyboardKey::*;
+		use RlInput::*;
+		match self {
+			Button::MouseLeft => Mouse(MouseButton::MOUSE_BUTTON_LEFT),
+			Button::MouseRight => Mouse(MouseButton::MOUSE_BUTTON_RIGHT),
+			Button::MouseMiddle => Mouse(MouseButton::MOUSE_BUTTON_MIDDLE),
+			Button::Mouse3 => Mouse(MouseButton::MOUSE_BUTTON_SIDE),
+			Button::Mouse4 => Mouse(MouseButton::MOUSE_BUTTON_EXTRA),
+			Button::Mouse5 => Mouse(MouseButton::MOUSE_BUTTON_FORWARD),
+			Button::Mouse6 => Mouse(MouseButton::MOUSE_BUTTON_BACK),
+			Button::Apostrophe => Key(KEY_APOSTROPHE),
+			Button::Comma => Key(KEY_COMMA),
+			Button::Minus => Key(KEY_MINUS),
+			Button::Period => Key(KEY_PERIOD),
+			Button::Slash => Key(KEY_SLASH),
+			Button::Zero => Key(KEY_ZERO),
+			Button::One => Key(KEY_ONE),
+			Button::Two => Key(KEY_TWO),
+			Button::Three => Key(KEY_THREE),
+			Button::Four => Key(KEY_FOUR),
+			Button::Five => Key(KEY_FIVE),
+			Button::Six => Key(KEY_SIX),
+			Button::Seven => Key(KEY_SEVEN),
+			Button::Eight => Key(KEY_EIGHT),
+			Button::Nine => Key(KEY_NINE),
+			Button::Semicolon => Key(KEY_SEMICOLON),
+			Button::Equal => Key(KEY_EQUAL),
+			Button::A => Key(KEY_A),
+			Button::B => Key(KEY_B),
+			Button::C => Key(KEY_C),
+			Button::D => Key(KEY_D),
+			Button::E => Key(KEY_E),
+			Button::F => Key(KEY_F),
+			Button::G => Key(KEY_G),
+			Button::H => Key(KEY_H),
+			Button::I => Key(KEY_I),
+			Button::J => Key(KEY_J),
+			Button::K => Key(KEY_K),
+			Button::L => Key(KEY_L),
+			Button::M => Key(KEY_M),
+			Button::N => Key(KEY_N),
+			Button::O => Key(KEY_O),
+			Button::P => Key(KEY_P),
+			Button::Q => Key(KEY_Q),
+			Button::R => Key(KEY_R),
+			Button::S => Key(KEY_S),
+			Button::T => Key(KEY_T),
+			Button::U => Key(KEY_U),
+			Button::V => Key(KEY_V),
+			Button::W => Key(KEY_W),
+			Button::X => Key(KEY_X),
+			Button::Y => Key(KEY_Y),
+			Button::Z => Key(KEY_Z),
+			Button::LeftBracket => Key(KEY_LEFT_BRACKET),
+			Button::Backslash => Key(KEY_BACKSLASH),
+			Button::RightBracket => Key(KEY_RIGHT_BRACKET),
+			Button::Grave => Key(KEY_GRAVE),
+			Button::Space => Key(KEY_SPACE),
+			Button::Escape => Key(KEY_ESCAPE),
+			Button::Enter => Key(KEY_ENTER),
+			Button::Tab => Key(KEY_TAB),
+			Button::Backspace => Key(KEY_BACKSPACE),
+			Button::Insert => Key(KEY_INSERT),
+			Button::Delete => Key(KEY_DELETE),
+			Button::Right => Key(KEY_RIGHT),
+			Button::Left => Key(KEY_LEFT),
+			Button::Down => Key(KEY_DOWN),
+			Button::Up => Key(KEY_UP),
+			Button::PageUp => Key(KEY_PAGE_UP),
+			Button::PageDown => Key(KEY_PAGE_DOWN),
+			Button::Home => Key(KEY_HOME),
+			Button::End => Key(KEY_END),
+			Button::CapsLock => Key(KEY_CAPS_LOCK),
+			Button::ScrollLock => Key(KEY_SCROLL_LOCK),
+			Button::NumLock => Key(KEY_NUM_LOCK),
+			Button::PrintScreen => Key(KEY_PRINT_SCREEN),
+			Button::Pause => Key(KEY_PAUSE),
+			Button::F1 => Key(KEY_F1),
+			Button::F2 => Key(KEY_F2),
+			Button::F3 => Key(KEY_F3),
+			Button::F4 => Key(KEY_F4),
+			Button::F5 => Key(KEY_F5),
+			Button::F6 => Key(KEY_F6),
+			Button::F7 => Key(KEY_F7),
+			Button::F8 => Key(KEY_F8),
+			Button::F9 => Key(KEY_F9),
+			Button::F10 => Key(KEY_F10),
+			Button::F11 => Key(KEY_F11),
+			Button::F12 => Key(KEY_F12),
+			Button::LShift => Key(KEY_LEFT_SHIFT),
+			Button::LCtrl => Key(KEY_LEFT_CONTROL),
+			Button::LAlt => Key(KEY_LEFT_ALT),
+			Button::LeftSuper => Key(KEY_LEFT_SUPER),
+			Button::RShift => Key(KEY_RIGHT_SHIFT),
+			Button::RCtrl => Key(KEY_RIGHT_CONTROL),
+			Button::RAlt => Key(KEY_RIGHT_ALT),
+			Button::RightSuper => Key(KEY_RIGHT_SUPER),
+			Button::Menu => Key(KEY_KB_MENU),
+			Button::Kp0 => Key(KEY_KP_0),
+			Button::Kp1 => Key(KEY_KP_1),
+			Button::Kp2 => Key(KEY_KP_2),
+			Button::Kp3 => Key(KEY_KP_3),
+			Button::Kp4 => Key(KEY_KP_4),
+			Button::Kp5 => Key(KEY_KP_5),
+			Button::Kp6 => Key(KEY_KP_6),
+			Button::Kp7 => Key(KEY_KP_7),
+			Button::Kp8 => Key(KEY_KP_8),
+			Button::Kp9 => Key(KEY_KP_9),
+			Button::KpDecimal => Key(KEY_KP_DECIMAL),
+			Button::KpDivide => Key(KEY_KP_DIVIDE),
+			Button::KpMultiply => Key(KEY_KP_MULTIPLY),
+			Button::KpSubtract => Key(KEY_KP_SUBTRACT),
+			Button::KpAdd => Key(KEY_KP_ADD),
+			Button::KpEnter => Key(KEY_KP_ENTER),
+			Button::KpEqual => Key(KEY_KP_EQUAL),
+			Button::Back => Key(KEY_BACK),
+			Button::VolumeUp => Key(KEY_VOLUME_UP),
+			Button::VolumeDown => Key(KEY_VOLUME_DOWN),
+			Button::_EnumSize => unreachable!(),
 		}
 	}
 }
-
-impl From<Binding> for BindingSerde {
-	fn from(value: Binding) -> Self {
-		Self {
-			modifiers: value.modifiers.iter().map(|c| format!("{c:?}")).collect(),
-			trigger: value.trigger.into(),
-		}
-	}
-}
-
-impl From<InputTrigger> for InputTriggerSerde {
-	fn from(value: InputTrigger) -> Self {
-		match value {
-			InputTrigger::Mouse(btn) => InputTriggerSerde::Mouse(format!("{btn:?}")),
-			InputTrigger::Key(key) => InputTriggerSerde::Key(format!("{key:?}")),
-		}
-	}
-}
-
-impl From<InputTriggerSerde> for InputTrigger {
-	fn from(value: InputTriggerSerde) -> Self {
-		match value {
-			InputTriggerSerde::Mouse(btn) => InputTrigger::Mouse(match btn.as_str() {
-				"MOUSE_BUTTON_LEFT" => MouseButton::MOUSE_BUTTON_LEFT,
-				"MOUSE_BUTTON_RIGHT" => MouseButton::MOUSE_BUTTON_RIGHT,
-				"MOUSE_BUTTON_MIDDLE" => MouseButton::MOUSE_BUTTON_MIDDLE,
-				"MOUSE_BUTTON_SIDE" => MouseButton::MOUSE_BUTTON_SIDE,
-				"MOUSE_BUTTON_EXTRA" => MouseButton::MOUSE_BUTTON_EXTRA,
-				"MOUSE_BUTTON_FORWARD" => MouseButton::MOUSE_BUTTON_FORWARD,
-				"MOUSE_BUTTON_BACK" => MouseButton::MOUSE_BUTTON_BACK,
-				_ => panic!("{btn} not a valid mouse button"),
-			}),
-			InputTriggerSerde::Key(key) => InputTrigger::Key(key_string_to_enum(key.as_str())),
-		}
-	}
-}
-
-fn key_string_to_enum(key: &str) -> KeyboardKey {
-	match key {
-		"KEY_NULL" => KeyboardKey::KEY_NULL,
-		"KEY_APOSTROPHE" => KeyboardKey::KEY_APOSTROPHE,
-		"KEY_COMMA" => KeyboardKey::KEY_COMMA,
-		"KEY_MINUS" => KeyboardKey::KEY_MINUS,
-		"KEY_PERIOD" => KeyboardKey::KEY_PERIOD,
-		"KEY_SLASH" => KeyboardKey::KEY_SLASH,
-		"KEY_ZERO" => KeyboardKey::KEY_ZERO,
-		"KEY_ONE" => KeyboardKey::KEY_ONE,
-		"KEY_TWO" => KeyboardKey::KEY_TWO,
-		"KEY_THREE" => KeyboardKey::KEY_THREE,
-		"KEY_FOUR" => KeyboardKey::KEY_FOUR,
-		"KEY_FIVE" => KeyboardKey::KEY_FIVE,
-		"KEY_SIX" => KeyboardKey::KEY_SIX,
-		"KEY_SEVEN" => KeyboardKey::KEY_SEVEN,
-		"KEY_EIGHT" => KeyboardKey::KEY_EIGHT,
-		"KEY_NINE" => KeyboardKey::KEY_NINE,
-		"KEY_SEMICOLON" => KeyboardKey::KEY_SEMICOLON,
-		"KEY_EQUAL" => KeyboardKey::KEY_EQUAL,
-		"KEY_A" => KeyboardKey::KEY_A,
-		"KEY_B" => KeyboardKey::KEY_B,
-		"KEY_C" => KeyboardKey::KEY_C,
-		"KEY_D" => KeyboardKey::KEY_D,
-		"KEY_E" => KeyboardKey::KEY_E,
-		"KEY_F" => KeyboardKey::KEY_F,
-		"KEY_G" => KeyboardKey::KEY_G,
-		"KEY_H" => KeyboardKey::KEY_H,
-		"KEY_I" => KeyboardKey::KEY_I,
-		"KEY_J" => KeyboardKey::KEY_J,
-		"KEY_K" => KeyboardKey::KEY_K,
-		"KEY_L" => KeyboardKey::KEY_L,
-		"KEY_M" => KeyboardKey::KEY_M,
-		"KEY_N" => KeyboardKey::KEY_N,
-		"KEY_O" => KeyboardKey::KEY_O,
-		"KEY_P" => KeyboardKey::KEY_P,
-		"KEY_Q" => KeyboardKey::KEY_Q,
-		"KEY_R" => KeyboardKey::KEY_R,
-		"KEY_S" => KeyboardKey::KEY_S,
-		"KEY_T" => KeyboardKey::KEY_T,
-		"KEY_U" => KeyboardKey::KEY_U,
-		"KEY_V" => KeyboardKey::KEY_V,
-		"KEY_W" => KeyboardKey::KEY_W,
-		"KEY_X" => KeyboardKey::KEY_X,
-		"KEY_Y" => KeyboardKey::KEY_Y,
-		"KEY_Z" => KeyboardKey::KEY_Z,
-		"KEY_LEFT_BRACKET" => KeyboardKey::KEY_LEFT_BRACKET,
-		"KEY_BACKSLASH" => KeyboardKey::KEY_BACKSLASH,
-		"KEY_RIGHT_BRACKET" => KeyboardKey::KEY_RIGHT_BRACKET,
-		"KEY_GRAVE" => KeyboardKey::KEY_GRAVE,
-		"KEY_SPACE" => KeyboardKey::KEY_SPACE,
-		"KEY_ESCAPE" => KeyboardKey::KEY_ESCAPE,
-		"KEY_ENTER" => KeyboardKey::KEY_ENTER,
-		"KEY_TAB" => KeyboardKey::KEY_TAB,
-		"KEY_BACKSPACE" => KeyboardKey::KEY_BACKSPACE,
-		"KEY_INSERT" => KeyboardKey::KEY_INSERT,
-		"KEY_DELETE" => KeyboardKey::KEY_DELETE,
-		"KEY_RIGHT" => KeyboardKey::KEY_RIGHT,
-		"KEY_LEFT" => KeyboardKey::KEY_LEFT,
-		"KEY_DOWN" => KeyboardKey::KEY_DOWN,
-		"KEY_UP" => KeyboardKey::KEY_UP,
-		"KEY_PAGE_UP" => KeyboardKey::KEY_PAGE_UP,
-		"KEY_PAGE_DOWN" => KeyboardKey::KEY_PAGE_DOWN,
-		"KEY_HOME" => KeyboardKey::KEY_HOME,
-		"KEY_END" => KeyboardKey::KEY_END,
-		"KEY_CAPS_LOCK" => KeyboardKey::KEY_CAPS_LOCK,
-		"KEY_SCROLL_LOCK" => KeyboardKey::KEY_SCROLL_LOCK,
-		"KEY_NUM_LOCK" => KeyboardKey::KEY_NUM_LOCK,
-		"KEY_PRINT_SCREEN" => KeyboardKey::KEY_PRINT_SCREEN,
-		"KEY_PAUSE" => KeyboardKey::KEY_PAUSE,
-		"KEY_F1" => KeyboardKey::KEY_F1,
-		"KEY_F2" => KeyboardKey::KEY_F2,
-		"KEY_F3" => KeyboardKey::KEY_F3,
-		"KEY_F4" => KeyboardKey::KEY_F4,
-		"KEY_F5" => KeyboardKey::KEY_F5,
-		"KEY_F6" => KeyboardKey::KEY_F6,
-		"KEY_F7" => KeyboardKey::KEY_F7,
-		"KEY_F8" => KeyboardKey::KEY_F8,
-		"KEY_F9" => KeyboardKey::KEY_F9,
-		"KEY_F10" => KeyboardKey::KEY_F10,
-		"KEY_F11" => KeyboardKey::KEY_F11,
-		"KEY_F12" => KeyboardKey::KEY_F12,
-		"KEY_LEFT_SHIFT" => KeyboardKey::KEY_LEFT_SHIFT,
-		"KEY_LEFT_CONTROL" => KeyboardKey::KEY_LEFT_CONTROL,
-		"KEY_LEFT_ALT" => KeyboardKey::KEY_LEFT_ALT,
-		"KEY_LEFT_SUPER" => KeyboardKey::KEY_LEFT_SUPER,
-		"KEY_RIGHT_SHIFT" => KeyboardKey::KEY_RIGHT_SHIFT,
-		"KEY_RIGHT_CONTROL" => KeyboardKey::KEY_RIGHT_CONTROL,
-		"KEY_RIGHT_ALT" => KeyboardKey::KEY_RIGHT_ALT,
-		"KEY_RIGHT_SUPER" => KeyboardKey::KEY_RIGHT_SUPER,
-		"KEY_KB_MENU" => KeyboardKey::KEY_KB_MENU,
-		"KEY_KP_0" => KeyboardKey::KEY_KP_0,
-		"KEY_KP_1" => KeyboardKey::KEY_KP_1,
-		"KEY_KP_2" => KeyboardKey::KEY_KP_2,
-		"KEY_KP_3" => KeyboardKey::KEY_KP_3,
-		"KEY_KP_4" => KeyboardKey::KEY_KP_4,
-		"KEY_KP_5" => KeyboardKey::KEY_KP_5,
-		"KEY_KP_6" => KeyboardKey::KEY_KP_6,
-		"KEY_KP_7" => KeyboardKey::KEY_KP_7,
-		"KEY_KP_8" => KeyboardKey::KEY_KP_8,
-		"KEY_KP_9" => KeyboardKey::KEY_KP_9,
-		"KEY_KP_DECIMAL" => KeyboardKey::KEY_KP_DECIMAL,
-		"KEY_KP_DIVIDE" => KeyboardKey::KEY_KP_DIVIDE,
-		"KEY_KP_MULTIPLY" => KeyboardKey::KEY_KP_MULTIPLY,
-		"KEY_KP_SUBTRACT" => KeyboardKey::KEY_KP_SUBTRACT,
-		"KEY_KP_ADD" => KeyboardKey::KEY_KP_ADD,
-		"KEY_KP_ENTER" => KeyboardKey::KEY_KP_ENTER,
-		"KEY_KP_EQUAL" => KeyboardKey::KEY_KP_EQUAL,
-		"KEY_BACK" => KeyboardKey::KEY_BACK,
-		"KEY_VOLUME_UP" => KeyboardKey::KEY_VOLUME_UP,
-		"KEY_VOLUME_DOWN" => KeyboardKey::KEY_VOLUME_DOWN,
-		_ => panic!("{key} not a known key name"),
-	}
-}