1 /*
2     SPDX-FileCopyrightText: 2019 Michail Vourlakos <mvourlakos@gmail.com>
3     SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 
6 #ifndef WINDOWSYSTEMLASTACTIVEWINDOW_H
7 #define WINDOWSYSTEMLASTACTIVEWINDOW_H
8 
9 // local
10 #include "../windowinfowrap.h"
11 #include "../abstractwindowinterface.h"
12 
13 // Qt
14 #include <QObject>
15 #include <QRect>
16 
17 namespace Latte {
18 class View;
19 namespace WindowSystem {
20 class AbstractWindowInterface;
21 namespace Tracker {
22 class TrackedGeneralInfo;
23 class Windows;
24 }
25 }
26 }
27 
28 namespace Latte {
29 namespace WindowSystem {
30 namespace Tracker {
31 
32 class LastActiveWindow : public QObject {
33     Q_OBJECT
34     Q_PROPERTY(bool isValid READ isValid NOTIFY isValidChanged)
35 
36     Q_PROPERTY(bool isActive READ isActive NOTIFY isActiveChanged)
37     Q_PROPERTY(bool isMinimized READ isMinimized NOTIFY isMinimizedChanged)
38     Q_PROPERTY(bool isMaximized READ isMaximized NOTIFY isMaximizedChanged)
39     Q_PROPERTY(bool isFullScreen READ isFullScreen NOTIFY isFullScreenChanged)
40     Q_PROPERTY(bool isKeepAbove READ isKeepAbove NOTIFY isKeepAboveChanged)
41     Q_PROPERTY(bool isOnAllDesktops  READ isOnAllDesktops NOTIFY isOnAllDesktopsChanged)
42     Q_PROPERTY(bool isShaded READ isShaded NOTIFY isShadedChanged)
43     Q_PROPERTY(bool hasSkipTaskbar READ hasSkipTaskbar NOTIFY hasSkipTaskbarChanged)
44 
45     //! BEGIN: Window Abitilities
46     /*since Latte v0.9.8*/
47     Q_PROPERTY(bool isClosable READ isClosable NOTIFY isClosableChanged)
48     Q_PROPERTY(bool isFullScreenable READ isFullScreenable NOTIFY isFullScreenableChanged)
49     Q_PROPERTY(bool isGroupable READ isGroupable NOTIFY isGroupableChanged)
50     Q_PROPERTY(bool isMaximizable READ isMaximizable NOTIFY isMaximizableChanged)
51     Q_PROPERTY(bool isMinimizable READ isMinimizable NOTIFY isMinimizableChanged)
52     Q_PROPERTY(bool isMovable READ isMovable NOTIFY isMovableChanged)
53     Q_PROPERTY(bool isResizable READ isResizable NOTIFY isResizableChanged)
54     Q_PROPERTY(bool isShadeable READ isShadeable NOTIFY isShadeableChanged)
55     Q_PROPERTY(bool isVirtualDesktopChangeable READ isVirtualDesktopChangeable NOTIFY isVirtualDesktopChangeableChanged)
56     //! END: Window Abitilities
57 
58     /*since Latte v0.9.4*/
59     Q_PROPERTY(QString colorScheme READ colorScheme NOTIFY colorSchemeChanged)
60 
61     Q_PROPERTY(QString appName READ appName NOTIFY appNameChanged)
62     Q_PROPERTY(QString display READ display NOTIFY displayChanged)
63     Q_PROPERTY(QRect geometry READ geometry NOTIFY geometryChanged)
64 
65     Q_PROPERTY(QIcon icon READ icon NOTIFY iconChanged)
66 
67     Q_PROPERTY(QVariant winId READ currentWinId NOTIFY currentWinIdChanged)
68 
69 public:
70     LastActiveWindow(TrackedGeneralInfo *trackedInfo);
71     ~LastActiveWindow() override;
72 
73     bool isValid() const;
74     bool isActive() const;
75     bool isMinimized() const;
76     bool isMaximized() const;
77     bool isFullScreen() const;
78     bool isKeepAbove() const;
79     bool isOnAllDesktops() const;
80     bool isShaded() const;
81     bool hasSkipTaskbar() const;
82 
83     //! BEGIN: Window Abitilities
84     /*since Latte v0.9.8*/
85     bool isClosable() const;
86     bool isFullScreenable() const;
87     bool isGroupable() const;
88     bool isMaximizable() const;
89     bool isMinimizable() const;
90     bool isMovable() const;
91     bool isResizable() const;
92     bool isShadeable() const;
93     bool isVirtualDesktopChangeable() const;
94     //! END: Window Abitilities
95 
96     QString appName() const;
97     QString colorScheme() const;
98     QString display() const;
99 
100     QRect geometry() const;
101     QIcon icon() const;
102 
103     QVariant currentWinId() const;
104 
105     void setInformation(const WindowInfoWrap &info);
106 
107 public slots:
108     Q_INVOKABLE void requestActivate();
109     Q_INVOKABLE void requestClose();
110     Q_INVOKABLE void requestToggleIsOnAllDesktops();
111     Q_INVOKABLE void requestToggleKeepAbove();
112     Q_INVOKABLE void requestToggleMinimized();
113     Q_INVOKABLE void requestToggleMaximized();
114 
115     Q_INVOKABLE bool canBeDragged();
116 
117     void requestMove(Latte::View *fromView, int localX, int localY);
118 
119     //! Debug
120     void printHistory();
121 
122 private slots:
123     void updateInformationFromHistory();
124 
125     void applicationDataChanged(const WindowId &wid);
126 
127     void windowChanged(const WindowId &wid);
128     void windowRemoved(const WindowId &wid);
129 
130 signals:
131     void colorSchemeChanged();
132     void iconChanged();
133     void isActiveChanged();
134     void isMinimizedChanged();
135     void isMaximizedChanged();
136     void isFullScreenChanged();
137     void isKeepAboveChanged();
138     void isOnAllDesktopsChanged();
139     void isShadedChanged();
140     void isValidChanged();
141     void hasSkipTaskbarChanged();
142 
143     //! BEGIN: Window Abitilities
144     /*since Latte v0.9.8*/
145     void isClosableChanged();
146     void isFullScreenableChanged();
147     void isGroupableChanged();
148     void isMaximizableChanged();
149     void isMinimizableChanged();
150     void isMovableChanged();
151     void isResizableChanged();
152     void isShadeableChanged();
153     void isVirtualDesktopChangeableChanged();
154     //! END: Window Abitilities
155 
156     void appNameChanged();
157     void displayChanged();
158 
159     void geometryChanged();
160     void currentWinIdChanged();
161 
162     //! Debug
163     void printRequested();
164 
165 private:
166     void setActive(bool active);
167     void setIsMinimized(bool minimized);
168     void setIsMaximized(bool maximized);
169     void setIsFullScreen(bool fullscreen);
170     void setIsKeepAbove(bool above);
171     void setIsOnAllDesktops(bool all);
172     void setIsShaded(bool shaded);
173     void setIsValid(bool valid);
174     void setHasSkipTaskbar(bool skip);
175 
176     //! BEGIN: Window Abitilities
177     /*since Latte v0.9.8*/
178     void setIsClosable(bool closable);
179     void setIsFullScreenable(bool fullscreenable);
180     void setIsGroupable(bool groupable);
181     void setIsMaximizable(bool maximizable);
182     void setIsMinimizable(bool minimizable);
183     void setIsMovable(bool movable);
184     void setIsResizable(bool resizable);
185     void setIsShadeable(bool shadeable);
186     void setIsVirtualDesktopsChangeable(bool virtualdestkopschangeable);
187     //! END: Window Abitilities
188 
189     void setColorScheme(QString scheme);
190 
191     void setAppName(QString appName);
192     void setDisplay(QString display);
193 
194     void setGeometry(QRect geometry);
195     void setIcon(QIcon icon);
196 
197     void setCurrentWinId(QVariant winId);
198 
199     void cleanHistory();
200     void appendInHistory(const QVariant &wid);
201     void removeFromHistory(const QVariant &wid);
202 
203     void updateColorScheme();
204 
205 private:
206     bool m_isActive{false};
207     bool m_isMinimized{false};
208     bool m_isMaximized{false};
209     bool m_isFullScreen{false};
210     bool m_isKeepAbove{false};
211     bool m_isOnAllDesktops{false};
212     bool m_isShaded{false};
213     bool m_isValid{false};
214     bool m_hasSkipTaskbar{false};
215 
216     //! BEGIN: Window Abitilities
217     /*since Latte v0.9.8*/
218     bool m_isClosable{true};
219     bool m_isFullScreenable{true};
220     bool m_isGroupable{true};
221     bool m_isMaximizable{true};
222     bool m_isMinimizable{true};
223     bool m_isMovable{true};
224     bool m_isResizable{true};
225     bool m_isShadeable{true};
226     bool m_isVirtualDesktopsChangeable{true};
227     //! END: Window Abitilities
228 
229     QString m_colorScheme;
230 
231     QString m_appName;
232     QString m_display;
233 
234     QRect m_geometry;
235     QIcon m_icon;
236 
237     QVariant m_currentWinId;
238 
239     QList<WindowId> m_history;
240 
241     TrackedGeneralInfo *m_trackedInfo{nullptr};
242     AbstractWindowInterface *m_wm{nullptr};
243     Tracker::Windows *m_windowsTracker{nullptr};
244 };
245 
246 }
247 }
248 }
249 
250 #endif
251