Module: wine Branch: master Commit: 1cd883fcb57c30120e564aefc35ce38934038288 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1cd883fcb57c30120e564aefc3...
Author: Piotr Caban piotr@codeweavers.com Date: Tue May 30 09:56:25 2017 +0200
winemac: Don't update clipboard if its content didn't change.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Ken Thomases ken@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winemac.drv/clipboard.c | 23 ++++++++--------------- dlls/winemac.drv/cocoa_clipboard.m | 18 ++++++++++++++++++ dlls/winemac.drv/macdrv_cocoa.h | 1 + 3 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c index 53f01d5..ac0dc31 100644 --- a/dlls/winemac.drv/clipboard.c +++ b/dlls/winemac.drv/clipboard.c @@ -198,7 +198,6 @@ static DWORD clipboard_thread_id; static HWND clipboard_hwnd; static BOOL is_clipboard_owner; static macdrv_window clipboard_cocoa_window; -static UINT rendered_formats; static ULONG64 last_clipboard_update; static DWORD last_get_seqno; static WINE_CLIPFORMAT **current_mac_formats; @@ -1729,11 +1728,7 @@ static void render_format(UINT id) { HANDLE handle = current_mac_formats[i]->import_func(pasteboard_data); CFRelease(pasteboard_data); - if (handle) - { - SetClipboardData(id, handle); - rendered_formats++; - } + if (handle) SetClipboardData(id, handle); break; } } @@ -1746,7 +1741,7 @@ static void render_format(UINT id) * Grab the Win32 clipboard when a Mac app has taken ownership of the * pasteboard, and fill it with the pasteboard data types. */ -static void grab_win32_clipboard(BOOL changed) +static void grab_win32_clipboard(void) { static CFArrayRef last_types; CFArrayRef types; @@ -1758,8 +1753,7 @@ static void grab_win32_clipboard(BOOL changed) return; }
- changed = (changed || rendered_formats || !last_types || !CFEqual(types, last_types)); - if (!changed) + if (!macdrv_has_pasteboard_changed() && last_types && CFEqual(types, last_types)) { CFRelease(types); return; @@ -1771,7 +1765,6 @@ static void grab_win32_clipboard(BOOL changed) if (!OpenClipboard(clipboard_hwnd)) return; EmptyClipboard(); is_clipboard_owner = TRUE; - rendered_formats = 0; last_clipboard_update = GetTickCount64(); set_win32_clipboard_formats_from_mac_pasteboard(types); CloseClipboard(); @@ -1798,10 +1791,10 @@ static void update_clipboard(void) if (is_clipboard_owner) { if (GetTickCount64() - last_clipboard_update > CLIPBOARD_UPDATE_DELAY) - grab_win32_clipboard(FALSE); + grab_win32_clipboard(); } else if (!macdrv_is_pasteboard_owner(clipboard_cocoa_window)) - grab_win32_clipboard(TRUE); + grab_win32_clipboard();
updating = FALSE; } @@ -1828,7 +1821,7 @@ static LRESULT CALLBACK clipboard_wndproc(HWND hwnd, UINT msg, WPARAM wp, LPARAM break; case WM_TIMER: if (!is_clipboard_owner) break; - grab_win32_clipboard(FALSE); + grab_win32_clipboard(); break; case WM_DESTROYCLIPBOARD: TRACE("WM_DESTROYCLIPBOARD: lost ownership\n"); @@ -1974,7 +1967,7 @@ static DWORD WINAPI clipboard_thread(void *arg) clipboard_thread_id = GetCurrentThreadId(); AddClipboardFormatListener(clipboard_hwnd); register_builtin_formats(); - grab_win32_clipboard(TRUE); + grab_win32_clipboard();
TRACE("clipboard thread %04x running\n", GetCurrentThreadId()); while (1) @@ -2239,7 +2232,7 @@ void macdrv_lost_pasteboard_ownership(HWND hwnd) { TRACE("win %p\n", hwnd); if (!macdrv_is_pasteboard_owner(clipboard_cocoa_window)) - grab_win32_clipboard(TRUE); + grab_win32_clipboard(); }
diff --git a/dlls/winemac.drv/cocoa_clipboard.m b/dlls/winemac.drv/cocoa_clipboard.m index 3b6ec41..39c3b8f 100644 --- a/dlls/winemac.drv/cocoa_clipboard.m +++ b/dlls/winemac.drv/cocoa_clipboard.m @@ -25,6 +25,7 @@
static int owned_change_count = -1; +static int change_count = -1;
static NSArray* BitmapOutputTypes; static NSDictionary* BitmapOutputTypeMap; @@ -52,6 +53,23 @@ int macdrv_is_pasteboard_owner(macdrv_window w) return ret; }
+/*********************************************************************** + * macdrv_has_pasteboard_changed + */ +int macdrv_has_pasteboard_changed(void) +{ + __block int new_change_count; + int ret; + + OnMainThread(^{ + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + new_change_count = [pb changeCount]; + }); + + ret = (change_count != new_change_count); + change_count = new_change_count; + return ret; +}
/*********************************************************************** * macdrv_copy_pasteboard_types diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index c4d3a53..a22b4c2 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -549,6 +549,7 @@ extern int macdrv_layout_list_needs_update DECLSPEC_HIDDEN; extern CFArrayRef macdrv_copy_pasteboard_types(CFTypeRef pasteboard) DECLSPEC_HIDDEN; extern CFDataRef macdrv_copy_pasteboard_data(CFTypeRef pasteboard, CFStringRef type) DECLSPEC_HIDDEN; extern int macdrv_is_pasteboard_owner(macdrv_window w) DECLSPEC_HIDDEN; +extern int macdrv_has_pasteboard_changed(void) DECLSPEC_HIDDEN; extern void macdrv_clear_pasteboard(macdrv_window w) DECLSPEC_HIDDEN; extern int macdrv_set_pasteboard_data(CFStringRef type, CFDataRef data, macdrv_window w) DECLSPEC_HIDDEN;