summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp72
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.h7
2 files changed, 43 insertions, 36 deletions
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index e9ab902966..256967d25f 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -882,20 +882,8 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const QWindowsWindowData &data)
setFlag(OpenGL_ES2);
#endif
}
- if (aWindow->isTopLevel()) {
- switch (type) {
- case Qt::Window:
- case Qt::Dialog:
- case Qt::Sheet:
- case Qt::Drawer:
- case Qt::Popup:
- case Qt::Tool:
- registerDropSite();
- break;
- default:
- break;
- }
- }
+ updateDropSite();
+
#ifndef Q_OS_WINCE
if (QWindowsContext::instance()->systemInfo() & QWindowsContext::SI_SupportsTouch) {
if (QWindowsContext::user32dll.registerTouchWindow(m_data.hwnd, 0)) {
@@ -944,7 +932,7 @@ void QWindowsWindow::destroyWindow()
context->clearWindowUnderMouse();
if (hasMouseCapture())
setMouseGrabEnabled(false);
- unregisterDropSite();
+ setDropSiteEnabled(false);
#ifdef QT_OPENGL_ES_2
if (m_eglSurface) {
qCDebug(lcQpaGl) << __FUNCTION__ << "Freeing EGL surface " << m_eglSurface << window();
@@ -967,31 +955,44 @@ void QWindowsWindow::destroyWindow()
}
}
-void QWindowsWindow::registerDropSite()
+void QWindowsWindow::updateDropSite()
{
-#ifndef QT_NO_CLIPBOARD
-# ifndef QT_NO_DRAGANDDROP
- if (m_data.hwnd && !m_dropTarget) {
- m_dropTarget = new QWindowsOleDropTarget(window());
- RegisterDragDrop(m_data.hwnd, m_dropTarget);
- CoLockObjectExternal(m_dropTarget, true, true);
+ bool enabled = false;
+ if (window()->isTopLevel()) {
+ switch (window()->type()) {
+ case Qt::Window:
+ case Qt::Dialog:
+ case Qt::Sheet:
+ case Qt::Drawer:
+ case Qt::Popup:
+ case Qt::Tool:
+ enabled = true;
+ break;
+ default:
+ break;
+ }
}
-# endif // !QT_NO_DRAGANDDROP
-#endif // !QT_NO_CLIPBOARD
+ setDropSiteEnabled(enabled);
}
-void QWindowsWindow::unregisterDropSite()
+void QWindowsWindow::setDropSiteEnabled(bool dropEnabled)
{
-#ifndef QT_NO_CLIPBOARD
-# ifndef QT_NO_DRAGANDDROP
- if (m_data.hwnd && m_dropTarget) {
+ if (isDropSiteEnabled() == dropEnabled)
+ return;
+ qCDebug(lcQpaMime) << __FUNCTION__ << window() << dropEnabled;
+#if !defined(QT_NO_CLIPBOARD) && !defined(QT_NO_DRAGANDDROP)
+ if (dropEnabled) {
+ Q_ASSERT(m_data.hwnd);
+ m_dropTarget = new QWindowsOleDropTarget(window());
+ RegisterDragDrop(m_data.hwnd, m_dropTarget);
+ CoLockObjectExternal(m_dropTarget, true, true);
+ } else {
m_dropTarget->Release();
CoLockObjectExternal(m_dropTarget, false, true);
RevokeDragDrop(m_data.hwnd);
m_dropTarget = 0;
}
-# endif // !QT_NO_DRAGANDDROP
-#endif // !QT_NO_CLIPBOARD
+#endif // !QT_NO_CLIPBOARD && !QT_NO_DRAGANDDROP
}
// Returns topmost QWindowsWindow ancestor even if there are embedded windows in the chain.
@@ -1188,7 +1189,7 @@ void QWindowsWindow::setParent(const QPlatformWindow *newParent)
setParent_sys(newParent);
}
-void QWindowsWindow::setParent_sys(const QPlatformWindow *parent) const
+void QWindowsWindow::setParent_sys(const QPlatformWindow *parent)
{
// Use GetAncestor instead of GetParent, as GetParent can return owner window for toplevels
HWND oldParentHWND = GetAncestor(m_data.hwnd, GA_PARENT);
@@ -1217,8 +1218,11 @@ void QWindowsWindow::setParent_sys(const QPlatformWindow *parent) const
// WS_CHILD/WS_POPUP must be manually set/cleared in addition
// to dialog frames, etc (see SetParent() ) if the top level state changes.
// Force toplevel state as QWindow::isTopLevel cannot be relied upon here.
- if (wasTopLevel != isTopLevel)
+ if (wasTopLevel != isTopLevel) {
+ setDropSiteEnabled(false);
setWindowFlags_sys(window()->flags(), unsigned(isTopLevel ? WindowCreationData::ForceTopLevel : WindowCreationData::ForceChild));
+ updateDropSite();
+ }
}
}
@@ -1458,8 +1462,10 @@ void QWindowsWindow::setWindowFlags(Qt::WindowFlags flags)
const QRect oldGeometry = geometry();
if (m_data.flags != flags) {
m_data.flags = flags;
- if (m_data.hwnd)
+ if (m_data.hwnd) {
m_data = setWindowFlags_sys(flags);
+ updateDropSite();
+ }
}
// When switching to a frameless window, geometry
// may change without a WM_MOVE. Report change manually.
diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h
index 99c5761a65..1d515fd2fe 100644
--- a/src/plugins/platforms/windows/qwindowswindow.h
+++ b/src/plugins/platforms/windows/qwindowswindow.h
@@ -278,11 +278,12 @@ private:
inline QWindowsWindowData setWindowFlags_sys(Qt::WindowFlags wt, unsigned flags = 0) const;
inline bool isFullScreen_sys() const;
inline void setWindowState_sys(Qt::WindowState newState);
- inline void setParent_sys(const QPlatformWindow *parent) const;
+ inline void setParent_sys(const QPlatformWindow *parent);
inline void updateTransientParent() const;
void destroyWindow();
- void registerDropSite();
- void unregisterDropSite();
+ inline bool isDropSiteEnabled() const { return m_dropTarget != 0; }
+ void setDropSiteEnabled(bool enabled);
+ void updateDropSite();
void handleGeometryChange();
void handleWindowStateChange(Qt::WindowState state);
inline void destroyIcon();