window_of_opportunity 0.3.0

window_of_opportunity is attempting to make a native react style library
use windows::Win32::UI::WindowsAndMessaging::*;

use super::{hword, lword};

#[derive(Debug, PartialEq)]
pub enum MouseEventType {
    Move,
    LeftButtonDown,
    LeftButtonUp,
    LeftButtonDoubleClick,
    RightButtonDown,
    RightButtonUp,
    RightButtonDoubleClick,
    MiddleButtonDown,
    MiddleButtonUp,
    MiddleButtonDoubleClick,
    Unknown,
}

#[derive(Debug)]
pub enum MouseEventMod {
    Control,
    LeftButton,
    MiddleButton,
    RightButton,
    Shift,
    XButton1,
    XButton2,
    None,
    Unknown,
}

#[derive(Debug)]
pub struct MouseEvent {
    pub event_type: MouseEventType,
    pub point: (i32, i32),
    pub opt: MouseEventMod,
}

impl MouseEvent {
    pub fn new(event: &super::Event) -> Self {
        Self {
            event_type: match event.message {
                WM_MOUSEMOVE => MouseEventType::Move,
                WM_LBUTTONDOWN => MouseEventType::LeftButtonDown,
                WM_LBUTTONUP => MouseEventType::LeftButtonUp,
                WM_LBUTTONDBLCLK => MouseEventType::LeftButtonDoubleClick,
                WM_RBUTTONDOWN => MouseEventType::RightButtonDown,
                WM_RBUTTONUP => MouseEventType::RightButtonUp,
                WM_RBUTTONDBLCLK => MouseEventType::RightButtonDoubleClick,
                WM_MBUTTONDOWN => MouseEventType::MiddleButtonDown,
                WM_MBUTTONUP => MouseEventType::MiddleButtonUp,
                WM_MBUTTONDBLCLK => MouseEventType::MiddleButtonDoubleClick,
                _ => MouseEventType::Unknown,
            },
            point: (lword(event.lparam.0), hword(event.lparam.0)),
            opt: match event.wparam.0 {
                0x0008 => MouseEventMod::Control,
                0x0001 => MouseEventMod::LeftButton,
                0x0010 => MouseEventMod::MiddleButton,
                0x0002 => MouseEventMod::RightButton,
                0x0004 => MouseEventMod::Shift,
                0x0020 => MouseEventMod::XButton1,
                0x0040 => MouseEventMod::XButton2,
                0x0000 => MouseEventMod::None,
                _ => MouseEventMod::Unknown,
            },
        }
    }
}