Fix: handle `IconData::default()` without crashing (#3842)

* Closes https://github.com/emilk/egui/issues/3839
This commit is contained in:
Emil Ernerfeldt 2024-01-19 14:24:26 +01:00 committed by GitHub
parent 76ec982958
commit 3936418f0b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 8 deletions

View File

@ -1338,10 +1338,8 @@ fn process_viewport_command(
egui::viewport::WindowLevel::Normal => WindowLevel::Normal,
}),
ViewportCommand::Icon(icon) => {
window.set_window_icon(icon.map(|icon| {
winit::window::Icon::from_rgba(icon.rgba.clone(), icon.width, icon.height)
.expect("Invalid ICON data!")
}));
let winit_icon = icon.and_then(|icon| to_winit_icon(&icon));
window.set_window_icon(winit_icon);
}
ViewportCommand::IMERect(rect) => {
window.set_ime_cursor_area(
@ -1546,10 +1544,8 @@ pub fn create_winit_window_builder<T>(
}
if let Some(icon) = icon {
window_builder = window_builder.with_window_icon(Some(
winit::window::Icon::from_rgba(icon.rgba.clone(), icon.width, icon.height)
.expect("Invalid Icon Data!"),
));
let winit_icon = to_winit_icon(&icon);
window_builder = window_builder.with_window_icon(winit_icon);
}
#[cfg(all(feature = "wayland", target_os = "linux"))]
@ -1577,6 +1573,21 @@ pub fn create_winit_window_builder<T>(
window_builder
}
fn to_winit_icon(icon: &egui::IconData) -> Option<winit::window::Icon> {
if icon.is_empty() {
None
} else {
crate::profile_function!();
match winit::window::Icon::from_rgba(icon.rgba.clone(), icon.width, icon.height) {
Ok(winit_icon) => Some(winit_icon),
Err(err) => {
log::warn!("Invalid IconData: {err}");
None
}
}
}
}
/// Applies what `create_winit_window_builder` couldn't
pub fn apply_viewport_builder_to_window(
egui_ctx: &egui::Context,

View File

@ -170,6 +170,13 @@ pub struct IconData {
pub height: u32,
}
impl IconData {
#[inline]
pub fn is_empty(&self) -> bool {
self.rgba.is_empty()
}
}
impl std::fmt::Debug for IconData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("IconData")