Browse Source

Xdnd: move text formats atoms to X11Atoms

pull/20926/head
Julien Lebosquain 7 months ago
parent
commit
c1e8e976d0
No known key found for this signature in database GPG Key ID: 1833CAD10ACC46FD
  1. 17
      src/Avalonia.X11/Selections/Clipboard/X11Clipboard.cs
  2. 4
      src/Avalonia.X11/Selections/DataFormatHelper.cs
  3. 5
      src/Avalonia.X11/X11Atoms.cs

17
src/Avalonia.X11/Selections/Clipboard/X11Clipboard.cs

@ -8,7 +8,6 @@ using System.Threading.Tasks;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.Platform; using Avalonia.Input.Platform;
using Avalonia.Logging; using Avalonia.Logging;
using Avalonia.Platform.Storage;
using static Avalonia.X11.XLib; using static Avalonia.X11.XLib;
namespace Avalonia.X11.Selections.Clipboard namespace Avalonia.X11.Selections.Clipboard
@ -20,8 +19,6 @@ namespace Avalonia.X11.Selections.Clipboard
private IAsyncDataTransfer? _storedDataTransfer; private IAsyncDataTransfer? _storedDataTransfer;
private readonly IntPtr _handle; private readonly IntPtr _handle;
private TaskCompletionSource<bool>? _storeAtomTcs; private TaskCompletionSource<bool>? _storeAtomTcs;
private readonly IntPtr[] _textAtoms;
private readonly IntPtr _avaloniaSaveTargetsAtom;
private readonly int _maximumPropertySize; private readonly int _maximumPropertySize;
public X11ClipboardImpl(AvaloniaX11Platform platform) public X11ClipboardImpl(AvaloniaX11Platform platform)
@ -29,14 +26,6 @@ namespace Avalonia.X11.Selections.Clipboard
_platform = platform; _platform = platform;
_x11 = platform.Info; _x11 = platform.Info;
_handle = CreateEventWindow(platform, OnEvent); _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 extendedMaxRequestSize = XExtendedMaxRequestSize(_platform.Display);
var maxRequestSize = XMaxRequestSize(_platform.Display); var maxRequestSize = XMaxRequestSize(_platform.Display);
@ -253,7 +242,7 @@ namespace Avalonia.X11.Selections.Clipboard
{ {
foreach (var format in dataTransfer.Formats) 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); atoms.Add(atom);
} }
} }
@ -287,10 +276,10 @@ namespace Avalonia.X11.Selections.Clipboard
_storeAtomTcs = new TaskCompletionSource<bool>(); _storeAtomTcs = new TaskCompletionSource<bool>();
var atoms = ConvertDataTransfer(dataTransfer); 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); PropertyMode.Replace, atoms, atoms.Length);
XConvertSelection(_x11.Display, _x11.Atoms.CLIPBOARD_MANAGER, _x11.Atoms.SAVE_TARGETS, 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; await _storeAtomTcs.Task;
} }
} }

4
src/Avalonia.X11/Selections/DataFormatHelper.cs

@ -117,10 +117,10 @@ internal static class DataFormatHelper
return atoms.GetAtom(systemName); 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)) if (DataFormat.Text.Equals(format))
return textFormatAtoms; return atoms.TextFormats;
if (DataFormat.File.Equals(format)) if (DataFormat.File.Equals(format))
return [atoms.GetAtom(MimeTypeTextUriList)]; return [atoms.GetAtom(MimeTypeTextUriList)];

5
src/Avalonia.X11/X11Atoms.cs

@ -196,6 +196,7 @@ namespace Avalonia.X11
public IntPtr _KDE_NET_WM_BLUR_BEHIND_REGION; public IntPtr _KDE_NET_WM_BLUR_BEHIND_REGION;
public IntPtr INCR; public IntPtr INCR;
public IntPtr _NET_WM_STATE_FOCUSED; public IntPtr _NET_WM_STATE_FOCUSED;
public IntPtr AVALONIA_SAVE_TARGETS_PROPERTY_ATOM;
public IntPtr XdndActionCopy; public IntPtr XdndActionCopy;
public IntPtr XdndActionLink; public IntPtr XdndActionLink;
@ -213,10 +214,14 @@ namespace Avalonia.X11
private readonly Dictionary<string, IntPtr> _namesToAtoms = new Dictionary<string, IntPtr>(); private readonly Dictionary<string, IntPtr> _namesToAtoms = new Dictionary<string, IntPtr>();
private readonly Dictionary<IntPtr, string> _atomsToNames = new Dictionary<IntPtr, string>(); private readonly Dictionary<IntPtr, string> _atomsToNames = new Dictionary<IntPtr, string>();
public IntPtr[] TextFormats { get; }
public X11Atoms(IntPtr display) public X11Atoms(IntPtr display)
{ {
_display = display; _display = display;
PopulateAtoms(display); PopulateAtoms(display);
TextFormats = [STRING, OEMTEXT, UTF8_STRING, UTF16_STRING];
} }
private void InitAtom(ref IntPtr field, string name, IntPtr value) private void InitAtom(ref IntPtr field, string name, IntPtr value)

Loading…
Cancel
Save