VirtualBox

Changeset 86684 in vbox for trunk


Ignore:
Timestamp:
Oct 23, 2020 9:24:36 AM (4 years ago)
Author:
vboxsync
Message:

Shared Clipboard/X11: Re-integrated previously removed fixes (before 5.2) for busy / overlapping Xt handling (see r86051 + r119036). bugref:9848

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-x11.cpp

    r85845 r86684  
    9292class formats;
    9393SHCL_X11_DECL(Atom) clipGetAtom(PSHCLX11CTX pCtx, const char *pszName);
     94SHCL_X11_DECL(void) clipQueryX11FormatsCallback(PSHCLX11CTX pCtx);
    9495
    9596
     
    662663    LogFlowFuncEnter();
    663664
     665    pCtx->fXtBusy = false;
     666    if (pCtx->fXtNeedsUpdate)
     667    {
     668        /* We may already be out of date. */
     669        pCtx->fXtNeedsUpdate = false;
     670        clipQueryX11FormatsCallback(pCtx);
     671        return;
     672    }
     673
    664674    if (paIdxFmtTargets == NULL)
    665675    {
     
    690700    PSHCLX11CTX pCtx = reinterpret_cast<SHCLX11CTX *>(pClient);
    691701
    692 #ifndef TESTCASE
    693     LogFlowFunc(("fXtNeedsUpdate=%RTbool, fXtBusy=%RTbool\n", pCtx->fXtNeedsUpdate, pCtx->fXtBusy));
    694 
    695     if (pCtx->fXtNeedsUpdate)
    696     {
    697         // The data from this callback is already out of date.  Refresh it.
    698         pCtx->fXtNeedsUpdate = false;
    699         XtGetSelectionValue(pCtx->pWidget,
    700                             clipGetAtom(pCtx, "CLIPBOARD"),
    701                             clipGetAtom(pCtx, "TARGETS"),
    702                             clipConvertX11TargetsCallback, pCtx,
    703                             CurrentTime);
    704         return;
    705     }
    706     else
    707     {
    708         pCtx->fXtBusy = false;
    709     }
    710 #endif
    711 
    712     Atom *pAtoms = (Atom *)pValue;
    713 
    714702    LogFlowFunc(("pValue=%p, *pcLen=%u, *atomType=%d%s\n",
    715703                 pValue, *pcLen, *atomType, *atomType == XT_CONVERT_FAIL ? " (XT_CONVERT_FAIL)" : ""));
     704
     705    Atom *pAtoms = (Atom *)pValue;
    716706
    717707    unsigned cFormats = *pcLen;
     
    784774    {
    785775        pCtx->fXtNeedsUpdate = true;
    786     }
    787     else
    788     {
    789         pCtx->fXtBusy = true;
    790         XtGetSelectionValue(pCtx->pWidget,
    791                             clipGetAtom(pCtx, "CLIPBOARD"),
    792                             clipGetAtom(pCtx, "TARGETS"),
    793                             clipConvertX11TargetsCallback, pCtx,
    794                             CurrentTime);
    795     }
     776        return;
     777    }
     778
     779    pCtx->fXtBusy = true;
     780    XtGetSelectionValue(pCtx->pWidget,
     781                        clipGetAtom(pCtx, "CLIPBOARD"),
     782                        clipGetAtom(pCtx, "TARGETS"),
     783                        clipConvertX11TargetsCallback, pCtx,
     784                        CurrentTime);
    796785#else
    797786    tstRequestTargets(pCtx);
     
    17721761    void  *pvDst = NULL;
    17731762    size_t cbDst = 0;
     1763
     1764    PSHCLX11CTX pCtx = pReq->pCtx;
     1765    AssertPtr(pReq->pCtx);
     1766
     1767    pCtx->fXtBusy = false;
     1768    if (pCtx->fXtNeedsUpdate)
     1769        clipQueryX11FormatsCallback(pCtx);
    17741770
    17751771    if (pvSrc == NULL)
     
    20232019    int rc = VERR_NO_DATA; /* VBox thinks we have data and we don't. */
    20242020
    2025     if (pReq->uFmtVBox & VBOX_SHCL_FMT_UNICODETEXT)
     2021    const bool fXtBusy = pCtx->fXtBusy;
     2022    pCtx->fXtBusy = true;
     2023    if (fXtBusy)
     2024    {
     2025        /* If the clipboard is busy just fend off the request. */
     2026        rc = VERR_TRY_AGAIN;
     2027    }
     2028    else if (pReq->uFmtVBox & VBOX_SHCL_FMT_UNICODETEXT)
    20262029    {
    20272030        pReq->idxFmtX11 = pCtx->idxFmtText;
     
    20632066    else
    20642067    {
     2068        pCtx->fXtBusy = false;
     2069
    20652070        rc = VERR_NOT_IMPLEMENTED;
    20662071    }
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