Ken Thomases : winemac: Extract new function from macdrv_EnumClipboardFormats() parameterized by the target pasteboard.
Alexandre Julliard
julliard at winehq.org
Thu Mar 14 14:55:05 CDT 2013
Module: wine
Branch: master
Commit: fb5794a764b302bce91f938d8fdef396ac8d6922
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fb5794a764b302bce91f938d8fdef396ac8d6922
Author: Ken Thomases <ken at codeweavers.com>
Date: Wed Mar 13 16:53:27 2013 -0500
winemac: Extract new function from macdrv_EnumClipboardFormats() parameterized by the target pasteboard.
---
dlls/winemac.drv/clipboard.c | 159 +++++++++++++++++++++++++-----------------
1 files changed, 96 insertions(+), 63 deletions(-)
diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index fa4857b..40445f6 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -1367,6 +1367,79 @@ static BOOL macdrv_pasteboard_has_format(CFTypeRef pasteboard, UINT desired_form
/**************************************************************************
+ * macdrv_copy_pasteboard_formats
+ */
+static CFArrayRef macdrv_copy_pasteboard_formats(CFTypeRef pasteboard)
+{
+ CFArrayRef types;
+ CFIndex count;
+ CFMutableArrayRef formats;
+ CFIndex i;
+
+ TRACE("pasteboard %p\n", pasteboard);
+
+ types = macdrv_copy_pasteboard_types(pasteboard);
+ if (!types)
+ {
+ WARN("Failed to copy pasteboard types\n");
+ return NULL;
+ }
+
+ count = CFArrayGetCount(types);
+ TRACE("got %ld types\n", count);
+
+ if (!count)
+ {
+ CFRelease(types);
+ return NULL;
+ }
+
+ formats = CFArrayCreateMutable(NULL, 0, NULL);
+ if (!formats)
+ {
+ WARN("Failed to allocate formats array\n");
+ CFRelease(types);
+ return NULL;
+ }
+
+ for (i = 0; i < count; i++)
+ {
+ CFStringRef type = CFArrayGetValueAtIndex(types, i);
+ WINE_CLIPFORMAT* format;
+
+ format = NULL;
+ while ((format = format_for_type(format, type)))
+ {
+ TRACE("for type %s got format %p/%s\n", debugstr_cf(type), format, debugstr_format(format->format_id));
+
+ if (format->synthesized)
+ {
+ /* Don't override a real value with a synthesized value. */
+ if (!CFArrayContainsValue(formats, CFRangeMake(0, CFArrayGetCount(formats)), (void*)format->format_id))
+ CFArrayAppendValue(formats, (void*)format->format_id);
+ }
+ else
+ {
+ /* If the type was already in the array, it must have been synthesized
+ because this one's real. Remove the synthesized entry in favor of
+ this one. */
+ CFIndex index = CFArrayGetFirstIndexOfValue(formats, CFRangeMake(0, CFArrayGetCount(formats)),
+ (void*)format->format_id);
+ if (index != kCFNotFound)
+ CFArrayRemoveValueAtIndex(formats, index);
+ CFArrayAppendValue(formats, (void*)format->format_id);
+ }
+ }
+ }
+
+ CFRelease(types);
+
+ TRACE(" -> %s\n", debugstr_cf(formats));
+ return formats;
+}
+
+
+/**************************************************************************
* check_clipboard_ownership
*/
static void check_clipboard_ownership(HWND *owner)
@@ -1498,88 +1571,48 @@ void CDECL macdrv_EndClipboardUpdate(void)
*/
UINT CDECL macdrv_EnumClipboardFormats(UINT prev_format)
{
- CFArrayRef types;
CFIndex count;
CFIndex i;
- UINT ret;
+ UINT ret = 0;
TRACE("prev_format %s\n", debugstr_format(prev_format));
check_clipboard_ownership(NULL);
- types = macdrv_copy_pasteboard_types(NULL);
- if (!types)
- {
- WARN("Failed to copy pasteboard types\n");
- return 0;
- }
-
- count = CFArrayGetCount(types);
- TRACE("got %ld types\n", count);
-
- if (!count)
- {
- CFRelease(types);
- return 0;
- }
-
if (prev_format)
{
- CFMutableArrayRef formats = CFArrayCreateMutable(NULL, 0, NULL);
- if (!formats)
+ CFArrayRef formats = macdrv_copy_pasteboard_formats(NULL);
+ if (formats)
{
- WARN("Failed to allocate array to track formats\n");
- CFRelease(types);
- return 0;
- }
+ count = CFArrayGetCount(formats);
+ i = CFArrayGetFirstIndexOfValue(formats, CFRangeMake(0, count), (void*)prev_format);
+ if (i != kCFNotFound && i + 1 < count)
+ ret = (UINT)CFArrayGetValueAtIndex(formats, i + 1);
- for (i = 0; i < count; i++)
+ CFRelease(formats);
+ }
+ }
+ else
+ {
+ CFArrayRef types = macdrv_copy_pasteboard_types(NULL);
+ if (types)
{
- CFStringRef type = CFArrayGetValueAtIndex(types, i);
- WINE_CLIPFORMAT* format;
+ count = CFArrayGetCount(types);
+ TRACE("got %ld types\n", count);
- format = NULL;
- while ((format = format_for_type(format, type)))
+ if (count)
{
- TRACE("for type %s got format %p/%s\n", debugstr_cf(type), format, debugstr_format(format->format_id));
+ CFStringRef type = CFArrayGetValueAtIndex(types, 0);
+ WINE_CLIPFORMAT *format = format_for_type(NULL, type);
- if (format->synthesized)
- {
- /* Don't override a real value with a synthesized value. */
- if (!CFArrayContainsValue(formats, CFRangeMake(0, CFArrayGetCount(formats)), (void*)format->format_id))
- CFArrayAppendValue(formats, (void*)format->format_id);
- }
- else
- {
- /* If the type was already in the array, it must have been synthesized
- because this one's real. Remove the synthesized entry in favor of
- this one. */
- CFIndex index = CFArrayGetFirstIndexOfValue(formats, CFRangeMake(0, CFArrayGetCount(formats)),
- (void*)format->format_id);
- if (index != kCFNotFound)
- CFArrayRemoveValueAtIndex(formats, index);
- CFArrayAppendValue(formats, (void*)format->format_id);
- }
+ ret = format ? format->format_id : 0;
}
- }
- count = CFArrayGetCount(formats);
- i = CFArrayGetFirstIndexOfValue(formats, CFRangeMake(0, count), (void*)prev_format);
- if (i == kCFNotFound || i + 1 >= count)
- ret = 0;
+ CFRelease(types);
+ }
else
- ret = (UINT)CFArrayGetValueAtIndex(formats, i + 1);
-
- CFRelease(formats);
+ WARN("Failed to copy pasteboard types\n");
}
- else
- {
- CFStringRef type = CFArrayGetValueAtIndex(types, 0);
- WINE_CLIPFORMAT *format = format_for_type(NULL, type);
- ret = format ? format->format_id : 0;
- }
-
- CFRelease(types);
TRACE(" -> %u\n", ret);
return ret;
}
More information about the wine-cvs
mailing list