From c1e8e976d0ec76b08a984779cb8ba4d5b64a92b1 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Mon, 16 Mar 2026 23:49:58 +0100 Subject: [PATCH] Xdnd: move text formats atoms to X11Atoms --- .../Selections/Clipboard/X11Clipboard.cs | 17 +++-------------- src/Avalonia.X11/Selections/DataFormatHelper.cs | 4 ++-- src/Avalonia.X11/X11Atoms.cs | 5 +++++ 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/Avalonia.X11/Selections/Clipboard/X11Clipboard.cs b/src/Avalonia.X11/Selections/Clipboard/X11Clipboard.cs index 04431e9e33..3edc593ae5 100644 --- a/src/Avalonia.X11/Selections/Clipboard/X11Clipboard.cs +++ b/src/Avalonia.X11/Selections/Clipboard/X11Clipboard.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using Avalonia.Input; using Avalonia.Input.Platform; using Avalonia.Logging; -using Avalonia.Platform.Storage; using static Avalonia.X11.XLib; namespace Avalonia.X11.Selections.Clipboard @@ -20,8 +19,6 @@ namespace Avalonia.X11.Selections.Clipboard private IAsyncDataTransfer? _storedDataTransfer; private readonly IntPtr _handle; private TaskCompletionSource? _storeAtomTcs; - private readonly IntPtr[] _textAtoms; - private readonly IntPtr _avaloniaSaveTargetsAtom; private readonly int _maximumPropertySize; public X11ClipboardImpl(AvaloniaX11Platform platform) @@ -29,14 +26,6 @@ namespace Avalonia.X11.Selections.Clipboard _platform = platform; _x11 = platform.Info; _handle = CreateEventWindow(platform, OnEvent); - _avaloniaSaveTargetsAtom = XInternAtom(_x11.Display, "AVALONIA_SAVE_TARGETS_PROPERTY_ATOM", false); - _textAtoms = new[] - { - _x11.Atoms.STRING, - _x11.Atoms.OEMTEXT, - _x11.Atoms.UTF8_STRING, - _x11.Atoms.UTF16_STRING - }.Where(a => a != IntPtr.Zero).ToArray(); var extendedMaxRequestSize = XExtendedMaxRequestSize(_platform.Display); var maxRequestSize = XMaxRequestSize(_platform.Display); @@ -253,7 +242,7 @@ namespace Avalonia.X11.Selections.Clipboard { foreach (var format in dataTransfer.Formats) { - foreach (var atom in DataFormatHelper.ToAtoms(format, _textAtoms, _x11.Atoms)) + foreach (var atom in DataFormatHelper.ToAtoms(format, _x11.Atoms)) atoms.Add(atom); } } @@ -287,10 +276,10 @@ namespace Avalonia.X11.Selections.Clipboard _storeAtomTcs = new TaskCompletionSource(); var atoms = ConvertDataTransfer(dataTransfer); - XChangeProperty(_x11.Display, _handle, _avaloniaSaveTargetsAtom, _x11.Atoms.ATOM, 32, + XChangeProperty(_x11.Display, _handle, _x11.Atoms.AVALONIA_SAVE_TARGETS_PROPERTY_ATOM, _x11.Atoms.ATOM, 32, PropertyMode.Replace, atoms, atoms.Length); XConvertSelection(_x11.Display, _x11.Atoms.CLIPBOARD_MANAGER, _x11.Atoms.SAVE_TARGETS, - _avaloniaSaveTargetsAtom, _handle, IntPtr.Zero); + _x11.Atoms.AVALONIA_SAVE_TARGETS_PROPERTY_ATOM, _handle, IntPtr.Zero); await _storeAtomTcs.Task; } } diff --git a/src/Avalonia.X11/Selections/DataFormatHelper.cs b/src/Avalonia.X11/Selections/DataFormatHelper.cs index d80e5d65cf..ff44fc9953 100644 --- a/src/Avalonia.X11/Selections/DataFormatHelper.cs +++ b/src/Avalonia.X11/Selections/DataFormatHelper.cs @@ -117,10 +117,10 @@ internal static class DataFormatHelper return atoms.GetAtom(systemName); } - public static IntPtr[] ToAtoms(DataFormat format, IntPtr[] textFormatAtoms, X11Atoms atoms) + public static IntPtr[] ToAtoms(DataFormat format, X11Atoms atoms) { if (DataFormat.Text.Equals(format)) - return textFormatAtoms; + return atoms.TextFormats; if (DataFormat.File.Equals(format)) return [atoms.GetAtom(MimeTypeTextUriList)]; diff --git a/src/Avalonia.X11/X11Atoms.cs b/src/Avalonia.X11/X11Atoms.cs index 047234b9d1..0324295b91 100644 --- a/src/Avalonia.X11/X11Atoms.cs +++ b/src/Avalonia.X11/X11Atoms.cs @@ -196,6 +196,7 @@ namespace Avalonia.X11 public IntPtr _KDE_NET_WM_BLUR_BEHIND_REGION; public IntPtr INCR; public IntPtr _NET_WM_STATE_FOCUSED; + public IntPtr AVALONIA_SAVE_TARGETS_PROPERTY_ATOM; public IntPtr XdndActionCopy; public IntPtr XdndActionLink; @@ -213,10 +214,14 @@ namespace Avalonia.X11 private readonly Dictionary _namesToAtoms = new Dictionary(); private readonly Dictionary _atomsToNames = new Dictionary(); + + public IntPtr[] TextFormats { get; } + public X11Atoms(IntPtr display) { _display = display; PopulateAtoms(display); + TextFormats = [STRING, OEMTEXT, UTF8_STRING, UTF16_STRING]; } private void InitAtom(ref IntPtr field, string name, IntPtr value)