summaryrefslogtreecommitdiff
path: root/engine/src/windowing.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-09-01 18:24:39 +0200
committerHampusM <hampus@hampusmat.com>2026-09-01 18:24:39 +0200
commit12f7283b34b9504cafe9448ede110b1fc2a3ae41 (patch)
tree529644b6722382e14461c41f28ae42f2f5404132 /engine/src/windowing.rs
parent632a7188ea267c93b5317ceffd18f1dab0e97cbe (diff)
refactor(engine): replace MapVec with intmap crate
Diffstat (limited to 'engine/src/windowing.rs')
-rw-r--r--engine/src/windowing.rs111
1 files changed, 29 insertions, 82 deletions
diff --git a/engine/src/windowing.rs b/engine/src/windowing.rs
index aa86f01..2493851 100644
--- a/engine/src/windowing.rs
+++ b/engine/src/windowing.rs
@@ -8,6 +8,7 @@ use std::time::Duration;
use bitflags::{bitflags, bitflags_match, Flags};
use crossbeam_queue::ArrayQueue;
+use intmap::IntMap;
use raw_window_handle::{DisplayHandle, HandleError, HasDisplayHandle, WindowHandle};
use winit::application::ApplicationHandler;
use winit::error::EventLoopError;
@@ -19,7 +20,6 @@ use winit::event_loop::{
OwnedDisplayHandle,
};
use winit::keyboard::PhysicalKey;
-use winit::monitor::MonitorHandle as WinitMonitorHandle;
use winit::window::{Window as WinitWindow, WindowId as WinitWindowId};
use crate::ecs::actions::Actions;
@@ -33,7 +33,7 @@ use crate::ecs::system::observer::Observe;
use crate::ecs::uid::Uid;
use crate::ecs::util::StreamingIterator;
use crate::ecs::{declare_entity, pair, Query, Sole};
-use crate::util::{BitArray, MapVec};
+use crate::util::BitArray;
use crate::vector::Vec2;
use crate::windowing::dpi::{PhysicalPosition, PhysicalSize, Position};
use crate::windowing::keyboard::{Key, KeyState, Keyboard, UnknownKeyCodeError};
@@ -169,17 +169,17 @@ fn update_stuff(
mouse.curr_tick_scroll_delta = input.mouse_scroll_delta.clone();
for (mouse_button, mouse_button_input) in input.mouse_buttons.iter_mut() {
- mouse_buttons.set_previous_to_current(*mouse_button);
+ mouse_buttons.set_previous_to_current(mouse_button);
if mouse_button_input.flags.is_all() {
- match mouse_buttons.get_previous(*mouse_button) {
+ match mouse_buttons.get_previous(mouse_button) {
MouseButtonState::Pressed => {
- mouse_buttons.set(*mouse_button, MouseButtonState::Released);
+ mouse_buttons.set(mouse_button, MouseButtonState::Released);
mouse_button_input.flags.remove(MouseButtonFlags::RELEASED);
}
MouseButtonState::Released => {
- mouse_buttons.set(*mouse_button, MouseButtonState::Pressed);
+ mouse_buttons.set(mouse_button, MouseButtonState::Pressed);
mouse_button_input.flags.remove(MouseButtonFlags::PRESSED);
}
@@ -203,7 +203,7 @@ fn update_stuff(
})
};
- mouse_buttons.set(*mouse_button, mouse_button_state);
+ mouse_buttons.set(mouse_button, mouse_button_state);
mouse_button_input.flags.clear();
}
@@ -284,7 +284,7 @@ fn update_stuff(
);
let Some(window_ent_id) =
- windows.get(&window_id).map(|(_, ent_id)| ent_id)
+ windows.get(window_id).map(|(_, ent_id)| ent_id)
else {
tracing::error!(
wid = ?window_id,
@@ -307,7 +307,7 @@ fn update_stuff(
}
MessageFromApp::WindowCloseRequested(window_id) => {
let Some(window_ent_id) =
- windows.get(&window_id).map(|(_, ent_id)| ent_id)
+ windows.get(window_id).map(|(_, ent_id)| ent_id)
else {
tracing::error!(
wid = ?window_id,
@@ -320,7 +320,7 @@ fn update_stuff(
}
MessageFromApp::WindowScaleFactorChanged(window_id, scale_factor) => {
let Some(window_ent_id) =
- windows.get(&window_id).map(|(_, ent_id)| ent_id)
+ windows.get(window_id).map(|(_, ent_id)| ent_id)
else {
tracing::error!(
wid = ?window_id,
@@ -384,7 +384,7 @@ fn handle_window_changed(
let mut window = evt_match.get_ent_target_comp_mut();
- let Some((winit_window, _)) = context.windows.get(&window.wid()) else {
+ let Some((winit_window, _)) = context.windows.get(window.wid()) else {
tracing::error!(
wid = ?window.wid(),
entity_id = %window_ent_id,
@@ -435,8 +435,8 @@ pub struct Context
{
shared_state: Arc<SharedState>,
display_handle: Option<OwnedDisplayHandle>,
- windows: MapVec<WindowId, (Arc<WinitWindow>, Uid)>,
- available_monitors: MapVec<NativeMonitorId, MonitorHandle>,
+ windows: IntMap<WindowId, (Arc<WinitWindow>, Uid)>,
+ available_monitors: Vec<MonitorHandle>,
primary_monitor: Option<MonitorHandle>,
}
@@ -456,7 +456,7 @@ impl Context
window_id: &WindowId,
) -> Option<Result<WindowHandle<'_>, HandleError>>
{
- self.windows.get(window_id).map(|(winit_window, _)| {
+ self.windows.get(*window_id).map(|(winit_window, _)| {
#[cfg(windows)]
{
use winit::platform::windows::WindowExtWindows;
@@ -485,7 +485,7 @@ impl Context
/// may not exist any longer.
pub fn available_monitors(&self) -> impl Iterator<Item = &MonitorHandle>
{
- self.available_monitors.values()
+ self.available_monitors.iter()
}
fn try_send_message_to_app(&self, message: MessageToApp)
@@ -526,7 +526,7 @@ impl Context
match catch_unwind(move || {
let mut app = App {
shared_state: shared_state_b,
- windows: MapVec::default(),
+ windows: IntMap::with_capacity(1),
};
let event_loop = match create_event_loop() {
@@ -583,8 +583,8 @@ impl Context
return Self {
shared_state,
display_handle: None,
- windows: MapVec::default(),
- available_monitors: MapVec::default(),
+ windows: IntMap::with_capacity(1),
+ available_monitors: Vec::with_capacity(2),
primary_monitor: None,
};
}
@@ -640,8 +640,8 @@ impl Context
return Self {
shared_state,
display_handle: None,
- windows: MapVec::default(),
- available_monitors: MapVec::default(),
+ windows: IntMap::with_capacity(1),
+ available_monitors: Vec::with_capacity(2),
primary_monitor: None,
};
};
@@ -649,7 +649,7 @@ impl Context
Self {
shared_state,
display_handle: Some(init_data.display),
- windows: MapVec::default(),
+ windows: IntMap::with_capacity(1),
available_monitors: init_data.available_monitors,
primary_monitor: init_data.primary_monitor,
}
@@ -755,7 +755,7 @@ struct Input
relative_mouse_pos_delta: Vec2<f64>,
absolute_mouse_pos: PhysicalPosition<f64>,
mouse_scroll_delta: MouseScrollDelta,
- mouse_buttons: MapVec<MouseButton, MouseButtonInput>,
+ mouse_buttons: IntMap<MouseButton, MouseButtonInput>,
keys: BitArray<{ (Key::KEYS.len() * BITS_PER_KEY).div_ceil(8) }, BITS_PER_KEY>,
}
@@ -767,7 +767,7 @@ impl Default for Input
relative_mouse_pos_delta: Vec2::default(),
absolute_mouse_pos: PhysicalPosition::default(),
mouse_scroll_delta: MouseScrollDelta::default(),
- mouse_buttons: MapVec::from_iter([
+ mouse_buttons: IntMap::from_iter([
(MouseButton::Left, MouseButtonInput::default()),
(MouseButton::Right, MouseButtonInput::default()),
(MouseButton::Middle, MouseButtonInput::default()),
@@ -804,7 +804,7 @@ const KEY_RELEASED_BITS: u8 = 0b01;
struct InitData
{
display: OwnedDisplayHandle,
- available_monitors: MapVec<NativeMonitorId, MonitorHandle>,
+ available_monitors: Vec<MonitorHandle>,
primary_monitor: Option<MonitorHandle>,
}
@@ -812,7 +812,7 @@ struct InitData
struct App
{
shared_state: Arc<SharedState>,
- windows: MapVec<WindowId, (Weak<WinitWindow>, WindowSettings)>,
+ windows: IntMap<WindowId, (Weak<WinitWindow>, WindowSettings)>,
}
impl App
@@ -862,7 +862,7 @@ impl App
));
}
MessageToApp::SetWindowCursorGrabMode(window_id, cursor_grab_mode) => {
- let Some((_, window_settings)) = self.windows.get_mut(&window_id)
+ let Some((_, window_settings)) = self.windows.get_mut(window_id)
else {
tracing::warn!(
window_id=?window_id,
@@ -906,13 +906,8 @@ impl ApplicationHandler for App
StartCause::Init => {
let available_monitors = event_loop
.available_monitors()
- .map(|monitor| {
- (
- get_monitor_native_id(&monitor, event_loop),
- MonitorHandle::from_winit_monitor_handle(monitor),
- )
- })
- .collect::<MapVec<_, _>>();
+ .map(MonitorHandle::from_winit_monitor_handle)
+ .collect::<Vec<_>>();
let Ok(mut init_data) = self.shared_state.init_data.lock() else {
tracing::error!("Init data mutex is poisoned, exiting event loop");
@@ -1039,7 +1034,7 @@ impl ApplicationHandler for App
}
let Some((window, window_settings)) =
- self.windows.get(&WindowId::from_inner(window_id))
+ self.windows.get(WindowId::from_inner(window_id))
else {
cold_path();
return;
@@ -1166,54 +1161,6 @@ struct WindowSettings
cursor_grab_mode: CursorGrabMode,
}
-#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
-enum NativeMonitorId
-{
- #[cfg(windows)]
- Windows(String),
-
- #[cfg(target_os = "linux")]
- X11(u32),
-
- #[cfg(target_os = "linux")]
- Wayland(u32),
-}
-
-fn get_monitor_native_id(
- monitor: &WinitMonitorHandle,
- #[allow(unused)] // Only used when target OS is linux
- event_loop: &ActiveEventLoop,
-) -> NativeMonitorId
-{
- cfg_select! {
- windows => {
- use winit::platform::windows::MonitorHandleExtWindows;
-
- NativeMonitorId::Windows(monitor.native_id())
- }
- target_os = "linux" => {
- use winit::platform::wayland::{
- ActiveEventLoopExtWayland,
- MonitorHandleExtWayland,
- };
- use winit::platform::x11::MonitorHandleExtX11;
-
- if event_loop.is_wayland() {
- NativeMonitorId::Wayland(
- <WinitMonitorHandle as MonitorHandleExtWayland>::native_id(monitor),
- )
- } else {
- NativeMonitorId::X11(
- <WinitMonitorHandle as MonitorHandleExtX11>::native_id(monitor),
- )
- }
- }
- _ => {
- compile_error!("Unsupported target platform")
- }
- }
-}
-
fn iter_array_queue<Item>(
queue: &ArrayQueue<Item>,
) -> impl Iterator<Item = Item> + use<'_, Item>