mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-02-22 17:10:19 +00:00
* add avalonia support * only lock around skia flush * addressed review * cleanup * add fallback size if avalonia attempts to render but the window size is 0. read desktop scale after enabling dpi check * fix getting window handle on linux. skip render is size is 0
71 lines
No EOL
1.8 KiB
C#
71 lines
No EOL
1.8 KiB
C#
using Avalonia;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using static Ryujinx.Ava.Ui.Backend.Interop;
|
|
|
|
namespace Ryujinx.Ava.Ui.Backend
|
|
{
|
|
public abstract class BackendSurface : IDisposable
|
|
{
|
|
protected IntPtr Display => _display;
|
|
|
|
private IntPtr _display = IntPtr.Zero;
|
|
|
|
[DllImport("libX11.so.6")]
|
|
public static extern IntPtr XOpenDisplay(IntPtr display);
|
|
|
|
[DllImport("libX11.so.6")]
|
|
public static extern int XCloseDisplay(IntPtr display);
|
|
|
|
private PixelSize _currentSize;
|
|
public IntPtr Handle { get; protected set; }
|
|
|
|
public bool IsDisposed { get; private set; }
|
|
|
|
public BackendSurface(IntPtr handle)
|
|
{
|
|
Handle = handle;
|
|
|
|
if (OperatingSystem.IsLinux())
|
|
{
|
|
_display = XOpenDisplay(IntPtr.Zero);
|
|
}
|
|
}
|
|
|
|
public PixelSize Size
|
|
{
|
|
get
|
|
{
|
|
PixelSize size = new PixelSize();
|
|
if (OperatingSystem.IsWindows())
|
|
{
|
|
GetClientRect(Handle, out var rect);
|
|
size = new PixelSize(rect.right, rect.bottom);
|
|
}
|
|
else if (OperatingSystem.IsLinux())
|
|
{
|
|
XWindowAttributes attributes = new XWindowAttributes();
|
|
XGetWindowAttributes(Display, Handle, ref attributes);
|
|
|
|
size = new PixelSize(attributes.width, attributes.height);
|
|
}
|
|
|
|
_currentSize = size;
|
|
|
|
return size;
|
|
}
|
|
}
|
|
|
|
public PixelSize CurrentSize => _currentSize;
|
|
|
|
public virtual void Dispose()
|
|
{
|
|
IsDisposed = true;
|
|
|
|
if (_display != IntPtr.Zero)
|
|
{
|
|
XCloseDisplay(_display);
|
|
}
|
|
}
|
|
}
|
|
} |