File indexing completed on 2024-05-05 12:24:31
0001 /* 0002 SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #ifndef KWINDOWSYSTEM_P_X11_H 0008 #define KWINDOWSYSTEM_P_X11_H 0009 0010 #include "kwindowsystem_p.h" 0011 #include "netwm.h" 0012 0013 #include <QAbstractNativeEventFilter> 0014 #include <memory> 0015 0016 class NETEventFilter; 0017 0018 class KWindowSystemPrivateX11 : public KWindowSystemPrivate 0019 { 0020 public: 0021 QList<WId> windows() override; 0022 QList<WId> stackingOrder() override; 0023 WId activeWindow() override; 0024 void activateWindow(WId win, long time) override; 0025 void forceActiveWindow(WId win, long time) override; 0026 #if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 101) 0027 void demandAttention(WId win, bool set) override; 0028 #endif 0029 bool compositingActive() override; 0030 int currentDesktop() override; 0031 int numberOfDesktops() override; 0032 void setCurrentDesktop(int desktop) override; 0033 void setOnAllDesktops(WId win, bool b) override; 0034 void setOnDesktop(WId win, int desktop) override; 0035 void setOnActivities(WId win, const QStringList &activities) override; 0036 #if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 0) 0037 WId transientFor(WId window) override; 0038 WId groupLeader(WId window) override; 0039 #endif 0040 QPixmap icon(WId win, int width, int height, bool scale, int flags) override; 0041 QPixmap iconFromNetWinInfo(int width, int height, bool scale, int flags, NETWinInfo *info) override; 0042 #if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 101) 0043 void setIcons(WId win, const QPixmap &icon, const QPixmap &miniIcon) override; 0044 #endif 0045 void setType(WId win, NET::WindowType windowType) override; 0046 void setState(WId win, NET::States state) override; 0047 void clearState(WId win, NET::States state) override; 0048 void minimizeWindow(WId win) override; 0049 void unminimizeWindow(WId win) override; 0050 void raiseWindow(WId win) override; 0051 void lowerWindow(WId win) override; 0052 bool icccmCompliantMappingState() override; 0053 QRect workArea(int desktop) override; 0054 QRect workArea(const QList<WId> &excludes, int desktop) override; 0055 QString desktopName(int desktop) override; 0056 void setDesktopName(int desktop, const QString &name) override; 0057 bool showingDesktop() override; 0058 void setShowingDesktop(bool showing) override; 0059 void setUserTime(WId win, long time) override; 0060 void setExtendedStrut(WId win, 0061 int left_width, 0062 int left_start, 0063 int left_end, 0064 int right_width, 0065 int right_start, 0066 int right_end, 0067 int top_width, 0068 int top_start, 0069 int top_end, 0070 int bottom_width, 0071 int bottom_start, 0072 int bottom_end) override; 0073 void setStrut(WId win, int left, int right, int top, int bottom) override; 0074 bool allowedActionsSupported() override; 0075 QString readNameProperty(WId window, unsigned long atom) override; 0076 void allowExternalProcessWindowActivation(int pid) override; 0077 void setBlockingCompositing(WId window, bool active) override; 0078 bool mapViewport() override; 0079 int viewportToDesktop(const QPoint &pos) override; 0080 int viewportWindowToDesktop(const QRect &r) override; 0081 QPoint desktopToViewport(int desktop, bool absolute) override; 0082 QPoint constrainViewportRelativePosition(const QPoint &pos) override; 0083 0084 void connectNotify(const QMetaMethod &signal) override; 0085 0086 enum FilterInfo { 0087 INFO_BASIC = 1, // desktop info, not per-window 0088 INFO_WINDOWS = 2, // also per-window info 0089 }; 0090 0091 private: 0092 void init(FilterInfo info); 0093 NETEventFilter *s_d_func() 0094 { 0095 return d.get(); 0096 } 0097 std::unique_ptr<NETEventFilter> d; 0098 }; 0099 0100 class MainThreadInstantiator : public QObject 0101 { 0102 Q_OBJECT 0103 0104 public: 0105 MainThreadInstantiator(KWindowSystemPrivateX11::FilterInfo _what); 0106 Q_INVOKABLE NETEventFilter *createNETEventFilter(); 0107 0108 private: 0109 KWindowSystemPrivateX11::FilterInfo m_what; 0110 }; 0111 0112 class NETEventFilter : public NETRootInfo, public QAbstractNativeEventFilter 0113 { 0114 public: 0115 NETEventFilter(KWindowSystemPrivateX11::FilterInfo _what); 0116 ~NETEventFilter() override; 0117 void activate(); 0118 QList<WId> windows; 0119 QList<WId> stackingOrder; 0120 0121 struct StrutData { 0122 StrutData(WId window_, const NETStrut &strut_, int desktop_) 0123 : window(window_) 0124 , strut(strut_) 0125 , desktop(desktop_) 0126 { 0127 } 0128 WId window; 0129 NETStrut strut; 0130 int desktop; 0131 }; 0132 QList<StrutData> strutWindows; 0133 QList<WId> possibleStrutWindows; 0134 bool strutSignalConnected; 0135 bool compositingEnabled; 0136 bool haveXfixes; 0137 KWindowSystemPrivateX11::FilterInfo what; 0138 int xfixesEventBase; 0139 bool mapViewport(); 0140 0141 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 0142 bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *) override; 0143 #else 0144 bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override; 0145 #endif 0146 0147 void updateStackingOrder(); 0148 bool removeStrutWindow(WId); 0149 0150 protected: 0151 void addClient(xcb_window_t) override; 0152 void removeClient(xcb_window_t) override; 0153 0154 private: 0155 bool nativeEventFilter(xcb_generic_event_t *event); 0156 xcb_window_t winId; 0157 xcb_window_t m_appRootWindow; 0158 }; 0159 0160 #endif