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

No need to clone viewports

This commit is contained in:
Emil Ernerfeldt
2023-11-13 15:38:39 +01:00
parent 8d35f51b52
commit 39ccffbaf9

View File

@@ -1863,7 +1863,6 @@ mod wgpu_integration {
use super::*; use super::*;
#[derive(Clone)]
pub struct Viewport { pub struct Viewport {
window: Option<Rc<Window>>, window: Option<Rc<Window>>,
@@ -2387,11 +2386,18 @@ mod wgpu_integration {
let (viewport_ui_cb, raw_input) = { let (viewport_ui_cb, raw_input) = {
let mut shared_lock = shared.borrow_mut(); let mut shared_lock = shared.borrow_mut();
let Some(viewport_id) = shared_lock.viewport_maps.get(&window_id).copied() else { let SharedState {
viewports,
painter,
viewport_maps,
..
} = &mut *shared_lock;
let Some(viewport_id) = viewport_maps.get(&window_id).copied() else {
return EventResult::Wait; return EventResult::Wait;
}; };
let Some(viewport) = shared_lock.viewports.get(&viewport_id).cloned() else { let Some(viewport) = viewports.get(&viewport_id) else {
return EventResult::Wait; return EventResult::Wait;
}; };
@@ -2408,7 +2414,7 @@ mod wgpu_integration {
// This is used to not render a viewport if is sync // This is used to not render a viewport if is sync
if viewport_id != ViewportId::ROOT && viewport_ui_cb.is_none() { if viewport_id != ViewportId::ROOT && viewport_ui_cb.is_none() {
if let Some(viewport) = shared_lock.viewports.get(&parent_id) { if let Some(viewport) = viewports.get(parent_id) {
if let Some(window) = viewport.window.as_ref() { if let Some(window) = viewport.window.as_ref() {
return EventResult::RepaintNext(window.id()); return EventResult::RepaintNext(window.id());
} }
@@ -2416,20 +2422,17 @@ mod wgpu_integration {
return EventResult::Wait; return EventResult::Wait;
} }
let _ = let _ = pollster::block_on(painter.set_window(viewport_id, Some(window)));
pollster::block_on(shared_lock.painter.set_window(viewport_id, Some(&window)));
drop(shared_lock); // Release lock!
let raw_input = egui_winit.borrow_mut().as_mut().unwrap().take_egui_input( let raw_input = egui_winit.borrow_mut().as_mut().unwrap().take_egui_input(
&window, window,
ViewportIdPair { ViewportIdPair {
this: viewport_id, this: viewport_id,
parent: parent_id, parent: *parent_id,
}, },
); );
integration.pre_update(&window); integration.pre_update(window);
(viewport_ui_cb.clone(), raw_input) (viewport_ui_cb.clone(), raw_input)
}; };
@@ -2449,7 +2452,7 @@ mod wgpu_integration {
return EventResult::Wait; return EventResult::Wait;
}; };
let Some(viewport) = shared_lock.viewports.get(&viewport_id).cloned() else { let Some(viewport) = shared_lock.viewports.get(&viewport_id) else {
return EventResult::Wait; return EventResult::Wait;
}; };
@@ -2461,7 +2464,7 @@ mod wgpu_integration {
return EventResult::Wait; return EventResult::Wait;
}; };
integration.post_update(app.as_mut(), &window); integration.post_update(app.as_mut(), window);
let FullOutput { let FullOutput {
platform_output, platform_output,
@@ -2472,7 +2475,7 @@ mod wgpu_integration {
} = full_output; } = full_output;
integration.handle_platform_output( integration.handle_platform_output(
&window, window,
viewport_id, viewport_id,
platform_output, platform_output,
egui_winit.borrow_mut().as_mut().unwrap(), egui_winit.borrow_mut().as_mut().unwrap(),
@@ -2497,8 +2500,8 @@ mod wgpu_integration {
*screenshot_requested = false; *screenshot_requested = false;
integration.frame.screenshot.set(screenshot); integration.frame.screenshot.set(screenshot);
integration.post_rendering(app.as_mut(), &window); integration.post_rendering(app.as_mut(), window);
integration.post_present(&window); integration.post_present(window);
let SharedState { let SharedState {
viewports, viewports,
@@ -2741,15 +2744,11 @@ mod wgpu_integration {
_ => {} _ => {}
}; };
let event_response = if let Some((id, viewport)) = let shared = running.shared.borrow();
viewport_id.and_then(|id| {
running let event_response = if let Some((id, viewport)) = viewport_id
.shared .and_then(|id| shared.viewports.get(&id).map(|viewport| (id, viewport)))
.borrow() {
.viewports
.get(&id)
.map(|w| (id, w.clone()))
}) {
if let Some(egui_winit) = &mut *viewport.egui_winit.borrow_mut() { if let Some(egui_winit) = &mut *viewport.egui_winit.borrow_mut() {
Some(running.integration.on_event( Some(running.integration.on_event(
running.app.as_mut(), running.app.as_mut(),