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 {