2019-06-25 03:15:34 +02:00
|
|
|
use super::{backend, device, proxy::Proxy, runner, window};
|
2019-06-25 21:01:13 +02:00
|
|
|
use crate::event::{DeviceId, ElementState, Event, KeyboardInput, TouchPhase, WindowEvent};
|
2019-06-25 03:15:34 +02:00
|
|
|
use crate::event_loop::ControlFlow;
|
|
|
|
|
use crate::window::WindowId;
|
|
|
|
|
use std::clone::Clone;
|
|
|
|
|
|
|
|
|
|
pub struct WindowTarget<T: 'static> {
|
|
|
|
|
pub(crate) runner: runner::Shared<T>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<T> Clone for WindowTarget<T> {
|
|
|
|
|
fn clone(&self) -> Self {
|
|
|
|
|
WindowTarget {
|
|
|
|
|
runner: self.runner.clone(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<T> WindowTarget<T> {
|
|
|
|
|
pub fn new() -> Self {
|
|
|
|
|
WindowTarget {
|
|
|
|
|
runner: runner::Shared::new(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn proxy(&self) -> Proxy<T> {
|
|
|
|
|
Proxy::new(self.runner.clone())
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 21:01:13 +02:00
|
|
|
pub fn run(&self, event_handler: Box<dyn FnMut(Event<T>, &mut ControlFlow)>) {
|
2019-06-25 03:15:34 +02:00
|
|
|
self.runner.set_listener(event_handler);
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-19 18:40:18 -04:00
|
|
|
pub fn generate_id(&self) -> window::Id {
|
|
|
|
|
window::Id(self.runner.generate_id())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn register(&self, canvas: &mut backend::Canvas, id: window::Id) {
|
2019-06-25 21:01:13 +02:00
|
|
|
let runner = self.runner.clone();
|
2019-09-19 18:40:18 -04:00
|
|
|
|
2019-09-27 17:06:14 -04:00
|
|
|
canvas.set_attribute("data-raw-handle", &id.0.to_string());
|
|
|
|
|
|
2019-06-25 21:01:13 +02:00
|
|
|
canvas.on_blur(move || {
|
|
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 21:01:13 +02:00
|
|
|
event: WindowEvent::Focused(false),
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let runner = self.runner.clone();
|
|
|
|
|
canvas.on_focus(move || {
|
|
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 21:01:13 +02:00
|
|
|
event: WindowEvent::Focused(true),
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_keyboard_press(move |scancode, virtual_keycode, modifiers| {
|
2019-06-25 21:01:13 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 21:01:13 +02:00
|
|
|
event: WindowEvent::KeyboardInput {
|
|
|
|
|
device_id: DeviceId(unsafe { device::Id::dummy() }),
|
|
|
|
|
input: KeyboardInput {
|
|
|
|
|
scancode,
|
|
|
|
|
state: ElementState::Pressed,
|
|
|
|
|
virtual_keycode,
|
|
|
|
|
modifiers,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_keyboard_release(move |scancode, virtual_keycode, modifiers| {
|
2019-06-25 21:01:13 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 21:01:13 +02:00
|
|
|
event: WindowEvent::KeyboardInput {
|
|
|
|
|
device_id: DeviceId(unsafe { device::Id::dummy() }),
|
|
|
|
|
input: KeyboardInput {
|
|
|
|
|
scancode,
|
|
|
|
|
state: ElementState::Released,
|
|
|
|
|
virtual_keycode,
|
|
|
|
|
modifiers,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2019-06-25 21:18:11 +02:00
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_received_character(move |char_code| {
|
2019-06-25 21:18:11 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 21:18:11 +02:00
|
|
|
event: WindowEvent::ReceivedCharacter(char_code),
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2019-06-25 18:07:47 +02:00
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_cursor_leave(move |pointer_id| {
|
2019-06-25 03:15:34 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 03:15:34 +02:00
|
|
|
event: WindowEvent::CursorLeft {
|
|
|
|
|
device_id: DeviceId(device::Id(pointer_id)),
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2019-06-25 18:07:47 +02:00
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_cursor_enter(move |pointer_id| {
|
2019-06-25 03:15:34 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 03:15:34 +02:00
|
|
|
event: WindowEvent::CursorEntered {
|
|
|
|
|
device_id: DeviceId(device::Id(pointer_id)),
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2019-06-25 18:07:47 +02:00
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_cursor_move(move |pointer_id, position, modifiers| {
|
2019-06-25 03:15:34 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 03:15:34 +02:00
|
|
|
event: WindowEvent::CursorMoved {
|
|
|
|
|
device_id: DeviceId(device::Id(pointer_id)),
|
|
|
|
|
position,
|
|
|
|
|
modifiers,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2019-06-25 18:07:47 +02:00
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_mouse_press(move |pointer_id, button, modifiers| {
|
2019-06-25 03:15:34 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 03:15:34 +02:00
|
|
|
event: WindowEvent::MouseInput {
|
|
|
|
|
device_id: DeviceId(device::Id(pointer_id)),
|
2019-06-29 17:48:22 +02:00
|
|
|
state: ElementState::Pressed,
|
2019-06-25 03:15:34 +02:00
|
|
|
button,
|
|
|
|
|
modifiers,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2019-06-25 18:07:47 +02:00
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_mouse_release(move |pointer_id, button, modifiers| {
|
2019-06-25 03:15:34 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 03:15:34 +02:00
|
|
|
event: WindowEvent::MouseInput {
|
|
|
|
|
device_id: DeviceId(device::Id(pointer_id)),
|
2019-06-29 17:48:22 +02:00
|
|
|
state: ElementState::Released,
|
2019-06-25 03:15:34 +02:00
|
|
|
button,
|
|
|
|
|
modifiers,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2019-06-25 18:07:47 +02:00
|
|
|
let runner = self.runner.clone();
|
2019-06-25 21:36:24 +02:00
|
|
|
canvas.on_mouse_wheel(move |pointer_id, delta, modifiers| {
|
2019-06-25 03:15:34 +02:00
|
|
|
runner.send_event(Event::WindowEvent {
|
2019-09-19 18:40:18 -04:00
|
|
|
window_id: WindowId(id),
|
2019-06-25 03:15:34 +02:00
|
|
|
event: WindowEvent::MouseWheel {
|
|
|
|
|
device_id: DeviceId(device::Id(pointer_id)),
|
|
|
|
|
delta,
|
|
|
|
|
phase: TouchPhase::Moved,
|
|
|
|
|
modifiers,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|