use super::*;
#[derive(Clone, Default)]
pub struct EventBuffer(pub Vec<Event>);
impl From<Vec<Event>> for EventBuffer {
#[inline(always)]
fn from(v: Vec<Event>) -> Self {
Self(v)
}
}
impl From<EventBuffer> for Vec<Event> {
#[inline(always)]
fn from(b: EventBuffer) -> Self {
b.0
}
}
impl IntoIterator for EventBuffer {
type Item = Event;
type IntoIter = std::vec::IntoIter<Event>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl AsRef<Vec<Event>> for EventBuffer {
fn as_ref(&self) -> &Vec<Event> {
&self.0
}
}
impl AsMut<Vec<Event>> for EventBuffer {
fn as_mut(&mut self) -> &mut Vec<Event> {
&mut self.0
}
}
impl EventBuffer {
#[inline(always)]
pub fn new() -> Self {
Self::default()
}
#[inline(always)]
pub fn with_capacity(cap: usize) -> Self {
Self(Vec::with_capacity(cap))
}
#[inline(always)]
pub fn add_event(&mut self, event: Event) {
self.0.push(event)
}
#[inline(always)]
pub fn extend(&mut self, events: impl IntoIterator<Item = Event>) {
self.0.extend(events);
}
#[inline(always)]
pub fn extend_from_slice(&mut self, events: &[Event]) {
self.0.extend_from_slice(events);
}
#[inline(always)]
pub fn append(&mut self, events: &mut EventBuffer) {
self.0.append(&mut events.0)
}
#[inline]
pub fn add_multiple<K: Keylike>(&mut self, keys: impl IntoIterator<Item = K>) {
self.extend(keys.into_iter().flat_map(Keylike::press_release));
}
#[inline(always)]
pub fn send(&mut self, key: impl Keylike) {
self.extend(key.press_release());
}
#[inline(always)]
pub fn press(&mut self, key: impl Keylike) {
self.add_event(key.press())
}
#[inline(always)]
pub fn release(&mut self, key: impl Keylike) {
self.add_event(key.release())
}
#[inline(always)]
pub fn type_str(&mut self, s: &str) {
self.add_multiple(s.chars())
}
#[inline(always)]
pub fn move_mouse_relative(&mut self, dx: i32, dy: i32) {
self.add_event(Event::MoveMouseRelative { dx, dy });
}
#[inline(always)]
pub fn move_mouse_absolute(&mut self, x: f32, y: f32) {
self.add_event(Event::MoveMouseAbsolute {
x,
y,
map_to_virtual_desktop: false,
});
}
#[inline(always)]
pub fn add_scroll_event(&mut self, delta: f32, direction: ScrollDirection) {
self.add_event(Event::Scroll { delta, direction });
}
#[inline(always)]
pub fn scroll(&mut self, delta: f32) {
self.add_scroll_event(delta, ScrollDirection::Vertical);
}
#[inline(always)]
pub fn scroll_horizontal(&mut self, delta: f32) {
self.add_scroll_event(delta, ScrollDirection::Horizontal);
}
#[inline(always)]
pub fn simulate(self) -> Result<()> {
SIM.send_events(self)
}
}