summaryrefslogtreecommitdiffstats
path: root/src/compositor/extensions/qwaylandxdgshellv6integration.cpp
diff options
context:
space:
mode:
authorMatt Hoosier <matt.hoosier@garmin.com>2018-06-12 10:54:55 -0500
committerMatt Hoosier <matt.hoosier@garmin.com>2018-06-17 01:39:02 +0000
commit254b1428724f3e79248b906ad4cba810c0d37572 (patch)
treec6907bf1648d0c1058a52fd35a4d9dfd8fa35c5e /src/compositor/extensions/qwaylandxdgshellv6integration.cpp
parentf423482a6e619a10754111254d7b4598e2d1e37c (diff)
Compositor: implement fullscreen for XdgShellV6
This is patterned closely after the existing handling for maximization. [ChangeLog][Compositor] Added support for handling xdg-shell v6 requests to enter/exit fullscreen mode. Change-Id: I1f3127694d8537d76159b56350f35a4e8aa3e56d Reviewed-by: Johan Helsing <johan.helsing@qt.io>
Diffstat (limited to 'src/compositor/extensions/qwaylandxdgshellv6integration.cpp')
-rw-r--r--src/compositor/extensions/qwaylandxdgshellv6integration.cpp49
1 files changed, 45 insertions, 4 deletions
diff --git a/src/compositor/extensions/qwaylandxdgshellv6integration.cpp b/src/compositor/extensions/qwaylandxdgshellv6integration.cpp
index 68230937f..769b426c9 100644
--- a/src/compositor/extensions/qwaylandxdgshellv6integration.cpp
+++ b/src/compositor/extensions/qwaylandxdgshellv6integration.cpp
@@ -66,6 +66,9 @@ XdgToplevelV6Integration::XdgToplevelV6Integration(QWaylandQuickShellSurfaceItem
connect(m_toplevel, &QWaylandXdgToplevelV6::setMaximized, this, &XdgToplevelV6Integration::handleSetMaximized);
connect(m_toplevel, &QWaylandXdgToplevelV6::unsetMaximized, this, &XdgToplevelV6Integration::handleUnsetMaximized);
connect(m_toplevel, &QWaylandXdgToplevelV6::maximizedChanged, this, &XdgToplevelV6Integration::handleMaximizedChanged);
+ connect(m_toplevel, &QWaylandXdgToplevelV6::setFullscreen, this, &XdgToplevelV6Integration::handleSetFullscreen);
+ connect(m_toplevel, &QWaylandXdgToplevelV6::unsetFullscreen, this, &XdgToplevelV6Integration::handleUnsetFullscreen);
+ connect(m_toplevel, &QWaylandXdgToplevelV6::fullscreenChanged, this, &XdgToplevelV6Integration::handleFullscreenChanged);
connect(m_toplevel, &QWaylandXdgToplevelV6::activatedChanged, this, &XdgToplevelV6Integration::handleActivatedChanged);
connect(m_xdgSurface->shell(), &QWaylandXdgShellV6::popupCreated, this, [item](QWaylandXdgPopupV6 *popup, QWaylandXdgSurfaceV6 *){
handlePopupCreated(item, popup);
@@ -135,8 +138,12 @@ void XdgToplevelV6Integration::handleSetMaximized()
if (!m_item->view()->isPrimary())
return;
- maximizeState.initialWindowSize = m_xdgSurface->windowGeometry().size();
- maximizeState.initialPosition = m_item->moveItem()->position();
+ QVector<QWaylandXdgToplevelV6::State> states = m_toplevel->states();
+
+ if (!states.contains(QWaylandXdgToplevelV6::State::FullscreenState) && !states.contains(QWaylandXdgToplevelV6::State::MaximizedState)) {
+ windowedGeometry.initialWindowSize = m_xdgSurface->windowGeometry().size();
+ windowedGeometry.initialPosition = m_item->moveItem()->position();
+ }
QWaylandOutput *output = m_item->view()->output();
m_toplevel->sendMaximized(output->availableGeometry().size() / output->scaleFactor());
@@ -147,7 +154,7 @@ void XdgToplevelV6Integration::handleUnsetMaximized()
if (!m_item->view()->isPrimary())
return;
- m_toplevel->sendUnmaximized(maximizeState.initialWindowSize);
+ m_toplevel->sendUnmaximized(windowedGeometry.initialWindowSize);
}
void XdgToplevelV6Integration::handleMaximizedChanged()
@@ -156,7 +163,41 @@ void XdgToplevelV6Integration::handleMaximizedChanged()
QWaylandOutput *output = m_item->view()->output();
m_item->moveItem()->setPosition(output->position() + output->availableGeometry().topLeft());
} else {
- m_item->moveItem()->setPosition(maximizeState.initialPosition);
+ m_item->moveItem()->setPosition(windowedGeometry.initialPosition);
+ }
+}
+
+void XdgToplevelV6Integration::handleSetFullscreen()
+{
+ if (!m_item->view()->isPrimary())
+ return;
+
+ QVector<QWaylandXdgToplevelV6::State> states = m_toplevel->states();
+
+ if (!states.contains(QWaylandXdgToplevelV6::State::FullscreenState) && !states.contains(QWaylandXdgToplevelV6::State::MaximizedState)) {
+ windowedGeometry.initialWindowSize = m_xdgSurface->windowGeometry().size();
+ windowedGeometry.initialPosition = m_item->moveItem()->position();
+ }
+
+ QWaylandOutput *output = m_item->view()->output();
+ m_toplevel->sendFullscreen(output->geometry().size() / output->scaleFactor());
+}
+
+void XdgToplevelV6Integration::handleUnsetFullscreen()
+{
+ if (!m_item->view()->isPrimary())
+ return;
+
+ m_toplevel->sendUnmaximized(windowedGeometry.initialWindowSize);
+}
+
+void XdgToplevelV6Integration::handleFullscreenChanged()
+{
+ if (m_toplevel->fullscreen()) {
+ QWaylandOutput *output = m_item->view()->output();
+ m_item->moveItem()->setPosition(output->position() + output->geometry().topLeft());
+ } else {
+ m_item->moveItem()->setPosition(windowedGeometry.initialPosition);
}
}