File indexing completed on 2024-12-08 13:22:24

0001 /*
0002 *  Copyright 2016  Smith AR <audoban@openmailbox.org>
0003 *                  Michail Vourlakos <mvourlakos@gmail.com>
0004 *
0005 *  This file is part of Latte-Dock
0006 *
0007 *  Latte-Dock is free software; you can redistribute it and/or
0008 *  modify it under the terms of the GNU General Public License as
0009 *  published by the Free Software Foundation; either version 2 of
0010 *  the License, or (at your option) any later version.
0011 *
0012 *  Latte-Dock is distributed in the hope that it will be useful,
0013 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0014 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0015 *  GNU General Public License for more details.
0016 *
0017 *  You should have received a copy of the GNU General Public License
0018 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
0019 */
0020 
0021 #ifndef VISIBILITYMANAGER_H
0022 #define VISIBILITYMANAGER_H
0023 
0024 #include <array>
0025 
0026 // local
0027 #include "../plasma/quick/containmentview.h"
0028 #include "../../liblatte2/types.h"
0029 
0030 // Qt
0031 #include <QObject>
0032 #include <QTimer>
0033 
0034 // Plasma
0035 #include <Plasma/Containment>
0036 
0037 namespace Latte {
0038 class Corona;
0039 class View;
0040 namespace ViewPart {
0041 class ScreenEdgeGhostWindow;
0042 }
0043 namespace WindowSystem {
0044 class AbstractWindowInterface;
0045 }
0046 }
0047 
0048 namespace Latte {
0049 namespace ViewPart {
0050 
0051 class VisibilityManager : public QObject
0052 {
0053     Q_OBJECT
0054 
0055     Q_PROPERTY(Latte::Types::Visibility mode READ mode WRITE setMode NOTIFY modeChanged)
0056     Q_PROPERTY(bool raiseOnDesktop READ raiseOnDesktop WRITE setRaiseOnDesktop NOTIFY raiseOnDesktopChanged)
0057     Q_PROPERTY(bool raiseOnActivity READ raiseOnActivity WRITE setRaiseOnActivity NOTIFY raiseOnActivityChanged)
0058     Q_PROPERTY(bool isHidden READ isHidden WRITE setIsHidden NOTIFY isHiddenChanged)
0059     Q_PROPERTY(bool blockHiding READ blockHiding WRITE setBlockHiding NOTIFY blockHidingChanged)
0060     Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged)
0061 
0062     //! KWin Edges Support Options
0063     Q_PROPERTY(bool enableKWinEdges READ enableKWinEdges WRITE setEnableKWinEdges NOTIFY enableKWinEdgesChanged)
0064     Q_PROPERTY(bool supportsKWinEdges READ supportsKWinEdges NOTIFY supportsKWinEdgesChanged)
0065 
0066     Q_PROPERTY(int timerShow READ timerShow WRITE setTimerShow NOTIFY timerShowChanged)
0067     Q_PROPERTY(int timerHide READ timerHide WRITE setTimerHide NOTIFY timerHideChanged)
0068 
0069 public:
0070     explicit VisibilityManager(PlasmaQuick::ContainmentView *view);
0071     virtual ~VisibilityManager();
0072 
0073     Latte::Types::Visibility mode() const;
0074     void setMode(Latte::Types::Visibility mode);
0075 
0076     void applyActivitiesToHiddenWindows(const QStringList &activities);
0077 
0078     bool raiseOnDesktop() const;
0079     void setRaiseOnDesktop(bool enable);
0080 
0081     bool raiseOnActivity() const;
0082     void setRaiseOnActivity(bool enable);
0083 
0084     bool isHidden() const;
0085     void setIsHidden(bool isHidden);
0086 
0087     bool blockHiding() const;
0088     void setBlockHiding(bool blockHiding);
0089 
0090     bool containsMouse() const;
0091 
0092     int timerShow() const;
0093     void setTimerShow(int msec);
0094 
0095     int timerHide() const;
0096     void setTimerHide(int msec);
0097 
0098     //! KWin Edges Support functions
0099     bool enableKWinEdges() const;
0100     void setEnableKWinEdges(bool enable);
0101 
0102     bool supportsKWinEdges() const;
0103 
0104 public slots:
0105     Q_INVOKABLE void hide();
0106     Q_INVOKABLE void show();
0107 
0108 signals:
0109     void mustBeShown();
0110     void mustBeHide();
0111 
0112     void slideOutFinished();
0113     void slideInFinished();
0114 
0115     void modeChanged();
0116     void raiseOnDesktopChanged();
0117     void raiseOnActivityChanged();
0118     void isHiddenChanged();
0119     void blockHidingChanged();
0120     void containsMouseChanged();
0121     void timerShowChanged();
0122     void timerHideChanged();
0123 
0124     //! KWin Edges Support signals
0125     void enableKWinEdgesChanged();
0126     void supportsKWinEdgesChanged();
0127 
0128 private slots:
0129     void saveConfig();
0130     void restoreConfig();
0131 
0132     //! KWin Edges Support functions
0133     void updateKWinEdgesSupport();
0134 
0135 private:
0136     void setContainsMouse(bool contains);
0137 
0138     void raiseView(bool raise);
0139     void raiseViewTemporarily();
0140 
0141     //! KWin Edges Support functions
0142     void createEdgeGhostWindow();
0143     void deleteEdgeGhostWindow();
0144     void updateGhostWindowState();
0145 
0146     void updateStrutsBasedOnLayoutsAndActivities(bool forceUpdate = false);
0147     void viewEventManager(QEvent *ev);
0148 
0149     QRect acceptableStruts();
0150 
0151 private slots:
0152     void dodgeAllWindows();
0153     void dodgeActive();
0154     void dodgeMaximized();
0155     void updateHiddenState();
0156 
0157 private:
0158     WindowSystem::AbstractWindowInterface *m_wm;
0159     Types::Visibility m_mode{Types::None};
0160     std::array<QMetaObject::Connection, 5> m_connections;
0161 
0162     QTimer m_timerShow;
0163     QTimer m_timerHide;
0164     QTimer m_timerStartUp;
0165 
0166     bool m_isHidden{false};
0167     bool m_dragEnter{false};
0168     bool m_blockHiding{false};
0169     bool m_containsMouse{false};
0170     bool m_raiseTemporarily{false};
0171     bool m_raiseOnDesktopChange{false};
0172     bool m_raiseOnActivityChange{false};
0173     bool m_hideNow{false};
0174 
0175     QRect m_publishedStruts;
0176 
0177     //! KWin Edges
0178     bool m_enableKWinEdgesFromUser{true};
0179     std::array<QMetaObject::Connection, 1> m_connectionsKWinEdges;
0180     ScreenEdgeGhostWindow *m_edgeGhostWindow{nullptr};
0181 
0182     Latte::Corona *m_corona{nullptr};
0183     Latte::View *m_latteView{nullptr};
0184 
0185 };
0186 
0187 }
0188 }
0189 #endif // VISIBILITYMANAGER_H