Skip to content
Open
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
c32b348
Alter clipboard to support multiple formats
minetoblend Mar 23, 2024
95116ea
Add custom format support to `HeadlessClipboard`
minetoblend Mar 23, 2024
cdd0c0c
Add in-memory fallback for custom clipboard format to `MacOSClipboard`
minetoblend Mar 23, 2024
16b00d9
Add in-memory fallback for custom clipboard format to `SDL2Clipboard`
minetoblend Mar 23, 2024
d149485
Add support for custom clipboard formats & web custom formats to `Win…
minetoblend Mar 23, 2024
99179b3
Add in-memory fallback for custom clipboard format to `AndroidClipboard`
minetoblend Mar 23, 2024
ef661c9
Add comment linking to web custom format explainer
minetoblend Mar 23, 2024
1b7ff7c
Add doc comments to clipboard entry classes
minetoblend Mar 23, 2024
38b11cf
Fix comments in `Clipboard`
minetoblend Mar 23, 2024
5f7d94d
Undo change to how pointers are freed in `WindowsClipboard.setClipboard`
minetoblend Mar 24, 2024
744d72d
Simplify the data structures used to represent multiple clipboard values
minetoblend Mar 24, 2024
beb1d98
Always free pointer after registering clipboard format
Mar 26, 2024
27efe4c
Refactor logic to create web custom format clipboard entries
Mar 26, 2024
ae106b3
Add documentation explaining the clipboard entries created to support…
Mar 26, 2024
def378e
Use consistent ordering for method parameters
Mar 26, 2024
51b5fbc
Use UTF8 instead of ansi for web custom format clipboard entries
Mar 26, 2024
825b952
Rename variable
Mar 26, 2024
74a35fa
Clean up `ClipboardData` and `Clipboard`
Mar 26, 2024
7e660f0
Rename variables to be consistent between methods
Mar 26, 2024
3398cad
Add doc comment explaining the web custom format fallback when readin…
Mar 26, 2024
48115c3
Add documentation for `SetData` return value
Mar 26, 2024
6fa516d
Fix formatting for `ClipboardData` values in `Clipboard`
Mar 26, 2024
ac78808
Handle cases where registering clipboard format fails
Mar 26, 2024
c758183
Add logging for cases where calls to win32 clipboard api fail
Mar 26, 2024
629ddff
Add logging for cases where calls to win32 clipboard api fail when re…
Mar 26, 2024
7e4231a
Add `SetLastError` flag to dll imports
minetoblend Mar 28, 2024
8081b3c
Fix gibberish in doc comment
minetoblend Mar 28, 2024
e0fd3fb
Rename `customFormats` to `registeredFormatIdentifiers`
minetoblend Mar 28, 2024
87f243b
Use `TryGetValue` to retrieve values from web custom format map
Mar 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add in-memory fallback for custom clipboard format to MacOSClipboard
  • Loading branch information
minetoblend committed Mar 23, 2024
commit cdd0c0c98c266ecdfc1942a09d42abeaba9c8e72
37 changes: 33 additions & 4 deletions osu.Framework/Platform/MacOS/MacOSClipboard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.

using System;
using System.Collections.Generic;
using osu.Framework.Platform.MacOS.Native;
using SixLabors.ImageSharp;

Expand All @@ -11,13 +12,16 @@ public class MacOSClipboard : Clipboard
{
private readonly NSPasteboard generalPasteboard = NSPasteboard.GeneralPasteboard();

private readonly Dictionary<string, string> customFormatValues = new Dictionary<string, string>();

public override string? GetText() => Cocoa.FromNSString(getFromPasteboard(Class.Get("NSString")));

public override Image<TPixel>? GetImage<TPixel>() => Cocoa.FromNSImage<TPixel>(getFromPasteboard(Class.Get("NSImage")));

public override void SetText(string text) => setToPasteboard(Cocoa.ToNSString(text));

public override bool SetImage(Image image) => setToPasteboard(Cocoa.ToNSImage(image));
public override string? GetCustom(string format)
{
return customFormatValues[format];
}

private IntPtr getFromPasteboard(IntPtr @class)
{
Expand All @@ -32,12 +36,37 @@ private IntPtr getFromPasteboard(IntPtr @class)
return objects?.Length > 0 ? objects[0] : IntPtr.Zero;
}

public override bool SetData(params ClipboardEntry[] entries)
{
generalPasteboard.ClearContents();
customFormatValues.Clear();

foreach (var entry in entries)
{
switch (entry)
{
case ClipboardTextEntry textEntry:
setToPasteboard(Cocoa.ToNSString(textEntry.Value));
break;

case ClipboardImageEntry imageEntry:
setToPasteboard(Cocoa.ToNSImage(imageEntry.Value));
break;

case ClipboardCustomEntry customEntry:
customFormatValues[customEntry.Format] = customEntry.Value;
break;
}
}

return true;
}

private bool setToPasteboard(IntPtr handle)
{
if (handle == IntPtr.Zero)
return false;

generalPasteboard.ClearContents();
generalPasteboard.WriteObjects(NSArray.ArrayWithObject(handle));
return true;
}
Expand Down