From 2220ae44c4c7f4868e8cf74639b2c0e5772dcbb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Tue, 5 May 2015 17:58:09 +0200 Subject: [PATCH] Create a plugin for each of the wayland backends Each of the backends becomes a plugin. This allows kwin_wayland to load the requested plugin and kwin itself doesn't need to link all the libraries needed. E.g. libdrm is no longer linked if running kwin_x11. Also this allows to create backends for the non-standard EGL platforms (examples could be raspberrypi or Android devices). --- CMakeLists.txt | 51 +----------- abstract_backend.h | 2 + abstract_egl_backend.h | 4 +- backends/CMakeLists.txt | 6 ++ backends/drm/CMakeLists.txt | 24 ++++++ backends/drm/drm.json | 3 + backends/drm/drm_backend.h | 2 + backends/fbdev/CMakeLists.txt | 16 ++++ backends/fbdev/fb_backend.h | 2 + backends/fbdev/fbdev.json | 3 + backends/wayland/CMakeLists.txt | 23 ++++++ backends/wayland/wayland.json | 3 + backends/wayland/wayland_backend.h | 2 + backends/x11/CMakeLists.txt | 19 +++++ backends/x11/x11.json | 3 + backends/x11/x11windowed_backend.cpp | 3 - backends/x11/x11windowed_backend.h | 4 +- composite.h | 2 +- cursor.h | 2 +- eglonxbackend.h | 2 +- logind.h | 2 +- main_wayland.cpp | 113 ++++++++++++++------------- main_wayland.h | 24 ------ options.h | 4 +- scene_opengl.h | 2 +- scene_qpainter.h | 2 +- screens.h | 2 +- udev.h | 7 +- virtual_terminal.h | 2 +- xcbutils.h | 2 +- 30 files changed, 189 insertions(+), 147 deletions(-) create mode 100644 backends/CMakeLists.txt create mode 100644 backends/drm/CMakeLists.txt create mode 100644 backends/drm/drm.json create mode 100644 backends/fbdev/CMakeLists.txt create mode 100644 backends/fbdev/fbdev.json create mode 100644 backends/wayland/CMakeLists.txt create mode 100644 backends/wayland/wayland.json create mode 100644 backends/x11/CMakeLists.txt create mode 100644 backends/x11/x11.json diff --git a/CMakeLists.txt b/CMakeLists.txt index e52ba841f9..23dd238ee7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -436,39 +436,9 @@ if(HAVE_WAYLAND) set(kwin_KDEINIT_SRCS ${kwin_KDEINIT_SRCS} abstract_backend.cpp - backends/fbdev/fb_backend.cpp - backends/fbdev/logging.cpp - backends/fbdev/scene_qpainter_fb_backend.cpp - backends/fbdev/screens_fb.cpp - backends/wayland/scene_qpainter_wayland_backend.cpp - backends/wayland/screens_wayland.cpp - backends/x11/scene_qpainter_x11_backend.cpp - backends/x11/screens_x11windowed.cpp virtual_terminal.cpp - backends/wayland/logging.cpp - backends/wayland/wayland_backend.cpp wayland_server.cpp - backends/x11/x11windowed_backend.cpp - backends/x11/logging.cpp ) - if(KWIN_HAVE_EGL AND Wayland_Egl_FOUND) - set(kwin_KDEINIT_SRCS ${kwin_KDEINIT_SRCS} backends/wayland/egl_wayland_backend.cpp) - endif() - if(HAVE_DRM) - set(kwin_KDEINIT_SRCS - ${kwin_KDEINIT_SRCS} - backends/drm/drm_backend.cpp - backends/drm/logging.cpp - backends/drm/screens_drm.cpp - backends/drm/scene_qpainter_drm_backend.cpp - ) - endif() - if(HAVE_GBM) - set(kwin_KDEINIT_SRCS - ${kwin_KDEINIT_SRCS} - backends/drm/egl_gbm_backend.cpp - ) - endif() if(HAVE_WAYLAND_CURSOR) set(kwin_KDEINIT_SRCS ${kwin_KDEINIT_SRCS} @@ -565,14 +535,6 @@ set(kwin_WAYLAND_LIBS ${CMAKE_THREAD_LIBS_INIT} ) -set(kwin_WAYLAND_EGL_LIBS - Wayland::Egl -) - -if(X11_XCB_FOUND) - set(kwin_WAYLAND_LIBS ${kwin_WAYLAND_LIBS} X11::XCB) -endif() - if(Wayland_Cursor_FOUND) set(kwin_WAYLAND_LIBS ${kwin_WAYLAND_LIBS} Wayland::Cursor) endif() @@ -595,9 +557,6 @@ set(kwinLibs if(HAVE_WAYLAND) set(kwinLibs ${kwinLibs} ${kwin_WAYLAND_LIBS}) - if(KWIN_HAVE_EGL AND Wayland_Egl_FOUND) - set(kwinLibs ${kwinLibs} ${kwin_WAYLAND_EGL_LIBS}) - endif() endif() if(UDEV_FOUND) @@ -608,14 +567,6 @@ if(HAVE_INPUT) set(kwinLibs ${kwinLibs} Libinput::Libinput) endif() -if(HAVE_DRM) - set(kwinLibs ${kwinLibs} Libdrm::Libdrm) -endif() - -if(HAVE_GBM) - set(kwinLibs ${kwinLibs} gbm::gbm) -endif() - add_library(kwin SHARED ${kwin_KDEINIT_SRCS}) set_target_properties(kwin PROPERTIES @@ -652,6 +603,8 @@ if(HAVE_WAYLAND) install(TARGETS kdeinit_kwin_wayland ${INSTALL_TARGETS_DEFAULT_ARGS} ) install(TARGETS kwin_wayland ${INSTALL_TARGETS_DEFAULT_ARGS} ) + + add_subdirectory(backends) endif() ########### install files ############### diff --git a/abstract_backend.h b/abstract_backend.h index 5dfc5d8894..04c1478a52 100644 --- a/abstract_backend.h +++ b/abstract_backend.h @@ -126,4 +126,6 @@ private: } +Q_DECLARE_INTERFACE(KWin::AbstractBackend, "org.kde.kwin.AbstractBackend") + #endif diff --git a/abstract_egl_backend.h b/abstract_egl_backend.h index 90100b0f35..c266521d3a 100644 --- a/abstract_egl_backend.h +++ b/abstract_egl_backend.h @@ -24,7 +24,7 @@ along with this program. If not, see . namespace KWin { -class AbstractEglBackend : public OpenGLBackend +class KWIN_EXPORT AbstractEglBackend : public OpenGLBackend { public: virtual ~AbstractEglBackend(); @@ -75,7 +75,7 @@ private: QList m_clientExtensions; }; -class AbstractEglTexture : public SceneOpenGL::TexturePrivate +class KWIN_EXPORT AbstractEglTexture : public SceneOpenGL::TexturePrivate { public: virtual ~AbstractEglTexture(); diff --git a/backends/CMakeLists.txt b/backends/CMakeLists.txt new file mode 100644 index 0000000000..4aeafa97d7 --- /dev/null +++ b/backends/CMakeLists.txt @@ -0,0 +1,6 @@ +if(HAVE_DRM) + add_subdirectory(drm) +endif() +add_subdirectory(fbdev) +add_subdirectory(wayland) +add_subdirectory(x11) diff --git a/backends/drm/CMakeLists.txt b/backends/drm/CMakeLists.txt new file mode 100644 index 0000000000..1fda8a0f7f --- /dev/null +++ b/backends/drm/CMakeLists.txt @@ -0,0 +1,24 @@ +set(DRM_SOURCES + drm_backend.cpp + logging.cpp + scene_qpainter_drm_backend.cpp + screens_drm.cpp +) + +if(HAVE_GBM) + set(DRM_SOURCES ${DRM_SOURCES} egl_gbm_backend.cpp) +endif() + +add_library(KWinWaylandDrmBackend MODULE ${DRM_SOURCES}) +target_link_libraries(KWinWaylandDrmBackend kwin Libdrm::Libdrm) + +if(HAVE_GBM) + target_link_libraries(KWinWaylandDrmBackend gbm::gbm) +endif() + +install( + TARGETS + KWinWaylandDrmBackend + DESTINATION + ${PLUGIN_INSTALL_DIR}/org.kde.kwin.waylandbackends/ +) diff --git a/backends/drm/drm.json b/backends/drm/drm.json new file mode 100644 index 0000000000..404bba5384 --- /dev/null +++ b/backends/drm/drm.json @@ -0,0 +1,3 @@ +{ + "input": false +} diff --git a/backends/drm/drm_backend.h b/backends/drm/drm_backend.h index 644b3ed791..814374cab3 100644 --- a/backends/drm/drm_backend.h +++ b/backends/drm/drm_backend.h @@ -48,6 +48,8 @@ class DrmOutput; class KWIN_EXPORT DrmBackend : public AbstractBackend { Q_OBJECT + Q_INTERFACES(KWin::AbstractBackend) + Q_PLUGIN_METADATA(IID "org.kde.kwin.AbstractBackend" FILE "drm.json") public: explicit DrmBackend(QObject *parent = nullptr); virtual ~DrmBackend(); diff --git a/backends/fbdev/CMakeLists.txt b/backends/fbdev/CMakeLists.txt new file mode 100644 index 0000000000..f0c1b54ebe --- /dev/null +++ b/backends/fbdev/CMakeLists.txt @@ -0,0 +1,16 @@ +set(FBDEV_SOURCES + fb_backend.cpp + logging.cpp + scene_qpainter_fb_backend.cpp + screens_fb.cpp +) + +add_library(KWinWaylandFbdevBackend MODULE ${FBDEV_SOURCES}) +target_link_libraries(KWinWaylandFbdevBackend kwin) + +install( + TARGETS + KWinWaylandFbdevBackend + DESTINATION + ${PLUGIN_INSTALL_DIR}/org.kde.kwin.waylandbackends/ +) diff --git a/backends/fbdev/fb_backend.h b/backends/fbdev/fb_backend.h index 1a6e39c897..99de9ad32e 100644 --- a/backends/fbdev/fb_backend.h +++ b/backends/fbdev/fb_backend.h @@ -30,6 +30,8 @@ namespace KWin class KWIN_EXPORT FramebufferBackend : public AbstractBackend { Q_OBJECT + Q_INTERFACES(KWin::AbstractBackend) + Q_PLUGIN_METADATA(IID "org.kde.kwin.AbstractBackend" FILE "fbdev.json") public: explicit FramebufferBackend(QObject *parent = nullptr); virtual ~FramebufferBackend(); diff --git a/backends/fbdev/fbdev.json b/backends/fbdev/fbdev.json new file mode 100644 index 0000000000..404bba5384 --- /dev/null +++ b/backends/fbdev/fbdev.json @@ -0,0 +1,3 @@ +{ + "input": false +} diff --git a/backends/wayland/CMakeLists.txt b/backends/wayland/CMakeLists.txt new file mode 100644 index 0000000000..a1670a34b1 --- /dev/null +++ b/backends/wayland/CMakeLists.txt @@ -0,0 +1,23 @@ +set(WAYLAND_BACKEND_SOURCES + logging.cpp + scene_qpainter_wayland_backend.cpp + screens_wayland.cpp + wayland_backend.cpp +) +if(KWIN_HAVE_EGL AND Wayland_Egl_FOUND) + set(WAYLAND_BACKEND_SOURCES ${WAYLAND_BACKEND_SOURCES} egl_wayland_backend.cpp) +endif() + +add_library(KWinWaylandWaylandBackend MODULE ${WAYLAND_BACKEND_SOURCES}) +target_link_libraries(KWinWaylandWaylandBackend kwin KF5::WaylandClient) + +if(KWIN_HAVE_EGL AND Wayland_Egl_FOUND) + target_link_libraries(KWinWaylandWaylandBackend Wayland::Egl) +endif() + +install( + TARGETS + KWinWaylandWaylandBackend + DESTINATION + ${PLUGIN_INSTALL_DIR}/org.kde.kwin.waylandbackends/ +) diff --git a/backends/wayland/wayland.json b/backends/wayland/wayland.json new file mode 100644 index 0000000000..1551bf5de1 --- /dev/null +++ b/backends/wayland/wayland.json @@ -0,0 +1,3 @@ +{ + "input": true +} diff --git a/backends/wayland/wayland_backend.h b/backends/wayland/wayland_backend.h index fa176d0b62..c0d58d2551 100644 --- a/backends/wayland/wayland_backend.h +++ b/backends/wayland/wayland_backend.h @@ -132,6 +132,8 @@ private: class KWIN_EXPORT WaylandBackend : public AbstractBackend { Q_OBJECT + Q_INTERFACES(KWin::AbstractBackend) + Q_PLUGIN_METADATA(IID "org.kde.kwin.AbstractBackend" FILE "wayland.json") public: explicit WaylandBackend(QObject *parent = nullptr); virtual ~WaylandBackend(); diff --git a/backends/x11/CMakeLists.txt b/backends/x11/CMakeLists.txt new file mode 100644 index 0000000000..9ce72fad1a --- /dev/null +++ b/backends/x11/CMakeLists.txt @@ -0,0 +1,19 @@ +set(X11BACKEND_SOURCES + logging.cpp + scene_qpainter_x11_backend.cpp + screens_x11windowed.cpp + x11windowed_backend.cpp +) + +add_library(KWinWaylandX11Backend MODULE ${X11BACKEND_SOURCES}) +target_link_libraries(KWinWaylandX11Backend kwin) +if(X11_XCB_FOUND) + target_link_libraries(KWinWaylandX11Backend X11::XCB) +endif() + +install( + TARGETS + KWinWaylandX11Backend + DESTINATION + ${PLUGIN_INSTALL_DIR}/org.kde.kwin.waylandbackends/ +) diff --git a/backends/x11/x11.json b/backends/x11/x11.json new file mode 100644 index 0000000000..1551bf5de1 --- /dev/null +++ b/backends/x11/x11.json @@ -0,0 +1,3 @@ +{ + "input": true +} diff --git a/backends/x11/x11windowed_backend.cpp b/backends/x11/x11windowed_backend.cpp index 8690258aaa..96cdbf3d2c 100644 --- a/backends/x11/x11windowed_backend.cpp +++ b/backends/x11/x11windowed_backend.cpp @@ -206,9 +206,6 @@ void X11WindowedBackend::handleClientMessage(xcb_client_message_event_t *event) void X11WindowedBackend::handleButtonPress(xcb_button_press_event_t *event) { - if (!input()) { - return; - } bool const pressed = (event->response_type & ~0x80) == XCB_BUTTON_PRESS; if (event->detail >= XCB_BUTTON_INDEX_4 && event->detail <= 7) { // wheel diff --git a/backends/x11/x11windowed_backend.h b/backends/x11/x11windowed_backend.h index 6bb1153b4f..3b1b4e9112 100644 --- a/backends/x11/x11windowed_backend.h +++ b/backends/x11/x11windowed_backend.h @@ -37,9 +37,11 @@ namespace KWin class KWIN_EXPORT X11WindowedBackend : public AbstractBackend { Q_OBJECT + Q_INTERFACES(KWin::AbstractBackend) + Q_PLUGIN_METADATA(IID "org.kde.kwin.AbstractBackend" FILE "x11.json") Q_PROPERTY(QSize size READ size NOTIFY sizeChanged) public: - X11WindowedBackend(QObject *parent); + X11WindowedBackend(QObject *parent = nullptr); virtual ~X11WindowedBackend(); void init() override; diff --git a/composite.h b/composite.h index 3daab16034..fc0ddd5288 100644 --- a/composite.h +++ b/composite.h @@ -49,7 +49,7 @@ private Q_SLOTS: void looseOwnership(); }; -class Compositor : public QObject { +class KWIN_EXPORT Compositor : public QObject { Q_OBJECT public: enum SuspendReason { NoReasonSuspend = 0, UserSuspend = 1<<0, BlockRuleSuspend = 1<<1, ScriptSuspend = 1<<2, AllReasonSuspend = 0xff }; diff --git a/cursor.h b/cursor.h index df224e4c2e..067afc8ef4 100644 --- a/cursor.h +++ b/cursor.h @@ -51,7 +51,7 @@ namespace KWin * fetch the position and warp pointer to set the position. It uses a timer based mouse polling and * can provide X11 cursors through the XCursor library. **/ -class Cursor : public QObject +class KWIN_EXPORT Cursor : public QObject { Q_OBJECT public: diff --git a/eglonxbackend.h b/eglonxbackend.h index 43f807e4ff..e0572c10d8 100644 --- a/eglonxbackend.h +++ b/eglonxbackend.h @@ -28,7 +28,7 @@ namespace KWin /** * @brief OpenGL Backend using Egl windowing system over an X overlay window. **/ -class EglOnXBackend : public AbstractEglBackend +class KWIN_EXPORT EglOnXBackend : public AbstractEglBackend { public: EglOnXBackend(); diff --git a/logind.h b/logind.h index 9a3f4563a8..a14601016f 100644 --- a/logind.h +++ b/logind.h @@ -30,7 +30,7 @@ class QDBusServiceWatcher; namespace KWin { -class LogindIntegration : public QObject +class KWIN_EXPORT LogindIntegration : public QObject { Q_OBJECT public: diff --git a/main_wayland.cpp b/main_wayland.cpp index 5580e251b6..602227c758 100644 --- a/main_wayland.cpp +++ b/main_wayland.cpp @@ -21,20 +21,17 @@ along with this program. If not, see . #include "workspace.h" #include // kwin -#include "backends/fbdev/fb_backend.h" -#if HAVE_DRM -#include "backends/drm/drm_backend.h" -#endif -#include "backends/wayland/wayland_backend.h" +#include "abstract_backend.h" #include "wayland_server.h" #include "xcbutils.h" -#include "backends/x11/x11windowed_backend.h" // KWayland #include #include // KDE #include +#include +#include // Qt #include #include @@ -98,45 +95,15 @@ void ApplicationWayland::performStartup() void ApplicationWayland::createBackend() { - AbstractBackend *backend = nullptr; - if (m_windowed) { - if (!m_waylandDisplay.isEmpty()) { - Wayland::WaylandBackend *b = new Wayland::WaylandBackend(this); - b->setDeviceIdentifier(m_waylandDisplay); - backend = b; + AbstractBackend *backend = waylandServer()->backend(); + connect(backend, &AbstractBackend::screensQueried, this, &ApplicationWayland::continueStartupWithScreens); + connect(backend, &AbstractBackend::initFailed, this, + [] () { + std::cerr << "FATAL ERROR: backend failed to initialize, exiting now" << std::endl; + ::exit(1); } - if (!backend && !m_x11Display.isEmpty()) { - KWin::X11WindowedBackend *x11Backend = new KWin::X11WindowedBackend(this); - x11Backend->setDeviceIdentifier(m_x11Display); - backend = x11Backend; - } - } -#if HAVE_DRM - if (m_drm) { - DrmBackend *b = new DrmBackend(this); - backend = b; - } -#endif - if (!m_framebuffer.isEmpty()) { - FramebufferBackend *b = new FramebufferBackend(this); - b->setDeviceIdentifier(m_framebuffer.toUtf8()); - backend = b; - } - - if (backend) { - connect(backend, &AbstractBackend::screensQueried, this, &ApplicationWayland::continueStartupWithScreens); - connect(backend, &AbstractBackend::initFailed, this, - [] () { - std::cerr << "FATAL ERROR: backend failed to initialize, exiting now" << std::endl; - ::exit(1); - } - ); - backend->setInitialWindowSize(m_backendSize); - backend->init(); - } else { - std::cerr << "FATAL ERROR: could not create a backend, exiting now" << std::endl; - ::exit(1); - } + ); + backend->init(); } void ApplicationWayland::continueStartupWithScreens() @@ -464,6 +431,9 @@ KWIN_EXPORT int kdemain(int argc, char * argv[]) KWin::Application::setUseLibinput(parser.isSet(libinputOption)); #endif + QString pluginName; + QSize initialWindowSize; + QByteArray deviceIdentifier; if (parser.isSet(windowedOption) && parser.isSet(framebufferOption)) { std::cerr << "FATAL ERROR Cannot have both --windowed and --framebuffer" << std::endl; return 1; @@ -473,10 +443,11 @@ KWIN_EXPORT int kdemain(int argc, char * argv[]) std::cerr << "FATAL ERROR Cannot have both --windowed/--framebuffer and --drm" << std::endl; return 1; } - a.setDrm(parser.isSet(drmOption)); + if (parser.isSet(drmOption)) { + pluginName = QStringLiteral("KWinWaylandDrmBackend"); + } #endif - a.setWindowed(parser.isSet(windowedOption)); if (parser.isSet(windowedOption)) { bool ok = false; const int width = parser.value(widthOption).toInt(&ok); @@ -489,20 +460,54 @@ KWIN_EXPORT int kdemain(int argc, char * argv[]) std::cerr << "FATAL ERROR incorrect value for height" << std::endl; return 1; } - a.setBackendSize(QSize(width, height)); + initialWindowSize = QSize(width, height); if (parser.isSet(x11DisplayOption)) { - a.setX11Display(parser.value(x11DisplayOption).toUtf8()); + deviceIdentifier = parser.value(x11DisplayOption).toUtf8(); } else if (!parser.isSet(waylandDisplayOption)) { - a.setX11Display(qgetenv("DISPLAY")); + deviceIdentifier = qgetenv("DISPLAY"); } - if (parser.isSet(waylandDisplayOption)) { - a.setWaylandDisplay(parser.value(waylandDisplayOption).toUtf8()); - } else if (!parser.isSet(x11DisplayOption)) { - a.setWaylandDisplay(qgetenv("WAYLAND_DISPLAY")); + if (!deviceIdentifier.isEmpty()) { + pluginName = QStringLiteral("KWinWaylandX11Backend"); + } else { + if (parser.isSet(waylandDisplayOption)) { + deviceIdentifier = parser.value(waylandDisplayOption).toUtf8(); + } else if (!parser.isSet(x11DisplayOption)) { + deviceIdentifier = qgetenv("WAYLAND_DISPLAY"); + } + if (!deviceIdentifier.isEmpty()) { + pluginName = QStringLiteral("KWinWaylandWaylandBackend"); + } } } if (parser.isSet(framebufferOption)) { - a.setFramebuffer(parser.value(framebufferDeviceOption)); + pluginName = QStringLiteral("KWinWaylandFbdevBackend"); + deviceIdentifier = parser.value(framebufferDeviceOption).toUtf8(); + } + + const auto pluginCandidates = KPluginLoader::findPlugins(QStringLiteral("org.kde.kwin.waylandbackends"), + [&pluginName] (const KPluginMetaData &plugin) { + return plugin.pluginId() == pluginName; + } + ); + if (pluginCandidates.isEmpty()) { + std::cerr << "FATAL ERROR: could not find a backend" << std::endl; + return 1; + } + for (const auto &candidate: pluginCandidates) { + if (qobject_cast(candidate.instantiate())) { + break; + } + } + if (!server->backend()) { + std::cerr << "FATAL ERROR: could not instantiate a backend" << std::endl; + return 1; + } + server->backend()->setParent(server); + if (!deviceIdentifier.isEmpty()) { + server->backend()->setDeviceIdentifier(deviceIdentifier); + } + if (initialWindowSize.isValid()) { + server->backend()->setInitialWindowSize(initialWindowSize); } a.setStartXwayland(parser.isSet(xwaylandOption)); diff --git a/main_wayland.h b/main_wayland.h index b8d93178d6..9189f92565 100644 --- a/main_wayland.h +++ b/main_wayland.h @@ -34,24 +34,6 @@ public: void setStartXwayland(bool start) { m_startXWayland = start; } - void setBackendSize(const QSize &size) { - m_backendSize = size; - } - void setWindowed(bool set) { - m_windowed = set; - } - void setX11Display(const QByteArray &display) { - m_x11Display = display; - } - void setWaylandDisplay(const QByteArray &display) { - m_waylandDisplay = display; - } - void setFramebuffer(const QString &fbdev) { - m_framebuffer = fbdev; - } - void setDrm(bool set) { - m_drm = set; - } void setApplicationsToStart(const QStringList &applications) { m_applicationsToStart = applications; } @@ -67,12 +49,6 @@ private: bool m_startXWayland = false; int m_xcbConnectionFd = -1; - QSize m_backendSize; - bool m_windowed = false; - QByteArray m_x11Display; - QByteArray m_waylandDisplay; - QString m_framebuffer; - bool m_drm = false; QStringList m_applicationsToStart; }; diff --git a/options.h b/options.h index 23967cf829..07c5193e3b 100644 --- a/options.h +++ b/options.h @@ -45,7 +45,7 @@ enum HiddenPreviews { class Settings; -class Options : public QObject +class KWIN_EXPORT Options : public QObject { Q_OBJECT Q_ENUMS(FocusPolicy) @@ -932,7 +932,7 @@ private: MouseCommand wheelToMouseCommand(MouseWheelCommand com, int delta) const; }; -extern Options* options; +extern KWIN_EXPORT Options* options; } // namespace diff --git a/scene_opengl.h b/scene_opengl.h index 06d23485b5..44a1e8932a 100644 --- a/scene_opengl.h +++ b/scene_opengl.h @@ -370,7 +370,7 @@ private: * * @author Martin Gräßlin **/ -class OpenGLBackend +class KWIN_EXPORT OpenGLBackend { public: OpenGLBackend(); diff --git a/scene_qpainter.h b/scene_qpainter.h index 23b579ee86..a9c97a2ec9 100644 --- a/scene_qpainter.h +++ b/scene_qpainter.h @@ -31,7 +31,7 @@ namespace Xcb { class Shm; } -class QPainterBackend +class KWIN_EXPORT QPainterBackend { public: virtual ~QPainterBackend(); diff --git a/screens.h b/screens.h index 0d8369e337..cc54cdcec8 100644 --- a/screens.h +++ b/screens.h @@ -34,7 +34,7 @@ namespace KWin { class Client; -class Screens : public QObject +class KWIN_EXPORT Screens : public QObject { Q_OBJECT Q_PROPERTY(int count READ count WRITE setCount NOTIFY countChanged) diff --git a/udev.h b/udev.h index e6bc80307c..a88fb25121 100644 --- a/udev.h +++ b/udev.h @@ -20,6 +20,7 @@ along with this program. If not, see . #ifndef KWIN_UDEV_H #define KWIN_UDEV_H #include +#include struct udev; struct udev_device; @@ -29,7 +30,7 @@ namespace KWin { class Udev; -class UdevDevice +class KWIN_EXPORT UdevDevice { public: UdevDevice(udev_device *device); @@ -53,7 +54,7 @@ private: udev_device *m_device; }; -class UdevMonitor +class KWIN_EXPORT UdevMonitor { public: explicit UdevMonitor(Udev *udev); @@ -72,7 +73,7 @@ private: udev_monitor *m_monitor; }; -class Udev +class KWIN_EXPORT Udev { public: Udev(); diff --git a/virtual_terminal.h b/virtual_terminal.h index 84bd80ff6c..8b40beeb8f 100644 --- a/virtual_terminal.h +++ b/virtual_terminal.h @@ -28,7 +28,7 @@ class QSocketNotifier; namespace KWin { -class VirtualTerminal : public QObject +class KWIN_EXPORT VirtualTerminal : public QObject { Q_OBJECT public: diff --git a/xcbutils.h b/xcbutils.h index 7ff7a8902a..2b9a6c8f83 100644 --- a/xcbutils.h +++ b/xcbutils.h @@ -1192,7 +1192,7 @@ public: QVector errorCodes; }; -class Extensions +class KWIN_EXPORT Extensions { public: bool isShapeAvailable() const {