1 /*
2     SPDX-FileCopyrightText: 2016 Smith AR <audoban@openmailbox.org>
3     SPDX-FileCopyrightText: 2016 Michail Vourlakos <mvourlakos@gmail.com>
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #ifndef ABSTRACTWINDOWINTERFACE_H
8 #define ABSTRACTWINDOWINTERFACE_H
9 
10 // local
11 #include <coretypes.h>
12 #include "schemecolors.h"
13 #include "tasktools.h"
14 #include "windowinfowrap.h"
15 #include "tracker/windowstracker.h"
16 
17 // C++
18 #include <unordered_map>
19 #include <list>
20 
21 // Qt
22 #include <QObject>
23 #include <QWindow>
24 #include <QDBusServiceWatcher>
25 #include <QDialog>
26 #include <QMap>
27 #include <QRect>
28 #include <QPoint>
29 #include <QPointer>
30 #include <QScreen>
31 #include <QTimer>
32 
33 // KDE
34 #include <KSharedConfig>
35 #include <KActivities/Consumer>
36 
37 // Plasma
38 #include <Plasma>
39 
40 
41 namespace Latte {
42 class Corona;
43 namespace WindowSystem {
44 namespace Tracker {
45 class Schemes;
46 class Windows;
47 }
48 }
49 }
50 
51 namespace Latte {
52 namespace WindowSystem {
53 
54 class AbstractWindowInterface : public QObject
55 {
56     Q_OBJECT
57 
58 public:
59     enum class Slide
60     {
61         None,
62         Top,
63         Left,
64         Bottom,
65         Right,
66     };
67 
68     explicit AbstractWindowInterface(QObject *parent = nullptr);
69     virtual ~AbstractWindowInterface();
70 
71     virtual void setViewExtraFlags(QObject *view,bool isPanelWindow = true, Latte::Types::Visibility mode = Latte::Types::WindowsGoBelow) = 0;
72     virtual void setViewStruts(QWindow &view, const QRect &rect
73                                , Plasma::Types::Location location) = 0;
74     virtual void setWindowOnActivities(const WindowId &wid, const QStringList &activities) = 0;
75 
76     virtual void removeViewStruts(QWindow &view) = 0;
77 
78     virtual WindowId activeWindow() = 0;
79     virtual WindowInfoWrap requestInfo(WindowId wid) = 0;
80     virtual WindowInfoWrap requestInfoActive() = 0;
81 
82     virtual void skipTaskBar(const QDialog &dialog) = 0;
83     virtual void slideWindow(QWindow &view, Slide location) = 0;
84     virtual void enableBlurBehind(QWindow &view) = 0;
85     virtual void setActiveEdge(QWindow *view, bool active) = 0;
86 
87     virtual void requestActivate(WindowId wid) = 0;
88     virtual void requestClose(WindowId wid) = 0;
89     virtual void requestMoveWindow(WindowId wid, QPoint from) = 0;
90     virtual void requestToggleIsOnAllDesktops(WindowId wid) = 0;
91     virtual void requestToggleKeepAbove(WindowId wid) = 0;
92     virtual void requestToggleMinimized(WindowId wid) = 0;
93     virtual void requestToggleMaximized(WindowId wid) = 0;
94     virtual void setKeepAbove(WindowId wid, bool active) = 0;
95     virtual void setKeepBelow(WindowId wid, bool active) = 0;
96 
97     virtual bool windowCanBeDragged(WindowId wid) = 0;
98     virtual bool windowCanBeMaximized(WindowId wid) = 0;
99 
100     virtual QIcon iconFor(WindowId wid) = 0;
101     virtual WindowId winIdFor(QString appId, QRect geometry) = 0;
102     virtual WindowId winIdFor(QString appId, QString title) = 0;
103     virtual AppData appDataFor(WindowId wid) = 0;
104 
105     bool isKWinRunning() const;
106 
107     bool inCurrentDesktopActivity(const WindowInfoWrap &winfo);
108     bool isShowingDesktop() const;
109 
110     bool hasBlockedTracking(const WindowId &wid) const;
111 
112     QString currentDesktop();
113     QString currentActivity();
114 
115     virtual void registerIgnoredWindow(WindowId wid);
116     virtual void unregisterIgnoredWindow(WindowId wid);
117 
118     void registerPlasmaIgnoredWindow(WindowId wid);
119     void unregisterPlasmaIgnoredWindow(WindowId wid);
120 
121     void registerWhitelistedWindow(WindowId wid);
122     void unregisterWhitelistedWindow(WindowId wid);
123 
124     void switchToNextActivity();
125     void switchToPreviousActivity();
126 
127     virtual void switchToNextVirtualDesktop() = 0;
128     virtual void switchToPreviousVirtualDesktop() = 0;
129 
130     virtual void setFrameExtents(QWindow *view, const QMargins &margins) = 0;
131     virtual void setInputMask(QWindow *window, const QRect &rect) = 0;
132 
133     Latte::Corona *corona();
134     Tracker::Schemes *schemesTracker();
135     Tracker::Windows *windowsTracker() const;
136 
137 signals:
138     void activeWindowChanged(WindowId wid);
139     void windowChanged(WindowId winfo);
140     void windowAdded(WindowId wid);
141     void windowRemoved(WindowId wid);
142     void currentDesktopChanged();
143     void currentActivityChanged();
144 
145     void isShowingDesktopChanged();
146 
147     void latteWindowAdded();
148 
149 protected:
150     QString m_currentDesktop;
151     QString m_currentActivity;
152 
153     //! windows that must be ignored from tracking, a good example are Latte::Views and
154     //! their Configuration windows
155     QList<WindowId> m_ignoredWindows;
156     //! identified plasma panels
157     QList<WindowId> m_plasmaIgnoredWindows;
158 
159     //! identified whitelisted windows that can be tracked e.g. plasma widgets explorer and activities
160     QList<WindowId> m_whitelistedWindows;
161 
162     QPointer<KActivities::Consumer> m_activities;
163 
164     //! Sending too fast plenty of signals for the same window
165     //! has no reason and can create HIGH CPU usage. This Timer
166     //! can delay the batch sending of signals for the same window
167     WindowId m_windowChangedWaiting;
168     QTimer m_windowWaitingTimer;
169 
170     //! Plasma taskmanager rules ile
171     KSharedConfig::Ptr rulesConfig;
172 
173     void considerWindowChanged(WindowId wid);
174 
175     bool isIgnored(const WindowId &wid) const;
176     bool isRegisteredPlasmaIgnoredWindow(const WindowId &wid) const;
177     bool isWhitelistedWindow(const WindowId &wid) const;
178 
179     bool isFullScreenWindow(const QRect &wGeometry) const;
180     bool isPlasmaPanel(const QRect &wGeometry) const;
181     bool isSidepanel(const QRect &wGeometry) const;
182 
183     bool isVirtualDesktopNavigationWrappingAround() const;
184 
185 private slots:
186     void initKWinInterface();
187     void windowRemovedSlot(WindowId wid);
188 
189     void setIsShowingDesktop(const bool &showing);
190 
191     void onVirtualDesktopNavigationWrappingAroundChanged(bool navigationWrappingAround);
192 
193 private:
194     bool m_isShowingDesktop{false};
195 
196     bool m_isKWinInterfaceAvailable{false};
197     bool m_isVirtualDesktopNavigationWrappingAround{true};
198 
199     Latte::Corona *m_corona;
200     Tracker::Schemes *m_schemesTracker;
201     Tracker::Windows *m_windowsTracker;
202 
203     QDBusServiceWatcher *m_kwinServiceWatcher{nullptr};
204 };
205 
206 }
207 }
208 
209 #endif // ABSTRACTWINDOWINTERFACE_H
210