Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[lipstick] Allow a surface to change category by creating new views. …
…Contributes to JB#37807

If the category of a surface changes and it is raised create a new
window and raise that instead before lowering the old window. This
allows a surface to move to different layer in a mostly coherent
fashion.
  • Loading branch information
adenexter committed Mar 4, 2020
1 parent b585668 commit a9f17b6
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 16 deletions.
68 changes: 52 additions & 16 deletions src/compositor/lipstickcompositor.cpp
Expand Up @@ -375,8 +375,7 @@ void LipstickCompositor::setTopmostWindowId(int id)

QWaylandSurfaceView *LipstickCompositor::createView(QWaylandSurface *surface)
{
QVariantMap properties = surface->windowProperties();
QString category = properties.value("CATEGORY").toString();
const QString category = surface->windowProperties().value("CATEGORY").toString();

int id = m_nextWindowId++;
LipstickCompositorWindow *item = new LipstickCompositorWindow(id, category, static_cast<QWaylandQuickSurface *>(surface));
Expand All @@ -388,18 +387,27 @@ QWaylandSurfaceView *LipstickCompositor::createView(QWaylandSurface *surface)

static LipstickCompositorWindow *surfaceWindow(QWaylandSurface *surface)
{
return surface->views().isEmpty() ? 0 : static_cast<LipstickCompositorWindow *>(surface->views().first());
const QString category = surface->windowProperties().value("CATEGORY").toString();

foreach (QWaylandSurfaceView *view, surface->views()) {
LipstickCompositorWindow * const window = static_cast<LipstickCompositorWindow *>(view);

if (window->category() == category)
return window;
}

return 0;
}

void LipstickCompositor::onSurfaceDying()
{
QWaylandSurface *surface = static_cast<QWaylandSurface *>(sender());
LipstickCompositorWindow *item = surfaceWindow(surface);

if (surface == m_fullscreenSurface)
setFullscreenSurface(0);

if (item) {
foreach (QWaylandSurfaceView *view, surface->views()) {
LipstickCompositorWindow * const item = static_cast<LipstickCompositorWindow *>(view);
item->m_windowClosed = true;
item->tryRemove();
}
Expand Down Expand Up @@ -451,10 +459,17 @@ void LipstickCompositor::surfaceMapped()
if (!item)
item = static_cast<LipstickCompositorWindow *>(createView(surface));

surfaceMapped(item);
}

void LipstickCompositor::surfaceMapped(LipstickCompositorWindow *item)
{
// The surface was mapped for the first time
if (item->m_mapped)
return;

QWaylandSurface *surface = item->surface();

QWaylandSurface *transientParent = surface->transientParent();
if (transientParent) {
LipstickCompositorWindow *transientParentItem = surfaceWindow(transientParent);
Expand Down Expand Up @@ -501,17 +516,19 @@ void LipstickCompositor::surfaceSizeChanged()
{
QWaylandSurface *surface = qobject_cast<QWaylandSurface *>(sender());

LipstickCompositorWindow *window = surfaceWindow(surface);
if (window)
foreach (QWaylandSurfaceView *view, surface->views()) {
LipstickCompositorWindow * const window = static_cast<LipstickCompositorWindow *>(view);
window->setSize(surface->size());
}
}

void LipstickCompositor::surfaceTitleChanged()
{
QWaylandSurface *surface = qobject_cast<QWaylandSurface *>(sender());
LipstickCompositorWindow *window = surfaceWindow(surface);

if (window) {
foreach (QWaylandSurfaceView *view, surface->views()) {
LipstickCompositorWindow * const window = static_cast<LipstickCompositorWindow *>(view);

emit window->titleChanged();

int windowId = window->windowId();
Expand All @@ -524,20 +541,39 @@ void LipstickCompositor::surfaceTitleChanged()
void LipstickCompositor::surfaceRaised()
{
QWaylandSurface *surface = qobject_cast<QWaylandSurface *>(sender());

LipstickCompositorWindow *window = surfaceWindow(surface);
if (!window) {
window = static_cast<LipstickCompositorWindow *>(createView(surface));
}

if (window && window->m_mapped) {
if (window->m_mapped) {
emit windowRaised(window);
} else {
surfaceMapped(window);
}

// If a previous view of the surface was raised under a different category lower it now.
const QString category = surface->windowProperties().value("CATEGORY").toString();

foreach (QWaylandSurfaceView *view, surface->views()) {
LipstickCompositorWindow * const window = static_cast<LipstickCompositorWindow *>(view);

if (window->category() != category) {
emit windowLowered(window);
}
}
}

void LipstickCompositor::surfaceLowered()
{
QWaylandSurface *surface = qobject_cast<QWaylandSurface *>(sender());
LipstickCompositorWindow *window = surfaceWindow(surface);

if (window && window->m_mapped) {
emit windowLowered(window);
foreach (QWaylandSurfaceView *view, surface->views()) {
LipstickCompositorWindow * const window = static_cast<LipstickCompositorWindow *>(view);
if (window->m_mapped) {
emit windowLowered(window);
}
}
}

Expand Down Expand Up @@ -576,9 +612,9 @@ void LipstickCompositor::surfaceUnmapped(QWaylandSurface *surface)
if (surface == m_fullscreenSurface)
setFullscreenSurface(0);

LipstickCompositorWindow *window = surfaceWindow(surface);
if (window)
emit windowHidden(window);
foreach (QWaylandSurfaceView *view, surface->views()) {
emit windowHidden(static_cast<LipstickCompositorWindow *>(view));
}
}

void LipstickCompositor::surfaceUnmapped(LipstickCompositorWindow *item)
Expand Down
1 change: 1 addition & 0 deletions src/compositor/lipstickcompositor.h
Expand Up @@ -214,6 +214,7 @@ private slots:
friend class WindowPixmapItem;
friend class WindowProperty;

void surfaceMapped(LipstickCompositorWindow *item);
void surfaceUnmapped(LipstickCompositorWindow *item);

int windowIdForLink(QWaylandSurface *, uint) const;
Expand Down

0 comments on commit a9f17b6

Please sign in to comment.