[gtk/macos-ci: 2/3] macos: keep array of pasteboard types
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/macos-ci: 2/3] macos: keep array of pasteboard types
- Date: Wed, 6 Jan 2021 00:21:26 +0000 (UTC)
commit 855b44f2ed522e5a201f28544234f97c846ae020
Author: Christian Hergert <chergert redhat com>
Date: Tue Jan 5 15:24:41 2021 -0800
macos: keep array of pasteboard types
To support Sierra, we need to have access to pasteboard types as a
NSString. Constants are provided in later versions of macOS, but we
can emulate that with an array which is initialized on first access.
gdk/macos/gdkmacosclipboard.c | 80 ++++++++++++++++++++++++++++++++++---------
1 file changed, 64 insertions(+), 16 deletions(-)
---
diff --git a/gdk/macos/gdkmacosclipboard.c b/gdk/macos/gdkmacosclipboard.c
index 7297045b76..288a7c64d5 100644
--- a/gdk/macos/gdkmacosclipboard.c
+++ b/gdk/macos/gdkmacosclipboard.c
@@ -40,8 +40,56 @@ typedef struct
guint done : 1;
} WriteRequest;
+enum {
+ TYPE_STRING,
+ TYPE_PBOARD,
+ TYPE_URL,
+ TYPE_FILE_URL,
+ TYPE_COLOR,
+ TYPE_TIFF,
+ TYPE_PNG,
+ TYPE_LAST
+};
+
+#define PTYPE(k) (get_pasteboard_type(TYPE_##k))
+
+static NSPasteboardType pasteboard_types[TYPE_LAST];
+
G_DEFINE_TYPE (GdkMacosClipboard, _gdk_macos_clipboard, GDK_TYPE_CLIPBOARD)
+static NSPasteboardType
+get_pasteboard_type (int type)
+{
+ static gsize initialized = FALSE;
+
+ g_assert (type >= 0);
+ g_assert (type < TYPE_LAST);
+
+ if (g_once_init_enter (&initialized))
+ {
+ pasteboard_types[TYPE_PNG] = NSPasteboardTypePNG;
+ pasteboard_types[TYPE_STRING] = NSPasteboardTypeString;
+ pasteboard_types[TYPE_TIFF] = NSPasteboardTypeTIFF;
+ pasteboard_types[TYPE_COLOR] = NSPasteboardTypeColor;
+
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ pasteboard_types[TYPE_PBOARD] = NSStringPboardType;
+ G_GNUC_END_IGNORE_DEPRECATIONS
+
+#ifdef AVAILABLE_MAC_OS_X_VERSION_10_13_AND_LATER
+ pasteboard_types[TYPE_URL] = NSPasteboardTypeURL;
+ pasteboard_types[TYPE_FILE_URL] = NSPasteboardTypeFileURL;
+#else
+ pasteboard_types[TYPE_URL] = [[NSString alloc] initWithUTF8String:"public.url"];
+ pasteboard_types[TYPE_FILE_URL] = [[NSString alloc] initWithUTF8String:"public.file-url"];
+#endif
+
+ g_once_init_leave (&initialized, TRUE);
+ }
+
+ return pasteboard_types[type];
+}
+
static void
write_request_free (WriteRequest *wr)
{
@@ -56,17 +104,17 @@ _gdk_macos_clipboard_from_ns_type (NSPasteboardType type)
{
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
- if ([type isEqualToString:NSPasteboardTypeString] ||
- [type isEqualToString:NSStringPboardType])
+ if ([type isEqualToString:PTYPE(STRING)] ||
+ [type isEqualToString:PTYPE(PBOARD)])
return g_intern_string ("text/plain;charset=utf-8");
- else if ([type isEqualToString:NSPasteboardTypeURL] ||
- [type isEqualToString:NSPasteboardTypeFileURL])
+ else if ([type isEqualToString:PTYPE(URL)] ||
+ [type isEqualToString:PTYPE(FILE_URL)])
return g_intern_string ("text/uri-list");
- else if ([type isEqualToString:NSPasteboardTypeColor])
+ else if ([type isEqualToString:PTYPE(COLOR)])
return g_intern_string ("application/x-color");
- else if ([type isEqualToString:NSPasteboardTypeTIFF])
+ else if ([type isEqualToString:PTYPE(TIFF)])
return g_intern_string ("image/tiff");
- else if ([type isEqualToString:NSPasteboardTypePNG])
+ else if ([type isEqualToString:PTYPE(PNG)])
return g_intern_string ("image/png");
G_GNUC_END_IGNORE_DEPRECATIONS;
@@ -83,25 +131,25 @@ _gdk_macos_clipboard_to_ns_type (const char *mime_type,
if (g_strcmp0 (mime_type, "text/plain;charset=utf-8") == 0)
{
- return NSPasteboardTypeString;
+ return PTYPE(STRING);
}
else if (g_strcmp0 (mime_type, "text/uri-list") == 0)
{
if (alternate)
- *alternate = NSPasteboardTypeURL;
- return NSPasteboardTypeFileURL;
+ *alternate = PTYPE(URL);
+ return PTYPE(FILE_URL);
}
else if (g_strcmp0 (mime_type, "application/x-color") == 0)
{
- return NSPasteboardTypeColor;
+ return PTYPE(COLOR);
}
else if (g_strcmp0 (mime_type, "image/tiff") == 0)
{
- return NSPasteboardTypeTIFF;
+ return PTYPE(TIFF);
}
else if (g_strcmp0 (mime_type, "image/png") == 0)
{
- return NSPasteboardTypePNG;
+ return PTYPE(PNG);
}
return nil;
@@ -220,7 +268,7 @@ _gdk_macos_clipboard_read_async (GdkClipboard *clipboard,
{
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
- if ([[self->pasteboard types] containsObject:NSPasteboardTypeFileURL])
+ if ([[self->pasteboard types] containsObject:PTYPE(FILE_URL)])
{
GString *str = g_string_new (NULL);
NSArray *files = [self->pasteboard propertyListForType:NSFilenamesPboardType];
@@ -267,12 +315,12 @@ _gdk_macos_clipboard_read_async (GdkClipboard *clipboard,
}
else if (strcmp (mime_type, "image/tiff") == 0)
{
- NSData *data = [self->pasteboard dataForType:NSPasteboardTypeTIFF];
+ NSData *data = [self->pasteboard dataForType:PTYPE(TIFF)];
stream = create_stream_from_nsdata (data);
}
else if (strcmp (mime_type, "image/png") == 0)
{
- NSData *data = [self->pasteboard dataForType:NSPasteboardTypePNG];
+ NSData *data = [self->pasteboard dataForType:PTYPE(PNG)];
stream = create_stream_from_nsdata (data);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]