use std::os::raw;
use std::ptr;
use super::{CGEvent, CGEventSource};
extern {
fn CGEventCreateScrollWheelEvent(
source: CGEventSource,
units: raw::c_int,
wheelCount: u32,
wheel1: i32,
...
) -> CGEvent;
}
pub enum ScrollUnit {
Pixel,
Line,
}
declare_event!("A scroll wheel event that can be posted into the Quartz event stream.");
impl Event {
pub fn new<W: Wheels>(unit: ScrollUnit, wheels: W) -> Event {
let slice = wheels.as_ref();
let count = slice.len() as u32;
let null = ptr::null();
let unit = unit as raw::c_int;
Event(super::Event(unsafe { match count {
1 => CGEventCreateScrollWheelEvent(
null, unit, count, slice[0]
),
2 => CGEventCreateScrollWheelEvent(
null, unit, count, slice[0], slice[1]
),
_ => CGEventCreateScrollWheelEvent(
null, unit, count, slice[0], slice[1], slice[2]
),
} }))
}
}
pub trait Wheels: ::private::Priv + AsRef<[i32]> {}
macro_rules! impl_wheels {
($($n:expr)+) => { $(
impl ::private::Priv for [i32; $n] {}
impl Wheels for [i32; $n] {}
)+ }
}
impl_wheels! { 1 2 3 }