diff options
| author | HampusM <hampus@hampusmat.com> | 2026-09-01 18:24:39 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-09-01 18:24:39 +0200 |
| commit | 12f7283b34b9504cafe9448ede110b1fc2a3ae41 (patch) | |
| tree | 529644b6722382e14461c41f28ae42f2f5404132 /engine/src/windowing.rs | |
| parent | 632a7188ea267c93b5317ceffd18f1dab0e97cbe (diff) | |
refactor(engine): replace MapVec with intmap crate
Diffstat (limited to 'engine/src/windowing.rs')
| -rw-r--r-- | engine/src/windowing.rs | 111 |
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> |
