Browse Source

Xdnd: rename XdndHandler to X11DropTarget

pull/20926/head
Julien Lebosquain 7 months ago
parent
commit
8a8e098a82
No known key found for this signature in database GPG Key ID: 1833CAD10ACC46FD
  1. 15
      src/Avalonia.X11/Selections/DragDrop/DragDropDataTransfer.cs
  2. 11
      src/Avalonia.X11/Selections/DragDrop/X11DropTarget.cs
  3. 12
      src/Avalonia.X11/X11Window.cs

15
src/Avalonia.X11/Selections/DragDrop/DragDropDataTransfer.cs

@ -15,7 +15,8 @@ internal sealed class DragDropDataTransfer(
IntPtr display, IntPtr display,
IntPtr sourceWindow, IntPtr sourceWindow,
IntPtr targetWindow, IntPtr targetWindow,
IInputRoot inputRoot) IInputRoot inputRoot,
byte xdndVersion)
: PlatformDataTransfer : PlatformDataTransfer
{ {
public IntPtr SourceWindow { get; } = sourceWindow; public IntPtr SourceWindow { get; } = sourceWindow;
@ -32,10 +33,8 @@ internal sealed class DragDropDataTransfer(
protected override PlatformDataTransferItem[] ProvideItems() protected override PlatformDataTransferItem[] ProvideItems()
=> reader.CreateItems(); => reader.CreateItems();
public override void Dispose() private void SendXdndFinished()
{ {
reader.Dispose();
var evt = new XEvent var evt = new XEvent
{ {
ClientMessageEvent = new XClientMessageEvent ClientMessageEvent = new XClientMessageEvent
@ -56,4 +55,12 @@ internal sealed class DragDropDataTransfer(
XSendEvent(display, SourceWindow, false, (IntPtr)EventMask.NoEventMask, ref evt); XSendEvent(display, SourceWindow, false, (IntPtr)EventMask.NoEventMask, ref evt);
XFlush(display); XFlush(display);
} }
public override void Dispose()
{
reader.Dispose();
if (xdndVersion >= 5)
SendXdndFinished();
}
} }

11
src/Avalonia.X11/Selections/DragDrop/XdndHandler.cs → src/Avalonia.X11/Selections/DragDrop/X11DropTarget.cs

@ -11,8 +11,10 @@ namespace Avalonia.X11.Selections.DragDrop;
/// Manages XDND (drag and drop) for a given X11 window. /// Manages XDND (drag and drop) for a given X11 window.
/// Specs: https://www.freedesktop.org/wiki/Specifications/XDND/ /// Specs: https://www.freedesktop.org/wiki/Specifications/XDND/
/// </summary> /// </summary>
internal sealed class XdndHandler internal sealed class X11DropTarget
{ {
// Spec: every application that supports XDND version N must also support all previous versions (3 to N-1).
private const byte MinXdndVersion = 3;
private const byte XdndVersion = 5; private const byte XdndVersion = 5;
private readonly IDragDropDevice _dragDropDevice; private readonly IDragDropDevice _dragDropDevice;
@ -21,7 +23,7 @@ internal sealed class XdndHandler
private readonly X11Atoms _atoms; private readonly X11Atoms _atoms;
private DragDropDataTransfer? _currentDrag; private DragDropDataTransfer? _currentDrag;
public XdndHandler(IDragDropDevice dragDropDevice, IXdndWindow window, IntPtr _display, X11Atoms atoms) public X11DropTarget(IDragDropDevice dragDropDevice, IXdndWindow window, IntPtr _display, X11Atoms atoms)
{ {
_dragDropDevice = dragDropDevice; _dragDropDevice = dragDropDevice;
_window = window; _window = window;
@ -40,7 +42,7 @@ internal sealed class XdndHandler
// Spec: If the version number in the XdndEnter message is higher than what the target can support, // Spec: If the version number in the XdndEnter message is higher than what the target can support,
// the target should ignore the source. // the target should ignore the source.
var version = (byte)((message.ptr2 >> 24) & 0xFF); var version = (byte)((message.ptr2 >> 24) & 0xFF);
if (version > XdndVersion) if (version is < MinXdndVersion or > XdndVersion)
return; return;
// If we ever receive a new XdndEnter message while a drag is in progress, it means something went wrong. // If we ever receive a new XdndEnter message while a drag is in progress, it means something went wrong.
@ -82,7 +84,8 @@ internal sealed class XdndHandler
_display, _display,
sourceWindow, sourceWindow,
_window.Handle, _window.Handle,
inputRoot); inputRoot,
version);
} }
public void HandleXdndPosition(in XClientMessageEvent message) public void HandleXdndPosition(in XClientMessageEvent message)

12
src/Avalonia.X11/X11Window.cs

@ -71,7 +71,7 @@ namespace Avalonia.X11
private bool _usePositioningFlags = false; private bool _usePositioningFlags = false;
private X11WindowMode _mode; private X11WindowMode _mode;
private IWindowIconImpl? _iconImpl; private IWindowIconImpl? _iconImpl;
private readonly XdndHandler? _xdndHandler; private readonly X11DropTarget? _dropTarget;
private enum XSyncState private enum XSyncState
{ {
@ -280,7 +280,7 @@ namespace Avalonia.X11
}); });
if (AvaloniaLocator.Current.GetService<IDragDropDevice>() is { } dragDropDevice) if (AvaloniaLocator.Current.GetService<IDragDropDevice>() is { } dragDropDevice)
_xdndHandler = new XdndHandler(dragDropDevice, this, _x11.Display, _x11.Atoms); _dropTarget = new X11DropTarget(dragDropDevice, this, _x11.Display, _x11.Atoms);
platform.X11Screens.Changed += OnScreensChanged; platform.X11Screens.Changed += OnScreensChanged;
} }
@ -700,13 +700,13 @@ namespace Avalonia.X11
} }
} }
else if (messageType == _x11.Atoms.XdndEnter) else if (messageType == _x11.Atoms.XdndEnter)
_xdndHandler?.HandleXdndEnter(ev.ClientMessageEvent); _dropTarget?.HandleXdndEnter(ev.ClientMessageEvent);
else if (messageType == _x11.Atoms.XdndPosition) else if (messageType == _x11.Atoms.XdndPosition)
_xdndHandler?.HandleXdndPosition(ev.ClientMessageEvent); _dropTarget?.HandleXdndPosition(ev.ClientMessageEvent);
else if (messageType == _x11.Atoms.XdndLeave) else if (messageType == _x11.Atoms.XdndLeave)
_xdndHandler?.HandleXdndLeave(ev.ClientMessageEvent); _dropTarget?.HandleXdndLeave(ev.ClientMessageEvent);
else if (messageType == _x11.Atoms.XdndDrop) else if (messageType == _x11.Atoms.XdndDrop)
_xdndHandler?.HandleXdndDrop(ev.ClientMessageEvent); _dropTarget?.HandleXdndDrop(ev.ClientMessageEvent);
} }
else if (ev.type == XEventName.KeyPress || ev.type == XEventName.KeyRelease) else if (ev.type == XEventName.KeyPress || ev.type == XEventName.KeyRelease)
{ {

Loading…
Cancel
Save