Compare commits
3 commits
6c6272e523
...
0034edd0f8
Author | SHA1 | Date | |
---|---|---|---|
outfoxxed | 0034edd0f8 | ||
outfoxxed | c0faebc700 | ||
outfoxxed | 3bd587cfcc |
|
@ -31,5 +31,5 @@ find_package(Qt6 REQUIRED COMPONENTS ${QT_FPDEPS})
|
|||
|
||||
qt_standard_project_setup(REQUIRES 6.6)
|
||||
|
||||
add_subdirectory(src/wayland)
|
||||
add_subdirectory(src/core)
|
||||
add_subdirectory(src/wayland)
|
||||
|
|
2
docs
2
docs
|
@ -1 +1 @@
|
|||
Subproject commit d603e3de533c74248621943bc85034620f4ef8c7
|
||||
Subproject commit cc201afd3a352a28f5daddbe00d7aed974d52d30
|
|
@ -1,5 +1,6 @@
|
|||
qt_add_executable(quickshell
|
||||
main.cpp
|
||||
plugin.cpp
|
||||
shell.cpp
|
||||
variants.cpp
|
||||
rootwrapper.cpp
|
||||
|
@ -17,5 +18,3 @@ qt_add_executable(quickshell
|
|||
)
|
||||
|
||||
qt_add_qml_module(quickshell URI QuickShell)
|
||||
|
||||
target_link_libraries(quickshell PRIVATE ${QT_DEPS} quickshell-waylandplugin)
|
||||
|
|
11
src/core/doc.hpp
Normal file
11
src/core/doc.hpp
Normal file
|
@ -0,0 +1,11 @@
|
|||
#pragma once
|
||||
|
||||
// hide a property, function, or signal from typegen
|
||||
#define QSDOC_HIDE
|
||||
|
||||
// override the base class as seen by typegen
|
||||
#define QSDOC_BASECLASS(baseclass)
|
||||
|
||||
// make the type visible in the docs even if not a QML_ELEMENT
|
||||
#define QSDOC_ELEMENT
|
||||
#define QSDOC_NAMED_ELEMENT(name)
|
|
@ -8,6 +8,7 @@
|
|||
#include <qstandardpaths.h>
|
||||
#include <qstring.h>
|
||||
|
||||
#include "plugin.hpp"
|
||||
#include "rootwrapper.hpp"
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
|
@ -38,6 +39,8 @@ int main(int argc, char** argv) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
QuickshellPlugin::initPlugins();
|
||||
|
||||
// Base window transparency appears to be additive.
|
||||
// Use a fully transparent window with a colored rect.
|
||||
QQuickWindow::setDefaultAlphaBuffer(true);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <qtmetamacros.h>
|
||||
|
||||
#include "doc.hpp"
|
||||
#include "windowinterface.hpp"
|
||||
|
||||
class Anchors {
|
||||
|
@ -94,6 +95,7 @@ Q_ENUM_NS(Enum);
|
|||
/// }
|
||||
/// ```
|
||||
class PanelWindowInterface: public WindowInterface {
|
||||
QSDOC_NAMED_ELEMENT(PanelWindow);
|
||||
// clang-format off
|
||||
Q_OBJECT;
|
||||
/// Anchors attach a shell window to the sides of the screen.
|
||||
|
|
27
src/core/plugin.cpp
Normal file
27
src/core/plugin.cpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
#include "plugin.hpp"
|
||||
#include <algorithm>
|
||||
|
||||
#include <qvector.h> // NOLINT (what??)
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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
|
||||
)
|
||||
|
||||
# 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)
|
||||
|
||||
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)
|
||||
|
||||
target_link_libraries(quickshell-wayland PRIVATE ${QT_DEPS} wayland-client)
|
||||
target_link_libraries(quickshell-wayland-init PRIVATE ${QT_DEPS} wayland-client)
|
||||
|
||||
# wayland protocols
|
||||
|
||||
|
|
29
src/wayland/init.cpp
Normal file
29
src/wayland/init.cpp
Normal file
|
@ -0,0 +1,29 @@
|
|||
#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._WaylandOverlay", 1, 0, "PanelWindow");
|
||||
|
||||
// If any types are defined inside a module using QML_ELEMENT then all QML_ELEMENT types
|
||||
// will not be registered. This can be worked around with a module import which makes
|
||||
// the QML_ELMENT module import the old register-type style module.
|
||||
qmlRegisterModuleImport(
|
||||
"QuickShell",
|
||||
QQmlModuleImportModuleAny,
|
||||
"QuickShell._WaylandOverlay",
|
||||
QQmlModuleImportLatest
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
QS_REGISTER_PLUGIN(WaylandPlugin);
|
||||
|
||||
} // namespace
|
|
@ -7,10 +7,12 @@
|
|||
#include <qtmetamacros.h>
|
||||
#include <qtypes.h>
|
||||
|
||||
#include "../core/doc.hpp"
|
||||
#include "../core/proxywindow.hpp"
|
||||
#include "layershell.hpp"
|
||||
|
||||
class WaylandLayershell: public ProxyWindowBase {
|
||||
QSDOC_BASECLASS(PanelWindowInterface);
|
||||
// clang-format off
|
||||
Q_OBJECT;
|
||||
/// The shell layer the window sits in. Defaults to `Layer.Top`.
|
||||
|
@ -22,10 +24,10 @@ class WaylandLayershell: public ProxyWindowBase {
|
|||
/// The degree of keyboard focus taken. Defaults to `KeyboardFocus.None`.
|
||||
Q_PROPERTY(KeyboardFocus::Enum keyboardFocus READ keyboardFocus WRITE setKeyboardFocus NOTIFY keyboardFocusChanged);
|
||||
|
||||
Q_PROPERTY(Anchors anchors READ anchors WRITE setAnchors NOTIFY anchorsChanged);
|
||||
Q_PROPERTY(qint32 exclusiveZone READ exclusiveZone WRITE setExclusiveZone NOTIFY exclusiveZoneChanged);
|
||||
Q_PROPERTY(ExclusionMode::Enum exclusionMode READ exclusionMode WRITE setExclusionMode NOTIFY exclusionModeChanged);
|
||||
Q_PROPERTY(Margins margins READ margins WRITE setMargins NOTIFY marginsChanged);
|
||||
QSDOC_HIDE Q_PROPERTY(Anchors anchors READ anchors WRITE setAnchors NOTIFY anchorsChanged);
|
||||
QSDOC_HIDE Q_PROPERTY(qint32 exclusiveZone READ exclusiveZone WRITE setExclusiveZone NOTIFY exclusiveZoneChanged);
|
||||
QSDOC_HIDE Q_PROPERTY(ExclusionMode::Enum exclusionMode READ exclusionMode WRITE setExclusionMode NOTIFY exclusionModeChanged);
|
||||
QSDOC_HIDE Q_PROPERTY(Margins margins READ margins WRITE setMargins NOTIFY marginsChanged);
|
||||
QML_ATTACHED(WaylandLayershell);
|
||||
QML_ELEMENT;
|
||||
// clang-format on
|
||||
|
@ -68,10 +70,10 @@ signals:
|
|||
void layerChanged();
|
||||
void namespaceChanged();
|
||||
void keyboardFocusChanged();
|
||||
void anchorsChanged();
|
||||
void exclusiveZoneChanged();
|
||||
void exclusionModeChanged();
|
||||
void marginsChanged();
|
||||
QSDOC_HIDE void anchorsChanged();
|
||||
QSDOC_HIDE void exclusiveZoneChanged();
|
||||
QSDOC_HIDE void exclusionModeChanged();
|
||||
QSDOC_HIDE void marginsChanged();
|
||||
|
||||
private slots:
|
||||
void updateAutoExclusion();
|
||||
|
@ -87,7 +89,6 @@ private:
|
|||
|
||||
class WaylandPanelInterface: public PanelWindowInterface {
|
||||
Q_OBJECT;
|
||||
QML_NAMED_ELEMENT(PanelWindow); // temp
|
||||
|
||||
public:
|
||||
explicit WaylandPanelInterface(QObject* parent = nullptr);
|
||||
|
|
Loading…
Reference in a new issue