VirtualBox

Ignore:
Timestamp:
Sep 11, 2007 1:49:44 PM (17 years ago)
Author:
vboxsync
Message:

Fixed a shared clipboard problem on Windows.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedClipboard/win32.cpp

    r4071 r4711  
    2121#include <iprt/alloc.h>
    2222#include <iprt/string.h>
     23#include <iprt/asm.h>
    2324#include <iprt/assert.h>
    2425#include <iprt/thread.h>
     
    4344    VBOXCLIPBOARDCLIENTDATA *pClient;
    4445   
    45     bool fAnnouncing;
     46    volatile uint32_t u32Announcing;
    4647};
    4748
     
    224225            Log(("WM_DRAWCLIPBOARD next %p\n", pCtx->hwndNextInChain));
    225226
    226             if (!pCtx->fAnnouncing)
    227             {
     227            if (ASMAtomicCmpXchgU32 (&pCtx->u32Announcing, 0, 1) == false)
     228            {
     229                /* Could not do 1->0 transition. That means u32Announcing is 0. */
    228230                vboxClipboardChanged (pCtx);
    229231            }
     
    381383            Log(("WM_USER u32Formats = %02X\n", u32Formats));
    382384           
    383             pCtx->fAnnouncing = true;
    384 
    385385            if (OpenClipboard (hwnd))
    386386            {
     
    389389                Log(("WM_USER emptied clipboard\n"));
    390390           
    391                 HANDLE hClip;
     391                HANDLE hClip = NULL;
    392392
    393393                if (u32Formats & VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT)
    394394                {
    395395                    dprintf(("window proc WM_USER: VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT\n"));
    396                     hClip = SetClipboardData (CF_UNICODETEXT, NULL);
     396                   
     397                    /* Prevent the WM_DRAWCLIPBOARD processing. Will be reset in WM_DRAWCLIPBOARD. */
     398                    if (ASMAtomicCmpXchgU32 (&pCtx->u32Announcing, 1, 0) == true)
     399                    {
     400                        hClip = SetClipboardData (CF_UNICODETEXT, NULL);
     401                    }
    397402                }
    398403
     
    400405                {
    401406                    dprintf(("window proc WM_USER: VBOX_SHARED_CLIPBOARD_FMT_BITMAP\n"));
    402                     hClip = SetClipboardData (CF_DIB, NULL);
     407                   
     408                    /* Prevent the WM_DRAWCLIPBOARD processing. Will be reset in WM_DRAWCLIPBOARD. */
     409                    if (ASMAtomicCmpXchgU32 (&pCtx->u32Announcing, 1, 0) == true)
     410                    {
     411                        hClip = SetClipboardData (CF_DIB, NULL);
     412                    }
    403413                }
    404414
     
    409419                    if (format != 0)
    410420                    {
    411                         hClip = SetClipboardData (format, NULL);
     421                        /* Prevent the WM_DRAWCLIPBOARD processing. Will be reset in WM_DRAWCLIPBOARD. */
     422                        if (ASMAtomicCmpXchgU32 (&pCtx->u32Announcing, 1, 0) == true)
     423                        {
     424                            hClip = SetClipboardData (format, NULL);
     425                        }
    412426                    }
    413427                }
     
    415429                CloseClipboard();
    416430
    417                 dprintf(("window proc WM_USER: hClip %p\n", hClip));
     431                dprintf(("window proc WM_USER: hClip %p, err %d\n", hClip, GetLastError ()));
    418432            }
    419433            else
     
    421435                dprintf(("window proc WM_USER: failed to open clipboard\n"));
    422436            }
    423            
    424             pCtx->fAnnouncing = false;
    425            
    426437        } break;
    427438
     
    525536    g_ctx.hRenderEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    526537   
     538    g_ctx.u32Announcing = 0;
     539   
    527540    rc = RTThreadCreate (&g_ctx.thread, VBoxClipboardThread, NULL, 65536,
    528541                         RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "SHCLIP");
     
    605618    if (OpenClipboard (pClient->pCtx->hwnd))
    606619    {
     620        dprintf(("Clipboard opened.\n"));
     621       
    607622        if (u32Format & VBOX_SHARED_CLIPBOARD_FMT_BITMAP)
    608623        {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette