1
0
mirror of https://github.com/KDE/latte-dock.git synced 2024-12-23 01:33:50 +03:00
latte-dock/app/view/visibilitymanager.h

234 lines
6.2 KiB
C
Raw Normal View History

2017-01-03 01:05:30 +03:00
/*
* Copyright 2016 Smith AR <audoban@openmailbox.org>
* Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Latte-Dock
*
* Latte-Dock is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* Latte-Dock is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef VISIBILITYMANAGER_H
#define VISIBILITYMANAGER_H
2019-08-18 12:57:06 +03:00
#include <array>
2018-12-02 03:05:52 +03:00
// local
#include <coretypes.h>
#include "../plasma/quick/containmentview.h"
2018-12-02 03:05:52 +03:00
// Qt
2016-12-26 02:12:31 +03:00
#include <QObject>
#include <QTimer>
2018-12-02 03:05:52 +03:00
// Plasma
#include <Plasma/Containment>
2016-12-29 08:42:55 +03:00
namespace Latte {
class Corona;
class View;
namespace ViewPart {
class FloatingGapWindow;
class ScreenEdgeGhostWindow;
}
2019-05-11 15:43:10 +03:00
namespace WindowSystem {
class AbstractWindowInterface;
}
}
2016-12-29 08:42:55 +03:00
namespace Latte {
namespace ViewPart {
2016-12-29 08:42:55 +03:00
2018-07-03 22:15:45 +03:00
class VisibilityManager : public QObject
{
Q_OBJECT
Q_PROPERTY(bool hidingIsBlocked READ hidingIsBlocked NOTIFY hidingIsBlockedChanged)
2017-01-16 22:07:49 +03:00
Q_PROPERTY(Latte::Types::Visibility mode READ mode WRITE setMode NOTIFY modeChanged)
Q_PROPERTY(bool raiseOnDesktop READ raiseOnDesktop WRITE setRaiseOnDesktop NOTIFY raiseOnDesktopChanged)
Q_PROPERTY(bool raiseOnActivity READ raiseOnActivity WRITE setRaiseOnActivity NOTIFY raiseOnActivityChanged)
2016-12-30 10:18:08 +03:00
Q_PROPERTY(bool isHidden READ isHidden WRITE setIsHidden NOTIFY isHiddenChanged)
Q_PROPERTY(bool isBelowLayer READ isBelowLayer NOTIFY isBelowLayerChanged)
Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged)
//! KWin Edges Support Options
Q_PROPERTY(bool enableKWinEdges READ enableKWinEdges WRITE setEnableKWinEdges NOTIFY enableKWinEdgesChanged)
Q_PROPERTY(bool supportsKWinEdges READ supportsKWinEdges NOTIFY supportsKWinEdgesChanged)
2016-12-26 02:12:31 +03:00
Q_PROPERTY(int timerShow READ timerShow WRITE setTimerShow NOTIFY timerShowChanged)
Q_PROPERTY(int timerHide READ timerHide WRITE setTimerHide NOTIFY timerHideChanged)
2017-01-16 22:07:49 +03:00
public:
explicit VisibilityManager(PlasmaQuick::ContainmentView *view);
2016-12-26 02:12:31 +03:00
virtual ~VisibilityManager();
2017-01-16 22:07:49 +03:00
Latte::Types::Visibility mode() const;
void setMode(Latte::Types::Visibility mode);
2017-01-16 22:07:49 +03:00
void applyActivitiesToHiddenWindows(const QStringList &activities);
bool raiseOnDesktop() const;
void setRaiseOnDesktop(bool enable);
bool raiseOnActivity() const;
void setRaiseOnActivity(bool enable);
bool isBelowLayer() const;
2016-12-28 11:00:01 +03:00
bool isHidden() const;
2016-12-30 10:18:08 +03:00
void setIsHidden(bool isHidden);
2017-01-16 22:07:49 +03:00
bool hidingIsBlocked() const;
2017-01-16 22:07:49 +03:00
2016-12-28 11:00:01 +03:00
bool containsMouse() const;
2017-01-16 22:07:49 +03:00
2016-12-26 02:12:31 +03:00
int timerShow() const;
void setTimerShow(int msec);
2017-01-16 22:07:49 +03:00
2016-12-26 02:12:31 +03:00
int timerHide() const;
void setTimerHide(int msec);
2017-01-16 22:07:49 +03:00
//! KWin Edges Support functions
bool enableKWinEdges() const;
void setEnableKWinEdges(bool enable);
bool supportsKWinEdges() const;
//! Used mostly to show / hide SideBars
void toggleHiddenState();
2019-04-12 19:08:00 +03:00
public slots:
Q_INVOKABLE void hide();
Q_INVOKABLE void show();
Q_INVOKABLE void setViewOnBackLayer();
Q_INVOKABLE void setViewOnFrontLayer();
Q_INVOKABLE void addBlockHidingEvent(const QString &type);
Q_INVOKABLE void removeBlockHidingEvent(const QString &type);
void initViewFlags();
2016-12-26 02:12:31 +03:00
signals:
void mustBeShown();
void mustBeHide();
2017-01-16 22:07:49 +03:00
void slideOutFinished();
void slideInFinished();
2016-12-26 02:12:31 +03:00
void modeChanged();
void raiseOnDesktopChanged();
void raiseOnActivityChanged();
void isBelowLayerChanged();
void isHiddenChanged();
void hidingIsBlockedChanged();
void containsMouseChanged();
2016-12-26 02:12:31 +03:00
void timerShowChanged();
void timerHideChanged();
2017-01-16 22:07:49 +03:00
//! KWin Edges Support signals
void enableKWinEdgesChanged();
void supportsKWinEdgesChanged();
private slots:
void saveConfig();
void restoreConfig();
void setIsBelowLayer(bool below);
void on_hidingIsBlockedChanged();
void on_publishFrameExtents(); //! delayed
void publishFrameExtents(); //! direct
//! KWin Edges Support functions
void updateKWinEdgesSupport();
private:
void setContainsMouse(bool contains);
void raiseView(bool raise);
void raiseViewTemporarily();
//! KWin Edges Support functions
void createEdgeGhostWindow();
void deleteEdgeGhostWindow();
void updateGhostWindowState();
//! Floating Gap Support functions
void createFloatingGapWindow();
void deleteFloatingGapWindow();
bool supportsFloatingGap() const;
void updateStrutsBasedOnLayoutsAndActivities(bool forceUpdate = false);
void viewEventManager(QEvent *ev);
void checkMouseInFloatingArea();
bool windowContainsMouse();
2019-05-01 23:04:39 +03:00
QRect acceptableStruts();
private slots:
void dodgeAllWindows();
2019-04-23 09:58:06 +03:00
void dodgeActive();
void dodgeMaximized();
void updateHiddenState();
bool isValidMode() const;
private:
2019-05-11 15:43:10 +03:00
WindowSystem::AbstractWindowInterface *m_wm;
Types::Visibility m_mode{Types::None};
std::array<QMetaObject::Connection, 5> m_connections;
QTimer m_timerShow;
QTimer m_timerHide;
QTimer m_timerStartUp;
QTimer m_timerPublishFrameExtents;
bool m_isBelowLayer{false};
bool m_isHidden{false};
bool m_dragEnter{false};
bool m_containsMouse{false};
bool m_raiseTemporarily{false};
bool m_raiseOnDesktopChange{false};
bool m_raiseOnActivityChange{false};
bool m_hideNow{false};
int m_frameExtentsHeadThicknessGap{0};
Plasma::Types::Location m_frameExtentsLocation{Plasma::Types::BottomEdge};
QStringList m_blockHidingEvents;
2019-05-01 23:04:39 +03:00
QRect m_publishedStruts;
QRegion m_lastMask;
2019-05-01 23:04:39 +03:00
//! KWin Edges
bool m_enableKWinEdgesFromUser{true};
std::array<QMetaObject::Connection, 1> m_connectionsKWinEdges;
ScreenEdgeGhostWindow *m_edgeGhostWindow{nullptr};
//! Floating Gap
FloatingGapWindow *m_floatingGapWindow{nullptr};
Latte::Corona *m_corona{nullptr};
Latte::View *m_latteView{nullptr};
};
2016-12-29 08:42:55 +03:00
}
2016-12-29 08:42:55 +03:00
}
2016-12-26 02:12:31 +03:00
#endif // VISIBILITYMANAGER_H