forked from quickshell/quickshell
feat: basic plugin system
The wayland plugin now uses it.
This commit is contained in:
parent
6c6272e523
commit
3bd587cfcc
|
@ -31,5 +31,5 @@ find_package(Qt6 REQUIRED COMPONENTS ${QT_FPDEPS})
|
||||||
|
|
||||||
qt_standard_project_setup(REQUIRES 6.6)
|
qt_standard_project_setup(REQUIRES 6.6)
|
||||||
|
|
||||||
add_subdirectory(src/wayland)
|
|
||||||
add_subdirectory(src/core)
|
add_subdirectory(src/core)
|
||||||
|
add_subdirectory(src/wayland)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
qt_add_executable(quickshell
|
qt_add_executable(quickshell
|
||||||
main.cpp
|
main.cpp
|
||||||
|
plugin.cpp
|
||||||
shell.cpp
|
shell.cpp
|
||||||
variants.cpp
|
variants.cpp
|
||||||
rootwrapper.cpp
|
rootwrapper.cpp
|
||||||
|
@ -17,5 +18,3 @@ qt_add_executable(quickshell
|
||||||
)
|
)
|
||||||
|
|
||||||
qt_add_qml_module(quickshell URI QuickShell)
|
qt_add_qml_module(quickshell URI QuickShell)
|
||||||
|
|
||||||
target_link_libraries(quickshell PRIVATE ${QT_DEPS} quickshell-waylandplugin)
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <qstandardpaths.h>
|
#include <qstandardpaths.h>
|
||||||
#include <qstring.h>
|
#include <qstring.h>
|
||||||
|
|
||||||
|
#include "plugin.hpp"
|
||||||
#include "rootwrapper.hpp"
|
#include "rootwrapper.hpp"
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
@ -38,6 +39,8 @@ int main(int argc, char** argv) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QuickshellPlugin::initPlugins();
|
||||||
|
|
||||||
// Base window transparency appears to be additive.
|
// Base window transparency appears to be additive.
|
||||||
// Use a fully transparent window with a colored rect.
|
// Use a fully transparent window with a colored rect.
|
||||||
QQuickWindow::setDefaultAlphaBuffer(true);
|
QQuickWindow::setDefaultAlphaBuffer(true);
|
||||||
|
|
35
src/core/plugin.cpp
Normal file
35
src/core/plugin.cpp
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#include "plugin.hpp"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <qvector.h> // NOLINT (what??)
|
||||||
|
|
||||||
|
// defined by moc. see below comment.
|
||||||
|
void qml_register_types_QuickShell(); // NOLINT
|
||||||
|
|
||||||
|
static QVector<QuickshellPlugin*> plugins; // NOLINT
|
||||||
|
|
||||||
|
void QuickshellPlugin::registerPlugin(QuickshellPlugin& plugin) { plugins.push_back(&plugin); }
|
||||||
|
|
||||||
|
void QuickshellPlugin::initPlugins() {
|
||||||
|
plugins.erase(
|
||||||
|
std::remove_if(
|
||||||
|
plugins.begin(),
|
||||||
|
plugins.end(),
|
||||||
|
[](QuickshellPlugin* plugin) { return !plugin->applies(); }
|
||||||
|
),
|
||||||
|
plugins.end()
|
||||||
|
);
|
||||||
|
|
||||||
|
for (QuickshellPlugin* plugin: plugins) {
|
||||||
|
plugin->init();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This seems incredibly stupid but it appears qt will not register the module types
|
||||||
|
// if types are already defined for the module, meaning qmlRegisterType does not work
|
||||||
|
// unless the module types are already registered.
|
||||||
|
qml_register_types_QuickShell();
|
||||||
|
|
||||||
|
for (QuickshellPlugin* plugin: plugins) {
|
||||||
|
plugin->registerTypes();
|
||||||
|
}
|
||||||
|
}
|
29
src/core/plugin.hpp
Normal file
29
src/core/plugin.hpp
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <qcontainerfwd.h>
|
||||||
|
#include <qfunctionpointer.h>
|
||||||
|
|
||||||
|
class QuickshellPlugin {
|
||||||
|
public:
|
||||||
|
QuickshellPlugin() = default;
|
||||||
|
virtual ~QuickshellPlugin() = default;
|
||||||
|
QuickshellPlugin(QuickshellPlugin&&) = delete;
|
||||||
|
QuickshellPlugin(const QuickshellPlugin&) = delete;
|
||||||
|
void operator=(QuickshellPlugin&&) = delete;
|
||||||
|
void operator=(const QuickshellPlugin&) = delete;
|
||||||
|
|
||||||
|
virtual bool applies() { return true; }
|
||||||
|
virtual void init() {}
|
||||||
|
virtual void registerTypes() {}
|
||||||
|
|
||||||
|
static void registerPlugin(QuickshellPlugin& plugin);
|
||||||
|
static void initPlugins();
|
||||||
|
};
|
||||||
|
|
||||||
|
// NOLINTBEGIN
|
||||||
|
#define QS_REGISTER_PLUGIN(clazz) \
|
||||||
|
[[gnu::constructor]] void qsInitPlugin() { \
|
||||||
|
static clazz plugin; \
|
||||||
|
QuickshellPlugin::registerPlugin(plugin); \
|
||||||
|
}
|
||||||
|
// NOLINTEND
|
|
@ -5,6 +5,11 @@ qt_add_library(quickshell-wayland STATIC
|
||||||
waylandlayershell.cpp
|
waylandlayershell.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# required to make sure the constructor is linked
|
||||||
|
add_library(quickshell-wayland-init OBJECT init.cpp)
|
||||||
|
|
||||||
|
target_link_libraries(quickshell PRIVATE ${QT_DEPS} quickshell-waylandplugin quickshell-wayland-init)
|
||||||
|
|
||||||
qt_add_qml_module(quickshell-wayland URI QuickShell.Wayland)
|
qt_add_qml_module(quickshell-wayland URI QuickShell.Wayland)
|
||||||
|
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
|
@ -13,6 +18,7 @@ pkg_check_modules(wayland REQUIRED IMPORTED_TARGET wayland-client wayland-protoc
|
||||||
find_package(Qt6 REQUIRED COMPONENTS WaylandClient)
|
find_package(Qt6 REQUIRED COMPONENTS WaylandClient)
|
||||||
|
|
||||||
target_link_libraries(quickshell-wayland PRIVATE ${QT_DEPS} wayland-client)
|
target_link_libraries(quickshell-wayland PRIVATE ${QT_DEPS} wayland-client)
|
||||||
|
target_link_libraries(quickshell-wayland-init PRIVATE ${QT_DEPS} wayland-client)
|
||||||
|
|
||||||
# wayland protocols
|
# wayland protocols
|
||||||
|
|
||||||
|
|
19
src/wayland/init.cpp
Normal file
19
src/wayland/init.cpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#include <qguiapplication.h>
|
||||||
|
#include <qqml.h>
|
||||||
|
|
||||||
|
#include "../core/plugin.hpp"
|
||||||
|
#include "waylandlayershell.hpp"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class WaylandPlugin: public QuickshellPlugin {
|
||||||
|
bool applies() override { return QGuiApplication::platformName() == "wayland"; }
|
||||||
|
|
||||||
|
void registerTypes() override {
|
||||||
|
qmlRegisterType<WaylandPanelInterface>("QuickShell", 1, 0, "PanelWindow");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
QS_REGISTER_PLUGIN(WaylandPlugin);
|
||||||
|
|
||||||
|
} // namespace
|
|
@ -87,7 +87,6 @@ private:
|
||||||
|
|
||||||
class WaylandPanelInterface: public PanelWindowInterface {
|
class WaylandPanelInterface: public PanelWindowInterface {
|
||||||
Q_OBJECT;
|
Q_OBJECT;
|
||||||
QML_NAMED_ELEMENT(PanelWindow); // temp
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit WaylandPanelInterface(QObject* parent = nullptr);
|
explicit WaylandPanelInterface(QObject* parent = nullptr);
|
||||||
|
|
Loading…
Reference in a new issue