VirtualBox

Changeset 55707 in vbox


Ignore:
Timestamp:
May 7, 2015 7:26:10 AM (10 years ago)
Author:
vboxsync
Message:

DnD: Additions/X11/VBoxClient: Some more sanity checking, extended logging.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/x11/VBoxClient/draganddrop.cpp

    r55571 r55707  
    193193    }
    194194
    195     RTCString xErrorToString(int xrc) const;
     195    RTCString xErrorToString(int xRc) const;
    196196    Window applicationWindowBelowCursor(Window parentWin) const;
    197197
     
    261261};
    262262
    263 RTCString xHelpers::xErrorToString(int xrc) const
    264 {
    265     switch (xrc)
    266     {
    267         case Success:           return RTCStringFmt("%d (Success)", xrc); break;
    268         case BadRequest:        return RTCStringFmt("%d (BadRequest)", xrc); break;
    269         case BadValue:          return RTCStringFmt("%d (BadValue)", xrc); break;
    270         case BadWindow:         return RTCStringFmt("%d (BadWindow)", xrc); break;
    271         case BadPixmap:         return RTCStringFmt("%d (BadPixmap)", xrc); break;
    272         case BadAtom:           return RTCStringFmt("%d (BadAtom)", xrc); break;
    273         case BadCursor:         return RTCStringFmt("%d (BadCursor)", xrc); break;
    274         case BadFont:           return RTCStringFmt("%d (BadFont)", xrc); break;
    275         case BadMatch:          return RTCStringFmt("%d (BadMatch)", xrc); break;
    276         case BadDrawable:       return RTCStringFmt("%d (BadDrawable)", xrc); break;
    277         case BadAccess:         return RTCStringFmt("%d (BadAccess)", xrc); break;
    278         case BadAlloc:          return RTCStringFmt("%d (BadAlloc)", xrc); break;
    279         case BadColor:          return RTCStringFmt("%d (BadColor)", xrc); break;
    280         case BadGC:             return RTCStringFmt("%d (BadGC)", xrc); break;
    281         case BadIDChoice:       return RTCStringFmt("%d (BadIDChoice)", xrc); break;
    282         case BadName:           return RTCStringFmt("%d (BadName)", xrc); break;
    283         case BadLength:         return RTCStringFmt("%d (BadLength)", xrc); break;
    284         case BadImplementation: return RTCStringFmt("%d (BadImplementation)", xrc); break;
    285     }
    286     return RTCStringFmt("%d (unknown)", xrc);
     263RTCString xHelpers::xErrorToString(int xRc) const
     264{
     265    switch (xRc)
     266    {
     267        case Success:           return RTCStringFmt("%d (Success)", xRc);          break;
     268        case BadRequest:        return RTCStringFmt("%d (BadRequest)", xRc);        break;
     269        case BadValue:          return RTCStringFmt("%d (BadValue)", xRc);          break;
     270        case BadWindow:         return RTCStringFmt("%d (BadWindow)", xRc);        break;
     271        case BadPixmap:         return RTCStringFmt("%d (BadPixmap)", xRc);        break;
     272        case BadAtom:           return RTCStringFmt("%d (BadAtom)", xRc);          break;
     273        case BadCursor:         return RTCStringFmt("%d (BadCursor)", xRc);        break;
     274        case BadFont:           return RTCStringFmt("%d (BadFont)", xRc);          break;
     275        case BadMatch:          return RTCStringFmt("%d (BadMatch)", xRc);          break;
     276        case BadDrawable:       return RTCStringFmt("%d (BadDrawable)", xRc);      break;
     277        case BadAccess:         return RTCStringFmt("%d (BadAccess)", xRc);        break;
     278        case BadAlloc:          return RTCStringFmt("%d (BadAlloc)", xRc);          break;
     279        case BadColor:          return RTCStringFmt("%d (BadColor)", xRc);          break;
     280        case BadGC:             return RTCStringFmt("%d (BadGC)", xRc);            break;
     281        case BadIDChoice:       return RTCStringFmt("%d (BadIDChoice)", xRc);      break;
     282        case BadName:           return RTCStringFmt("%d (BadName)", xRc);          break;
     283        case BadLength:         return RTCStringFmt("%d (BadLength)", xRc);        break;
     284        case BadImplementation: return RTCStringFmt("%d (BadImplementation)", xRc); break;
     285    }
     286    return RTCStringFmt("%d (unknown)", xRc);
    287287}
    288288
     
    342342
    343343/* For now only one DragInstance will exits when the app is running. In the
    344  * future the support for having more than one D&D operation supported at the
     344 * future the support for having more than one drag and drop operation supported at the
    345345 * time will be necessary. */
    346346class DragInstance
     
    547547void DragInstance::reset(void)
    548548{
     549    LogFlowFuncEnter();
     550
    549551    /* Hide the proxy win. */
    550552    proxyWinHide();
     
    565567    m_curVer = -1;
    566568    m_state  = Initialized;
     569    m_mode   = Unknown;
    567570    m_eventQueue.clear();
    568571}
     
    841844                s.xselection.property  = e.xselectionrequest.property;
    842845
    843                 int xrc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
    844                 if (RT_UNLIKELY(xrc == 0))
     846                int xRc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
     847                if (RT_UNLIKELY(xRc == 0))
    845848                    LogFlowThisFunc(("Error sending SelectionNotify event to wnd=%#x\n", e.xselectionrequest.requestor));
    846849            }
     
    868871                    s.xselection.property  = e.xselectionrequest.property;
    869872
    870                     int xrc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
    871                     if (RT_UNLIKELY(xrc == 0))
     873                    int xRc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
     874                    if (RT_UNLIKELY(xRc == 0))
    872875                        LogFlowThisFunc(("Error sending SelectionNotify event to wnd=%#x\n", e.xselectionrequest.requestor));
    873876                }
     
    901904                s.xselection.target    = None; /* default is refusing */
    902905                s.xselection.property  = None; /* default is refusing */
    903                 int xrc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
    904                 if (RT_UNLIKELY(xrc == 0))
     906                int xRc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
     907                if (RT_UNLIKELY(xRc == 0))
    905908                    LogFlowThisFunc(("Error sending SelectionNotify event to wnd=%#x\n", e.xselectionrequest.requestor));
    906909            }
     
    974977                                 RTMSINTERVAL uTimeoutMS /* = 100 */)
    975978{
    976     LogFlowThisFunc(("iType=%d, uTimeoutMS=%RU32, cEventQueue=%zu\n",
    977                      iType, uTimeoutMS, m_eventQueue.size()));
     979    LogFlowThisFunc(("iType=%d, uTimeoutMS=%RU32, cEventQueue=%zu\n", iType, uTimeoutMS, m_eventQueue.size()));
    978980
    979981    bool fFound = false;
    980982    const uint64_t uiStart = RTTimeMilliTS();
     983
    981984    do
    982985    {
     
    10171020    while (RTTimeMilliTS() - uiStart < uTimeoutMS);
    10181021
    1019     LogFlowThisFunc(("Returning fFound=%RTbool, msRuntime=%RU64\n",
    1020                      fFound, RTTimeMilliTS() - uiStart));
     1022    LogFlowThisFunc(("Returning fFound=%RTbool, msRuntime=%RU64\n", fFound, RTTimeMilliTS() - uiStart));
    10211023    return fFound;
    10221024}
     
    10801082int DragInstance::hgEnter(const RTCList<RTCString> &formats, uint32_t uActions)
    10811083{
     1084    if (m_mode != Unknown)
     1085        return VERR_INVALID_STATE;
     1086
    10821087    reset();
    10831088
     
    11191124
    11201125    int rc  = VINF_SUCCESS;
    1121     int xrc = Success;
     1126    int xRc = Success;
    11221127
    11231128    /* Move the mouse cursor within the guest. */
     
    11381143        /* Query the XdndAware property from the window. We are interested in
    11391144         * the version and if it is XdndAware at all. */
    1140         xrc = XGetWindowProperty(m_pDisplay, wndCursor, xAtom(XA_XdndAware),
     1145        xRc = XGetWindowProperty(m_pDisplay, wndCursor, xAtom(XA_XdndAware),
    11411146                                 0, 2, False, AnyPropertyType,
    11421147                                 &atmp, &fmt, &cItems, &cbRemaining, &pcData);
    11431148
    1144         if (RT_UNLIKELY(xrc != Success))
    1145             logError("Error getting properties of cursor window=%#x: %s\n", wndCursor, gX11->xErrorToString(xrc).c_str());
     1149        if (RT_UNLIKELY(xRc != Success))
     1150            logError("Error getting properties of cursor window=%#x: %s\n", wndCursor, gX11->xErrorToString(xRc).c_str());
    11461151        else
    11471152        {
     
    11761181        m.data.l[0]    = m_wndProxy;
    11771182
    1178         xrc = XSendEvent(m_pDisplay, m_wndCur, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
    1179         if (RT_UNLIKELY(xrc == 0))
    1180             logError("DnD: Error sending XA_XdndLeave to old window=%#x: %s\n", m_wndCur, gX11->xErrorToString(xrc).c_str());
     1183        xRc = XSendEvent(m_pDisplay, m_wndCur, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
     1184        if (RT_UNLIKELY(xRc == 0))
     1185            logError("DnD: Error sending XA_XdndLeave event to old window=%#x: %s\n", m_wndCur, gX11->xErrorToString(xRc).c_str());
    11811186    }
    11821187
     
    12081213        m.data.l[4]    = m_formats.value(2, None);
    12091214
    1210         xrc = XSendEvent(m_pDisplay, wndCursor, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
    1211         if (RT_UNLIKELY(xrc == 0))
    1212             logError("Error sending XA_XdndEnter to new window=%#x: %s\n", wndCursor, gX11->xErrorToString(xrc).c_str());
     1215        xRc = XSendEvent(m_pDisplay, wndCursor, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
     1216        if (RT_UNLIKELY(xRc == 0))
     1217            logError("Error sending XA_XdndEnter event to new window=%#x: %s\n", wndCursor, gX11->xErrorToString(xRc).c_str());
    12131218    }
    12141219
     
    12351240        m.data.l[4]    = pa;
    12361241
    1237         xrc = XSendEvent(m_pDisplay, wndCursor, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
    1238         if (RT_UNLIKELY(xrc == 0))
    1239             logError(("Error sending XA_XdndPosition to current window=%#x: %s\n", wndCursor, gX11->xErrorToString(xrc).c_str()));
     1242        xRc = XSendEvent(m_pDisplay, wndCursor, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
     1243        if (RT_UNLIKELY(xRc == 0))
     1244            logError(("Error sending XA_XdndPosition event to current window=%#x: %s\n", wndCursor, gX11->xErrorToString(xRc).c_str()));
    12401245    }
    12411246
     
    12611266    if (   m_mode  != HG
    12621267        || m_state != Dragging)
     1268    {
    12631269        return VERR_INVALID_STATE;
     1270    }
    12641271
    12651272    int rc = VINF_SUCCESS;
     
    12761283    m.data.l[2]    = CurrentTime;
    12771284
    1278     int xrc = XSendEvent(m_pDisplay, m_wndCur, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
    1279     if (RT_UNLIKELY(xrc == 0))
    1280         logError(("Error sending XA_XdndDrop to current window=%#x: %s\n", m_wndCur, gX11->xErrorToString(xrc).c_str()));
     1285    int xRc = XSendEvent(m_pDisplay, m_wndCur, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
     1286    if (RT_UNLIKELY(xRc == 0))
     1287        logError(("Error sending XA_XdndDrop event to current window=%#x: %s\n", m_wndCur, gX11->xErrorToString(xRc).c_str()));
    12811288
    12821289    m_wndCur = None;
     
    12891296}
    12901297
    1291 int DragInstance::hgDataReceived(void *pvData, uint32_t cData)
     1298int DragInstance::hgDataReceived(void *pvData, uint32_t cbData)
    12921299{
    12931300    if (   m_mode  != HG
    12941301        || m_state != Dropped)
     1302    {
    12951303        return VERR_INVALID_STATE;
     1304    }
    12961305
    12971306    if (RT_UNLIKELY(   pvData == NULL
    1298                     || cData  == 0))
     1307                    || cbData  == 0))
     1308    {
    12991309        return VERR_INVALID_PARAMETER;
     1310    }
    13001311
    13011312    if (RT_UNLIKELY(m_state != Dropped))
     
    13031314
    13041315    /* Make a copy of the data. The xserver will become the new owner. */
    1305     void *pvNewData = RTMemAlloc(cData);
     1316    void *pvNewData = RTMemAlloc(cbData);
    13061317    if (RT_UNLIKELY(!pvNewData))
    13071318        return VERR_NO_MEMORY;
    1308     memcpy(pvNewData, pvData, cData);
     1319
     1320    memcpy(pvNewData, pvData, cbData);
    13091321
    13101322    /*
     
    13341346    /* Fill up the property with the data. */
    13351347    XChangeProperty(s.xselection.display, s.xselection.requestor, s.xselection.property, s.xselection.target, 8, PropModeReplace,
    1336                     reinterpret_cast<const unsigned char*>(pvNewData), cData);
    1337     int xrc = XSendEvent(s.xselection.display, s.xselection.requestor, True, 0, &s);
    1338     if (RT_UNLIKELY(xrc == 0))
     1348                    reinterpret_cast<const unsigned char*>(pvNewData), cbData);
     1349    int xRc = XSendEvent(s.xselection.display, s.xselection.requestor, True, 0, &s);
     1350    if (RT_UNLIKELY(xRc == 0))
    13391351    {
    13401352        logError(("Error sending SelectionNotify event to window=%#x: %s\n",
    1341                   s.xselection.requestor, gX11->xErrorToString(xrc).c_str()));
     1353                  s.xselection.requestor, gX11->xErrorToString(xRc).c_str()));
    13421354    }
    13431355
     
    13481360int DragInstance::ghIsDnDPending(void)
    13491361{
     1362    LogFlowFuncEnter();
     1363
     1364    if (m_mode == HG)
     1365        return VERR_INVALID_STATE;
     1366
    13501367    int rc = VINF_SUCCESS;
    13511368    Window wndSelection = XGetSelectionOwner(m_pDisplay, xAtom(XA_XdndSelection));
     
    14661483                if (RT_UNLIKELY(xRc == 0))
    14671484                {
    1468                     logError(("Error sending enter XA_XdndStatus to current window=%#x: %s\n",
     1485                    logError(("Error sending enter XA_XdndStatus event to current window=%#x: %s\n",
    14691486                              m_wndCur, gX11->xErrorToString(xRc).c_str()));
    14701487                }
     
    14921509                if (RT_UNLIKELY(xRc == 0))
    14931510                {
    1494                     logError(("Error sending position XA_XdndStatus to current window=%#x: %s\n",
     1511                    logError(("Error sending position XA_XdndStatus event to current window=%#x: %s\n",
    14951512                              m_wndCur, gX11->xErrorToString(xRc).c_str()));
    14961513                }
     
    15211538int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
    15221539{
    1523     LogFlowThisFunc(("strFormat=%s, uAction=%RU32\n",
    1524                      strFormat.c_str(), uAction));
     1540    LogFlowThisFunc(("strFormat=%s, uAction=%RU32\n", strFormat.c_str(), uAction));
     1541
     1542    if (   m_mode  != GH
     1543        || m_state != Dragging)
     1544    {
     1545        return VERR_INVALID_STATE;
     1546    }
    15251547
    15261548    int rc = VINF_SUCCESS;
     
    15481570                   1 /* Button */, false /* Release button */);
    15491571
    1550     /* The fake button release event should lead to a XdndDrop event from the
     1572    /**
     1573     * The fake button release event above should lead to a XdndDrop event from the
    15511574     * source. Because of showing our proxy window, other Xdnd events can
    15521575     * occur before, e.g. a XdndPosition event. We are not interested
    1553      * in those, so just try to get the right one. */
     1576     * in those, so just try to get the right one.
     1577     */
    15541578
    15551579    XClientMessageEvent evDnDDrop;
    1556     bool fDrop = waitForX11ClientMsg(evDnDDrop, xAtom(XA_XdndDrop),
    1557                                      5 * 1000 /* Timeout in ms */);
     1580    bool fDrop = waitForX11ClientMsg(evDnDDrop, xAtom(XA_XdndDrop), 5 * 1000 /* Timeout in ms */);
    15581581    if (fDrop)
    15591582    {
    15601583        /* Request to convert the selection in the specific format and
    15611584         * place it to our proxy window as property. */
    1562         Window wndSource = evDnDDrop.data.l[0]; /* Source window which sent the message. */
     1585        Window wndSource = evDnDDrop.data.l[0]; /* Source window which has sent the message. */
    15631586        Assert(wndSource == m_wndCur);
    15641587        Atom aFormat  = gX11->stringToxAtom(strFormat.c_str());
    15651588
    1566         XConvertSelection(m_pDisplay, xAtom(XA_XdndSelection),
    1567                           aFormat, xAtom(XA_XdndSelection),
     1589        XConvertSelection(m_pDisplay, xAtom(XA_XdndSelection), aFormat, xAtom(XA_XdndSelection),
    15681590                          m_wndProxy, evDnDDrop.data.l[2]);
    15691591
     
    15881610                unsigned long cItems, cbRemaining;
    15891611                unsigned char *pcData = NULL;
    1590                 XGetWindowProperty(m_pDisplay, m_wndProxy,
    1591                                    xAtom(XA_XdndSelection) /* Property */,
    1592                                    0 /* Offset */,
    1593                                    VBOX_MAX_XPROPERTIES /* Length of 32-bit multiples */,
    1594                                    True /* Delete property? */,
    1595                                    AnyPropertyType, /* Property type */
    1596                                    &aPropType, &iPropFormat, &cItems, &cbRemaining, &pcData);
     1612                int xRc = XGetWindowProperty(m_pDisplay, m_wndProxy,
     1613                                             xAtom(XA_XdndSelection)  /* Property */,
     1614                                             0                        /* Offset */,
     1615                                             VBOX_MAX_XPROPERTIES     /* Length of 32-bit multiples */,
     1616                                             True                     /* Delete property? */,
     1617                                             AnyPropertyType,         /* Property type */
     1618                                             &aPropType, &iPropFormat, &cItems, &cbRemaining, &pcData);
     1619                if (RT_UNLIKELY(xRc == 0))
     1620                    LogFlowThisFunc(("Error getting XA_XdndSelection property of proxy window=%#x: %s\n",
     1621                                     m_wndProxy, gX11->xErrorToString(xRc).c_str()));
    15971622
    15981623                LogFlowThisFunc(("strType=%s, iPropFormat=%d, cItems=%RU32, cbRemaining=%RU32\n",
     
    16481673                        m.data.l[2]    = RT_SUCCESS(rc) ? toX11Action(uAction) : None; /* Action used on success */
    16491674
    1650                         int xrc = XSendEvent(m_pDisplay, wndSource, True, NoEventMask, reinterpret_cast<XEvent*>(&m));
    1651                         if (RT_UNLIKELY(xrc == 0))
    1652                             LogFlowThisFunc(("Error sending xEvent\n"));
     1675                        xRc = XSendEvent(m_pDisplay, wndSource, True, NoEventMask, reinterpret_cast<XEvent*>(&m));
     1676                        if (RT_UNLIKELY(xRc == 0))
     1677                            LogFlowThisFunc(("Error sending XA_XdndFinished event to proxy window=%#x: %s\n",
     1678                                             m_wndProxy, gX11->xErrorToString(xRc).c_str()));
    16531679                    }
    16541680                    else
     
    16651691                    else
    16661692                    {
    1667                         AssertMsgFailed(("Not supported data type (%s)\n",
    1668                                          gX11->xAtomToString(aPropType).c_str()));
    1669                         rc = VERR_INVALID_PARAMETER;
     1693                        LogFlowFunc(("Not supported data type: %s\n", gX11->xAtomToString(aPropType).c_str()));
     1694                        rc = VERR_NOT_SUPPORTED;
    16701695                    }
    16711696
     
    16881713                    m.data.l[1]    = 0; /* Don't accept the drop to not make the guest stuck. */
    16891714
    1690                     int xrc = XSendEvent(m_pDisplay, wndSource, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
    1691                     if (RT_UNLIKELY(xrc == 0))
     1715                    xRc = XSendEvent(m_pDisplay, wndSource, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
     1716                    if (RT_UNLIKELY(xRc == 0))
    16921717                    {
    1693                         logError(("Error sending XA_XdndFinished to proxy window=%#x: %s\n",
    1694                                   m_wndProxy, gX11->xErrorToString(xrc).c_str()));
     1718                        logError(("Error sending XA_XdndFinished event to proxy window=%#x: %s\n",
     1719                                  m_wndProxy, gX11->xErrorToString(xRc).c_str()));
    16951720                    }
    16961721                }
     
    17351760    /* Move the guest pointer to the DnD position, so we can find the window
    17361761     * below that position. */
    1737     XWarpPointer(m_pDisplay, None, m_wndRoot, 0, 0, 0, 0, iPosX, iPosY);
     1762    XWarpPointer(m_pDisplay, None, m_wndRoot, 0, 0, 0, 0, RT_MAX(0, iPosX), RT_MAX(0, iPosY));
    17381763    return VINF_SUCCESS;
    17391764}
     
    17801805        LogFlowThisFunc(("XText extension available\n"));
    17811806
    1782         int xrc = XTestFakeButtonEvent(m_pDisplay, 1, fPress ? True : False, CurrentTime);
    1783         if (RT_UNLIKELY(xrc == 0))
    1784             LogFlowThisFunc(("Error sending XTestFakeButtonEvent event\n"));
     1807        int xRc = XTestFakeButtonEvent(m_pDisplay, 1, fPress ? True : False, CurrentTime);
     1808        if (RT_UNLIKELY(xRc == 0))
     1809            LogFlowThisFunc(("Error sending XTestFakeButtonEvent event: %s\n", gX11->xErrorToString(xRc).c_str()));
    17851810        XFlush(m_pDisplay);
    17861811    }
     
    18121837        //XTranslateCoordinates(m_pDisplay, eBtn.root, eBtn.window, eBtn.x_root, eBtn.y_root, &eBtn.x, &eBtn.y, &eBtn.subwindow);
    18131838#if 0
    1814         int xrc = XSendEvent(m_pDisplay, eBtn.window, True /* fPropagate */,
     1839        int xRc = XSendEvent(m_pDisplay, eBtn.window, True /* fPropagate */,
    18151840                               fPress
    18161841                             ? ButtonPressMask : ButtonReleaseMask,
    18171842                             reinterpret_cast<XEvent*>(&eBtn));
    18181843#else
    1819         int xrc = XSendEvent(m_pDisplay, eBtn.window, False /* fPropagate */,
    1820                              0 /* Mask */,
    1821                              reinterpret_cast<XEvent*>(&eBtn));
     1844        int xRc = XSendEvent(m_pDisplay, eBtn.window, False /* fPropagate */,
     1845                             0 /* Mask */, reinterpret_cast<XEvent*>(&eBtn));
    18221846#endif
    1823         if (RT_UNLIKELY(xrc == 0))
    1824             LogFlowThisFunc(("Error sending XSendEvent\n"));
     1847        if (RT_UNLIKELY(xRc == 0))
     1848            LogFlowThisFunc(("Error sending XButtonEvent event to window=%#x: %s\n", wndDest, gX11->xErrorToString(xRc).c_str()));
    18251849
    18261850#ifdef DEBUG
     
    18521876
    18531877//    XTestGrabControl(m_pDisplay, False);
     1878
     1879    /* Get the mouse pointer position and determine if we're on the same screen as the root window
     1880     * and returns the current child window beneath our mouse pointer, if any. */
    18541881    Bool fInRootWnd = XQueryPointer(m_pDisplay, m_wndRoot, &wndRoot, &wndChild,
    18551882                                    &iRootX, &iRootY,
    18561883                                    &iChildX, &iChildY, &iMask);
    1857 #ifdef DEBUG_andy
     1884
    18581885    LogFlowThisFunc(("fInRootWnd=%RTbool, wndRoot=0x%x, wndChild=0x%x, iRootX=%d, iRootY=%d\n",
    18591886                     RT_BOOL(fInRootWnd), wndRoot, wndChild, iRootX, iRootY));
    1860 #endif
    18611887
    18621888    if (piRootX)
     
    18671893    XSynchronize(m_pDisplay, True /* Enable sync */);
    18681894
     1895    /* Bring our proxy window into foreground. */
    18691896    XMapWindow(m_pDisplay, m_wndProxy);
    18701897    XRaiseWindow(m_pDisplay, m_wndProxy);
    1871     XMoveResizeWindow(m_pDisplay, m_wndProxy, iRootX, iRootY, 100, 100);
     1898
     1899    /* Resize our proxy window so that it gets displayed right in center of our mouse cursor. */
     1900    const int iProxyX = RT_MAX(0, iRootX - 50);
     1901    const int iProxyY = RT_MAX(0, iRootY - 50);
     1902    LogFlowThisFunc(("iProxyX=%d, iProxyY=%d\n", iProxyX, iProxyY));
     1903    XMoveResizeWindow(m_pDisplay, m_wndProxy, iProxyX, iProxyY, 100, 100);
    18721904
    18731905    if (fMouseMove)
     
    21422174                    case DragAndDropSvc::HOST_DND_HG_EVT_MOVE:
    21432175                    {
    2144                         m_pCurDnD->hgMove(e.hgcm.u.a.uXpos, e.hgcm.u.a.uYpos,
    2145                                           e.hgcm.u.a.uDefAction);
     2176                        rc = m_pCurDnD->hgMove(e.hgcm.u.a.uXpos, e.hgcm.u.a.uYpos, e.hgcm.u.a.uDefAction);
    21462177                        break;
    21472178                    }
     
    21532184                    case DragAndDropSvc::HOST_DND_HG_EVT_DROPPED:
    21542185                    {
    2155                         m_pCurDnD->hgDrop();
     2186                        rc = m_pCurDnD->hgDrop();
    21562187                        break;
    21572188                    }
    21582189                    case DragAndDropSvc::HOST_DND_HG_SND_DATA:
    21592190                    {
    2160                         m_pCurDnD->hgDataReceived(e.hgcm.u.b.pvData, e.hgcm.u.b.cbData);
     2191                        rc = m_pCurDnD->hgDataReceived(e.hgcm.u.b.pvData, e.hgcm.u.b.cbData);
    21612192                        break;
    21622193                    }
     
    21642195                    {
    21652196#ifdef VBOX_WITH_DRAG_AND_DROP_GH
    2166                         m_pCurDnD->ghIsDnDPending();
     2197                        rc = m_pCurDnD->ghIsDnDPending();
    21672198#endif
    21682199                        break;
     
    21712202                    {
    21722203#ifdef VBOX_WITH_DRAG_AND_DROP_GH
    2173                         m_pCurDnD->ghDropped(e.hgcm.pszFormats,
    2174                                              e.hgcm.u.a.uDefAction);
     2204                        rc = m_pCurDnD->ghDropped(e.hgcm.pszFormats, e.hgcm.u.a.uDefAction);
    21752205#endif
    21762206                        break;
     
    21782208
    21792209                    default:
    2180                         LogFlowThisFunc(("Unknown message: %RU32\n", e.hgcm.uType));
     2210                        LogFlowThisFunc(("Unsupported message: %RU32\n", e.hgcm.uType));
     2211                        rc = VERR_NOT_SUPPORTED;
    21812212                        break;
    21822213                }
     2214
     2215                LogFlowFunc(("Returning %Rrc\n", rc));
    21832216
    21842217                /* Some messages require cleanup. */
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