summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohan Klokkhammer Helsing <johan.helsing@qt.io>2018-08-27 09:25:50 +0200
committerJohan Helsing <johan.helsing@qt.io>2018-08-28 07:00:44 +0000
commitaa341afd9b428f5ad2d0bc1c16d9cda64a4b04fb (patch)
treef56fc2155695d440c532cdb71d90d0798bd0162b /src
parentde4f9ebea3207e5d7e87390b512f9ae8bb7636cc (diff)
downloadqtwayland-aa341afd9b428f5ad2d0bc1c16d9cda64a4b04fb.tar.gz
Client: Fix regression; drawing decorations of active windows as inactive
We can't trust QWindow::isActive, because it relies on focusWindow, which may be updated too late, and there might also be multiple active toplevel windows at once on Wayland. Even though Qt doesn't support multiple seats, we should still draw the decorations of active windows correctly. This implements QPlatformWindow::isActive and uses it in the decorations. Change-Id: I34d79b354e2d26694533e2319a26f24085212243 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/client/qwaylanddisplay.cpp5
-rw-r--r--src/client/qwaylanddisplay_p.h1
-rw-r--r--src/client/qwaylandwindow.cpp5
-rw-r--r--src/client/qwaylandwindow_p.h1
-rw-r--r--src/plugins/decorations/bradient/main.cpp5
5 files changed, 15 insertions, 2 deletions
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
index 5e67cd3a..c57dc13a 100644
--- a/src/client/qwaylanddisplay.cpp
+++ b/src/client/qwaylanddisplay.cpp
@@ -413,6 +413,11 @@ void QWaylandDisplay::setLastInputDevice(QWaylandInputDevice *device, uint32_t s
mLastInputWindow = win;
}
+bool QWaylandDisplay::isWindowActivated(const QWaylandWindow *window)
+{
+ return mActiveWindows.contains(const_cast<QWaylandWindow *>(window));
+}
+
void QWaylandDisplay::handleWindowActivated(QWaylandWindow *window)
{
if (mActiveWindows.contains(window))
diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
index 8839bbe4..71a39dd9 100644
--- a/src/client/qwaylanddisplay_p.h
+++ b/src/client/qwaylanddisplay_p.h
@@ -176,6 +176,7 @@ public:
QWaylandWindow *lastInputWindow() const;
void setLastInputDevice(QWaylandInputDevice *device, uint32_t serial, QWaylandWindow *window);
+ bool isWindowActivated(const QWaylandWindow *window);
void handleWindowActivated(QWaylandWindow *window);
void handleWindowDeactivated(QWaylandWindow *window);
void handleKeyboardFocusChanged(QWaylandInputDevice *inputDevice);
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 76039091..e58e8722 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -943,6 +943,11 @@ bool QWaylandWindow::isExposed() const
return QPlatformWindow::isExposed();
}
+bool QWaylandWindow::isActive() const
+{
+ return mDisplay->isWindowActivated(this);
+}
+
int QWaylandWindow::scale() const
{
return mScale;
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index b6b499a3..d11ed871 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -146,6 +146,7 @@ public:
void requestActivateWindow() override;
bool isExposed() const override;
+ bool isActive() const override;
void unfocus();
QWaylandAbstractDecoration *decoration() const;
diff --git a/src/plugins/decorations/bradient/main.cpp b/src/plugins/decorations/bradient/main.cpp
index 1df3ac62..3fa72344 100644
--- a/src/plugins/decorations/bradient/main.cpp
+++ b/src/plugins/decorations/bradient/main.cpp
@@ -132,6 +132,7 @@ QMargins QWaylandBradientDecoration::margins() const
void QWaylandBradientDecoration::paint(QPaintDevice *device)
{
+ bool active = window()->handle()->isActive();
QRect surfaceRect(QPoint(), window()->frameGeometry().size());
QRect clips[] =
{
@@ -183,7 +184,7 @@ void QWaylandBradientDecoration::paint(QPaintDevice *device)
p.save();
p.setClipRect(titleBar);
- p.setPen(window()->isActive() ? m_foregroundColor : m_foregroundInactiveColor);
+ p.setPen(active ? m_foregroundColor : m_foregroundInactiveColor);
QSizeF size = m_windowTitle.size();
int dx = (top.width() - size.width()) /2;
int dy = (top.height()- size.height()) /2;
@@ -199,7 +200,7 @@ void QWaylandBradientDecoration::paint(QPaintDevice *device)
QRectF rect;
// Default pen
- QPen pen(window()->isActive() ? m_foregroundColor : m_foregroundInactiveColor);
+ QPen pen(active ? m_foregroundColor : m_foregroundInactiveColor);
p.setPen(pen);
// Close button