mirror of
https://github.com/rust-windowing/winit.git
synced 2026-08-31 22:00:04 -04:00
feat: Move Event to winit-core
This requires a lot of restructuring on the backend side, as we need to accommodate for backends not being able to construct these types implicitly. In addition, we also need to expose some new APIs on these types to make them usable. Several breaking changes occurred in this commit. Signed-off-by: John Nunley <dev@notgull.net>
This commit is contained in:
@@ -23,3 +23,7 @@ bitflags.workspace = true
|
||||
cursor-icon.workspace = true
|
||||
serde = { workspace = true, optional = true }
|
||||
smol_str.workspace = true
|
||||
web-time = "1"
|
||||
|
||||
[build-dependencies]
|
||||
cfg_aliases = "0.2.0"
|
||||
|
||||
24
winit-core/build.rs
Normal file
24
winit-core/build.rs
Normal file
@@ -0,0 +1,24 @@
|
||||
use cfg_aliases::cfg_aliases;
|
||||
|
||||
fn main() {
|
||||
// The script doesn't depend on our code
|
||||
println!("cargo:rerun-if-changed=build.rs");
|
||||
|
||||
// Setup cfg aliases
|
||||
cfg_aliases! {
|
||||
// Systems.
|
||||
android_platform: { target_os = "android" },
|
||||
web_platform: { all(target_family = "wasm", target_os = "unknown") },
|
||||
macos_platform: { target_os = "macos" },
|
||||
ios_platform: { target_os = "ios" },
|
||||
windows_platform: { target_os = "windows" },
|
||||
apple: { any(target_os = "ios", target_os = "macos") },
|
||||
free_unix: { all(unix, not(apple), not(android_platform), not(target_os = "emscripten")) },
|
||||
redox: { target_os = "redox" },
|
||||
|
||||
// Native displays.
|
||||
x11_platform: { all(feature = "x11", free_unix, not(redox)) },
|
||||
wayland_platform: { all(feature = "wayland", free_unix, not(redox)) },
|
||||
orbital_platform: { redox },
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
28
winit-core/src/event_loop.rs
Normal file
28
winit-core/src/event_loop.rs
Normal file
@@ -0,0 +1,28 @@
|
||||
//! Types needed to define the event loop.
|
||||
|
||||
use std::sync::atomic::{AtomicU64, Ordering};
|
||||
|
||||
/// A unique identifier of the winit's async request.
|
||||
///
|
||||
/// This could be used to identify the async request once it's done
|
||||
/// and a specific action must be taken.
|
||||
///
|
||||
/// One of the handling scenarious could be to maintain a working list
|
||||
/// containing [`AsyncRequestSerial`] and some closure associated with it.
|
||||
/// Then once event is arriving the working list is being traversed and a job
|
||||
/// executed and removed from the list.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct AsyncRequestSerial {
|
||||
serial: u64,
|
||||
}
|
||||
|
||||
impl AsyncRequestSerial {
|
||||
/// Get the next serial in the sequence.
|
||||
pub fn get() -> Self {
|
||||
static CURRENT_SERIAL: AtomicU64 = AtomicU64::new(0);
|
||||
// NOTE: we rely on wrap around here, while the user may just request
|
||||
// in the loop u64::MAX times that's issue is considered on them.
|
||||
let serial = CURRENT_SERIAL.fetch_add(1, Ordering::Relaxed);
|
||||
Self { serial }
|
||||
}
|
||||
}
|
||||
@@ -1454,6 +1454,29 @@ pub enum NamedKey {
|
||||
F35,
|
||||
}
|
||||
|
||||
// NOTE: the exact modifier key is not used to represent modifiers state in the
|
||||
// first place due to a fact that modifiers state could be changed without any
|
||||
// key being pressed and on some platforms like Wayland/X11 which key resulted
|
||||
// in modifiers change is hidden, also, not that it really matters.
|
||||
//
|
||||
// The reason this API is even exposed is mostly to provide a way for users
|
||||
// to treat modifiers differently based on their position, which is required
|
||||
// on macOS due to their AltGr/Option situation.
|
||||
bitflags! {
|
||||
#[doc(hidden)]
|
||||
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub struct ModifiersKeys: u8 {
|
||||
const LSHIFT = 0b0000_0001;
|
||||
const RSHIFT = 0b0000_0010;
|
||||
const LCONTROL = 0b0000_0100;
|
||||
const RCONTROL = 0b0000_1000;
|
||||
const LALT = 0b0001_0000;
|
||||
const RALT = 0b0010_0000;
|
||||
const LSUPER = 0b0100_0000;
|
||||
const RSUPER = 0b1000_0000;
|
||||
}
|
||||
}
|
||||
|
||||
/// Key represents the meaning of a keypress.
|
||||
///
|
||||
/// This is a superset of the UI Events Specification's [`KeyboardEvent.key`] with
|
||||
|
||||
@@ -13,5 +13,6 @@ compile_error! { "no-std and no-alloc usage are not yet supported" }
|
||||
pub mod dpi;
|
||||
pub mod error;
|
||||
pub mod event;
|
||||
pub mod event_loop;
|
||||
pub mod keyboard;
|
||||
pub mod window;
|
||||
|
||||
@@ -191,3 +191,25 @@ impl Default for ImePurpose {
|
||||
Self::Normal
|
||||
}
|
||||
}
|
||||
|
||||
/// An opaque token used to activate the [`Window`].
|
||||
///
|
||||
/// [`Window`]: crate::window::Window
|
||||
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||
pub struct ActivationToken {
|
||||
pub(crate) token: String,
|
||||
}
|
||||
|
||||
impl ActivationToken {
|
||||
pub fn new(_token: String) -> Self {
|
||||
Self { token: _token }
|
||||
}
|
||||
|
||||
pub fn token(&self) -> &str {
|
||||
&self.token
|
||||
}
|
||||
|
||||
pub fn into_token(self) -> String {
|
||||
self.token
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user