File indexing completed on 2024-05-05 16:19:52

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