Piotr Caban : winemac: Don't update clipboard if its content didn' t change.
Alexandre Julliard
julliard at winehq.org
Tue May 30 16:05:13 CDT 2017
Module: wine
Branch: master
Commit: 1cd883fcb57c30120e564aefc35ce38934038288
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1cd883fcb57c30120e564aefc35ce38934038288
Author: Piotr Caban <piotr at 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 at codeweavers.com>
Signed-off-by: Ken Thomases <ken at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list