From 697f61b732c7564ec31469f41d51bb666f9b07ce Mon Sep 17 00:00:00 2001 From: Tony Aldridge Date: Fri, 21 Mar 2014 11:53:04 +0000 Subject: [PATCH] Unknown mouse states now get collected into handy enum variants that wrap the unknown value (which I believe might be platform specific, so we can't give them sensible names). This fixes #47 --- src/sdl2/mouse.rs | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/sdl2/mouse.rs b/src/sdl2/mouse.rs index b0494921..325b7721 100644 --- a/src/sdl2/mouse.rs +++ b/src/sdl2/mouse.rs @@ -1,5 +1,5 @@ use std::ptr; -use std::vec::Vec; +use std::vec::{Vec, append_one}; use get_error; use surface; @@ -140,15 +140,17 @@ pub enum Mouse { RightMouse, X1Mouse, X2Mouse, + UnknownMouse(u8) } #[deriving(Eq)] pub enum MouseState { - LeftMouseState = 1, - MiddleMouseState = 2, - RightMouseState = 4, - X1MouseState = 8, - X2MouseState = 16, + LeftMouseState, + MiddleMouseState, + RightMouseState, + X1MouseState, + X2MouseState, + UnknownMouseState(u32) } pub fn wrap_mouse(bitflags: u8) -> Mouse { @@ -158,21 +160,33 @@ pub fn wrap_mouse(bitflags: u8) -> Mouse { 3 => RightMouse, 4 => X1Mouse, 5 => X2Mouse, - _ => fail!(~"unhandled mouse type") + _ => UnknownMouse(bitflags) } } pub fn wrap_mouse_state(bitflags: u32) -> Vec { - let flags = [LeftMouseState, - MiddleMouseState, - RightMouseState, - X1MouseState, - X2MouseState]; + let flags = [(LeftMouseState, 1), + (MiddleMouseState, 2), + (RightMouseState, 4), + (X1MouseState, 8), + (X2MouseState, 16)]; - flags.iter().filter_map(|&flag| { - if bitflags & (flag as u32) != 0 { Some(flag) } - else { None } - }).collect() + let mut leftovers = bitflags; + + let flags_out = flags.iter().filter_map(|&(flag, value)| { + if bitflags & value != 0 { + leftovers -= value; + Some(flag) + } else { + None + } + }).collect(); + + if leftovers > 0 { + append_one(flags_out, UnknownMouseState(leftovers)) + } else { + flags_out + } } pub fn get_mouse_focus() -> Option<~video::Window> {