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); } } } } }
private async void UriSchemeCallback(IntPtr request, IntPtr userdata) { try { var uri = new Uri(GLibString.FromPointer(WebKit.UriScheme.GetRequestUri(request))); var scheme = uri.GetComponents(UriComponents.Scheme, UriFormat.Unescaped); if (scheme == CustomScheme) { using (var contentStream = await Application.ContentProvider.GetStreamAsync(uri)) { if (contentStream != null) { IntPtr stream = IntPtr.Zero; try { if (contentStream is UnmanagedMemoryStream unmanagedMemoryStream) { unsafe { long length = unmanagedMemoryStream.Length - unmanagedMemoryStream.Position; stream = GLib.CreateStreamFromData((IntPtr)unmanagedMemoryStream.PositionPointer, length, IntPtr.Zero); FinishUriSchemeCallback(request, stream, length, uri); return; } } else { byte[] data; long length; if (contentStream is MemoryStream memoryStream) { data = memoryStream.GetBuffer(); length = memoryStream.Length; } else { using (var copyStream = new MemoryStream()) { await contentStream.CopyToAsync(copyStream); data = copyStream.GetBuffer(); length = copyStream.Length; } } unsafe { fixed(byte *dataPtr = data) { stream = GLib.CreateStreamFromData((IntPtr)dataPtr, length, IntPtr.Zero); FinishUriSchemeCallback(request, stream, length, uri); return; } } } } finally { if (stream != IntPtr.Zero) { GLib.UnrefObject(stream); } } } } } FinishUriSchemeCallbackWithError(request, UriCallbackFileNotFound); } catch { FinishUriSchemeCallbackWithError(request, UriCallbackUnspecifiedError); } }