Changeset 50460 in vbox for trunk/src/VBox/Frontends/VirtualBox
- Timestamp:
- Feb 14, 2014 9:46:58 AM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 92295
- Location:
- trunk/src/VBox/Frontends/VirtualBox
- Files:
-
- 8 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
r50305 r50460 455 455 ifdef VBOX_WITH_DRAG_AND_DROP_GH 456 456 VirtualBox_QT_MOCHDRS += \ 457 src/runtime/UIDnDMIMEData.h 457 src/runtime/UIDnDMIMEData.h \ 458 src/runtime/UIDnDDrag.h 458 459 endif 459 460 endif … … 492 493 493 494 ifdef VBOX_WITH_DRAG_AND_DROP 495 VirtualBox_QT_MOCSRCS += \ 496 src/runtime/UIDnDHandler.cpp 494 497 ifdef VBOX_WITH_DRAG_AND_DROP_GH 495 498 VirtualBox_QT_MOCSRCS += \ 499 src/runtime/UIDnDDrag.cpp \ 496 500 src/runtime/UIDnDMIMEData.cpp 497 501 endif … … 781 785 ifdef VBOX_WITH_DRAG_AND_DROP_GH 782 786 VirtualBox_SOURCES += \ 783 src/runtime/UIDnDMIMEData.cpp 784 VirtualBox_QT_MOCSRCS += \ 785 src/runtime/UIDnDMIMEData.cpp 787 src/runtime/UIDnDMIMEData.cpp \ 788 src/runtime/UIDnDDrag.cpp 789 VirtualBox_SOURCES.win += \ 790 src/runtime/UIDnDDropSource_win.cpp \ 791 src/runtime/UIDnDDataObject_win.cpp \ 792 src/runtime/UIDnDEnumFormat_win.cpp 786 793 endif 787 794 endif -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDHandler.cpp
r50306 r50460 34 34 #include "UIDnDHandler.h" 35 35 #ifdef VBOX_WITH_DRAG_AND_DROP_GH 36 # include "UIDnD MIMEData.h"36 # include "UIDnDDrag.h" 37 37 #endif 38 38 #include "UIMessageCenter.h" … … 46 46 47 47 UIDnDHandler::UIDnDHandler(void) 48 #ifdef VBOX_WITH_DRAG_AND_DROP_GH 49 : pMData(NULL) 50 #endif 48 : mMode(Unknown) 51 49 { 52 50 } … … 60 58 const QMimeData *pMimeData, QWidget * /* pParent = NULL */) 61 59 { 60 if (mMode == GH) /* Wrong mode? Bail out. */ 61 return Qt::IgnoreAction; 62 62 63 LogFlowFunc(("screenId=%RU32, x=%d, y=%d, action=%ld\n", 63 64 screenId, x, y, toVBoxDnDAction(proposedAction))); … … 78 79 const QMimeData *pMimeData, QWidget * /* pParent = NULL */) 79 80 { 81 if (mMode == GH) /* Wrong mode? Bail out. */ 82 return Qt::IgnoreAction; 83 80 84 #ifdef DEBUG_andy 81 85 LogFlowFunc(("screenId=%RU32, x=%d, y=%d, action=%ld\n", … … 99 103 const QMimeData *pMimeData, QWidget *pParent /* = NULL */) 100 104 { 105 if (mMode == GH) /* Wrong mode? Bail out. */ 106 return Qt::IgnoreAction; 107 101 108 LogFlowFunc(("screenId=%RU32, x=%d, y=%d, action=%ld\n", 102 109 screenId, x, y, toVBoxDnDAction(proposedAction))); … … 114 121 if (result != KDragAndDropAction_Ignore) 115 122 { 116 /* Get the actual ly data*/123 /* Get the actual MIME data in the requested format. */ 117 124 const QByteArray &d = pMimeData->data(format); 118 125 if ( !d.isEmpty() 119 126 && !format.isEmpty()) 120 127 { 121 /* We need the data in the vector format. */ 128 /* Convert the actual MIME data to a vector (needed 129 * for the COM wrapper). */ 122 130 QVector<uint8_t> dv(d.size()); 123 131 memcpy(dv.data(), d.constData(), d.size()); … … 126 134 if (guest.isOk()) 127 135 { 128 msgCenter().showModalProgressDialog(progress, tr("Dropping data ..."), ":/progress_dnd_hg_90px.png", pParent); 129 if (!progress.GetCanceled() && (!progress.isOk() || progress.GetResultCode() != 0)) 136 msgCenter().showModalProgressDialog(progress, 137 tr("Dropping data ..."), ":/progress_dnd_hg_90px.png", 138 pParent); 139 if ( !progress.GetCanceled() 140 && ( !progress.isOk() 141 || progress.GetResultCode() != 0)) 130 142 { 131 143 msgCenter().cannotDropData(progress, pParent); … … 146 158 void UIDnDHandler::dragHGLeave(CGuest &guest, ulong screenId, QWidget * /* pParent = NULL */) 147 159 { 160 if (mMode == GH) /* Wrong mode? Bail out. */ 161 return; 162 148 163 LogFlowFunc(("screenId=%RU32\n", screenId)); 149 164 guest.DragHGLeave(screenId); … … 154 169 int rc; 155 170 #ifdef VBOX_WITH_DRAG_AND_DROP_GH 171 if (mMode == HG) /* Wrong mode? Bail out. */ 172 return VERR_WRONG_ORDER; 173 156 174 /* 157 175 * How this works: Host is asking the guest if there is any DnD … … 169 187 LogFlowFunc(("defaultAction=%d, numFormats=%d\n", defaultAction, vecFmtGuest.size())); 170 188 171 /*172 * Do guest -> host format conversion, if needed.173 * On X11 this already maps to the Xdnd protocol.174 ** @todo What about the MacOS Carbon Drag Manager? Needs testing.175 *176 * See: https://www.iana.org/assignments/media-types/media-types.xhtml177 */178 LogFlowFunc(("Number of guest formats: %d\n", vecFmtGuest.size()));179 189 QStringList lstFmtNative; 180 for (int i = 0; i < vecFmtGuest.size(); i++)190 if (defaultAction != KDragAndDropAction_Ignore) 181 191 { 182 const QString &strFmtGuest = vecFmtGuest.at(i); 183 LogFlowFunc(("\tFormat %d: %s\n", i, 184 strFmtGuest.toAscii().constData())); 192 /* 193 * Do guest -> host format conversion, if needed. 194 * On X11 this already maps to the Xdnd protocol. 195 ** @todo What about the MacOS Carbon Drag Manager? Needs testing. 196 * 197 * See: https://www.iana.org/assignments/media-types/media-types.xhtml 198 */ 199 LogFlowFunc(("Number of guest formats: %d\n", vecFmtGuest.size())); 200 for (int i = 0; i < vecFmtGuest.size(); i++) 201 { 202 const QString &strFmtGuest = vecFmtGuest.at(i); 203 LogFlowFunc(("\tFormat %d: %s\n", i, 204 strFmtGuest.toAscii().constData())); 185 205 # ifdef RT_OS_WINDOWS 186 /* CF_TEXT */187 if ( strFmtGuest.contains("text/plain", Qt::CaseInsensitive)188 && !lstFmtNative.contains("text/plain"))189 {190 lstFmtNative << "text/plain";191 }192 /* CF_HDROP */193 else if ( strFmtGuest.contains("text/uri-list", Qt::CaseInsensitive)194 && !lstFmtNative.contains("text/uri-list"))195 {196 lstFmtNative << "text/uri-list";197 }206 /* CF_TEXT */ 207 if ( strFmtGuest.contains("text/plain", Qt::CaseInsensitive) 208 && !lstFmtNative.contains("text/plain")) 209 { 210 lstFmtNative << "text/plain"; 211 } 212 /* CF_HDROP */ 213 else if ( strFmtGuest.contains("text/uri-list", Qt::CaseInsensitive) 214 && !lstFmtNative.contains("text/uri-list")) 215 { 216 lstFmtNative << "text/uri-list"; 217 } 198 218 # else 199 /* On non-Windows just do a 1:1 mapping. */200 lstFmtNative << strFmtGuest;219 /* On non-Windows just do a 1:1 mapping. */ 220 lstFmtNative << strFmtGuest; 201 221 # ifdef RT_OS_MACOS 202 /** @todo Does the mapping apply here? Don't think so ... */222 /** @todo Does the mapping apply here? Don't think so ... */ 203 223 # endif 204 224 # endif /* !RT_OS_WINDOWS */ 225 } 226 227 LogFlowFunc(("Number of native formats: %d\n", lstFmtNative.size())); 228 # ifdef DEBUG 229 for (int i = 0; i < lstFmtNative.size(); i++) 230 LogFlowFunc(("\tFormat %d: %s\n", i, lstFmtNative.at(i).toAscii().constData())); 231 # endif 205 232 } 206 233 207 LogFlowFunc(("Number of native formats: %d\n", lstFmtNative.size())); 208 # ifdef DEBUG 209 for (int i = 0; i < lstFmtNative.size(); i++) 210 LogFlowFunc(("\tFormat %d: %s\n", i, lstFmtNative.at(i).toAscii().constData())); 211 # endif 212 213 if ( defaultAction != KDragAndDropAction_Ignore 214 && !lstFmtNative.isEmpty()) 234 if (!lstFmtNative.isEmpty()) 215 235 { 216 236 try 217 237 { 218 QDrag *pDrag = new QDrag(pParent); 219 220 /* pMData is transfered to the QDrag object, so no need for deletion. */ 221 pMData = new UIDnDMimeData(session, lstFmtNative, 222 toQtDnDAction(defaultAction), 223 toQtDnDActions(vecActions), pParent); 224 225 /* Inform this object that MIME data from the guest is available so that 226 * it can update the MIME data object accordingly. */ 227 connect(pMData, SIGNAL(sigDataAvailable(QString)), 228 this, SLOT(sltDataAvailable(QString)), Qt::DirectConnection); 229 230 /* Inform the MIME data object of any changes in the current action. */ 231 connect(pDrag, SIGNAL(actionChanged(Qt::DropAction)), 232 pMData, SLOT(sltDropActionChanged(Qt::DropAction))); 233 234 /* Fire it up. 235 * 236 * On Windows this will start a modal operation using OLE's 237 * DoDragDrop() method, so this call will block until the DnD operation 238 * is finished. */ 239 pDrag->setMimeData(pMData); 240 Qt::DropAction dropAction = 241 pDrag->exec(toQtDnDActions(vecActions), toQtDnDAction(defaultAction)); 242 LogFlowFunc(("dropAction=%ld\n", toVBoxDnDAction(dropAction))); 243 # ifdef RT_OS_WINDOWS 244 /* Since the QDrag::exec() call above was blocking on Windows, decide what 245 * to do now, e.g. if there was a "drop" action. 246 * 247 * Note: The UIDnDMimeData object will not be not accessible here anymore, 248 * since QDrag had its ownership and deleted it after the (blocking) 249 * QDrag::exec() call. */ 250 # endif 251 rc = VINF_SUCCESS; 238 UIDnDDrag *pDrag = new UIDnDDrag(session, lstFmtNative, 239 toQtDnDAction(defaultAction), 240 toQtDnDActions(vecActions), pParent); 241 rc = pDrag->DoDragDrop(); 242 243 delete pDrag; 252 244 } 253 245 catch (std::bad_alloc) … … 258 250 else 259 251 rc = VINF_SUCCESS; 260 #else 252 #else /* !VBOX_WITH_DRAG_AND_DROP_GH */ 261 253 NOREF(session); 262 254 NOREF(screenId); … … 274 266 */ 275 267 268 /* static */ 276 269 KDragAndDropAction UIDnDHandler::toVBoxDnDAction(Qt::DropAction action) 277 270 { … … 286 279 } 287 280 281 /* static */ 288 282 QVector<KDragAndDropAction> UIDnDHandler::toVBoxDnDActions(Qt::DropActions actions) 289 283 { … … 301 295 } 302 296 297 /* static */ 303 298 Qt::DropAction UIDnDHandler::toQtDnDAction(KDragAndDropAction action) 304 299 { … … 315 310 } 316 311 312 /* static */ 317 313 Qt::DropActions UIDnDHandler::toQtDnDActions(const QVector<KDragAndDropAction> &vecActions) 318 314 { … … 343 339 } 344 340 345 void UIDnDHandler::sltDataAvailable(const QString &mimeType)346 {347 #ifdef VBOX_WITH_DRAG_AND_DROP_GH348 LogFlowFunc(("pMData=0x%p, mimeType=%s\n",349 pMData, mimeType.toAscii().constData()));350 351 if (pMData)352 pMData->setData(mimeType);353 #endif354 }355 356 341 #include "UIDnDHandler.moc" 357 342 -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDHandler.h
r50306 r50460 35 35 36 36 public: 37 37 38 /* Singleton factory. */ 38 39 static UIDnDHandler* instance(void) … … 42 43 return m_pInstance; 43 44 } 45 44 46 static void destroy(void) 45 47 { … … 50 52 } 51 53 } 54 55 /** 56 * Current operation mode. 57 */ 58 enum Mode 59 { 60 /** Unknown mode. */ 61 Unknown = 0, 62 /** Host to guest. */ 63 HG, 64 /** Guest to host. */ 65 GH 66 }; 52 67 53 68 /* Host -> Guest. */ … … 60 75 int dragGHPending(CSession &session, ulong screenId, QWidget *pParent = NULL); 61 76 62 public slots:77 public: 63 78 64 void sltDataAvailable(const QString &mimetype); 79 static KDragAndDropAction toVBoxDnDAction(Qt::DropAction action); 80 static QVector<KDragAndDropAction> toVBoxDnDActions(Qt::DropActions actions); 81 static Qt::DropAction toQtDnDAction(KDragAndDropAction action); 82 static Qt::DropActions toQtDnDActions(const QVector<KDragAndDropAction> &vecActions); 65 83 66 84 private: … … 70 88 virtual ~UIDnDHandler(void) {} 71 89 72 /* Private helpers. */ 73 static KDragAndDropAction toVBoxDnDAction(Qt::DropAction action); 74 static QVector<KDragAndDropAction> toVBoxDnDActions(Qt::DropActions actions); 75 static Qt::DropAction toQtDnDAction(KDragAndDropAction action); 76 static Qt::DropActions toQtDnDActions(const QVector<KDragAndDropAction> &vecActions); 77 78 #ifdef VBOX_WITH_DRAG_AND_DROP_GH 79 UIDnDMimeData *pMData; 80 friend class UIDnDMimeData; 81 #endif 90 /** The current operation mode. */ 91 Mode mMode; 82 92 }; 83 93 -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDMIMEData.cpp
r50305 r50460 20 20 /* Qt includes: */ 21 21 #include <QApplication> 22 #include <QFileInfo> 22 23 #include <QKeyEvent> 23 24 #include <QMimeData> … … 34 35 /* GUI includes: */ 35 36 #include "UIDnDMIMEData.h" 37 #include "UIDnDDrag.h" 36 38 #include "UIMessageCenter.h" 37 39 38 40 UIDnDMimeData::UIDnDMimeData(CSession &session, QStringList formats, 39 41 Qt::DropAction defAction, Qt::DropActions actions, 40 QWidget*pParent)42 UIDnDDrag *pParent) 41 43 : m_pParent(pParent) 42 44 , m_session(session) … … 96 98 } 97 99 98 bool UIDnDMimeData::hasFormat(const QString & mimeType) const99 { 100 bool fRc = m_lstFormats.contains( mimeType);100 bool UIDnDMimeData::hasFormat(const QString &strMIMEType) const 101 { 102 bool fRc = m_lstFormats.contains(strMIMEType); 101 103 LogFlowFunc(("%s: %RTbool (QtMimeData: %RTbool)\n", 102 mimeType.toStdString().c_str(),103 fRc, QMimeData::hasFormat( mimeType)));104 strMIMEType.toStdString().c_str(), 105 fRc, QMimeData::hasFormat(strMIMEType))); 104 106 return fRc; 105 107 } 106 108 107 QVariant UIDnDMimeData::retrieveData(const QString & mimeType,109 QVariant UIDnDMimeData::retrieveData(const QString &strMIMEType, 108 110 QVariant::Type type) const 109 111 { 110 112 LogFlowFunc(("m_enmState=%d, mimeType=%s, type=%d (%s)\n", 111 m_enmState, mimeType.toStdString().c_str(),113 m_enmState, strMIMEType.toStdString().c_str(), 112 114 type, QVariant::typeToName(type))); 113 115 114 116 bool fCanDrop = true; 115 117 116 #if 0117 118 #ifdef RT_OS_WINDOWS 118 Qt::MouseButtons mouseBtns = Qt::NoButton; 119 bool fLeftBtnDown = RT_BOOL(GetAsyncKeyState(VK_LBUTTON) & 0x8000); 120 if (fLeftBtnDown) 121 mouseBtns |= Qt::LeftButton; 122 # ifdef DEBUG_andy 123 LogFlowFunc(("mouseButtons=0x%x, GetAsyncKeyState(VK_LBUTTON)=%RTbool\n", 124 mouseBtns, fLeftBtnDown)); 125 # endif 126 if (mouseBtns == Qt::NoButton) 127 m_enmState = Dropped; 128 #endif 129 #endif 130 131 #ifdef RT_OS_WINDOWS 132 /* On Windows we only will get into this function if OLE's DoDragDrop 133 * routine (called by QtDrag) decides that a drop event just happened. 134 * So just update our internal state to reflect the same as on other 135 * platforms. */ 119 /* On Windows this function will be called several times by Qt's 120 * OLE-specific internals to figure out which data formats we have 121 * to offer. So just assume we can drop data here for a start.* */ 136 122 fCanDrop = true; 137 123 #else 138 /* Mouse button released? See eventFilter for more information. */ 124 /* On non-Windows our state gets updated via an own event filter 125 * (see UIDnDMimeData::eventFilter). This filter will update the current 126 * operation state for us (based on the mouse buttons). */ 139 127 if (m_enmState != Dropped) 140 128 fCanDrop = false; … … 143 131 /* Do we support the requested MIME type? */ 144 132 if ( fCanDrop 145 && !m_lstFormats.contains( mimeType))133 && !m_lstFormats.contains(strMIMEType)) 146 134 { 147 135 LogFlowFunc(("Unsupported MIME type=%s\n", 148 mimeType.toStdString().c_str()));136 strMIMEType.toStdString().c_str())); 149 137 fCanDrop = false; 150 138 } … … 169 157 LogFlowFunc(("Skipping request, m_enmState=%d ...\n", 170 158 m_enmState)); 171 return QMimeData::retrieveData(mimeType, type); 172 } 173 174 if (m_enmState == Dragging) 175 { 176 int rc = VINF_SUCCESS; 177 178 CGuest guest = m_session.GetConsole().GetGuest(); 179 /* Start getting the data from the guest. First inform the guest we 180 * want the data in the specified MIME type. */ 181 CProgress progress = guest.DragGHDropped(mimeType, 182 UIDnDHandler::toVBoxDnDAction(m_defAction)); 183 if (guest.isOk()) 184 { 185 msgCenter().showModalProgressDialog(progress, 186 tr("Retrieving data ..."), ":/progress_dnd_gh_90px.png", 187 m_pParent); 188 if (!progress.GetCanceled()) 189 { 190 if ( progress.isOk() 191 && progress.GetResultCode() == 0) 192 { 193 /** @todo What about retrieving bigger files? Loop? */ 194 195 /* After the data successfully arrived from the guest, we query it from Main. */ 196 QVector<uint8_t> data = guest.DragGHGetData(); 197 if (!data.isEmpty()) 198 { 199 switch (type) 200 { 201 case QVariant::String: 202 { 203 m_data = QVariant(QString(reinterpret_cast<const char*>(data.data()))); 204 break; 205 } 206 207 case QVariant::ByteArray: 208 { 209 QByteArray ba(reinterpret_cast<const char*>(data.constData()), data.size()); 210 m_data = QVariant(ba); 211 break; 212 } 213 214 case QVariant::List: 215 { 216 QString strData = QString(reinterpret_cast<const char*>(data.data())); 217 QStringList lstString = strData.split("\r\n", QString::SkipEmptyParts); 218 219 m_data = QVariant(lstString); 220 break; 221 } 222 223 default: 224 AssertMsgFailed(("Should never happen, d'oh!\n")); 225 rc = VERR_NOT_SUPPORTED; 226 break; 227 } 228 } 229 /** @todo How often to retry on empty data received? */ 230 231 if (RT_SUCCESS(rc)) 232 emit sigDataAvailable(mimeType); 233 234 m_enmState = DataRetrieved; 235 } 236 else 237 msgCenter().cannotDropData(progress, m_pParent); 238 } 239 else 240 m_enmState = Canceled; 159 return QMimeData::retrieveData(strMIMEType, type); 160 } 161 162 int rc = VINF_SUCCESS; 163 if (m_enmState == Dropped) 164 { 165 AssertPtr(m_pParent); 166 rc = m_pParent->RetrieveData(strMIMEType, type, m_data); 167 if (RT_SUCCESS(rc)) 168 { 169 /* Tell ourselves that data became available. */ 170 emit sigDataAvailable(strMIMEType); 241 171 } 242 172 else 243 msgCenter().cannotDropData(guest, m_pParent); 244 } 245 246 //return QMimeData::retrieveData(mimeType, type); 247 return m_data; 173 { 174 m_enmState = Canceled; 175 } 176 } 177 178 LogFlowFunc(("Returning rc=%Rrc, m_enmState=%ld\n", 179 rc, m_enmState)); 180 return QMimeData::retrieveData(strMIMEType, type); 248 181 } 249 182 … … 327 260 for (int i = 0; i < lstData.size(); i++) 328 261 { 329 QString strURL = lstData.at(i).toString(); 330 LogFlowFunc(("\tURL: %s\n", 331 strURL.toAscii().constData())); 332 lstURL << QUrl(strURL.toAscii()); 262 QFileInfo fileInfo(lstData.at(i).toString()); 263 #ifdef DEBUG 264 LogFlowFunc(("\tURL: %s (fExists=%RTbool, fIsDir=%RTbool, cb=%RU64)\n", 265 fileInfo.absoluteFilePath().constData(), fileInfo.exists(), 266 fileInfo.isDir(), fileInfo.size())); 267 #endif 268 lstURL << QUrl::fromLocalFile(fileInfo.absoluteFilePath()); 333 269 } 334 270 LogFlowFunc(("Number of URLs: %d\n", lstURL.size())); 335 271 336 QMimeData::setUrls(f); 272 if (RT_SUCCESS(rc)) 273 QMimeData::setUrls(lstURL); 337 274 break; 338 275 } -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDMIMEData.h
r50305 r50460 32 32 #include "UIDnDHandler.h" 33 33 34 /* Forward declarations: */ 35 class UIDnDDrag; 36 34 37 /** @todo Subclass QWindowsMime / QMacPasteboardMime 35 38 * to register own/more MIME types. */ … … 45 48 enum State 46 49 { 50 /** Host is in dragging state, without 51 * having retrieved the metadata from the guest yet. */ 47 52 Dragging = 0, 48 DataRetrieved, 53 /** Guest sent over the (MIME) metadata so that the 54 * host knows which DnD targets can be used. */ 55 MetaDataRetrieved, 56 /** There has been a "dropped" action which indicates 57 * that the guest can continue sending more data (if any) 58 * over to the host, based on the (MIME) metadata. */ 49 59 Dropped, 60 /** The operation has been canceled. */ 50 61 Canceled 51 62 }; … … 55 66 UIDnDMimeData(CSession &session, QStringList formats, 56 67 Qt::DropAction defAction, 57 Qt::DropActions actions, QWidget*pParent);68 Qt::DropActions actions, UIDnDDrag *pParent); 58 69 59 70 int setData(const QString &mimeType); … … 89 100 private: 90 101 91 /* Private members. */ 92 QWidget *m_pParent; 102 UIDnDDrag *m_pParent; 93 103 CSession m_session; 94 104 QStringList m_lstFormats; -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
r50265 r50460 1092 1092 1093 1093 #ifdef VBOX_WITH_DRAG_AND_DROP 1094 1095 1094 void UIMachineView::dragEnterEvent(QDragEnterEvent *pEvent) 1096 1095 { … … 1178 1177 gDnD->dragGHPending(session(), screenId(), this); 1179 1178 } 1180 1181 1179 #endif /* VBOX_WITH_DRAG_AND_DROP */ 1182 1180
Note:
See TracChangeset
for help on using the changeset viewer.