Skip to content

Commit

Permalink
fix: window icon in X11
Browse files Browse the repository at this point in the history
  • Loading branch information
ramezgerges committed Feb 8, 2024
1 parent 7f98659 commit cd51cc5
Showing 1 changed file with 12 additions and 13 deletions.
25 changes: 12 additions & 13 deletions src/Uno.UI.Runtime.Skia.X11/X11XamlRootHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,14 +114,12 @@ private void UpdateWindowPropertiesFromPackage()
_applicationView.Title = Windows.ApplicationModel.Package.Current.DisplayName;
}

// TODO: Currently not working
unsafe void SetIconFromFile(string iconPath)
{
using var fileStream = File.OpenRead(iconPath);
using var codec = SKCodec.Create(fileStream);
using var bitmap = new SKBitmap(codec.Info.Width, codec.Info.Height, SKColorType.Rgba8888, SKAlphaType.Unpremul);
var bitmapBuffer = bitmap.GetPixels();
var result = codec.GetPixels(bitmap.Info, bitmapBuffer);
var result = codec.GetPixels(bitmap.Info, bitmap.GetPixels());
if (result != SKCodecResult.Success)
{
if (this.Log().IsEnabled(LogLevel.Warning))
Expand All @@ -134,31 +132,32 @@ unsafe void SetIconFromFile(string iconPath)
var pixels = bitmap.Pixels;
var data = Marshal.AllocHGlobal((pixels.Length + 2) * sizeof(IntPtr));
using var _1 = Disposable.Create(() => Marshal.FreeHGlobal(data));
var span = new Span<IntPtr>(data.ToPointer(), pixels.Length + 2)
{
[0] = bitmap.Width,
[1] = bitmap.Height
};

new Span<IntPtr>(bitmap.GetPixels().ToPointer(), pixels.Length).CopyTo(span[2..]);
var ptr = (IntPtr*)data.ToPointer();
*(ptr++) = bitmap.Width;
*(ptr++) = bitmap.Height;
foreach (var pixel in bitmap.Pixels)
{
*(ptr++) = pixel.Alpha << 24 | pixel.Red << 16 | pixel.Green << 8 | pixel.Blue << 0;
}

var display = _x11Window!.Value.Display;
using var _2 = X11Helper.XLock(display);

var wmIconAtom = X11Helper.GetAtom(display, X11Helper._NET_WM_ICON);
var cardinalAtom = X11Helper.GetAtom(display, X11Helper.XA_CARDINAL);
var res = XLib.XChangeProperty(
var _3 = XLib.XChangeProperty(
display,
_x11Window!.Value.Window,
wmIconAtom,
cardinalAtom,
32,
PropertyMode.Replace,
data,
pixels.Length);
pixels.Length + 2);

var _3 = XLib.XFlush(display);
var _4 = XLib.XSync(display, false); // wait until the pixels are actually copied
var _4 = XLib.XFlush(display);
var _5 = XLib.XSync(display, false); // wait until the pixels are actually copied
}
}

Expand Down

0 comments on commit cd51cc5

Please sign in to comment.