1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-30 13:20:05 -04:00

use winit:🪟:{Window, WindowId};

This commit is contained in:
Emil Ernerfeldt
2023-11-12 16:14:42 +01:00
parent 115e10be76
commit df78a2d4c9

View File

@@ -4,8 +4,9 @@
use std::{cell::RefCell, rc::Rc, sync::Arc, time::Instant}; use std::{cell::RefCell, rc::Rc, sync::Arc, time::Instant};
use raw_window_handle::{HasRawDisplayHandle as _, HasRawWindowHandle as _}; use raw_window_handle::{HasRawDisplayHandle as _, HasRawWindowHandle as _};
use winit::event_loop::{ use winit::{
ControlFlow, EventLoop, EventLoopBuilder, EventLoopProxy, EventLoopWindowTarget, event_loop::{ControlFlow, EventLoop, EventLoopBuilder, EventLoopProxy, EventLoopWindowTarget},
window::{Window, WindowId},
}; };
use egui::{epaint::ahash::HashMap, ViewportBuilder, ViewportId}; use egui::{epaint::ahash::HashMap, ViewportBuilder, ViewportId};
@@ -71,14 +72,14 @@ enum EventResult {
/// ///
/// `RepaintNow` creates a new frame synchronously, and should therefore /// `RepaintNow` creates a new frame synchronously, and should therefore
/// only be used for extremely urgent repaints. /// only be used for extremely urgent repaints.
RepaintNow(winit::window::WindowId), RepaintNow(WindowId),
/// Queues a repaint for once the event loop handles its next redraw. Exists /// Queues a repaint for once the event loop handles its next redraw. Exists
/// so that multiple input events can be handled in one frame. Does not /// so that multiple input events can be handled in one frame. Does not
/// cause any delay like `RepaintNow`. /// cause any delay like `RepaintNow`.
RepaintNext(winit::window::WindowId), RepaintNext(WindowId),
RepaintAt(winit::window::WindowId, Instant), RepaintAt(WindowId, Instant),
Exit, Exit,
} }
@@ -87,19 +88,19 @@ trait WinitApp {
/// The current frame number, as reported by egui. /// The current frame number, as reported by egui.
fn frame_nr(&self, viewport_id: ViewportId) -> u64; fn frame_nr(&self, viewport_id: ViewportId) -> u64;
fn is_focused(&self, window_id: winit::window::WindowId) -> bool; fn is_focused(&self, window_id: WindowId) -> bool;
fn integration(&self) -> Option<&EpiIntegration>; fn integration(&self) -> Option<&EpiIntegration>;
fn window(&self, window_id: winit::window::WindowId) -> Option<Rc<winit::window::Window>>; fn window(&self, window_id: WindowId) -> Option<Rc<Window>>;
fn window_id_from_viewport_id(&self, id: ViewportId) -> Option<winit::window::WindowId>; fn window_id_from_viewport_id(&self, id: ViewportId) -> Option<WindowId>;
fn viewport_id_from_window_id(&self, id: &winit::window::WindowId) -> Option<ViewportId>; fn viewport_id_from_window_id(&self, id: &WindowId) -> Option<ViewportId>;
fn save_and_destroy(&mut self); fn save_and_destroy(&mut self);
fn run_ui_and_paint(&mut self, window_id: winit::window::WindowId) -> EventResult; fn run_ui_and_paint(&mut self, window_id: WindowId) -> EventResult;
fn on_event( fn on_event(
&mut self, &mut self,
@@ -443,18 +444,17 @@ fn run_and_exit(event_loop: EventLoop<UserEvent>, mut winit_app: impl WinitApp +
/// Run an egui app /// Run an egui app
#[cfg(feature = "glow")] #[cfg(feature = "glow")]
mod glow_integration { mod glow_integration {
use glutin::{
display::GetGlDisplay,
prelude::{GlDisplay, NotCurrentGlContextSurfaceAccessor, PossiblyCurrentGlContext},
surface::GlSurface,
};
use egui::{ use egui::{
epaint::ahash::HashMap, NumExt as _, ViewportIdMap, ViewportIdPair, ViewportIdSet, epaint::ahash::HashMap, NumExt as _, ViewportIdMap, ViewportIdPair, ViewportIdSet,
ViewportOutput, ViewportUiCallback, ViewportOutput, ViewportUiCallback,
}; };
use egui_winit::{create_winit_window_builder, process_viewport_commands, EventResponse}; use egui_winit::{create_winit_window_builder, process_viewport_commands, EventResponse};
use glutin::{
display::GetGlDisplay,
prelude::{GlDisplay, NotCurrentGlContextSurfaceAccessor, PossiblyCurrentGlContext},
surface::GlSurface,
};
use winit::window::WindowId;
use super::*; use super::*;
@@ -485,7 +485,7 @@ mod glow_integration {
struct Viewport { struct Viewport {
gl_surface: Option<glutin::surface::Surface<glutin::surface::WindowSurface>>, gl_surface: Option<glutin::surface::Surface<glutin::surface::WindowSurface>>,
window: Option<Rc<winit::window::Window>>, window: Option<Rc<Window>>,
id_pair: ViewportIdPair, id_pair: ViewportIdPair,
/// The user-callback that shows the ui. /// The user-callback that shows the ui.
@@ -832,7 +832,7 @@ mod glow_integration {
.expect("viewport doesn't exist") .expect("viewport doesn't exist")
} }
fn window(&self, viewport_id: ViewportId) -> Rc<winit::window::Window> { fn window(&self, viewport_id: ViewportId) -> Rc<Window> {
self.viewport(viewport_id) self.viewport(viewport_id)
.borrow() .borrow()
.window .window
@@ -1264,11 +1264,11 @@ mod glow_integration {
let viewport = &mut *viewport.borrow_mut(); let viewport = &mut *viewport.borrow_mut();
let Some(winit_state) = &mut viewport.egui_winit else { let Some(winit_state) = &mut viewport.egui_winit else {
return; return;
}; };
let Some(window) = &viewport.window else { let Some(window) = &viewport.window else {
return; return;
}; };
let mut input = winit_state.take_egui_input(window, id_pair); let mut input = winit_state.take_egui_input(window, id_pair);
input.time = Some(beginning.elapsed().as_secs_f64()); input.time = Some(beginning.elapsed().as_secs_f64());
@@ -1365,7 +1365,7 @@ mod glow_integration {
self.running.as_ref().map(|r| &r.integration) self.running.as_ref().map(|r| &r.integration)
} }
fn window(&self, window_id: WindowId) -> Option<Rc<winit::window::Window>> { fn window(&self, window_id: WindowId) -> Option<Rc<Window>> {
let running = self.running.as_ref()?; let running = self.running.as_ref()?;
let glutin_ctx = running.glutin_ctx.borrow(); let glutin_ctx = running.glutin_ctx.borrow();
let viewport_id = *glutin_ctx.viewport_maps.get(&window_id)?; let viewport_id = *glutin_ctx.viewport_maps.get(&window_id)?;
@@ -1829,7 +1829,7 @@ mod wgpu_integration {
#[derive(Clone)] #[derive(Clone)]
pub struct Viewport { pub struct Viewport {
window: Option<Rc<winit::window::Window>>, window: Option<Rc<Window>>,
egui_winit: Rc<RefCell<Option<egui_winit::State>>>, egui_winit: Rc<RefCell<Option<egui_winit::State>>>,
@@ -1848,7 +1848,7 @@ mod wgpu_integration {
viewports: Viewports, viewports: Viewports,
builders: ViewportIdMap<ViewportBuilder>, builders: ViewportIdMap<ViewportBuilder>,
painter: egui_wgpu::winit::Painter, painter: egui_wgpu::winit::Painter,
viewport_maps: HashMap<winit::window::WindowId, ViewportId>, viewport_maps: HashMap<WindowId, ViewportId>,
} }
/// State that is initialized when the application is first starts running via /// State that is initialized when the application is first starts running via
@@ -1954,7 +1954,7 @@ mod wgpu_integration {
&mut self, &mut self,
event_loop: &EventLoopWindowTarget<UserEvent>, event_loop: &EventLoopWindowTarget<UserEvent>,
storage: Option<Box<dyn epi::Storage>>, storage: Option<Box<dyn epi::Storage>>,
window: winit::window::Window, window: Window,
builder: ViewportBuilder, builder: ViewportBuilder,
) -> Result<(), egui_wgpu::WgpuError> { ) -> Result<(), egui_wgpu::WgpuError> {
crate::profile_function!(); crate::profile_function!();
@@ -2112,7 +2112,7 @@ mod wgpu_integration {
storage: Option<&dyn epi::Storage>, storage: Option<&dyn epi::Storage>,
title: &str, title: &str,
native_options: &mut NativeOptions, native_options: &mut NativeOptions,
) -> Result<(winit::window::Window, ViewportBuilder), winit::error::OsError> { ) -> Result<(Window, ViewportBuilder), winit::error::OsError> {
crate::profile_function!(); crate::profile_function!();
let window_settings = epi_integration::load_window_settings(storage); let window_settings = epi_integration::load_window_settings(storage);
@@ -2129,9 +2129,9 @@ mod wgpu_integration {
fn init_window( fn init_window(
id: ViewportId, id: ViewportId,
builder: &ViewportBuilder, builder: &ViewportBuilder,
windows_id: &mut HashMap<winit::window::WindowId, ViewportId>, windows_id: &mut HashMap<WindowId, ViewportId>,
painter: &mut egui_wgpu::winit::Painter, painter: &mut egui_wgpu::winit::Painter,
window: &mut Option<Rc<winit::window::Window>>, window: &mut Option<Rc<Window>>,
egui_winit: &mut Option<egui_winit::State>, egui_winit: &mut Option<egui_winit::State>,
event_loop: &EventLoopWindowTarget<UserEvent>, event_loop: &EventLoopWindowTarget<UserEvent>,
) { ) {
@@ -2214,11 +2214,11 @@ mod wgpu_integration {
let viewport = viewports.get(&id_pair.this).cloned(); let viewport = viewports.get(&id_pair.this).cloned();
let Some(viewport) = viewport else { return }; let Some(viewport) = viewport else { return };
let Some(winit_state) = &mut *viewport.egui_winit.borrow_mut() else { let Some(winit_state) = &mut *viewport.egui_winit.borrow_mut() else {
return; return;
}; };
let Some(window) = viewport.window else { let Some(window) = viewport.window else {
return; return;
}; };
let mut input = winit_state.take_egui_input(&window, id_pair); let mut input = winit_state.take_egui_input(&window, id_pair);
input.time = Some(beginning.elapsed().as_secs_f64()); input.time = Some(beginning.elapsed().as_secs_f64());
@@ -2242,11 +2242,11 @@ mod wgpu_integration {
let viewport = viewports.get(&id_pair.this).cloned(); let viewport = viewports.get(&id_pair.this).cloned();
let Some(viewport) = viewport else { return }; let Some(viewport) = viewport else { return };
let Some(winit_state) = &mut *viewport.egui_winit.borrow_mut() else { let Some(winit_state) = &mut *viewport.egui_winit.borrow_mut() else {
return; return;
}; };
let Some(window) = viewport.window else { let Some(window) = viewport.window else {
return; return;
}; };
if let Err(err) = pollster::block_on(painter.set_window(id_pair.this, Some(&window))) { if let Err(err) = pollster::block_on(painter.set_window(id_pair.this, Some(&window))) {
log::error!( log::error!(
@@ -2276,7 +2276,7 @@ mod wgpu_integration {
.map_or(0, |r| r.integration.egui_ctx.frame_nr_for(viewport_id)) .map_or(0, |r| r.integration.egui_ctx.frame_nr_for(viewport_id))
} }
fn is_focused(&self, window_id: winit::window::WindowId) -> bool { fn is_focused(&self, window_id: WindowId) -> bool {
if let Some(focus) = self.focused_viewport { if let Some(focus) = self.focused_viewport {
self.viewport_id_from_window_id(&window_id) self.viewport_id_from_window_id(&window_id)
.map_or(false, |i| i == focus) .map_or(false, |i| i == focus)
@@ -2289,7 +2289,7 @@ mod wgpu_integration {
self.running.as_ref().map(|r| &r.integration) self.running.as_ref().map(|r| &r.integration)
} }
fn window(&self, window_id: winit::window::WindowId) -> Option<Rc<winit::window::Window>> { fn window(&self, window_id: WindowId) -> Option<Rc<Window>> {
self.running self.running
.as_ref() .as_ref()
.and_then(|r| { .and_then(|r| {
@@ -2302,7 +2302,7 @@ mod wgpu_integration {
.flatten() .flatten()
} }
fn window_id_from_viewport_id(&self, id: ViewportId) -> Option<winit::window::WindowId> { fn window_id_from_viewport_id(&self, id: ViewportId) -> Option<WindowId> {
self.running.as_ref().and_then(|r| { self.running.as_ref().and_then(|r| {
r.shared r.shared
.borrow() .borrow()
@@ -2333,7 +2333,7 @@ mod wgpu_integration {
} }
} }
fn run_ui_and_paint(&mut self, window_id: winit::window::WindowId) -> EventResult { fn run_ui_and_paint(&mut self, window_id: WindowId) -> EventResult {
let Some(running) = &mut self.running else { let Some(running) = &mut self.running else {
return EventResult::Wait; return EventResult::Wait;
}; };
@@ -2755,7 +2755,7 @@ mod wgpu_integration {
}) })
} }
fn viewport_id_from_window_id(&self, id: &winit::window::WindowId) -> Option<ViewportId> { fn viewport_id_from_window_id(&self, id: &WindowId) -> Option<ViewportId> {
self.running self.running
.as_ref() .as_ref()
.and_then(|r| r.shared.borrow().viewport_maps.get(id).copied()) .and_then(|r| r.shared.borrow().viewport_maps.get(id).copied())
@@ -2787,7 +2787,7 @@ pub use wgpu_integration::run_wgpu;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
fn system_theme(window: &winit::window::Window, options: &NativeOptions) -> Option<crate::Theme> { fn system_theme(window: &Window, options: &NativeOptions) -> Option<crate::Theme> {
if options.follow_system_theme { if options.follow_system_theme {
window window
.theme() .theme()