diff --git a/src/Avalonia.Input/Raw/RawDragEvent.cs b/src/Avalonia.Input/Raw/RawDragEvent.cs
index d251fe8640..208d898a8a 100644
--- a/src/Avalonia.Input/Raw/RawDragEvent.cs
+++ b/src/Avalonia.Input/Raw/RawDragEvent.cs
@@ -3,7 +3,7 @@
public class RawDragEvent : RawInputEventArgs
{
public IInputElement InputRoot { get; }
- public Point Location { get; }
+ public Point Location { get; set; }
public IDataObject Data { get; }
public DragDropEffects Effects { get; set; }
public RawDragEventType Type { get; }
diff --git a/src/Avalonia.X11/Avalonia.X11.csproj b/src/Avalonia.X11/Avalonia.X11.csproj
index 40db6d8c62..087ba017ae 100644
--- a/src/Avalonia.X11/Avalonia.X11.csproj
+++ b/src/Avalonia.X11/Avalonia.X11.csproj
@@ -8,6 +8,7 @@
+
diff --git a/src/Avalonia.X11/X11Framebuffer.cs b/src/Avalonia.X11/X11Framebuffer.cs
index 8e48a4089a..d99d7970b6 100644
--- a/src/Avalonia.X11/X11Framebuffer.cs
+++ b/src/Avalonia.X11/X11Framebuffer.cs
@@ -1,5 +1,7 @@
using System;
+using System.IO;
using Avalonia.Platform;
+using SkiaSharp;
using static Avalonia.X11.XLib;
namespace Avalonia.X11
{
@@ -9,11 +11,11 @@ namespace Avalonia.X11
private readonly IntPtr _xid;
private IUnmanagedBlob _blob;
- public X11Framebuffer(IntPtr display, IntPtr xid, int width, int height, int factor)
+ public X11Framebuffer(IntPtr display, IntPtr xid, int width, int height, double factor)
{
_display = display;
_xid = xid;
- Size = new PixelSize(width * factor, height * factor);
+ Size = new PixelSize(width, height);
RowBytes = width * 4;
Dpi = new Vector(96, 96) * factor;
Format = PixelFormat.Bgra8888;
@@ -34,7 +36,7 @@ namespace Avalonia.X11
image.bitmap_bit_order = 0;// LSBFirst;
image.bitmap_pad = bitsPerPixel;
image.depth = 24;
- image.bytes_per_line = RowBytes - Size.Width * 4;
+ image.bytes_per_line = RowBytes;
image.bits_per_pixel = bitsPerPixel;
XLockDisplay(_display);
XInitImage(ref image);
diff --git a/src/Avalonia.X11/X11FramebufferSurface.cs b/src/Avalonia.X11/X11FramebufferSurface.cs
index 05b21efb0c..6caec0a66f 100644
--- a/src/Avalonia.X11/X11FramebufferSurface.cs
+++ b/src/Avalonia.X11/X11FramebufferSurface.cs
@@ -8,11 +8,13 @@ namespace Avalonia.X11
{
private readonly IntPtr _display;
private readonly IntPtr _xid;
+ private readonly Func _scaling;
- public X11FramebufferSurface(IntPtr display, IntPtr xid)
+ public X11FramebufferSurface(IntPtr display, IntPtr xid, Func scaling)
{
_display = display;
_xid = xid;
+ _scaling = scaling;
}
public ILockedFramebuffer Lock()
@@ -21,7 +23,7 @@ namespace Avalonia.X11
XGetGeometry(_display, _xid, out var root, out var x, out var y, out var width, out var height,
out var bw, out var d);
XUnlockDisplay(_display);
- return new X11Framebuffer(_display, _xid, width, height, 1);
+ return new X11Framebuffer(_display, _xid, width, height, _scaling());
}
}
}
diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs
index 675ed4bd53..efda30b2fc 100644
--- a/src/Avalonia.X11/X11Platform.cs
+++ b/src/Avalonia.X11/X11Platform.cs
@@ -21,6 +21,8 @@ namespace Avalonia.X11
public Dictionary> Windows = new Dictionary>();
public XI2Manager XI2;
public X11Info Info { get; private set; }
+ public IX11Screens X11Screens { get; private set; }
+ public IScreenImpl Screens { get; private set; }
public void Initialize()
{
XInitThreads();
@@ -44,7 +46,9 @@ namespace Avalonia.X11
.Bind().ToConstant(new SystemDialogsStub())
.Bind().ToConstant(new IconLoaderStub())
.Bind().ToConstant(new Gtk3ForeignX11SystemDialog());
- X11Screens.Init(this);
+
+ X11Screens = Avalonia.X11.X11Screens.Init(this);
+ Screens = new X11Screens(X11Screens);
if (Info.XInputVersion != null)
{
var xi2 = new XI2Manager();
diff --git a/src/Avalonia.X11/X11Screens.cs b/src/Avalonia.X11/X11Screens.cs
index 46ad4d7320..560cc04a28 100644
--- a/src/Avalonia.X11/X11Screens.cs
+++ b/src/Avalonia.X11/X11Screens.cs
@@ -13,7 +13,7 @@ namespace Avalonia.X11
{
private IX11Screens _impl;
- private X11Screens(IX11Screens impl)
+ public X11Screens(IX11Screens impl)
{
_impl = impl;
}
@@ -141,16 +141,15 @@ namespace Avalonia.X11
public X11Screen[] Screens { get; }
}
- public static void Init(AvaloniaX11Platform platform)
+ public static IX11Screens Init(AvaloniaX11Platform platform)
{
var info = platform.Info;
var settings = X11ScreensUserSettings.Detect();
var impl = (info.RandrVersion != null && info.RandrVersion >= new Version(1, 5))
? new Randr15ScreensImpl(platform, settings)
: (IX11Screens)new FallbackScreensImpl(info, settings);
-
- AvaloniaLocator.CurrentMutable.Bind().ToConstant(impl);
- AvaloniaLocator.CurrentMutable.Bind().ToConstant(new X11Screens(impl));
+
+ return impl;
}
@@ -207,7 +206,7 @@ namespace Avalonia.X11
//Ignore
}
- return null;
+ return rv;
}
diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs
index 4441006fda..b919424efe 100644
--- a/src/Avalonia.X11/X11Window.cs
+++ b/src/Avalonia.X11/X11Window.cs
@@ -27,13 +27,15 @@ namespace Avalonia.X11
private IInputRoot _inputRoot;
private readonly IMouseDevice _mouse;
private readonly IKeyboardDevice _keyboard;
- private Point _position;
+ private Point? _position;
+ private PixelSize _realSize;
private IntPtr _handle;
private IntPtr _xic;
private IntPtr _renderHandle;
private bool _mapped;
private HashSet _transientChildren = new HashSet();
private X11Window _transientParent;
+ public object SyncRoot { get; } = new object();
class InputEventContainer
{
@@ -79,7 +81,7 @@ namespace Avalonia.X11
SetWindowValuemask.WinGravity | SetWindowValuemask.BackingStore)), ref attr);
Handle = new PlatformHandle(_handle, "XID");
- ClientSize = new Size(400, 400);
+ _realSize = new PixelSize(300, 200);
platform.Windows[_handle] = OnEvent;
XEventMask ignoredMask = XEventMask.SubstructureRedirectMask
| XEventMask.ResizeRedirectMask
@@ -96,12 +98,12 @@ namespace Avalonia.X11
var feature = (EglGlPlatformFeature)AvaloniaLocator.Current.GetService();
var surfaces = new List