1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-01 22:30:03 -04:00

Now eframe glow supports viewport sync icon

This commit is contained in:
Konkitoman
2023-09-06 19:16:20 +03:00
parent fb80880ff8
commit a5d4ce84d4

View File

@@ -489,7 +489,6 @@ mod glow_integration {
} }
struct Window { struct Window {
builder: ViewportBuilder,
gl_surface: Option<glutin::surface::Surface<glutin::surface::WindowSurface>>, gl_surface: Option<glutin::surface::Surface<glutin::surface::WindowSurface>>,
window: Option<Arc<RwLock<winit::window::Window>>>, window: Option<Arc<RwLock<winit::window::Window>>>,
viewport_id: ViewportId, viewport_id: ViewportId,
@@ -520,6 +519,7 @@ mod glow_integration {
windows: HashMap<ViewportId, Arc<RwLock<Window>>>, windows: HashMap<ViewportId, Arc<RwLock<Window>>>,
window_maps: HashMap<winit::window::WindowId, ViewportId>, window_maps: HashMap<winit::window::WindowId, ViewportId>,
builders: HashMap<ViewportId, ViewportBuilder>,
} }
#[allow(unsafe_code)] #[allow(unsafe_code)]
@@ -639,7 +639,6 @@ mod glow_integration {
windows.insert( windows.insert(
ViewportId::MAIN, ViewportId::MAIN,
Arc::new(RwLock::new(Window { Arc::new(RwLock::new(Window {
builder: window_builder,
gl_surface: None, gl_surface: None,
window: window.map(|w| Arc::new(RwLock::new(w))), window: window.map(|w| Arc::new(RwLock::new(w))),
viewport_id: ViewportId::MAIN, viewport_id: ViewportId::MAIN,
@@ -649,6 +648,9 @@ mod glow_integration {
})), })),
); );
let mut builders = HashMap::default();
builders.insert(ViewportId::MAIN, window_builder);
// the fun part with opengl gl is that we never know whether there is an error. the context creation might have failed, but // the fun part with opengl gl is that we never know whether there is an error. the context creation might have failed, but
// it could keep working until we try to make surface current or swap buffers or something else. future glutin improvements might // it could keep working until we try to make surface current or swap buffers or something else. future glutin improvements might
// help us start from scratch again if we fail context creation and go back to preferEgl or try with different config etc.. // help us start from scratch again if we fail context creation and go back to preferEgl or try with different config etc..
@@ -659,6 +661,7 @@ mod glow_integration {
current_gl_context: None, current_gl_context: None,
not_current_gl_context, not_current_gl_context,
windows, windows,
builders,
window_maps, window_maps,
}) })
} }
@@ -692,6 +695,7 @@ mod glow_integration {
win: &Arc<RwLock<Window>>, win: &Arc<RwLock<Window>>,
event_loop: &EventLoopWindowTarget<UserEvent>, event_loop: &EventLoopWindowTarget<UserEvent>,
) -> Result<()> { ) -> Result<()> {
let builder = &self.builders[&win.read().viewport_id];
let mut win = win.write(); let mut win = win.write();
// make sure we have a window or create one. // make sure we have a window or create one.
let window = win.window.take().unwrap_or_else(|| { let window = win.window.take().unwrap_or_else(|| {
@@ -699,7 +703,7 @@ mod glow_integration {
Arc::new(RwLock::new( Arc::new(RwLock::new(
glutin_winit::finalize_window( glutin_winit::finalize_window(
event_loop, event_loop,
create_winit_window_builder(&win.builder), create_winit_window_builder(builder),
&self.gl_config, &self.gl_config,
) )
.expect("failed to finalize glutin window"), .expect("failed to finalize glutin window"),
@@ -1032,13 +1036,20 @@ mod glow_integration {
// ## Sync Rendering // ## Sync Rendering
integration.egui_ctx.set_render_sync_callback( integration.egui_ctx.set_render_sync_callback(
move |viewport_builder, viewport_id, parent_id, render| { move |mut viewport_builder, viewport_id, parent_id, render| {
// TODO: If the `viewport_builder` do not have a icon set the icon to be the icon of the parent viewport if viewport_builder.icon.is_none(){
viewport_builder.icon = glutin.read().builders.get(&parent_id).and_then(|b|b.icon.clone());
}
let has_window = glutin.read().windows.get(&viewport_id).is_some(); let has_window = glutin.read().windows.get(&viewport_id).is_some();
if !has_window{ if !has_window{
glutin.write().windows.entry(viewport_id).or_insert(Arc::new(RwLock::new(Window{ builder: viewport_builder, gl_surface: None, window: None, viewport_id, parent_id, render: None, egui_winit: None }))); {
let win = glutin.read().windows.get(&viewport_id).cloned().unwrap(); let mut glutin = glutin.write();
glutin.windows.entry(viewport_id).or_insert(Arc::new(RwLock::new(Window{ gl_surface: None, window: None, viewport_id, parent_id, render: None, egui_winit: None })));
glutin.builders.entry(viewport_id).or_insert(viewport_builder);
}
let win = glutin.read().windows[&viewport_id].clone();
let event_loop; let event_loop;
#[allow(unsafe_code)] #[allow(unsafe_code)]
unsafe{ unsafe{
@@ -1090,7 +1101,8 @@ mod glow_integration {
.unwrap() .unwrap()
.is_current(glutin.current_gl_context.as_ref().unwrap()) .is_current(glutin.current_gl_context.as_ref().unwrap())
{ {
log::error!("egui::create_viewport_sync with title: `{}` is not created in main thread, try to use wgpu!", window.builder.title); let builder = &&glutin.builders[&window.viewport_id];
log::error!("egui::create_viewport_sync with title: `{}` is not created in main thread, try to use wgpu!", builder.title);
} }
egui_glow::painter::clear( egui_glow::painter::clear(
@@ -1155,14 +1167,16 @@ mod glow_integration {
let mut active_viewports_ids = vec![ViewportId::MAIN]; let mut active_viewports_ids = vec![ViewportId::MAIN];
viewports.retain_mut(|(id, _, builder, render)| { viewports.retain_mut(|(id, _, builder, render)| {
let mut glutin = glutin_ctx.write();
let last_builder = glutin.builders.entry(*id).or_insert(builder.clone());
let (commands, recreate) = changes_between_builders(builder, last_builder);
drop(glutin);
if let Some(w) = glutin_ctx.read().windows.get(id) { if let Some(w) = glutin_ctx.read().windows.get(id) {
let mut w = w.write(); let mut w = w.write();
let (commands, recreate) = changes_between_builders(builder, &mut w.builder);
if recreate { if recreate {
w.window = None; w.window = None;
w.gl_surface = None; w.gl_surface = None;
w.render = render.clone(); w.render = render.clone();
w.builder = builder.clone();
w.parent_id = *id; w.parent_id = *id;
} }
if let Some(w) = w.window.clone() { if let Some(w) = w.window.clone() {
@@ -1178,26 +1192,28 @@ mod glow_integration {
for (id, parent_id, mut builder, render) in viewports { for (id, parent_id, mut builder, render) in viewports {
let default_icon = glutin_ctx let default_icon = glutin_ctx
.read() .read()
.windows .builders
.get(&parent_id) .get(&parent_id)
.map(|w| w.read().builder.icon.clone()) .and_then(|b| b.icon.clone());
.flatten();
if builder.icon.is_none() { if builder.icon.is_none() {
builder.icon = default_icon; builder.icon = default_icon;
} }
glutin_ctx.write().windows.insert( {
id, let mut glutin = glutin_ctx.write();
Arc::new(RwLock::new(Window { glutin.windows.insert(
builder, id,
gl_surface: None, Arc::new(RwLock::new(Window {
window: None, gl_surface: None,
viewport_id: id, window: None,
egui_winit: None, viewport_id: id,
render, egui_winit: None,
parent_id, render,
})), parent_id,
); })),
);
glutin.builders.insert(id, builder);
}
active_viewports_ids.push(id); active_viewports_ids.push(id);
} }
@@ -1205,6 +1221,9 @@ mod glow_integration {
gl_window gl_window
.windows .windows
.retain(|id, _| active_viewports_ids.contains(id)); .retain(|id, _| active_viewports_ids.contains(id));
gl_window
.builders
.retain(|id, _| active_viewports_ids.contains(id));
gl_window gl_window
.window_maps .window_maps
.retain(|_, id| active_viewports_ids.contains(id)); .retain(|_, id| active_viewports_ids.contains(id));
@@ -2041,7 +2060,6 @@ mod wgpu_integration {
let _windows = windows.clone(); let _windows = windows.clone();
let egui_ctx = integration.egui_ctx.clone(); let egui_ctx = integration.egui_ctx.clone();
let focused = self.is_focused.clone();
let time = integration.beginning; let time = integration.beginning;
let painter = Arc::new(RwLock::new(painter)); let painter = Arc::new(RwLock::new(painter));
let _painter = painter.clone(); let _painter = painter.clone();
@@ -2293,8 +2311,7 @@ mod wgpu_integration {
builder.icon = windows builder.icon = windows
.read() .read()
.get(&parent_id) .get(&parent_id)
.map(|w| w.builder.icon.clone()) .and_then(|w| w.builder.icon.clone());
.flatten();
} }
windows.write().insert( windows.write().insert(