File indexing completed on 2024-04-28 05:30:34

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #pragma once
0010 
0011 #include "effect/globals.h"
0012 
0013 #include <QObject>
0014 #include <QPointer>
0015 #include <QSet>
0016 
0017 namespace KWin
0018 {
0019 
0020 class AppMenuManagerInterface;
0021 class ClientConnection;
0022 class CompositorInterface;
0023 class Display;
0024 class DataDeviceInterface;
0025 class IdleInterface;
0026 class InputMethodV1Interface;
0027 class SeatInterface;
0028 class DataDeviceManagerInterface;
0029 class ServerSideDecorationManagerInterface;
0030 class ServerSideDecorationPaletteManagerInterface;
0031 class SurfaceInterface;
0032 class OutputInterface;
0033 class PlasmaShellInterface;
0034 class PlasmaWindowActivationFeedbackInterface;
0035 class PlasmaVirtualDesktopManagementInterface;
0036 class PlasmaWindowManagementInterface;
0037 class OutputDeviceV2Interface;
0038 class OutputManagementV2Interface;
0039 class XdgExportedSurface;
0040 class XdgForeignV2Interface;
0041 class XdgOutputManagerV1Interface;
0042 class DrmClientBufferIntegration;
0043 class LinuxDmaBufV1ClientBufferIntegration;
0044 class TabletManagerV2Interface;
0045 class KeyboardShortcutsInhibitManagerV1Interface;
0046 class XdgDecorationManagerV1Interface;
0047 class XWaylandKeyboardGrabManagerV1Interface;
0048 class ContentTypeManagerV1Interface;
0049 class DrmLeaseManagerV1;
0050 class TearingControlManagerV1Interface;
0051 class XwaylandShellV1Interface;
0052 class OutputOrderV1Interface;
0053 class Window;
0054 class Output;
0055 class XdgActivationV1Integration;
0056 class XdgPopupWindow;
0057 class XdgSurfaceWindow;
0058 class XdgToplevelWindow;
0059 class PresentationTime;
0060 class XXColorManagerV2;
0061 
0062 class KWIN_EXPORT WaylandServer : public QObject
0063 {
0064     Q_OBJECT
0065 
0066 public:
0067     enum class InitializationFlag {
0068         NoOptions = 0x0,
0069         LockScreen = 0x1,
0070         NoLockScreenIntegration = 0x2,
0071         NoGlobalShortcuts = 0x4
0072     };
0073 
0074     Q_DECLARE_FLAGS(InitializationFlags, InitializationFlag)
0075 
0076     ~WaylandServer() override;
0077     bool init(const QString &socketName, InitializationFlags flags = InitializationFlag::NoOptions);
0078     bool init(InitializationFlags flags = InitializationFlag::NoOptions);
0079 
0080     bool start();
0081 
0082     Display *display() const
0083     {
0084         return m_display;
0085     }
0086     CompositorInterface *compositor() const
0087     {
0088         return m_compositor;
0089     }
0090     SeatInterface *seat() const
0091     {
0092         return m_seat;
0093     }
0094     TabletManagerV2Interface *tabletManagerV2() const
0095     {
0096         return m_tabletManagerV2;
0097     }
0098     DataDeviceManagerInterface *dataDeviceManager() const
0099     {
0100         return m_dataDeviceManager;
0101     }
0102     PlasmaWindowActivationFeedbackInterface *plasmaActivationFeedback() const
0103     {
0104         return m_plasmaActivationFeedback;
0105     }
0106     PlasmaVirtualDesktopManagementInterface *virtualDesktopManagement() const
0107     {
0108         return m_virtualDesktopManagement;
0109     }
0110     PlasmaWindowManagementInterface *windowManagement() const
0111     {
0112         return m_windowManagement;
0113     }
0114     ServerSideDecorationManagerInterface *decorationManager() const
0115     {
0116         return m_decorationManager;
0117     }
0118     XdgOutputManagerV1Interface *xdgOutputManagerV1() const
0119     {
0120         return m_xdgOutputManagerV1;
0121     }
0122     KeyboardShortcutsInhibitManagerV1Interface *keyboardShortcutsInhibitManager() const
0123     {
0124         return m_keyboardShortcutsInhibitManager;
0125     }
0126     XwaylandShellV1Interface *xwaylandShell() const
0127     {
0128         return m_xwaylandShell;
0129     }
0130 
0131     bool isKeyboardShortcutsInhibited() const;
0132 
0133     DrmClientBufferIntegration *drm();
0134     LinuxDmaBufV1ClientBufferIntegration *linuxDmabuf();
0135 
0136     InputMethodV1Interface *inputMethod() const
0137     {
0138         return m_inputMethod;
0139     }
0140     IdleInterface *idle() const
0141     {
0142         return m_idle;
0143     }
0144     QList<Window *> windows() const
0145     {
0146         return m_windows;
0147     }
0148     void removeWindow(Window *c);
0149     Window *findWindow(const SurfaceInterface *surface) const;
0150     XdgToplevelWindow *findXdgToplevelWindow(SurfaceInterface *surface) const;
0151     XdgSurfaceWindow *findXdgSurfaceWindow(SurfaceInterface *surface) const;
0152 
0153     /**
0154      * @returns a transient parent of a surface imported with the foreign protocol, if any
0155      */
0156     SurfaceInterface *findForeignTransientForSurface(SurfaceInterface *surface);
0157 
0158     /**
0159      * Exports a surface with the foreign protocol
0160      */
0161     XdgExportedSurface *exportAsForeign(SurfaceInterface *surface);
0162 
0163     /**
0164      * @returns file descriptor for Xwayland to connect to.
0165      */
0166     int createXWaylandConnection();
0167     void destroyXWaylandConnection();
0168 
0169     /**
0170      * @returns file descriptor to the input method server's socket.
0171      */
0172     int createInputMethodConnection();
0173     void destroyInputMethodConnection();
0174 
0175     /**
0176      * @returns true if screen is locked.
0177      */
0178     bool isScreenLocked() const;
0179     /**
0180      * @returns whether integration with KScreenLocker is available.
0181      */
0182     bool hasScreenLockerIntegration() const;
0183 
0184     /**
0185      * @returns whether any kind of global shortcuts are supported.
0186      */
0187     bool hasGlobalShortcutSupport() const;
0188 
0189     void initWorkspace();
0190 
0191     ClientConnection *xWaylandConnection() const;
0192     ClientConnection *inputMethodConnection() const;
0193     ClientConnection *screenLockerClientConnection() const
0194     {
0195         return m_screenLockerClientConnection;
0196     }
0197 
0198     /**
0199      * Struct containing information for a created Wayland connection through a
0200      * socketpair.
0201      */
0202     struct SocketPairConnection
0203     {
0204         /**
0205          * ServerSide Connection
0206          */
0207         ClientConnection *connection = nullptr;
0208         /**
0209          * client-side file descriptor for the socket
0210          */
0211         int fd = -1;
0212     };
0213     /**
0214      * Creates a Wayland connection using a socket pair.
0215      */
0216     SocketPairConnection createConnection();
0217 
0218     /**
0219      * Returns the first socket name that can be used to connect to this server.
0220      * For a full list, use display()->socketNames()
0221      */
0222     QString socketName() const;
0223 
0224     XdgActivationV1Integration *xdgActivationIntegration() const
0225     {
0226         return m_xdgActivationIntegration;
0227     }
0228 
0229 Q_SIGNALS:
0230     void windowAdded(KWin::Window *);
0231     void windowRemoved(KWin::Window *);
0232     void initialized();
0233     void foreignTransientChanged(KWin::SurfaceInterface *child);
0234     void lockStateChanged();
0235 
0236 private:
0237     int createScreenLockerConnection();
0238     void initScreenLocker();
0239     void registerXdgGenericWindow(Window *window);
0240     void registerXdgToplevelWindow(XdgToplevelWindow *window);
0241     void registerXdgPopupWindow(XdgPopupWindow *window);
0242     void registerWindow(Window *window);
0243     void handleOutputAdded(Output *output);
0244     void handleOutputRemoved(Output *output);
0245     void handleOutputEnabled(Output *output);
0246     void handleOutputDisabled(Output *output);
0247 
0248     class LockScreenPresentationWatcher : public QObject
0249     {
0250     public:
0251         LockScreenPresentationWatcher(WaylandServer *server);
0252 
0253     private:
0254         QSet<Output *> m_signaledOutputs;
0255     };
0256 
0257     Display *m_display = nullptr;
0258     CompositorInterface *m_compositor = nullptr;
0259     SeatInterface *m_seat = nullptr;
0260     TabletManagerV2Interface *m_tabletManagerV2 = nullptr;
0261     DataDeviceManagerInterface *m_dataDeviceManager = nullptr;
0262     PlasmaShellInterface *m_plasmaShell = nullptr;
0263     PlasmaWindowActivationFeedbackInterface *m_plasmaActivationFeedback = nullptr;
0264     PlasmaWindowManagementInterface *m_windowManagement = nullptr;
0265     PlasmaVirtualDesktopManagementInterface *m_virtualDesktopManagement = nullptr;
0266     ServerSideDecorationManagerInterface *m_decorationManager = nullptr;
0267     OutputManagementV2Interface *m_outputManagement = nullptr;
0268     AppMenuManagerInterface *m_appMenuManager = nullptr;
0269     ServerSideDecorationPaletteManagerInterface *m_paletteManager = nullptr;
0270     IdleInterface *m_idle = nullptr;
0271     XdgOutputManagerV1Interface *m_xdgOutputManagerV1 = nullptr;
0272     XdgDecorationManagerV1Interface *m_xdgDecorationManagerV1 = nullptr;
0273     DrmClientBufferIntegration *m_drm = nullptr;
0274     LinuxDmaBufV1ClientBufferIntegration *m_linuxDmabuf = nullptr;
0275     KeyboardShortcutsInhibitManagerV1Interface *m_keyboardShortcutsInhibitManager = nullptr;
0276     QPointer<ClientConnection> m_xwaylandConnection;
0277     InputMethodV1Interface *m_inputMethod = nullptr;
0278     QPointer<ClientConnection> m_inputMethodServerConnection;
0279     ClientConnection *m_screenLockerClientConnection = nullptr;
0280     XdgForeignV2Interface *m_XdgForeign = nullptr;
0281     XdgActivationV1Integration *m_xdgActivationIntegration = nullptr;
0282     XWaylandKeyboardGrabManagerV1Interface *m_xWaylandKeyboardGrabManager = nullptr;
0283     ContentTypeManagerV1Interface *m_contentTypeManager = nullptr;
0284     TearingControlManagerV1Interface *m_tearingControlInterface = nullptr;
0285     XwaylandShellV1Interface *m_xwaylandShell = nullptr;
0286     PresentationTime *m_presentationTime = nullptr;
0287     QList<Window *> m_windows;
0288     InitializationFlags m_initFlags;
0289     QHash<Output *, OutputInterface *> m_waylandOutputs;
0290     QHash<Output *, OutputDeviceV2Interface *> m_waylandOutputDevices;
0291     DrmLeaseManagerV1 *m_leaseManager = nullptr;
0292     OutputOrderV1Interface *m_outputOrder = nullptr;
0293     XXColorManagerV2 *m_xxColorManager = nullptr;
0294     KWIN_SINGLETON(WaylandServer)
0295 };
0296 
0297 inline WaylandServer *waylandServer()
0298 {
0299     return WaylandServer::self();
0300 }
0301 
0302 } // namespace KWin