File indexing completed on 2024-12-01 05:02:34

0001 /*
0002     SPDX-FileCopyrightText: 2016 Smith AR <audoban@openmailbox.org>
0003     SPDX-FileCopyrightText: 2016 Michail Vourlakos <mvourlakos@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef LATTECORONA_H
0009 #define LATTECORONA_H
0010 
0011 // local
0012 #include <coretypes.h>
0013 #include "plasma/quick/configview.h"
0014 #include "layouts/storage.h"
0015 #include "view/panelshadows_p.h"
0016 
0017 // Qt
0018 #include <QObject>
0019 #include <QTimer>
0020 
0021 // Plasma
0022 #include <Plasma/Corona>
0023 
0024 // KDE
0025 #include <KAboutApplicationDialog>
0026 
0027 namespace KDeclarative {
0028 class QmlObjectSharedEngine;
0029 }
0030 
0031 namespace Plasma {
0032 class Corona;
0033 class Containment;
0034 class Types;
0035 }
0036 
0037 namespace PlasmaQuick {
0038 class ConfigView;
0039 }
0040 
0041 namespace KActivities {
0042 class Consumer;
0043 }
0044 
0045 namespace KWayland {
0046 namespace Client {
0047 class PlasmaShell;
0048 }
0049 }
0050 
0051 namespace Latte {
0052 class CentralLayout;
0053 class ScreenPool;
0054 class GlobalShortcuts;
0055 class UniversalSettings;
0056 class View;
0057 class ViewSettingsFactory;
0058 namespace Indicator{
0059 class Factory;
0060 }
0061 namespace Layout{
0062 class GenericLayout;
0063 }
0064 namespace Layouts{
0065 class Manager;
0066 }
0067 namespace PlasmaExtended{
0068 class ScreenGeometries;
0069 class ScreenPool;
0070 class Theme;
0071 }
0072 namespace Templates {
0073 class Manager;
0074 }
0075 namespace WindowSystem{
0076 class AbstractWindowInterface;
0077 }
0078 }
0079 
0080 namespace Latte {
0081 
0082 class Corona : public Plasma::Corona
0083 {
0084     Q_OBJECT
0085     Q_CLASSINFO("D-Bus Interface", "org.kde.LatteDock")
0086 
0087 public:
0088     Corona(bool defaultLayoutOnStartup = false,
0089                QString layoutNameOnStartUp = QString(),
0090                QString addViewTemplateName = QString(),
0091                int userSetMemoryUsage = -1,
0092                QObject *parent = nullptr);
0093     virtual ~Corona();
0094 
0095     bool inQuit() const;
0096 
0097     int numScreens() const override;
0098     QRect screenGeometry(int id) const override;
0099     QRegion availableScreenRegion(int id) const override;
0100     QRect availableScreenRect(int id) const override;
0101 
0102     //! This is a very generic function in order to return the availableScreenRect of specific screen
0103     //! by calculating only the user specified visibility modes and edges. Empty QLists for both
0104     //! arguments mean that all choices are accepted in calculations. ignoreExternalPanels means that
0105     //! external panels should be not considered in the calculations
0106     QRect availableScreenRectWithCriteria(int id,
0107                                           QString activityid = QString(),
0108                                           QList<Types::Visibility> ignoreModes = QList<Types::Visibility>(),
0109                                           QList<Plasma::Types::Location> ignoreEdges = QList<Plasma::Types::Location>(),
0110                                           bool ignoreExternalPanels = true,
0111                                           bool desktopUse = false) const;
0112 
0113     QRegion availableScreenRegionWithCriteria(int id,
0114                                               QString activityid = QString(),
0115                                               QList<Types::Visibility> ignoreModes = QList<Types::Visibility>(),
0116                                               QList<Plasma::Types::Location> ignoreEdges = QList<Plasma::Types::Location>(),
0117                                               bool ignoreExternalPanels = true,
0118                                               bool desktopUse = false) const;
0119 
0120     int screenForContainment(const Plasma::Containment *containment) const override;
0121 
0122     KWayland::Client::PlasmaShell *waylandCoronaInterface() const;
0123 
0124     KActivities::Consumer *activitiesConsumer() const;
0125     GlobalShortcuts *globalShortcuts() const;
0126     ScreenPool *screenPool() const;
0127     UniversalSettings *universalSettings() const;
0128     ViewSettingsFactory *viewSettingsFactory() const;
0129     Layouts::Manager *layoutsManager() const;   
0130     Templates::Manager *templatesManager() const;
0131 
0132     Indicator::Factory *indicatorFactory() const;
0133 
0134     PlasmaExtended::ScreenPool *plasmaScreenPool() const;
0135     PlasmaExtended::Theme *themeExtended() const;
0136 
0137     WindowSystem::AbstractWindowInterface *wm() const;
0138 
0139     PanelShadows *dialogShadows() const;
0140 
0141     //! Needs to be called in order to import and load application properly after application
0142     //! finished all its exit operations
0143     void importFullConfiguration(const QString &file);
0144 
0145     //! these functions are used from context menu through containmentactions    
0146     void quitApplication();
0147     void switchToLayout(QString layout);
0148     void importLayoutFile(const QString &filepath, const QString &suggestedLayoutName = QString());
0149     void showSettingsWindow(int page);
0150 
0151     QStringList contextMenuData(const uint &containmentId);
0152     QStringList viewTemplatesData();
0153 
0154 public slots:
0155     void aboutApplication();
0156     void activateLauncherMenu();
0157     void loadDefaultLayout() override;
0158 
0159     void setAutostart(const bool &enabled);
0160 
0161     void addView(const uint &containmentId, const QString &templateId);
0162     void duplicateView(const uint &containmentId);
0163     void exportViewTemplate(const uint &containmentId);
0164     void moveViewToLayout(const uint &containmentId, const QString &layoutName);
0165     void removeView(const uint &containmentId);
0166 
0167     void setBackgroundFromBroadcast(QString activity, QString screenName, QString filename);
0168     void setBroadcastedBackgroundsEnabled(QString activity, QString screenName, bool enabled);
0169     void showAlternativesForApplet(Plasma::Applet *applet);
0170     void toggleHiddenState(QString layoutName, QString viewName, QString screenName, int screenEdge);
0171 
0172     //! values are separated with a "-" character
0173     void windowColorScheme(QString windowIdAndScheme);
0174     void updateDockItemBadge(QString identifier, QString value);
0175 
0176     void unload();
0177 
0178 signals:
0179     void configurationShown(PlasmaQuick::ConfigView *configView);
0180     void viewLocationChanged();
0181     void raiseViewsTemporaryChanged();
0182     void availableScreenRectChangedFrom(Latte::View *origin);
0183     void availableScreenRegionChangedFrom(Latte::View *origin);
0184     void verticalUnityViewHasFocus();
0185 
0186 private slots:
0187     void alternativesVisibilityChanged(bool visible);
0188     void load();
0189 
0190     void onAboutToQuit();
0191 
0192     void onScreenAdded(QScreen *screen);
0193     void onScreenRemoved(QScreen *screen);
0194     void onScreenCountChanged();
0195     void onScreenGeometryChanged(const QRect &geometry);
0196     void syncLatteViewsToScreens();
0197 
0198 private:
0199     void cleanConfig();
0200     void qmlRegisterTypes() const;
0201     void setupWaylandIntegration();
0202 
0203     bool appletExists(uint containmentId, uint appletId) const;
0204     bool containmentExists(uint id) const;
0205 
0206     int primaryScreenId() const;
0207 
0208     QStringList containmentsIds();
0209     QStringList appletsIds();
0210 
0211     Layout::GenericLayout *layout(QString name) const;
0212     CentralLayout *centralLayout(QString name) const;
0213 
0214 private:
0215 
0216     bool m_activitiesStarting{true};
0217     bool m_defaultLayoutOnStartup{false}; //! this is used to enforce loading the default layout on startup
0218     bool m_inStartup{true}; //! this is used in order to identify when application is still in startup phase
0219     bool m_inQuit{false}; //! this is used in order to identify when application is in quit phase
0220     bool m_quitTimedEnded{false}; //! this is used on destructor in order to delay it and slide-out the views
0221 
0222     //!it can be used on startup to change memory usage from command line
0223     int m_userSetMemoryUsage{ -1};
0224 
0225     QString m_layoutNameOnStartUp;
0226     QString m_startupAddViewTemplateName;
0227     QString m_importFullConfigurationFile;
0228 
0229     QList<KDeclarative::QmlObjectSharedEngine *> m_alternativesObjects;
0230 
0231     QTimer m_viewsScreenSyncTimer;
0232 
0233     KActivities::Consumer *m_activitiesConsumer;
0234     QPointer<KAboutApplicationDialog> aboutDialog;
0235 
0236     ScreenPool *m_screenPool{nullptr};
0237     UniversalSettings *m_universalSettings{nullptr};
0238     ViewSettingsFactory *m_viewSettingsFactory{nullptr};
0239     GlobalShortcuts *m_globalShortcuts{nullptr};
0240 
0241     Indicator::Factory *m_indicatorFactory{nullptr};
0242     Layouts::Manager *m_layoutsManager{nullptr};
0243     Templates::Manager *m_templatesManager{nullptr};
0244 
0245     PlasmaExtended::ScreenGeometries *m_plasmaGeometries{nullptr};
0246     PlasmaExtended::ScreenPool *m_plasmaScreenPool{nullptr};
0247     PlasmaExtended::Theme *m_themeExtended{nullptr};
0248 
0249     WindowSystem::AbstractWindowInterface *m_wm{nullptr};
0250 
0251     PanelShadows *m_dialogShadows{nullptr};
0252 
0253     KWayland::Client::PlasmaShell *m_waylandCorona{nullptr};
0254 
0255     friend class GlobalShortcuts;
0256     friend class Layouts::Manager;
0257     friend class Layouts::Storage;
0258 };
0259 
0260 }
0261 
0262 #endif // LATTECORONA_H