From 045da603a45f355a6feba8d9e1fe16ab30ce862c Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 22 Jul 2022 17:22:09 +0300 Subject: [PATCH] Make backends part of libkwin Platform backends are provided as plugins. This is great for extensibility, but the disadvantages of this design outweigh the benefits. The number of backends will be limited, it's safe to say that we will have to maintain three backends for many years to come - kms/drm, virtual, and wayland. The plugin system adds unnecessary complexity. Startup logic is affected too. At the moment, platform backends provide the session object, which is awkward as it starts adding dependencies between backends. It will be nicer if the session is created depending on the loaded session type. In some cases, wayland code needs to talk to the backend directly, e.g. for drm leasing, etc. With the plugin architecture it's hard to do that. Not impossible though, we can approach it as in Qt 6, but it's still harder than linking the code directly. Of course, the main disadvantage of shipping backends in a lib is that you will need to patch kwin if you need a custom platform, however such cases will be rare. Despite that disadvantage, I still think that it's a step in the right direction where the goal is to have multi-purpose backends and other reusable components of kwin. The legacy X11 standalone platform is linked directly to kwin_x11 executable, while the remaining backends are linked to libkwin. --- autotests/integration/kwin_wayland_test.cpp | 8 +- autotests/test_x11_timestamp_update.cpp | 16 -- src/CMakeLists.txt | 1 + src/backends/drm/CMakeLists.txt | 13 +- src/backends/drm/drm.json | 92 --------- src/backends/drm/drm_backend.h | 3 +- src/backends/virtual/CMakeLists.txt | 13 +- src/backends/virtual/egl_gbm_backend.cpp | 2 +- src/backends/virtual/virtual.json | 92 --------- src/backends/virtual/virtual_backend.h | 2 - src/backends/wayland/CMakeLists.txt | 18 +- src/backends/wayland/wayland.json | 91 -------- src/backends/wayland/wayland_backend.h | 3 +- src/backends/x11/common/CMakeLists.txt | 3 +- src/backends/x11/common/eglonxbackend.cpp | 6 +- src/backends/x11/standalone/CMakeLists.txt | 12 +- src/backends/x11/standalone/eglbackend.h | 2 +- src/backends/x11/standalone/glxbackend.cpp | 4 +- .../x11/standalone/non_composited_outline.cpp | 2 +- src/backends/x11/standalone/x11.json | 90 -------- src/backends/x11/standalone/x11_platform.cpp | 2 +- src/backends/x11/standalone/x11_platform.h | 3 +- .../x11/standalone/xinputintegration.cpp | 3 +- src/backends/x11/windowed/CMakeLists.txt | 15 +- src/backends/x11/windowed/egl_x11_backend.h | 2 +- .../x11/windowed/x11windowed_backend.cpp | 4 +- .../x11/windowed/x11windowed_backend.h | 3 +- src/main.cpp | 14 +- src/main.h | 6 +- src/main_wayland.cpp | 195 +++++++----------- src/main_x11.cpp | 16 +- src/platform.h | 4 +- 32 files changed, 117 insertions(+), 623 deletions(-) delete mode 100644 src/backends/drm/drm.json delete mode 100644 src/backends/virtual/virtual.json delete mode 100644 src/backends/wayland/wayland.json delete mode 100644 src/backends/x11/standalone/x11.json diff --git a/autotests/integration/kwin_wayland_test.cpp b/autotests/integration/kwin_wayland_test.cpp index f315bf0872..77bf19939d 100644 --- a/autotests/integration/kwin_wayland_test.cpp +++ b/autotests/integration/kwin_wayland_test.cpp @@ -8,6 +8,7 @@ */ #include "kwin_wayland_test.h" +#include "backends/virtual/virtual_backend.h" #include "composite.h" #include "effects.h" #include "inputmethod.h" @@ -67,12 +68,7 @@ WaylandTestApplication::WaylandTestApplication(OperationMode mode, int &argc, ch removeLibraryPath(ownPath); addLibraryPath(ownPath); - const KPluginMetaData plugin = KPluginMetaData::findPluginById(QStringLiteral("org.kde.kwin.waylandbackends"), "KWinWaylandVirtualBackend"); - if (!plugin.isValid()) { - quit(); - return; - } - initPlatform(plugin); + setPlatform(std::make_unique()); WaylandServer::create(this); setProcessStartupEnvironment(QProcessEnvironment::systemEnvironment()); } diff --git a/autotests/test_x11_timestamp_update.cpp b/autotests/test_x11_timestamp_update.cpp index 744d6bdef4..fcc8dec95b 100644 --- a/autotests/test_x11_timestamp_update.cpp +++ b/autotests/test_x11_timestamp_update.cpp @@ -14,8 +14,6 @@ #include #endif -#include - #include "main.h" #include "utils/common.h" @@ -38,20 +36,6 @@ X11TestApplication::X11TestApplication(int &argc, char **argv) { setX11Connection(QX11Info::connection()); setX11RootWindow(QX11Info::appRootWindow()); - - // move directory containing executable to front, so that KPluginMetaData::findPluginById prefers the plugins in - // the build dir over system installed ones - const auto ownPath = libraryPaths().last(); - removeLibraryPath(ownPath); - addLibraryPath(ownPath); - - const KPluginMetaData plugin = KPluginMetaData::findPluginById(QStringLiteral("org.kde.kwin.platforms"), - QStringLiteral("KWinX11Platform")); - if (!plugin.isValid()) { - quit(); - return; - } - initPlatform(plugin); } X11TestApplication::~X11TestApplication() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1be1dde262..12876fe934 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -287,6 +287,7 @@ generate_export_header(kwin EXPORT_FILE_NAME kwin_export.h) add_executable(kwin_x11 main_x11.cpp) target_link_libraries(kwin_x11 + KWinX11Platform kwin KF5::Crash ) diff --git a/src/backends/drm/CMakeLists.txt b/src/backends/drm/CMakeLists.txt index 3958822ecf..662c7fa00d 100644 --- a/src/backends/drm/CMakeLists.txt +++ b/src/backends/drm/CMakeLists.txt @@ -1,4 +1,4 @@ -set(DRM_SOURCES +target_sources(kwin PRIVATE drm_backend.cpp drm_object.cpp drm_property.cpp @@ -31,13 +31,4 @@ set(DRM_SOURCES egl_gbm_cursor_layer.cpp ) -add_library(KWinWaylandDrmBackend MODULE ${DRM_SOURCES}) -set_target_properties(KWinWaylandDrmBackend PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/org.kde.kwin.waylandbackends/") -target_link_libraries(KWinWaylandDrmBackend kwin Libdrm::Libdrm gbm::gbm PkgConfig::Libxcvt) - -install( - TARGETS - KWinWaylandDrmBackend - DESTINATION - ${KDE_INSTALL_PLUGINDIR}/org.kde.kwin.waylandbackends/ -) +target_link_libraries(kwin Libdrm::Libdrm gbm::gbm PkgConfig::Libxcvt) diff --git a/src/backends/drm/drm.json b/src/backends/drm/drm.json deleted file mode 100644 index 69eed18bcb..0000000000 --- a/src/backends/drm/drm.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "KPlugin": { - "Description": "Render through drm node.", - "Description[ar]": "التصيير عن طريق drm.", - "Description[az]": "DRM vasitəsi ilə formalaşdırmaq.", - "Description[bg]": "Рендериране през drm възел.", - "Description[ca@valencia]": "Renderitza mitjançant el node del DRM.", - "Description[ca]": "Renderitza mitjançant el node del DRM.", - "Description[da]": "Render igennem drm-knude.", - "Description[de]": "In DRM-Knoten rendern.", - "Description[el]": "Αποτύπωση μέσω λειτουργίας drm.", - "Description[en_GB]": "Render through drm node.", - "Description[es]": "Renderizar a través del nodo DRM.", - "Description[et]": "Renderdamine drm režiimis.", - "Description[eu]": "Errendatu DRM-korapilunea erabiliz.", - "Description[fi]": "Hahmonna DRM-solmun läpi.", - "Description[fr]": "Rendre par le biais d'un nœud de rendu « DRM ».", - "Description[gl]": "Renderizar a través dun nodo de DRM.", - "Description[hu]": "Renderelés drm node-on.", - "Description[ia]": "Render a transverso nodo drm.", - "Description[id]": "Render melalui simpul drm.", - "Description[it]": "Resa tramite nodo drm.", - "Description[ko]": "DRM 노드로 렌더링합니다.", - "Description[lt]": "Atvaizduoti per drm veikseną.", - "Description[nl]": "Via drm-node renderen.", - "Description[nn]": "Teikn opp gjennom drm-node.", - "Description[pa]": "ਡੀਆਰਐਮ ਨੋਡ ਰਾਹੀਂ ਰੈਂਡਰ।", - "Description[pl]": "Wyświetlaj przez węzeł drm.", - "Description[pt]": "Desenhar através de um nó DRM.", - "Description[pt_BR]": "Renderizar pelo nó de DRM.", - "Description[ro]": "Randează prin nod DRM.", - "Description[ru]": "Отрисовка через DRM", - "Description[sk]": "Renderovať cez režim drm.", - "Description[sl]": "Izriši preko vozlišča drm.", - "Description[sr@ijekavian]": "Рендеровање кроз ДРМ чвор.", - "Description[sr@ijekavianlatin]": "Renderovanje kroz DRM čvor.", - "Description[sr@latin]": "Renderovanje kroz DRM čvor.", - "Description[sr]": "Рендеровање кроз ДРМ чвор.", - "Description[sv]": "Återge via DRM-nod.", - "Description[tr]": "Drm düğümü aracılığıyla gerçekle.", - "Description[uk]": "Обробляти через вузол DRM.", - "Description[vi]": "Kết xuất qua nút drm.", - "Description[x-test]": "xxRender through drm node.xx", - "Description[zh_CN]": "通过 drm 节点渲染。", - "Description[zh_TW]": "透過 drm 節點成像。", - "Id": "KWinWaylandDrmBackend", - "Name": "drm", - "Name[ar]": "drm", - "Name[az]": "drm", - "Name[bg]": "drm", - "Name[ca@valencia]": "DRM", - "Name[ca]": "DRM", - "Name[cs]": "drm", - "Name[da]": "drm", - "Name[de]": "DRM", - "Name[el]": "drm", - "Name[en_GB]": "drm", - "Name[es]": "drm", - "Name[et]": "drm", - "Name[eu]": "DRM", - "Name[fi]": "drm", - "Name[fr]": "drm", - "Name[gl]": "drm", - "Name[hu]": "drm", - "Name[ia]": "drm", - "Name[id]": "drm", - "Name[it]": "drm", - "Name[ko]": "drm", - "Name[lt]": "drm", - "Name[nl]": "drm", - "Name[nn]": "drm", - "Name[pa]": "ਡੀਆਰਐਮ", - "Name[pl]": "drm", - "Name[pt]": "DRM", - "Name[pt_BR]": "drm", - "Name[ro]": "drm", - "Name[ru]": "drm", - "Name[sk]": "drm", - "Name[sl]": "drm", - "Name[sr@ijekavian]": "ДРМ", - "Name[sr@ijekavianlatin]": "DRM", - "Name[sr@latin]": "DRM", - "Name[sr]": "ДРМ", - "Name[sv]": "DRM", - "Name[tr]": "drm", - "Name[uk]": "drm", - "Name[vi]": "drm", - "Name[x-test]": "xxdrmxx", - "Name[zh_CN]": "drm", - "Name[zh_TW]": "drm" - } -} diff --git a/src/backends/drm/drm_backend.h b/src/backends/drm/drm_backend.h index bb70010685..21770b4574 100644 --- a/src/backends/drm/drm_backend.h +++ b/src/backends/drm/drm_backend.h @@ -37,8 +37,7 @@ class DrmRenderBackend; class KWIN_EXPORT DrmBackend : public Platform { Q_OBJECT - Q_INTERFACES(KWin::Platform) - Q_PLUGIN_METADATA(IID "org.kde.kwin.Platform" FILE "drm.json") + public: explicit DrmBackend(QObject *parent = nullptr); ~DrmBackend() override; diff --git a/src/backends/virtual/CMakeLists.txt b/src/backends/virtual/CMakeLists.txt index f411f26266..b0c06092fe 100644 --- a/src/backends/virtual/CMakeLists.txt +++ b/src/backends/virtual/CMakeLists.txt @@ -1,18 +1,7 @@ -add_library(KWinWaylandVirtualBackend MODULE) -target_sources(KWinWaylandVirtualBackend PRIVATE +target_sources(kwin PRIVATE egl_gbm_backend.cpp logging.cpp scene_qpainter_virtual_backend.cpp virtual_backend.cpp virtual_output.cpp ) - -set_target_properties(KWinWaylandVirtualBackend PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/org.kde.kwin.waylandbackends/") -target_link_libraries(KWinWaylandVirtualBackend kwin) - -install( - TARGETS - KWinWaylandVirtualBackend - DESTINATION - ${KDE_INSTALL_PLUGINDIR}/org.kde.kwin.waylandbackends/ -) diff --git a/src/backends/virtual/egl_gbm_backend.cpp b/src/backends/virtual/egl_gbm_backend.cpp index b45f075ce8..abc8b7a8fb 100644 --- a/src/backends/virtual/egl_gbm_backend.cpp +++ b/src/backends/virtual/egl_gbm_backend.cpp @@ -10,10 +10,10 @@ // kwin #include "basiceglsurfacetexture_internal.h" #include "basiceglsurfacetexture_wayland.h" +#include "logging.h" #include "softwarevsyncmonitor.h" #include "virtual_backend.h" #include "virtual_output.h" -#include // kwin libs #include diff --git a/src/backends/virtual/virtual.json b/src/backends/virtual/virtual.json deleted file mode 100644 index 4d9ed95255..0000000000 --- a/src/backends/virtual/virtual.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "KPlugin": { - "Description": "Render to a virtual framebuffer.", - "Description[ar]": "التصيير إلى framebuffer افتراضي", - "Description[az]": "Virtual çərçivə tamponunun formalaşdırılması.", - "Description[bg]": "Рендериране към виртуален framebuffer.", - "Description[ca@valencia]": "Renderitza a un «framebuffer» virtual.", - "Description[ca]": "Renderitza a un «framebuffer» virtual.", - "Description[da]": "Rendér til en virtuel framebuffer.", - "Description[de]": "In virtuellen Framebuffer rendern.", - "Description[el]": "Αποτύπωση σε εικονική ενδιάμεση μνήμη πλαισίων.", - "Description[en_GB]": "Render to a virtual framebuffer.", - "Description[es]": "Renderizar en un «framebuffer» virtual.", - "Description[et]": "Renderdamine virtuaalses kaadripuhvris.", - "Description[eu]": "Errendatu alegiazko framebuffer batera.", - "Description[fi]": "Hahmonna virtuaaliseen framebufferiin.", - "Description[fr]": "Rendre sur un « framebuffer » factice.", - "Description[gl]": "Renderizar nun búfer de fotogramas virtual.", - "Description[hu]": "Renderelés egy virtuális framebufferbe.", - "Description[ia]": "Render a un framebuffer virtual.", - "Description[id]": "Render untuk sebuah virtual framebuffer.", - "Description[it]": "Resa su un framebuffer virtuale.", - "Description[ko]": "가상 프레임버퍼에 렌더링합니다.", - "Description[lt]": "Atvaizduoti į virtualų vaizdų atnaujinimo buferį.", - "Description[nl]": "Naar een virtuele framebuffer renderen.", - "Description[nn]": "Teikn opp til virtuell biletbuffer.", - "Description[pa]": "ਵਰਚੁਅਲ ਫ਼ਰੇਮਬਫ਼ਰ ਲਈ ਰੈਂਡਰ।", - "Description[pl]": "Wyświetlaj w wirtualnym buforze klatek.", - "Description[pt]": "Desenhar num 'framebuffer' virtual.", - "Description[pt_BR]": "Renderizar no framebuffer virtual.", - "Description[ro]": "Randează pe framebuffer virtual.", - "Description[ru]": "Отрисовка в виртуальный фреймбуфер", - "Description[sk]": "Renderovať na virtuálny framebuffer.", - "Description[sl]": "Izriši v navidezni medpomnilnik sličic.", - "Description[sr@ijekavian]": "Рендеровање у виртуелни кадробафер.", - "Description[sr@ijekavianlatin]": "Renderovanje u virtuelni kadrobafer.", - "Description[sr@latin]": "Renderovanje u virtuelni kadrobafer.", - "Description[sr]": "Рендеровање у виртуелни кадробафер.", - "Description[sv]": "Återge i en virtuell rambuffer.", - "Description[tr]": "Sanal bir çerçeve tamponuna gerçekle.", - "Description[uk]": "Обробляти до віртуального буфера кадрів.", - "Description[vi]": "Kết xuất vào một framebuffer ảo.", - "Description[x-test]": "xxRender to a virtual framebuffer.xx", - "Description[zh_CN]": "渲染到虚拟帧缓冲区。", - "Description[zh_TW]": "成像到虛擬影格緩衝區。", - "Id": "KWinWaylandVirtualBackend", - "Name": "virtual", - "Name[ar]": "افتراضي", - "Name[az]": "virtual", - "Name[bg]": "виртуален", - "Name[ca@valencia]": "Virtual", - "Name[ca]": "Virtual", - "Name[cs]": "virtuální", - "Name[da]": "virtuel", - "Name[de]": "Virtuell", - "Name[el]": "εικονικό", - "Name[en_GB]": "virtual", - "Name[es]": "virtual", - "Name[et]": "virtual", - "Name[eu]": "alegiazkoa", - "Name[fi]": "virtual", - "Name[fr]": "virtual", - "Name[gl]": "virtual", - "Name[hu]": "virtuális", - "Name[ia]": "virtual", - "Name[id]": "virtual", - "Name[it]": "virtual", - "Name[ko]": "virtual", - "Name[lt]": "virtualus", - "Name[nl]": "virtueel", - "Name[nn]": "virtuell", - "Name[pa]": "ਵਰਚੁਅਲ", - "Name[pl]": "wirtualne", - "Name[pt]": "virtual", - "Name[pt_BR]": "virtual", - "Name[ro]": "virtual", - "Name[ru]": "virtual", - "Name[sk]": "virtual", - "Name[sl]": "navidezno", - "Name[sr@ijekavian]": "Виртуелно", - "Name[sr@ijekavianlatin]": "Virtuelno", - "Name[sr@latin]": "Virtuelno", - "Name[sr]": "Виртуелно", - "Name[sv]": "virtuell", - "Name[tr]": "sanal", - "Name[uk]": "virtual", - "Name[vi]": "ảo", - "Name[x-test]": "xxvirtualxx", - "Name[zh_CN]": "virtual", - "Name[zh_TW]": "虛擬" - } -} diff --git a/src/backends/virtual/virtual_backend.h b/src/backends/virtual/virtual_backend.h index e3fb3d5a78..06ce0b5eb5 100644 --- a/src/backends/virtual/virtual_backend.h +++ b/src/backends/virtual/virtual_backend.h @@ -25,8 +25,6 @@ class VirtualOutput; class KWIN_EXPORT VirtualBackend : public Platform { Q_OBJECT - Q_INTERFACES(KWin::Platform) - Q_PLUGIN_METADATA(IID "org.kde.kwin.Platform" FILE "virtual.json") public: VirtualBackend(QObject *parent = nullptr); diff --git a/src/backends/wayland/CMakeLists.txt b/src/backends/wayland/CMakeLists.txt index 3fd9860f78..14d911e7d2 100644 --- a/src/backends/wayland/CMakeLists.txt +++ b/src/backends/wayland/CMakeLists.txt @@ -1,4 +1,4 @@ -set(WAYLAND_BACKEND_SOURCES +target_sources(kwin PRIVATE logging.cpp scene_qpainter_wayland_backend.cpp wayland_backend.cpp @@ -6,20 +6,10 @@ set(WAYLAND_BACKEND_SOURCES ) if (HAVE_WAYLAND_EGL) - set(WAYLAND_BACKEND_SOURCES egl_wayland_backend.cpp ${WAYLAND_BACKEND_SOURCES}) + target_sources(kwin PRIVATE egl_wayland_backend.cpp) endif() -add_library(KWinWaylandWaylandBackend MODULE ${WAYLAND_BACKEND_SOURCES}) -set_target_properties(KWinWaylandWaylandBackend PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/org.kde.kwin.waylandbackends/") -target_link_libraries(KWinWaylandWaylandBackend kwin KF5::WaylandClient) - +target_link_libraries(kwin KF5::WaylandClient) if (HAVE_WAYLAND_EGL) - target_link_libraries(KWinWaylandWaylandBackend Wayland::Egl gbm::gbm) + target_link_libraries(kwin Wayland::Egl gbm::gbm) endif() - -install( - TARGETS - KWinWaylandWaylandBackend - DESTINATION - ${KDE_INSTALL_PLUGINDIR}/org.kde.kwin.waylandbackends/ -) diff --git a/src/backends/wayland/wayland.json b/src/backends/wayland/wayland.json deleted file mode 100644 index ebfe5a1efc..0000000000 --- a/src/backends/wayland/wayland.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "KPlugin": { - "Description": "Render to a nested window on running Wayland compositor.", - "Description[ar]": "التصيير إلى نافذة متداخلة تعمل على مؤلف ويلاند.", - "Description[az]": "Wayland birləşdiricisində iç-içə keçmiş pəncərələri formalaşdırmaq.", - "Description[bg]": "Рендериране към вложен прозорец на Wayland", - "Description[ca@valencia]": "Renderitza a una finestra imbricada en un compositor Wayland en execució.", - "Description[ca]": "Renderitza a una finestra imbricada en un compositor Wayland en execució.", - "Description[da]": "Rendér til et indlejret vindue på kørende Wayland-compositor.", - "Description[de]": "In ein eingebettetes Fenster auf dem laufenden Wayland-Kompositor rendern.", - "Description[el]": "Αποτύπωση σε εμφωλευμένο παράθυρο κατά την εκτέλεση του συνθέτη Wayland.", - "Description[en_GB]": "Render to a nested window on running Wayland compositor.", - "Description[es]": "Renderizar en una ventana anidada en el compositor Wayland en ejecución.", - "Description[et]": "Renderdamine töötava Waylandi komposiitori pesastatud aknas.", - "Description[eu]": "Errendatu Wayland konposatzailean habiaratutako leiho batera.", - "Description[fi]": "Hahmonna sisäkkäiseen ikkunaan, jota hallitsee Wayland-koostin.", - "Description[fr]": "Rendre sur une fenêtre imbriquée sur un compositeur Wayland en cours de fonctionnement.", - "Description[gl]": "Renderizar unha xanela aniñada no compositor de Wayland en execución.", - "Description[hu]": "Renderelés egy Wayland kompozitoron futó beágyazott ablakba.", - "Description[ia]": "Render a un fenestra annidate sur compositor Wayland executante. ", - "Description[id]": "Render untuk sebuah window tersarang pada Wayland compositor yang berjalan.", - "Description[it]": "Resa in una finestra nidificata su compositore Wayland in esecuzione.", - "Description[ko]": "Wayland 컴포지터에서 실행 중인 창에 렌더링합니다.", - "Description[lt]": "Atvaizduoti į įdėtinį langą, veikiančiame Wayland kompozitoriuje.", - "Description[nl]": "Render naar een genest venster in een werkende Wayland-compositor.", - "Description[nn]": "Teikn opp til innebygd vindauge på køyrande Wayland-samansetjar.", - "Description[pl]": "Wyświetlaj w zagnieżdżonym oknie w kompozytorze Wayland.", - "Description[pt]": "Desenhar numa janela encadeada no compositor de Wayland em execução.", - "Description[pt_BR]": "Renderizar uma janela encadeada no compositor Wayland em execução.", - "Description[ro]": "Randează într-o fereastră imbricată pe compozitorul Wayland activ.", - "Description[ru]": "Отрисовка во вложенное окно компоновщика Wayland.", - "Description[sk]": "Renderovať na vnorené okno na bežiaci kompozítor Wayland.", - "Description[sl]": "Izriši v gnezdeno okno na upravljalniku skladnje Wayland.", - "Description[sr@ijekavian]": "Рендеровање у угнежђени прозор на вејланд слагачу.", - "Description[sr@ijekavianlatin]": "Renderovanje u ugnežđeni prozor na Wayland slagaču.", - "Description[sr@latin]": "Renderovanje u ugnežđeni prozor na Wayland slagaču.", - "Description[sr]": "Рендеровање у угнежђени прозор на вејланд слагачу.", - "Description[sv]": "Återge till ett nästlat fönster på Wayland-sammansättare som kör.", - "Description[tr]": "Wayland bileşikleştiricisi çalıştıran iç içe geçmiş bir pencerede gerçekle.", - "Description[uk]": "Обробляти у вкладене вікно запущеного засобу композиції Wayland.", - "Description[vi]": "Kết xuất vào một cửa sổ lồng trong trình kết hợp Wayland đang chạy.", - "Description[x-test]": "xxRender to a nested window on running Wayland compositor.xx", - "Description[zh_CN]": "渲染到运行在 Wayland 显示特效合成器中的嵌套窗口。", - "Description[zh_TW]": "成像到執行中的 Wayland 的巢狀視窗。", - "Id": "KWinWaylandWaylandBackend", - "Name": "wayland", - "Name[ar]": "ويلاند", - "Name[az]": "wayland", - "Name[bg]": "wayland", - "Name[ca@valencia]": "Wayland", - "Name[ca]": "Wayland", - "Name[cs]": "wayland", - "Name[da]": "wayland", - "Name[de]": "Wayland", - "Name[el]": "wayland", - "Name[en_GB]": "wayland", - "Name[es]": "wayland", - "Name[et]": "wayland", - "Name[eu]": "wayland", - "Name[fi]": "wayland", - "Name[fr]": "wayland", - "Name[gl]": "wayland", - "Name[hu]": "wayland", - "Name[ia]": "wayland", - "Name[id]": "wayland", - "Name[it]": "wayland", - "Name[ko]": "wayland", - "Name[lt]": "wayland", - "Name[nl]": "wayland", - "Name[nn]": "wayland", - "Name[pa]": "ਵੇਲੈਂਡ", - "Name[pl]": "wayland", - "Name[pt]": "Wayland", - "Name[pt_BR]": "wayland", - "Name[ro]": "wayland", - "Name[ru]": "wayland", - "Name[sk]": "wayland", - "Name[sl]": "wayland", - "Name[sr@ijekavian]": "Вејланд", - "Name[sr@ijekavianlatin]": "Wayland", - "Name[sr@latin]": "Wayland", - "Name[sr]": "Вејланд", - "Name[sv]": "Wayland", - "Name[tr]": "wayland", - "Name[uk]": "wayland", - "Name[vi]": "wayland", - "Name[x-test]": "xxwaylandxx", - "Name[zh_CN]": "wayland", - "Name[zh_TW]": "wayland" - } -} diff --git a/src/backends/wayland/wayland_backend.h b/src/backends/wayland/wayland_backend.h index 963d51012c..edc9930ab5 100644 --- a/src/backends/wayland/wayland_backend.h +++ b/src/backends/wayland/wayland_backend.h @@ -247,8 +247,7 @@ private: class KWIN_EXPORT WaylandBackend : public Platform { Q_OBJECT - Q_INTERFACES(KWin::Platform) - Q_PLUGIN_METADATA(IID "org.kde.kwin.Platform" FILE "wayland.json") + public: explicit WaylandBackend(QObject *parent = nullptr); ~WaylandBackend() override; diff --git a/src/backends/x11/common/CMakeLists.txt b/src/backends/x11/common/CMakeLists.txt index 2b0c4d43d8..a2bbe179b7 100644 --- a/src/backends/x11/common/CMakeLists.txt +++ b/src/backends/x11/common/CMakeLists.txt @@ -4,9 +4,8 @@ endif() if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-int-to-void-pointer-cast") endif() -add_library(eglx11common STATIC +target_sources(kwin PRIVATE eglonxbackend.cpp kwinxrenderutils.cpp logging.cpp ) -target_link_libraries(eglx11common kwin) diff --git a/src/backends/x11/common/eglonxbackend.cpp b/src/backends/x11/common/eglonxbackend.cpp index 6708282932..e7ff8f4f98 100644 --- a/src/backends/x11/common/eglonxbackend.cpp +++ b/src/backends/x11/common/eglonxbackend.cpp @@ -14,12 +14,8 @@ #include "options.h" #include "overlaywindow.h" #include "platform.h" +#include "utils/common.h" #include "utils/xcbutils.h" -// Qt -#include -#include - -Q_LOGGING_CATEGORY(KWIN_CORE, "kwin_core", QtWarningMsg) namespace KWin { diff --git a/src/backends/x11/standalone/CMakeLists.txt b/src/backends/x11/standalone/CMakeLists.txt index 0c72c319d1..1dbcdbc246 100644 --- a/src/backends/x11/standalone/CMakeLists.txt +++ b/src/backends/x11/standalone/CMakeLists.txt @@ -15,9 +15,8 @@ set(X11PLATFORM_SOURCES xfixes_cursor_event_filter.cpp ) -add_library(KWinX11Platform MODULE ${X11PLATFORM_SOURCES}) -set_target_properties(KWinX11Platform PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/org.kde.kwin.platforms/") -target_link_libraries(KWinX11Platform eglx11common kwin KF5::Crash X11::X11) +add_library(KWinX11Platform OBJECT ${X11PLATFORM_SOURCES}) +target_link_libraries(KWinX11Platform kwin KF5::Crash X11::X11) if (QT_MAJOR_VERSION EQUAL "5") target_link_libraries(KWinX11Platform Qt::X11Extras) endif() @@ -39,10 +38,3 @@ endif() if (HAVE_DL_LIBRARY) target_link_libraries(KWinX11Platform ${DL_LIBRARY}) endif() - -install( - TARGETS - KWinX11Platform - DESTINATION - ${KDE_INSTALL_PLUGINDIR}/org.kde.kwin.platforms/ -) diff --git a/src/backends/x11/standalone/eglbackend.h b/src/backends/x11/standalone/eglbackend.h index abf520180f..966f483bea 100644 --- a/src/backends/x11/standalone/eglbackend.h +++ b/src/backends/x11/standalone/eglbackend.h @@ -6,7 +6,7 @@ #pragma once -#include "eglonxbackend.h" +#include "../common/eglonxbackend.h" #include "openglsurfacetexture_x11.h" #include "outputlayer.h" #include "utils/damagejournal.h" diff --git a/src/backends/x11/standalone/glxbackend.cpp b/src/backends/x11/standalone/glxbackend.cpp index 156cdf15c0..bd984203e2 100644 --- a/src/backends/x11/standalone/glxbackend.cpp +++ b/src/backends/x11/standalone/glxbackend.cpp @@ -20,6 +20,9 @@ #include "sgivideosyncvsyncmonitor.h" #include "softwarevsyncmonitor.h" #include "x11_platform.h" + +#include "../common/kwinxrenderutils.h" + // kwin #include "composite.h" #include "options.h" @@ -34,7 +37,6 @@ #include #include #include -#include // Qt #include #include diff --git a/src/backends/x11/standalone/non_composited_outline.cpp b/src/backends/x11/standalone/non_composited_outline.cpp index c50254c333..149a779ca0 100644 --- a/src/backends/x11/standalone/non_composited_outline.cpp +++ b/src/backends/x11/standalone/non_composited_outline.cpp @@ -10,7 +10,7 @@ // own #include "non_composited_outline.h" // KWin libs -#include +#include "../common/kwinxrenderutils.h" // xcb #include diff --git a/src/backends/x11/standalone/x11.json b/src/backends/x11/standalone/x11.json deleted file mode 100644 index 284e87c500..0000000000 --- a/src/backends/x11/standalone/x11.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "KPlugin": { - "Description": "Platform plugin for standalone x11 in kwin_x11.", - "Description[ar]": "ملحقة النظام لأكس ١١ المفرد في kwin_x11.", - "Description[az]": "Kwin_x11 -də müstəqil X11 üçün platforma əlavəsi.", - "Description[bg]": "Приставка за самостоятелна платформа на x11 в kwin_x11.", - "Description[ca@valencia]": "Connector de plataforma per a una X11 autònoma en el kwin_x11.", - "Description[ca]": "Connector de plataforma per a una X11 autònoma en el kwin_x11.", - "Description[da]": "Platform-plugin til standalone x11 i kwin_x11.", - "Description[de]": "Plattform-Modul für ein selbstständiges X11 in kwin_x11.", - "Description[el]": "Πρόσθετο πλατφόρμας για αυτόνομο x11 και kwin_x11.", - "Description[en_GB]": "Platform plugin for standalone x11 in kwin_x11.", - "Description[es]": "Complemento de Platform para X11 autónomo en kwin_x11.", - "Description[et]": "Autonoomse x11 platvormi plugin kwin_x11-s", - "Description[eu]": "Plataformaren plugina x11 autonomoarentzako, kwin_x11 barruan.", - "Description[fi]": "Alustaliitännäinen itsenäiselle x11:lle kwin_x11:ssä.", - "Description[fr]": "Module de plate-forme pour x11 autonomes, au sein de kwin_x11", - "Description[gl]": "Complemento de plataforma para x11 independente en kwin_x11.", - "Description[hu]": "Platformbővítmény önálló x11-hez a kwin_x11-ben.", - "Description[ia]": "Plugin de platteforma per singule X11 in kwin_x11.", - "Description[id]": "Plugin platform untuk standalone x11 dalam kwin_x11.", - "Description[it]": "Estensione di piattaforma per x11 autonomo in kwin_x11.", - "Description[ko]": "kwin_x11의 단독 X11 플러그인입니다.", - "Description[lt]": "Platformos priedas, skirtas kwin_x11 viduje esančiam, atskiram x11.", - "Description[nl]": "Platform plug-in voor alleenstaande x11 in kwin_x11.", - "Description[nn]": "Plattformtillegg for frittståande X11 i kwin_x11.", - "Description[pl]": "Wtyczka platformy dla wolnostojącego x11 w kwin_x11.", - "Description[pt]": "'Plugin' de plataformas para um X11 autónomo no X11 do KWin.", - "Description[pt_BR]": "Plugin de plataforma para um x11 independente no kwin_x11.", - "Description[ro]": "Extensie de platformă pentru x11 de sine stătător în kwin_x11.", - "Description[ru]": "Подключаемый модуль выделенного х11 в kwin_x11.", - "Description[sk]": "Platformový plugin pre standalone x11 v kwin_x11.", - "Description[sl]": "Okoljski vstavek za samostojni x11 v kwin_x11.", - "Description[sr@ijekavian]": "Платформски прикључак за самостални Икс11 у К‑вину.", - "Description[sr@ijekavianlatin]": "Platformski priključak za samostalni X11 u KWinu.", - "Description[sr@latin]": "Platformski priključak za samostalni X11 u KWinu.", - "Description[sr]": "Платформски прикључак за самостални Икс11 у К‑вину.", - "Description[sv]": "Plattforminsticksprogram för fristående X11 i kwin_x11", - "Description[tr]": "Kwin_x11'de bağımsız x11 için platform eklentisi.", - "Description[uk]": "Додаток платформи для окремого x11 у kwin_x11.", - "Description[vi]": "Phần cài cắm nền tảng cho x11 độc lập trong kwin_x11.", - "Description[x-test]": "xxPlatform plugin for standalone x11 in kwin_x11.xx", - "Description[zh_CN]": "kwin_x11 中的独立 x11 的平台插件", - "Description[zh_TW]": "在 kwin_x11 中供 standalone 的 x11 使用的平臺外掛程式。", - "Id": "KWinX11Platform", - "Name": "x11-standalone", - "Name[ar]": "اكس ١١ مفرد", - "Name[az]": "x11-standalone", - "Name[bg]": "x11-standalone", - "Name[ca@valencia]": "X11-autònoma", - "Name[ca]": "X11-autònoma", - "Name[da]": "x11-standalone", - "Name[de]": "Selbständiges-x11", - "Name[el]": "x11-αυτόνομος", - "Name[en_GB]": "x11-standalone", - "Name[es]": "x11-autónomo", - "Name[et]": "x11-standalone", - "Name[eu]": "x11-autonomoa", - "Name[fi]": "x11-standalone", - "Name[fr]": "x11-standalone", - "Name[gl]": "x11-independente", - "Name[hu]": "x11-standalone", - "Name[ia]": "x11-standalone", - "Name[id]": "x11-standalone", - "Name[it]": "X11-alone", - "Name[ko]": "x11-standalone", - "Name[lt]": "x11-atskiras", - "Name[nl]": "x11-alleenstaand", - "Name[nn]": "X11 frittståande", - "Name[pa]": "x11-ਸਟੈਡਅਲੋਨ", - "Name[pl]": "x11-wolnostojący", - "Name[pt]": "x11-autónomo", - "Name[pt_BR]": "x11-standalone", - "Name[ro]": "x11-standalone", - "Name[ru]": "x11-standalone", - "Name[sk]": "x11-standalone", - "Name[sl]": "x11-samostojno", - "Name[sr@ijekavian]": "Икс11 самостални", - "Name[sr@ijekavianlatin]": "X11 samostalni", - "Name[sr@latin]": "X11 samostalni", - "Name[sr]": "Икс11 самостални", - "Name[sv]": "Fristående X11", - "Name[tr]": "x11-standalone", - "Name[uk]": "x11-окремий", - "Name[vi]": "x11-độc-lập", - "Name[x-test]": "xxx11-standalonexx", - "Name[zh_CN]": "x11-standalone", - "Name[zh_TW]": "x11-standalone" - } -} diff --git a/src/backends/x11/standalone/x11_platform.cpp b/src/backends/x11/standalone/x11_platform.cpp index 7a994ae244..f07dea3080 100644 --- a/src/backends/x11/standalone/x11_platform.cpp +++ b/src/backends/x11/standalone/x11_platform.cpp @@ -39,7 +39,7 @@ #include "workspace.h" #include "x11_output.h" -#include "kwinxrenderutils.h" +#include "../common/kwinxrenderutils.h" #include #include diff --git a/src/backends/x11/standalone/x11_platform.h b/src/backends/x11/standalone/x11_platform.h index 3b230cad23..230a7a14c1 100644 --- a/src/backends/x11/standalone/x11_platform.h +++ b/src/backends/x11/standalone/x11_platform.h @@ -30,8 +30,7 @@ class X11Output; class KWIN_EXPORT X11StandalonePlatform : public Platform { Q_OBJECT - Q_INTERFACES(KWin::Platform) - Q_PLUGIN_METADATA(IID "org.kde.kwin.Platform" FILE "x11.json") + public: X11StandalonePlatform(QObject *parent = nullptr); ~X11StandalonePlatform() override; diff --git a/src/backends/x11/standalone/xinputintegration.cpp b/src/backends/x11/standalone/xinputintegration.cpp index 89e3e39fa8..99d9f7e838 100644 --- a/src/backends/x11/standalone/xinputintegration.cpp +++ b/src/backends/x11/standalone/xinputintegration.cpp @@ -7,7 +7,6 @@ SPDX-License-Identifier: GPL-2.0-or-later */ #include "xinputintegration.h" -#include "ge_event_mem_mover.h" #include "gestures.h" #include "keyboard_input.h" #include "logging.h" @@ -17,6 +16,8 @@ #include "screenedge.h" #include "x11cursor.h" +#include "../common/ge_event_mem_mover.h" + #include "input.h" #include "modifier_only_shortcuts.h" #include "x11eventfilter.h" diff --git a/src/backends/x11/windowed/CMakeLists.txt b/src/backends/x11/windowed/CMakeLists.txt index 9cb4f08b25..f6ed131c23 100644 --- a/src/backends/x11/windowed/CMakeLists.txt +++ b/src/backends/x11/windowed/CMakeLists.txt @@ -1,4 +1,4 @@ -set(X11BACKEND_SOURCES +target_sources(kwin PRIVATE egl_x11_backend.cpp logging.cpp scene_qpainter_x11_backend.cpp @@ -6,16 +6,7 @@ set(X11BACKEND_SOURCES x11windowed_output.cpp ) -add_library(KWinWaylandX11Backend MODULE ${X11BACKEND_SOURCES}) -set_target_properties(KWinWaylandX11Backend PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/org.kde.kwin.waylandbackends/") -target_link_libraries(KWinWaylandX11Backend eglx11common kwin X11::XCB X11::X11) +target_link_libraries(kwin X11::XCB X11::X11) if (X11_Xi_FOUND) - target_link_libraries(KWinWaylandX11Backend X11::Xi) + target_link_libraries(kwin X11::Xi) endif() - -install( - TARGETS - KWinWaylandX11Backend - DESTINATION - ${KDE_INSTALL_PLUGINDIR}/org.kde.kwin.waylandbackends/ -) diff --git a/src/backends/x11/windowed/egl_x11_backend.h b/src/backends/x11/windowed/egl_x11_backend.h index 5b93eb95fb..aab75cd1b4 100644 --- a/src/backends/x11/windowed/egl_x11_backend.h +++ b/src/backends/x11/windowed/egl_x11_backend.h @@ -8,7 +8,7 @@ */ #pragma once -#include "eglonxbackend.h" +#include "../common/eglonxbackend.h" #include "kwinglutils.h" #include "outputlayer.h" diff --git a/src/backends/x11/windowed/x11windowed_backend.cpp b/src/backends/x11/windowed/x11windowed_backend.cpp index 5bb3b37bb5..d8206f425f 100644 --- a/src/backends/x11/windowed/x11windowed_backend.cpp +++ b/src/backends/x11/windowed/x11windowed_backend.cpp @@ -7,6 +7,7 @@ SPDX-License-Identifier: GPL-2.0-or-later */ #include "x11windowed_backend.h" +#include "../common/kwinxrenderutils.h" #include @@ -18,7 +19,6 @@ #include "wayland_server.h" #include "x11windowed_output.h" #include -#include #include // KDE #include @@ -29,7 +29,7 @@ #include // X11 #if HAVE_X11_XINPUT -#include "ge_event_mem_mover.h" +#include "../common/ge_event_mem_mover.h" #include #include #endif diff --git a/src/backends/x11/windowed/x11windowed_backend.h b/src/backends/x11/windowed/x11windowed_backend.h index 906666017a..38bc3b0a53 100644 --- a/src/backends/x11/windowed/x11windowed_backend.h +++ b/src/backends/x11/windowed/x11windowed_backend.h @@ -83,8 +83,7 @@ private: class KWIN_EXPORT X11WindowedBackend : public Platform { Q_OBJECT - Q_INTERFACES(KWin::Platform) - Q_PLUGIN_METADATA(IID "org.kde.kwin.Platform" FILE "x11.json") + public: X11WindowedBackend(QObject *parent = nullptr); ~X11WindowedBackend() override; diff --git a/src/main.cpp b/src/main.cpp index c26580259c..5582ab871a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,7 +34,6 @@ // KDE #include #include -#include // Qt #include #include @@ -141,8 +140,7 @@ void Application::destroyAtoms() void Application::destroyPlatform() { - delete m_platform; - m_platform = nullptr; + m_platform.reset(); } void Application::resetCrashesCount() @@ -549,16 +547,10 @@ void Application::setProcessStartupEnvironment(const QProcessEnvironment &enviro m_processEnvironment = environment; } -void Application::initPlatform(const KPluginMetaData &plugin) +void Application::setPlatform(std::unique_ptr &&platform) { Q_ASSERT(!m_platform); - QPluginLoader loader(plugin.fileName()); - m_platform = qobject_cast(loader.instance()); - if (m_platform) { - m_platform->setParent(this); - } else { - qCWarning(KWIN_CORE) << "Could not create plugin" << plugin.name() << "error:" << loader.errorString(); - } + m_platform = std::move(platform); } PluginManager *Application::pluginManager() const diff --git a/src/main.h b/src/main.h index 80a49a1c0c..70cb3f6449 100644 --- a/src/main.h +++ b/src/main.h @@ -222,11 +222,11 @@ public: QProcessEnvironment processStartupEnvironment() const; void setProcessStartupEnvironment(const QProcessEnvironment &environment); - void initPlatform(const KPluginMetaData &plugin); Platform *platform() const { - return m_platform; + return m_platform.get(); } + void setPlatform(std::unique_ptr &&platform); bool isTerminating() const { @@ -297,7 +297,7 @@ private: #if KWIN_BUILD_ACTIVITIES bool m_useKActivities = true; #endif - Platform *m_platform = nullptr; + std::unique_ptr m_platform; bool m_terminating = false; qreal m_xwaylandScale = 1; QProcessEnvironment m_processEnvironment; diff --git a/src/main_wayland.cpp b/src/main_wayland.cpp index 351f6171a7..da9e40260f 100644 --- a/src/main_wayland.cpp +++ b/src/main_wayland.cpp @@ -10,6 +10,10 @@ #include +#include "backends/drm/drm_backend.h" +#include "backends/virtual/virtual_backend.h" +#include "backends/wayland/wayland_backend.h" +#include "backends/x11/windowed/x11windowed_backend.h" #include "composite.h" #include "effects.h" #include "inputmethod.h" @@ -27,7 +31,6 @@ #include #include #include -#include #include // Qt @@ -272,22 +275,6 @@ void ApplicationWayland::startSession() } } -static const QString s_waylandPlugin = QStringLiteral("KWinWaylandWaylandBackend"); -static const QString s_x11Plugin = QStringLiteral("KWinWaylandX11Backend"); -static const QString s_drmPlugin = QStringLiteral("KWinWaylandDrmBackend"); -static const QString s_virtualPlugin = QStringLiteral("KWinWaylandVirtualBackend"); - -static QString automaticBackendSelection() -{ - if (qEnvironmentVariableIsSet("WAYLAND_DISPLAY")) { - return s_waylandPlugin; - } - if (qEnvironmentVariableIsSet("DISPLAY")) { - return s_x11Plugin; - } - return s_drmPlugin; -} - } // namespace int main(int argc, char *argv[]) @@ -329,20 +316,6 @@ int main(int argc, char *argv[]) KWin::Application::createAboutData(); - const auto availablePlugins = KPluginMetaData::findPlugins(QStringLiteral("org.kde.kwin.waylandbackends")); - auto hasPlugin = [&availablePlugins](const QString &name) { - return std::any_of(availablePlugins.begin(), availablePlugins.end(), - [name](const KPluginMetaData &plugin) { - return plugin.pluginId() == name; - }); - }; - const bool hasSizeOption = hasPlugin(KWin::s_x11Plugin) || hasPlugin(KWin::s_virtualPlugin); - const bool hasOutputCountOption = hasPlugin(KWin::s_x11Plugin); - const bool hasX11Option = hasPlugin(KWin::s_x11Plugin); - const bool hasVirtualOption = hasPlugin(KWin::s_virtualPlugin); - const bool hasWaylandOption = hasPlugin(KWin::s_waylandPlugin); - const bool hasDrmOption = hasPlugin(KWin::s_drmPlugin); - QCommandLineOption xwaylandOption(QStringLiteral("xwayland"), i18n("Start a rootless Xwayland server.")); QCommandLineOption waylandSocketOption(QStringList{QStringLiteral("s"), QStringLiteral("socket")}, @@ -393,6 +366,8 @@ int main(int argc, char *argv[]) QCommandLineOption replaceOption(QStringLiteral("replace"), i18n("Exits this instance so it can be restarted by kwin_wayland_wrapper.")); + QCommandLineOption drmOption(QStringLiteral("drm"), i18n("Render through drm node.")); + QCommandLineParser parser; a.setupCommandLine(&parser); parser.addOption(xwaylandOption); @@ -402,38 +377,20 @@ int main(int argc, char *argv[]) parser.addOption(xwaylandDisplayOption); parser.addOption(xwaylandXAuthorityOption); parser.addOption(replaceOption); - - if (hasX11Option) { - parser.addOption(x11DisplayOption); - } - if (hasWaylandOption) { - parser.addOption(waylandDisplayOption); - } - if (hasVirtualOption) { - parser.addOption(virtualFbOption); - } - if (hasSizeOption) { - parser.addOption(widthOption); - parser.addOption(heightOption); - parser.addOption(scaleOption); - } - if (hasOutputCountOption) { - parser.addOption(outputCountOption); - } - QCommandLineOption drmOption(QStringLiteral("drm"), i18n("Render through drm node.")); - if (hasDrmOption) { - parser.addOption(drmOption); - } + parser.addOption(x11DisplayOption); + parser.addOption(waylandDisplayOption); + parser.addOption(virtualFbOption); + parser.addOption(widthOption); + parser.addOption(heightOption); + parser.addOption(scaleOption); + parser.addOption(outputCountOption); + parser.addOption(drmOption); QCommandLineOption inputMethodOption(QStringLiteral("inputmethod"), i18n("Input method that KWin starts."), QStringLiteral("path/to/imserver")); parser.addOption(inputMethodOption); - QCommandLineOption listBackendsOption(QStringLiteral("list-backends"), - i18n("List all available backends and quit.")); - parser.addOption(listBackendsOption); - #if KWIN_BUILD_SCREENLOCKER QCommandLineOption screenLockerOption(QStringLiteral("lockscreen"), i18n("Starts the session in locked mode.")); @@ -478,82 +435,70 @@ int main(int argc, char *argv[]) QDBusConnection::sessionBus().call(msg, QDBus::NoBlock); return 0; } - if (parser.isSet(listBackendsOption)) { - for (const auto &plugin : availablePlugins) { - std::cout << std::setw(40) << std::left << qPrintable(plugin.name()) << qPrintable(plugin.description()) << std::endl; - } - return 0; - } if (parser.isSet(exitWithSessionOption)) { a.setSessionArgument(parser.value(exitWithSessionOption)); } + enum class BackendType { + Kms, + X11, + Wayland, + Virtual, + }; + + BackendType backendType; QString pluginName; QSize initialWindowSize; QByteArray deviceIdentifier; int outputCount = 1; qreal outputScale = 1; - if (hasDrmOption && parser.isSet(drmOption)) { - pluginName = KWin::s_drmPlugin; - } - - if (hasSizeOption) { - bool ok = false; - const int width = parser.value(widthOption).toInt(&ok); - if (!ok) { - std::cerr << "FATAL ERROR incorrect value for width" << std::endl; - return 1; - } - const int height = parser.value(heightOption).toInt(&ok); - if (!ok) { - std::cerr << "FATAL ERROR incorrect value for height" << std::endl; - return 1; - } - const qreal scale = parser.value(scaleOption).toDouble(&ok); - if (!ok || scale <= 0) { - std::cerr << "FATAL ERROR incorrect value for scale" << std::endl; - return 1; - } - - outputScale = scale; - initialWindowSize = QSize(width, height); - } - - if (hasOutputCountOption) { - bool ok = false; - const int count = parser.value(outputCountOption).toInt(&ok); - if (ok) { - outputCount = qMax(1, count); - } - } - - if (hasX11Option && parser.isSet(x11DisplayOption)) { + // Decide what backend to use. + if (parser.isSet(drmOption)) { + backendType = BackendType::Kms; + } else if (parser.isSet(x11DisplayOption)) { + backendType = BackendType::X11; deviceIdentifier = parser.value(x11DisplayOption).toUtf8(); - pluginName = KWin::s_x11Plugin; - } else if (hasWaylandOption && parser.isSet(waylandDisplayOption)) { + } else if (parser.isSet(waylandDisplayOption)) { + backendType = BackendType::Wayland; deviceIdentifier = parser.value(waylandDisplayOption).toUtf8(); - pluginName = KWin::s_waylandPlugin; + } else if (parser.isSet(virtualFbOption)) { + backendType = BackendType::Virtual; + } else { + if (qEnvironmentVariableIsSet("WAYLAND_DISPLAY")) { + backendType = BackendType::Wayland; + } else if (qEnvironmentVariableIsSet("DISPLAY")) { + backendType = BackendType::X11; + } else { + backendType = BackendType::Kms; + } } - if (hasVirtualOption && parser.isSet(virtualFbOption)) { - pluginName = KWin::s_virtualPlugin; - } - - if (pluginName.isEmpty()) { - std::cerr << "No backend specified through command line argument, trying auto resolution" << std::endl; - pluginName = KWin::automaticBackendSelection(); - } - - auto pluginIt = std::find_if(availablePlugins.begin(), availablePlugins.end(), - [&pluginName](const KPluginMetaData &plugin) { - return plugin.pluginId() == pluginName; - }); - if (pluginIt == availablePlugins.end()) { - std::cerr << "FATAL ERROR: could not find a backend" << std::endl; + bool ok = false; + const int width = parser.value(widthOption).toInt(&ok); + if (!ok) { + std::cerr << "FATAL ERROR incorrect value for width" << std::endl; return 1; } + const int height = parser.value(heightOption).toInt(&ok); + if (!ok) { + std::cerr << "FATAL ERROR incorrect value for height" << std::endl; + return 1; + } + const qreal scale = parser.value(scaleOption).toDouble(&ok); + if (!ok || scale <= 0) { + std::cerr << "FATAL ERROR incorrect value for scale" << std::endl; + return 1; + } + + outputScale = scale; + initialWindowSize = QSize(width, height); + + const int count = parser.value(outputCountOption).toInt(&ok); + if (ok) { + outputCount = qMax(1, count); + } // TODO: create backend without having the server running KWin::WaylandServer *server = KWin::WaylandServer::create(&a); @@ -595,11 +540,21 @@ int main(int argc, char *argv[]) return 1; } - a.initPlatform(*pluginIt); - if (!a.platform()) { - std::cerr << "FATAL ERROR: could not instantiate a backend" << std::endl; - return 1; + switch (backendType) { + case BackendType::Kms: + a.setPlatform(std::make_unique()); + break; + case BackendType::Virtual: + a.setPlatform(std::make_unique()); + break; + case BackendType::X11: + a.setPlatform(std::make_unique()); + break; + case BackendType::Wayland: + a.setPlatform(std::make_unique()); + break; } + if (!deviceIdentifier.isEmpty()) { a.platform()->setDeviceIdentifier(deviceIdentifier); } diff --git a/src/main_x11.cpp b/src/main_x11.cpp index 02bd33f40a..b734421655 100644 --- a/src/main_x11.cpp +++ b/src/main_x11.cpp @@ -12,6 +12,7 @@ #include +#include "backends/x11/standalone/x11_platform.h" #include "platform.h" #include "sm.h" #include "tabletmodemanager.h" @@ -21,7 +22,6 @@ #include #include #include -#include #include #include @@ -410,19 +410,7 @@ int main(int argc, char *argv[]) exit(1); } - // find and load the X11 platform plugin - const KPluginMetaData plugin = KPluginMetaData::findPluginById(QStringLiteral("org.kde.kwin.platforms"), QStringLiteral("KWinX11Platform")); - - if (!plugin.isValid()) { - std::cerr << "FATAL ERROR: KWin could not find the KWinX11Platform plugin" << std::endl; - return 1; - } - a.initPlatform(plugin); - if (!a.platform()) { - std::cerr << "FATAL ERROR: could not instantiate the platform plugin" << std::endl; - return 1; - } - + a.setPlatform(std::make_unique()); a.start(); return a.exec(); diff --git a/src/platform.h b/src/platform.h index 68717b1f8a..727a4e9b4b 100644 --- a/src/platform.h +++ b/src/platform.h @@ -439,8 +439,6 @@ private: Output *m_primaryOutput = nullptr; }; -} - -Q_DECLARE_INTERFACE(KWin::Platform, "org.kde.kwin.Platform") +} // namespace KWin #endif