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