From db60579db43b8ec524045a1ebc4f8aa3d775a639 Mon Sep 17 00:00:00 2001 From: gered Date: Wed, 12 Apr 2023 15:19:39 -0400 Subject: [PATCH] fix mouse button event mapping this was preventing applications from picking up basically all non-left button states --- ggdt/src/system/input_devices/mouse/buttons.rs | 17 ++++++++++++----- ggdt/src/system/input_devices/mouse/mod.rs | 16 ++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/ggdt/src/system/input_devices/mouse/buttons.rs b/ggdt/src/system/input_devices/mouse/buttons.rs index bb77cb5..7d28f73 100644 --- a/ggdt/src/system/input_devices/mouse/buttons.rs +++ b/ggdt/src/system/input_devices/mouse/buttons.rs @@ -1,13 +1,20 @@ use bitflags::bitflags; +// equivalent to SDL's "SDL_BUTTON" macro +#[inline] +const fn button_mask_to_value(mask: u32) -> u32 { + 1 << (mask - 1) +} + bitflags! { + #[repr(transparent)] #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] pub struct MouseButtons: u32 { - const LEFT_BUTTON = sdl2::mouse::MouseButton::Left as u32; - const MIDDLE_BUTTON = sdl2::mouse::MouseButton::Middle as u32; - const RIGHT_BUTTON = sdl2::mouse::MouseButton::Right as u32; - const X1 = sdl2::mouse::MouseButton::X1 as u32; - const X2 = sdl2::mouse::MouseButton::X2 as u32; + const LEFT_BUTTON = button_mask_to_value(sdl2::mouse::MouseButton::Left as u32); + const MIDDLE_BUTTON = button_mask_to_value(sdl2::mouse::MouseButton::Middle as u32); + const RIGHT_BUTTON = button_mask_to_value(sdl2::mouse::MouseButton::Right as u32); + const X1 = button_mask_to_value(sdl2::mouse::MouseButton::X1 as u32); + const X2 = button_mask_to_value(sdl2::mouse::MouseButton::X2 as u32); } } diff --git a/ggdt/src/system/input_devices/mouse/mod.rs b/ggdt/src/system/input_devices/mouse/mod.rs index f367114..d3b21b6 100644 --- a/ggdt/src/system/input_devices/mouse/mod.rs +++ b/ggdt/src/system/input_devices/mouse/mod.rs @@ -62,26 +62,26 @@ impl Mouse { /// Returns true if the given button was just pressed or is being held down. #[inline] - pub fn is_button_down(&self, button: usize) -> bool { - matches!(self.buttons[button], ButtonState::Pressed | ButtonState::Held) + pub fn is_button_down(&self, button: MouseButton) -> bool { + matches!(self.buttons[button as usize], ButtonState::Pressed | ButtonState::Held) } /// Returns true if the given button was not just pressed and is not being held down. #[inline] - pub fn is_button_up(&self, button: usize) -> bool { - matches!(self.buttons[button], ButtonState::Released | ButtonState::Idle) + pub fn is_button_up(&self, button: MouseButton) -> bool { + matches!(self.buttons[button as usize], ButtonState::Released | ButtonState::Idle) } /// Returns true if the given button was just pressed (not being held down, yet). #[inline] - pub fn is_button_pressed(&self, button: usize) -> bool { - self.buttons[button] == ButtonState::Pressed + pub fn is_button_pressed(&self, button: MouseButton) -> bool { + self.buttons[button as usize] == ButtonState::Pressed } /// Returns true if the given button was just released. #[inline] - pub fn is_button_released(&self, button: usize) -> bool { - self.buttons[button] == ButtonState::Released + pub fn is_button_released(&self, button: MouseButton) -> bool { + self.buttons[button as usize] == ButtonState::Released } fn update_button_state(&mut self, button: u32, is_pressed: bool) {