File: windowlistener.cpp

package info (click to toggle)
plasma-mobile 6.5.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 20,412 kB
  • sloc: xml: 38,474; cpp: 18,529; javascript: 139; sh: 82; makefile: 5
file content (57 lines) | stat: -rw-r--r-- 1,848 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later

#include "windowlistener.h"

WindowListener::WindowListener(QObject *parent)
    : QObject{parent}
{
    // initialize wayland window checking
    KWayland::Client::ConnectionThread *connection = KWayland::Client::ConnectionThread::fromApplication(this);
    if (!connection) {
        return;
    }

    auto *registry = new KWayland::Client::Registry(this);
    registry->create(connection);

    connect(registry, &KWayland::Client::Registry::plasmaWindowManagementAnnounced, this, [this, registry](quint32 name, quint32 version) {
        m_windowManagement = registry->createPlasmaWindowManagement(name, version, this);
        connect(m_windowManagement, &KWayland::Client::PlasmaWindowManagement::windowCreated, this, &WindowListener::onWindowCreated);
        connect(m_windowManagement, &KWayland::Client::PlasmaWindowManagement::activeWindowChanged, this, [this]() {
            Q_EMIT activeWindowChanged(m_windowManagement->activeWindow());
        });
    });

    registry->setup();
    connection->roundtrip();
}

WindowListener *WindowListener::instance()
{
    static WindowListener *listener = new WindowListener();
    return listener;
}

void WindowListener::onWindowCreated(KWayland::Client::PlasmaWindow *window)
{
    QString storageId = window->appId();

    // Ignore empty windows
    if (storageId == "") {
        return;
    }

    // Special handling for plasmashell windows, don't track them
    if (storageId == "org.kde.plasmashell") {
        Q_EMIT plasmaWindowCreated(window);
        return;
    }

    // listen for window close
    connect(window, &KWayland::Client::PlasmaWindow::unmapped, this, [this, storageId]() {
        Q_EMIT windowRemoved(storageId);
    });

    Q_EMIT windowCreated(window);
}