forked from quickshell/quickshell
		
	feat: basic plugin system
The wayland plugin now uses it.
This commit is contained in:
		
							parent
							
								
									6c6272e523
								
							
						
					
					
						commit
						3bd587cfcc
					
				
					 8 changed files with 94 additions and 4 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue