server: Remove obsolete synthesized formats in release_clipboard().

Synthesized formats must be removed too if the format they depend on has
been removed.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51496
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Francois Gouget 2021-08-10 05:51:46 +02:00 committed by Alexandre Julliard
parent ce98c3b58e
commit a716b13974
2 changed files with 8 additions and 5 deletions

View File

@ -973,7 +973,7 @@ static void test_synthesized(void)
/* CF_UNICODETEXT and derivatives, CF_TEXT + CF_OEMTEXT, should be gone */
count = CountClipboardFormats();
todo_wine ok(count == 1, "count %u\n", count );
ok(count == 1, "count %u\n", count );
cf = EnumClipboardFormats( 0 );
ok(cf == CF_LOCALE, "unexpected clipboard format %u\n", cf);
@ -984,10 +984,9 @@ static void test_synthesized(void)
ok(r, "gle %d\n", GetLastError());
SetLastError(0xdeadbeef);
data = (void*)1; if (broken(1)) /* FIXME Crashes in Wine */
data = GetClipboardData( CF_TEXT );
ok(GetLastError() == 0xdeadbeef, "unexpected last error %d\n", GetLastError());
todo_wine ok(!data, "GetClipboardData() should have returned NULL\n");
ok(GetLastError() == 0xdeadbeef, "bad last error %d\n", GetLastError());
ok(!data, "GetClipboardData() should have returned NULL\n");
r = CloseClipboard();
ok(r, "gle %d\n", GetLastError());

View File

@ -303,7 +303,11 @@ static user_handle_t release_clipboard( struct clipboard *clipboard )
/* free the delayed-rendered formats, since we no longer have an owner to render them */
LIST_FOR_EACH_ENTRY_SAFE( format, next, &clipboard->formats, struct clip_format, entry )
{
if (format->data || format->from) continue;
if (format->data) continue;
/* format->from is earlier in the list and thus has already been
* removed if not available anymore (it is also < CF_MAX)
*/
if (format->from && HAS_FORMAT( clipboard->format_map, format->from )) continue;
list_remove( &format->entry );
if (format->id < CF_MAX) clipboard->format_map &= ~(1 << format->id);
clipboard->format_count--;