diff --git a/src/gui/kernel/qplatformwindow_qpa.cpp b/src/gui/kernel/qplatformwindow_qpa.cpp index b36a2771f3..e07ed78615 100644 --- a/src/gui/kernel/qplatformwindow_qpa.cpp +++ b/src/gui/kernel/qplatformwindow_qpa.cpp @@ -310,6 +310,17 @@ bool QPlatformWindow::setMouseGrabEnabled(bool grab) return false; } +/*! + Reimplement to be able to let Qt indicate that the window has been + modified. Return true if the native window supports setting the modified + flag, false otherwise. +*/ +bool QPlatformWindow::setWindowModified(bool modified) +{ + Q_UNUSED(modified); + return false; +} + /*! Reimplement this method to be able to do any platform specific event handling. All events for window() are passed to this function before being diff --git a/src/gui/kernel/qplatformwindow_qpa.h b/src/gui/kernel/qplatformwindow_qpa.h index 31b14ca97d..aa4d7f5054 100644 --- a/src/gui/kernel/qplatformwindow_qpa.h +++ b/src/gui/kernel/qplatformwindow_qpa.h @@ -113,6 +113,8 @@ public: virtual bool setKeyboardGrabEnabled(bool grab); virtual bool setMouseGrabEnabled(bool grab); + virtual bool setWindowModified(bool modified); + virtual void windowEvent(QEvent *event); protected: diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 184422a04a..68cf72b0fb 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -117,6 +117,8 @@ public: void setCurrentContext(QCocoaGLContext *context); QCocoaGLContext *currentContext() const; + Q_DECL_OVERRIDE bool setWindowModified(bool modified); + protected: // NSWindow handling. The QCocoaWindow/QNSView can either be displayed // in an existing NSWindow or in one created by Qt. diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index af8f039d94..f3458c2540 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -503,3 +503,10 @@ QCocoaWindow *QCocoaWindow::parentCocoaWindow() const return 0; } +bool QCocoaWindow::setWindowModified(bool modified) +{ + if (!m_nsWindow) + return false; + [m_nsWindow setDocumentEdited:(modified?YES:NO)]; + return true; +} diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 662c9b7403..ddab66944e 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -10322,20 +10322,30 @@ void QWidget::setWindowModified(bool mod) Q_D(QWidget); setAttribute(Qt::WA_WindowModified, mod); -#ifndef Q_WS_MAC - if (!windowTitle().contains(QLatin1String("[*]")) && mod) - qWarning("QWidget::setWindowModified: The window title does not contain a '[*]' placeholder"); -#endif - d->setWindowTitle_helper(windowTitle()); - d->setWindowIconText_helper(windowIconText()); -#ifdef Q_WS_MAC - d->setWindowModified_sys(mod); -#endif + d->setWindowModified_helper(); QEvent e(QEvent::ModifiedChange); QApplication::sendEvent(this, &e); } +void QWidgetPrivate::setWindowModified_helper() +{ + Q_Q(QWidget); + QWindow *window = q->windowHandle(); + if (!window) + return; + QPlatformWindow *platformWindow = window->handle(); + if (!platformWindow) + return; + bool on = q->testAttribute(Qt::WA_WindowModified); + if (!platformWindow->setWindowModified(on)) { + if (!q->windowTitle().contains(QLatin1String("[*]")) && on) + qWarning("QWidget::setWindowModified: The window title does not contain a '[*]' placeholder"); + setWindowTitle_helper(q->windowTitle()); + setWindowIconText_helper(q->windowIconText()); + } +} + #ifndef QT_NO_TOOLTIP /*! \property QWidget::toolTip diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index d3fcdce6a8..d7c0ec75b0 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -466,6 +466,7 @@ public: void setWindowTitle_helper(const QString &cap); void setWindowFilePath_helper(const QString &filePath); + void setWindowModified_helper(); bool setMinimumSize_helper(int &minw, int &minh); bool setMaximumSize_helper(int &maxw, int &maxh); @@ -745,7 +746,6 @@ public: void update_sys(const QRect &rect); void update_sys(const QRegion &rgn); void setGeometry_sys_helper(int, int, int, int, bool); - void setWindowModified_sys(bool b); void updateMaximizeButton_sys(); void setWindowFilePath_sys(const QString &filePath); void createWindow_sys(); diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp index 4fe7ad6dc7..6b6dd12703 100644 --- a/src/widgets/kernel/qwidget_qpa.cpp +++ b/src/widgets/kernel/qwidget_qpa.cpp @@ -140,6 +140,7 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO q->setAttribute(Qt::WA_PaintOnScreen, true); } + setWindowModified_helper(); setWinId(win->winId()); // first check children. and create them if necessary