private unsafe void SetIcon(AppIcon icon) { if (icon == null || icon.Icons.Length == 0) { Gtk.Window.SetIcon(Handle, IntPtr.Zero); } else { IntPtr iconList = IntPtr.Zero; var icons = new IntPtr[icon.Icons.Length]; try { for (int i = 0; i < icons.Length; i++) { IntPtr iconStream = IntPtr.Zero; try { byte[] data = icon.GetIconData(icon.Icons[i]); fixed(byte *iconDataPtr = data) { iconStream = GLib.CreateStreamFromData((IntPtr)iconDataPtr, data.Length, IntPtr.Zero); icons[i] = Gdk.Pixbuf.NewFromStream(iconStream, IntPtr.Zero, IntPtr.Zero); iconList = GLib.ListPrepend(iconList, icons[i]); } } finally { if (iconStream != IntPtr.Zero) { GLib.UnrefObject(iconStream); } } } Gtk.Window.SetIconList(Handle, iconList); } finally { if (iconList != IntPtr.Zero) { GLib.FreeList(iconList); } foreach (var item in icons) { if (item != IntPtr.Zero) { GLib.UnrefObject(item); } } } } }