From 9a037a23e9b32d9dbe7086a54d777b5f0550a660 Mon Sep 17 00:00:00 2001
From: Francesco Pasa <francescopasa@gmail.com>
Date: Sat, 11 Apr 2020 15:16:10 +0200
Subject: Add support for setting window icon

This adds a new property from Settings::window::iconand a Icon struct which can be converted to winit::window::Icon.

It also adds code to display this icon in Application::run. Due to the fact that the Icon struct is non copyable, I also had to remove the Copy trait from all Settings, both in `iced` and `iced_winit`.
---
 winit/src/lib.rs      |  1 +
 winit/src/settings.rs | 39 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 38 insertions(+), 2 deletions(-)

(limited to 'winit/src')

diff --git a/winit/src/lib.rs b/winit/src/lib.rs
index bdab3ed7..4e5dc547 100644
--- a/winit/src/lib.rs
+++ b/winit/src/lib.rs
@@ -38,5 +38,6 @@ pub use clipboard::Clipboard;
 pub use mode::Mode;
 pub use proxy::Proxy;
 pub use settings::Settings;
+pub use settings::Icon;
 
 pub use iced_graphics::Viewport;
diff --git a/winit/src/settings.rs b/winit/src/settings.rs
index 6799f23f..8cfadf02 100644
--- a/winit/src/settings.rs
+++ b/winit/src/settings.rs
@@ -14,7 +14,7 @@ use winit::monitor::MonitorHandle;
 use winit::window::WindowBuilder;
 
 /// The settings of an application.
-#[derive(Debug, Clone, Copy, PartialEq, Default)]
+#[derive(Debug, Clone, PartialEq, Default)]
 pub struct Settings<Flags> {
     /// The [`Window`] settings
     ///
@@ -28,7 +28,7 @@ pub struct Settings<Flags> {
 }
 
 /// The window settings of an application.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+#[derive(Debug, Clone, PartialEq, Eq)]
 pub struct Window {
     /// The size of the window.
     pub size: (u32, u32),
@@ -45,6 +45,9 @@ pub struct Window {
     /// Whether the window should have a border, a title bar, etc.
     pub decorations: bool,
 
+    /// The window icon, which is also usually used in the taskbar
+    pub icon: Option<Icon>,
+
     /// Platform specific settings.
     pub platform_specific: platform::PlatformSpecific,
 }
@@ -66,6 +69,7 @@ impl Window {
             .with_inner_size(winit::dpi::LogicalSize { width, height })
             .with_resizable(self.resizable)
             .with_decorations(self.decorations)
+            .with_window_icon(self.icon.map(Icon::into))
             .with_fullscreen(conversion::fullscreen(primary_monitor, mode));
 
         if let Some((width, height)) = self.min_size {
@@ -99,7 +103,38 @@ impl Default for Window {
             max_size: None,
             resizable: true,
             decorations: true,
+            icon: None,
             platform_specific: Default::default(),
         }
     }
 }
+
+/// An Icon
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct Icon {
+    rgba: Vec<u8>,
+    width: u32,
+    height: u32,
+}
+
+impl Icon {
+    ///
+    pub fn new(rgba: &[u8], width: u32, height: u32) -> Self {
+        Self {
+            rgba: rgba.to_vec(),
+            width,
+            height,
+        }
+    }
+}
+
+impl Into<winit::window::Icon> for Icon {
+    fn into(self) -> winit::window::Icon {
+        winit::window::Icon::from_rgba(
+            self.rgba.to_vec(),
+            self.width,
+            self.height,
+        )
+        .unwrap()
+    }
+}
-- 
cgit