mirror of
https://github.com/rust-windowing/winit.git
synced 2026-06-26 22:53:15 -04:00
Add gamepad support for stdweb and web-sys, as well as web-specific gamepad examples. * [web] Fix compilation error from device api * [wasm] Apply device api changes * [wasm] Format and cleanup * [wasm32] Implement gamepad connections * [wasm] Harmonize * [Test] Made some tests with wasm-pack * Quick fix instant non supporting Hash trait * Fix on_received_character * [web_sys] Split add_event and add_window_event * [web] split device implementations * Update tests/web...still does not work * [tests/web] do not ignore index.html * [web/web_sys] split canvas and window * [tests/web] enable stack trace * [web] fix borrowmut * [web_sys] fix gamepad registration * [web] harmonize naming * [web_sys] create global emitter * [web] implement gamepad buttons * [web] implement gamepad axis * [web] cleanup * [web] update test * [web] move tests/web to examples/web * [web] axis does produce stick event * [web] Support Stick event * [web] implement gamepad to stdweb * [web] rename examples/web to examples/wasm * [web/web-sys] Move gamepad_manager from backend * [web/web_sys] implement EventLoop::gamepads * [web/web_sys] Drain gamepad events * [web/stdweb] apply web_sys changes * [web] update web/examples * [web] move gamepads code to gamepad_manager * [web] simplify and optimise * [web] replace EventCode to GamepadAxis and GamepadButton structs * [web] reuse gamepad events due to chrome issue * [web] rumble does not work * [web/stdweb] try debugging * [web] fix Chrome gamepad not updated * [web/stdweb] created an example * [examples] fix paths * fix warnings * [web/examples] update comments * [web/stdweb] add experimental support to vibrate() * [web] add CR
85 lines
2.2 KiB
Rust
85 lines
2.2 KiB
Rust
mod proxy;
|
|
mod runner;
|
|
mod state;
|
|
mod window_target;
|
|
pub(crate) mod global;
|
|
|
|
pub use self::proxy::Proxy;
|
|
pub use self::window_target::WindowTarget;
|
|
|
|
use super::{backend, monitor, window};
|
|
use crate::event::Event;
|
|
use crate::event_loop as root;
|
|
|
|
use std::collections::{vec_deque::IntoIter as VecDequeIter, VecDeque};
|
|
use std::marker::PhantomData;
|
|
|
|
pub struct EventLoop<T: 'static> {
|
|
elw: root::EventLoopWindowTarget<T>,
|
|
}
|
|
|
|
impl<T> EventLoop<T> {
|
|
pub fn new() -> Self {
|
|
EventLoop {
|
|
elw: root::EventLoopWindowTarget {
|
|
p: WindowTarget::new(),
|
|
_marker: PhantomData,
|
|
},
|
|
}
|
|
}
|
|
|
|
pub fn available_monitors(&self) -> VecDequeIter<monitor::Handle> {
|
|
VecDeque::new().into_iter()
|
|
}
|
|
|
|
pub fn primary_monitor(&self) -> monitor::Handle {
|
|
monitor::Handle
|
|
}
|
|
|
|
pub fn run<F>(self, mut event_handler: F) -> !
|
|
where
|
|
F: 'static + FnMut(Event<T>, &root::EventLoopWindowTarget<T>, &mut root::ControlFlow),
|
|
{
|
|
let target = root::EventLoopWindowTarget {
|
|
p: self.elw.p.clone(),
|
|
_marker: PhantomData,
|
|
};
|
|
|
|
self.elw.p.run(Box::new(move |event, flow| {
|
|
event_handler(event, &target, flow)
|
|
}));
|
|
|
|
// Throw an exception to break out of Rust exceution and use unreachable to tell the
|
|
// compiler this function won't return, giving it a return type of '!'
|
|
backend::throw(
|
|
"Using exceptions for control flow, don't mind me. This isn't actually an error!",
|
|
);
|
|
|
|
unreachable!();
|
|
}
|
|
|
|
pub fn create_proxy(&self) -> Proxy<T> {
|
|
self.elw.p.proxy()
|
|
}
|
|
|
|
pub fn window_target(&self) -> &root::EventLoopWindowTarget<T> {
|
|
&self.elw
|
|
}
|
|
|
|
pub fn mice(&self) -> impl '_ + Iterator<Item = crate::event::device::MouseId> {
|
|
std::iter::empty()
|
|
}
|
|
|
|
pub fn keyboards(&self) -> impl '_ + Iterator<Item = crate::event::device::KeyboardId> {
|
|
std::iter::empty()
|
|
}
|
|
|
|
pub fn hids(&self) -> impl '_ + Iterator<Item = crate::event::device::HidId> {
|
|
std::iter::empty()
|
|
}
|
|
|
|
pub fn gamepads(&self) -> impl '_ + Iterator<Item = crate::event::device::GamepadHandle> {
|
|
self.elw.p.collect_gamepads().into_iter()
|
|
}
|
|
}
|