File indexing completed on 2024-03-24 17:07:25

0001 /*
0002 *  Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
0003 *
0004 *  This file is part of Latte-Dock
0005 *
0006 *  Latte-Dock is free software; you can redistribute it and/or
0007 *  modify it under the terms of the GNU General Public License as
0008 *  published by the Free Software Foundation; either version 2 of
0009 *  the License, or (at your option) any later version.
0010 *
0011 *  Latte-Dock is distributed in the hope that it will be useful,
0012 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0013 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0014 *  GNU General Public License for more details.
0015 *
0016 *  You should have received a copy of the GNU General Public License
0017 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
0018 */
0019 
0020 #ifndef SCREENEDGEGHOSTWINDOW_H
0021 #define SCREENEDGEGHOSTWINDOW_H
0022 
0023 // local
0024 #include "../lattecorona.h"
0025 #include "../wm/windowinfowrap.h"
0026 
0027 // Qt
0028 #include <QObject>
0029 #include <QQuickView>
0030 #include <QTimer>
0031 
0032 namespace KWayland {
0033 namespace Client {
0034 class PlasmaShellSurface;
0035 }
0036 }
0037 
0038 namespace Latte {
0039 class Corona;
0040 class View;
0041 }
0042 
0043 namespace Latte {
0044 namespace ViewPart {
0045 
0046 //! What is the importance of this class?
0047 //!
0048 //! Plasma is activating the screen edges for the main panel window
0049 //! unfortunately this isn't possible for the Latte case.
0050 //! When a window is hidden at an edge it becomes NOT visible
0051 //! unfortunately that means that all the animations are
0052 //! stopped (Qt behaviour) and that creates confusion to the user after the window
0053 //! reappears because various animations are played (adding-removing tasks/launchers)
0054 //! that aren't relevant any more.
0055 //!
0056 //! In order to workaround the above behaviour Latte is using a
0057 //! fake window to communicate with KWin and the MAIN Latte::View window
0058 //! continues to use only mask technique to hide
0059 //!
0060 //! KDE BUGS: https://bugs.kde.org/show_bug.cgi?id=382219
0061 //!           https://bugs.kde.org/show_bug.cgi?id=392464
0062 
0063 class ScreenEdgeGhostWindow : public QQuickView
0064 {
0065     Q_OBJECT
0066 
0067 public:
0068     ScreenEdgeGhostWindow(Latte::View *view);
0069     ~ScreenEdgeGhostWindow() override;
0070 
0071     bool containsMouse() const;
0072 
0073     int location();
0074 
0075     void hideWithMask();
0076     void showWithMask();
0077 
0078     Latte::View *parentView();
0079 
0080     KWayland::Client::PlasmaShellSurface *surface();
0081 
0082 signals:
0083     void containsMouseChanged(bool contains);
0084     void dragEntered();
0085     void forcedShown(); //[workaround] forced shown to avoid a KWin issue that hides windows when activities are stopped
0086 
0087 protected:
0088     bool event(QEvent *ev) override;
0089 
0090 private slots:
0091     void startGeometryTimer();
0092     void updateGeometry();
0093     void fixGeometry();
0094 
0095 private:
0096     void setContainsMouse(bool contains);
0097     void setupWaylandIntegration();
0098 
0099 private:
0100     bool m_delayedContainsMouse{false};
0101     bool m_containsMouse{false};
0102     bool m_inDelete{false};
0103     QRect m_calculatedGeometry;
0104 
0105     QTimer m_delayedMouseTimer;
0106     QTimer m_fixGeometryTimer;
0107 
0108     //! HACK: Timers in order to handle KWin faulty
0109     //! behavior that hides Views when closing Activities
0110     //! with no actual reason
0111     QTimer m_visibleHackTimer1;
0112     QTimer m_visibleHackTimer2;
0113     //! Connections for the KWin visibility hack
0114     QList<QMetaObject::Connection> connectionsHack;
0115 
0116     Latte::View *m_latteView{nullptr};
0117 
0118     QPointer<Latte::Corona> m_corona;
0119 
0120     Latte::WindowSystem::WindowId m_trackedWindowId;
0121     KWayland::Client::PlasmaShellSurface *m_shellSurface{nullptr};
0122 };
0123 
0124 }
0125 }
0126 #endif