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
Michail Vourlakos 76549a9f99 shortcuts:wait for view to fully shown properly
--the new approach is not using timers but actual
events from View in order to identify when the
view is fully shown and when their popup is actual
visible. This way popup showing and view slide-in
is always synchronized properly

BUG:425078
2021-05-13 20:09:05 +03:00

273 lines
7.6 KiB
C++

/*
* 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
#include <array>
// local
#include <coretypes.h>
#include "../plasma/quick/containmentview.h"
// Qt
#include <QObject>
#include <QTimer>
// Plasma
#include <Plasma/Containment>
namespace Latte {
class Corona;
class View;
namespace ViewPart {
class FloatingGapWindow;
class ScreenEdgeGhostWindow;
}
namespace WindowSystem {
class AbstractWindowInterface;
}
}
namespace Latte {
namespace ViewPart {
class VisibilityManager : public QObject
{
Q_OBJECT
Q_PROPERTY(bool hidingIsBlocked READ hidingIsBlocked NOTIFY hidingIsBlockedChanged)
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)
Q_PROPERTY(bool isHidden READ isHidden WRITE setIsHidden NOTIFY isHiddenChanged)
Q_PROPERTY(bool isShownFully READ isShownFully WRITE setIsShownFully NOTIFY isShownFullyChanged)
Q_PROPERTY(bool isBelowLayer READ isBelowLayer NOTIFY isBelowLayerChanged)
Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged)
//! Floating Gap Window to identify mouse between the screenEdge and the view when it does not accept any other
//! user input
Q_PROPERTY(bool isFloatingGapWindowEnabled READ isFloatingGapWindowEnabled WRITE setIsFloatingGapWindowEnabled NOTIFY isFloatingGapWindowEnabledChanged)
//! KWin Edges Support Options
Q_PROPERTY(bool enableKWinEdges READ enableKWinEdges WRITE setEnableKWinEdges NOTIFY enableKWinEdgesChanged)
Q_PROPERTY(bool supportsKWinEdges READ supportsKWinEdges NOTIFY supportsKWinEdgesChanged)
Q_PROPERTY(int timerShow READ timerShow WRITE setTimerShow NOTIFY timerShowChanged)
Q_PROPERTY(int timerHide READ timerHide WRITE setTimerHide NOTIFY timerHideChanged)
//! Struts
Q_PROPERTY(int strutsThickness READ strutsThickness WRITE setStrutsThickness NOTIFY strutsThicknessChanged)
public:
static const QRect ISHIDDENMASK;
explicit VisibilityManager(PlasmaQuick::ContainmentView *view);
virtual ~VisibilityManager();
Latte::Types::Visibility mode() const;
void setMode(Latte::Types::Visibility mode);
void applyActivitiesToHiddenWindows(const QStringList &activities);
bool raiseOnDesktop() const;
void setRaiseOnDesktop(bool enable);
bool raiseOnActivity() const;
void setRaiseOnActivity(bool enable);
bool isBelowLayer() const;
bool isHidden() const;
void setIsHidden(bool isHidden);
bool isShownFully() const;
void setIsShownFully(bool fully);
bool hidingIsBlocked() const;
bool containsMouse() const;
bool isFloatingGapWindowEnabled() const;
void setIsFloatingGapWindowEnabled(bool enabled);
int timerShow() const;
void setTimerShow(int msec);
int timerHide() const;
void setTimerHide(int msec);
bool hasBlockHidingEvent(const QString &type);
bool isSidebar() const;
//! KWin Edges Support functions
bool enableKWinEdges() const;
void setEnableKWinEdges(bool enable);
bool supportsKWinEdges() const;
//! Struts
int strutsThickness() const;
void setStrutsThickness(int thickness);
//! Used mostly to show / hide Sidebars
void toggleHiddenState();
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();
signals:
void mustBeShown();
void mustBeHide();
void slideOutFinished();
void slideInFinished();
void frameExtentsCleared();
void modeChanged();
void raiseOnDesktopChanged();
void raiseOnActivityChanged();
void isBelowLayerChanged();
void isFloatingGapWindowEnabledChanged();
void isHiddenChanged();
void isShownFullyChanged();
void hidingIsBlockedChanged();
void containsMouseChanged();
void strutsThicknessChanged();
void timerShowChanged();
void timerHideChanged();
//! KWin Edges Support signals
void enableKWinEdgesChanged();
void supportsKWinEdgesChanged();
private slots:
void saveConfig();
void restoreConfig();
void setIsBelowLayer(bool below);
void onHeadThicknessChanged();
void onHidingIsBlockedChanged();
void onIsFloatingGapWindowEnabledChanged();
void publishFrameExtents(bool forceUpdate = false); //! 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();
QRect acceptableStruts();
private slots:
void dodgeAllWindows();
void dodgeActive();
void dodgeMaximized();
void updateHiddenState();
bool isValidMode() const;
private:
void startTimerHide(const int &msec = 0);
private:
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_isFloatingGapWindowEnabled{false};
bool m_isShownFully{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};
//! valid on demand sidebar hidden state in order to be checked after slide-ins/outs
bool m_isRequestedShownSidebarOnDemand{false};
int m_frameExtentsHeadThicknessGap{0};
int m_timerHideInterval{700};
Plasma::Types::Location m_frameExtentsLocation{Plasma::Types::BottomEdge};
int m_strutsThickness{0};
QStringList m_blockHidingEvents;
QRect m_publishedStruts;
QRect m_lastMask;
//! 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};
};
}
}
#endif // VISIBILITYMANAGER_H