From 9980f8587e90971af1e512cc120b1e50d8320191 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Thu, 31 Oct 2024 01:28:06 -0700 Subject: [PATCH] window: generate qmltypes --- src/core/CMakeLists.txt | 3 ++- src/core/doc.hpp | 3 +++ src/core/module.md | 10 +++++----- src/core/plugin.cpp | 4 ++++ src/core/plugin.hpp | 3 +++ src/wayland/init.cpp | 3 +++ src/window/CMakeLists.txt | 7 ++++++- src/window/init.cpp | 22 ++++++++++++++++++++++ src/window/panelinterface.hpp | 4 +++- 9 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 src/window/init.cpp diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index b454f3a7..8c8d077d 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -44,7 +44,8 @@ target_link_libraries(quickshell-core PRIVATE quickshell-build) qt_add_qml_module(quickshell-core URI Quickshell VERSION 0.1 - IMPORTS Quickshell._Window + OPTIONAL_IMPORTS Quickshell._Window + DEFAULT_IMPORTS Quickshell._Window ) target_link_libraries(quickshell-core PRIVATE ${QT_DEPS} CLI11::CLI11) diff --git a/src/core/doc.hpp b/src/core/doc.hpp index e1f2ee4c..f7db7ac4 100644 --- a/src/core/doc.hpp +++ b/src/core/doc.hpp @@ -10,6 +10,9 @@ #define QSDOC_ELEMENT #define QSDOC_NAMED_ELEMENT(name) +// unmark uncreatable (will be overlayed by other types) +#define QSDOC_CREATABLE + // change the cname used for this type #define QSDOC_CNAME(name) diff --git a/src/core/module.md b/src/core/module.md index 060aca9f..831f561b 100644 --- a/src/core/module.md +++ b/src/core/module.md @@ -7,12 +7,12 @@ headers = [ "shell.hpp", "variants.hpp", "region.hpp", - "proxywindow.hpp", + "../window/proxywindow.hpp", "persistentprops.hpp", - "windowinterface.hpp", - "panelinterface.hpp", - "floatingwindow.hpp", - "popupwindow.hpp", + "../window/windowinterface.hpp", + "../window/panelinterface.hpp", + "../window/floatingwindow.hpp", + "../window/popupwindow.hpp", "singleton.hpp", "lazyloader.hpp", "easingcurve.hpp", diff --git a/src/core/plugin.cpp b/src/core/plugin.cpp index 8f1d0e96..697406a9 100644 --- a/src/core/plugin.cpp +++ b/src/core/plugin.cpp @@ -19,6 +19,10 @@ void QuickshellPlugin::initPlugins() { plugins.end() ); + std::sort(plugins.begin(), plugins.end(), [](QuickshellPlugin* a, QuickshellPlugin* b) { + return b->dependencies().contains(a->name()); + }); + for (QuickshellPlugin* plugin: plugins) { plugin->init(); } diff --git a/src/core/plugin.hpp b/src/core/plugin.hpp index 38c9ddc2..082eb035 100644 --- a/src/core/plugin.hpp +++ b/src/core/plugin.hpp @@ -2,6 +2,7 @@ #include #include +#include class EngineGeneration; @@ -14,6 +15,8 @@ public: void operator=(QuickshellPlugin&&) = delete; void operator=(const QuickshellPlugin&) = delete; + virtual QString name() { return QString(); } + virtual QList dependencies() { return {}; } virtual bool applies() { return true; } virtual void init() {} virtual void registerTypes() {} diff --git a/src/wayland/init.cpp b/src/wayland/init.cpp index 1ad51cea..a9ddcadb 100644 --- a/src/wayland/init.cpp +++ b/src/wayland/init.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -15,6 +16,8 @@ void installPopupPositioner(); namespace { class WaylandPlugin: public QuickshellPlugin { + QList dependencies() override { return {"window"}; } + bool applies() override { auto isWayland = QGuiApplication::platformName() == "wayland"; diff --git a/src/window/CMakeLists.txt b/src/window/CMakeLists.txt index 6b14c58a..d415533e 100644 --- a/src/window/CMakeLists.txt +++ b/src/window/CMakeLists.txt @@ -11,12 +11,17 @@ qt_add_qml_module(quickshell-window VERSION 0.1 ) +add_library(quickshell-window-init OBJECT init.cpp) + target_link_libraries(quickshell-window PRIVATE ${QT_DEPS} Qt6::QuickPrivate) +target_link_libraries(quickshell-windowplugin PRIVATE ${QT_DEPS}) +target_link_libraries(quickshell-window-init PRIVATE ${QT_DEPS}) qs_pch(quickshell-window) qs_pch(quickshell-windowplugin) +qs_pch(quickshell-window-init) -target_link_libraries(quickshell PRIVATE quickshell-windowplugin) +target_link_libraries(quickshell PRIVATE quickshell-windowplugin quickshell-window-init) if (BUILD_TESTING) add_subdirectory(test) diff --git a/src/window/init.cpp b/src/window/init.cpp new file mode 100644 index 00000000..ef2b8c1d --- /dev/null +++ b/src/window/init.cpp @@ -0,0 +1,22 @@ +#include "../core/plugin.hpp" + +namespace { + +class WindowPlugin: public QuickshellPlugin { + // _Window has to be registered before wayland or x11 modules, otherwise module overlays + // will apply in the wrong order. + QString name() override { return "window"; } + + void registerTypes() override { + qmlRegisterModuleImport( + "Quickshell", + QQmlModuleImportModuleAny, + "Quickshell._Window", + QQmlModuleImportLatest + ); + } +}; + +QS_REGISTER_PLUGIN(WindowPlugin); + +} // namespace diff --git a/src/window/panelinterface.hpp b/src/window/panelinterface.hpp index 5ccb5186..ada01a7f 100644 --- a/src/window/panelinterface.hpp +++ b/src/window/panelinterface.hpp @@ -128,7 +128,9 @@ class PanelWindowInterface: public WindowInterface { /// Note: On Wayland this property corrosponds to @@Quickshell.Wayland.WlrLayershell.keyboardFocus. Q_PROPERTY(bool focusable READ focusable WRITE setFocusable NOTIFY focusableChanged); // clang-format on - QSDOC_NAMED_ELEMENT(PanelWindow); + QML_NAMED_ELEMENT(PanelWindow); + QML_UNCREATABLE("No PanelWindow backend loaded."); + QSDOC_CREATABLE; public: explicit PanelWindowInterface(QObject* parent = nullptr): WindowInterface(parent) {}