🏡 index : quine-global-labs/mirror-kde-plasma-desktop.git

/*
    SPDX-FileCopyrightText: 2013-2016 Eike Hein <hein@kde.org>

    SPDX-License-Identifier: GPL-2.0-or-later
*/

#pragma once

#include <KConfigWatcher>

#include <QAction>
#include <QObject>
#include <QQuickItem>
#include <QRect>

#include <netwm.h>
#include <qqmlregistration.h>
#include <qwindowdefs.h>

#include "kactivitymanagerd_plugins_settings.h"

class KActionCollection;
class QActionGroup;
class QQuickItem;
class QQuickWindow;
class QJsonArray;

namespace KActivities
{
class Consumer;
}

class Backend : public QObject
{
    Q_OBJECT
    QML_ELEMENT

public:
    enum MiddleClickAction {
        None = 0,
        Close,
        NewInstance,
        ToggleMinimized,
        ToggleGrouping,
        BringToCurrentDesktop,
    };

    Q_ENUM(MiddleClickAction)

    Q_PROPERTY(int screen READ screen WRITE setScreen NOTIFY screenChanged)
    Q_PROPERTY(bool hasActiveTask READ hasActiveTask WRITE setHasActiveTask NOTIFY hasActiveTaskChanged)
    Q_PROPERTY(bool showsOnlyCurrentScreen READ showsOnlyCurrentScreen WRITE setShowsOnlyCurrentScreen NOTIFY showsOnlyCurrentScreenChanged)

    explicit Backend(QObject *parent = nullptr);
    ~Backend() override;

    Q_INVOKABLE QVariantList jumpListActions(const QUrl &launcherUrl, QObject *parent);
    Q_INVOKABLE QVariantList placesActions(const QUrl &launcherUrl, bool showAllPlaces, QObject *parent);
    Q_INVOKABLE QVariantList recentDocumentActions(const QUrl &launcherUrl, QObject *parent);
    Q_INVOKABLE void setActionGroup(QAction *action) const;

    Q_INVOKABLE QRect globalRect(QQuickItem *item) const;

    Q_INVOKABLE bool isApplication(const QUrl &url) const;

    Q_INVOKABLE qint64 parentPid(qint64 pid) const;

    Q_INVOKABLE static QUrl tryDecodeApplicationsUrl(const QUrl &launcherUrl);
    Q_INVOKABLE static QStringList applicationCategories(const QUrl &launcherUrl);

    int screen() const;
    void setScreen(int screen);

    bool hasActiveTask() const;
    void setHasActiveTask(bool active);

    bool showsOnlyCurrentScreen() const;
    void setShowsOnlyCurrentScreen(bool shows);

Q_SIGNALS:
    void addLauncher(const QUrl &url) const;

    void showAllPlaces();

    void screenChanged();
    void hasActiveTaskChanged();
    void showsOnlyCurrentScreenChanged();

    void activateTaskAtIndexRequested(int index);
    void activatePreviousTaskRequested();
    void activateNextTaskRequested();
    void moveActiveTaskBackwardRequested();
    void moveActiveTaskForwardRequested();

private Q_SLOTS:
    void handleRecentDocumentAction() const;

private:
    static void setupShortcuts();
    static Backend *findTargetBackend();
    static void dispatchActivateTaskAtIndex(int index);
    static void dispatchActivatePreviousTask();
    static void dispatchActivateNextTask();
    static void dispatchMoveActiveTaskBackward();
    static void dispatchMoveActiveTaskForward();

    QVariantList systemSettingsActions(QObject *parent) const;

    QActionGroup *m_actionGroup = nullptr;
    KActivities::Consumer *m_activitiesConsumer = nullptr;

    static QVector<Backend *> s_instances;

    int m_screen = -1;
    bool m_hasActiveTask = false;
    bool m_showsOnlyCurrentScreen = false;

    KActivityManagerdPluginsSettings m_activityManagerPluginsSettings;
    KConfigWatcher::Ptr m_activityManagerPluginsSettingsWatcher;
};