summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qplatformwindow_qpa.cpp11
-rw-r--r--src/gui/kernel/qplatformwindow_qpa.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm7
-rw-r--r--src/widgets/kernel/qwidget.cpp28
-rw-r--r--src/widgets/kernel/qwidget_p.h2
-rw-r--r--src/widgets/kernel/qwidget_qpa.cpp1
7 files changed, 43 insertions, 10 deletions
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
@@ -311,6 +311,17 @@ bool QPlatformWindow::setMouseGrabEnabled(bool grab)
}
/*!
+ 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
sent to QWindow::event().
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