Compare commits

..

2 Commits

Author SHA1 Message Date
84b68ca1dd Update version number for 5.25.0
GIT_SILENT
2022-06-09 08:46:08 +00:00
9573abb542 Mark required deps as required
BUG: 454912
(cherry picked from commit 34e7c90c2d)
2022-06-06 12:40:57 +02:00
12 changed files with 84 additions and 114 deletions

View File

@ -2,6 +2,6 @@
# SPDX-License-Identifier: CC0-1.0 # SPDX-License-Identifier: CC0-1.0
include: include:
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/reuse-lint.yml - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux-qt6.yml - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux-qt6.yml
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd-qt6.yml

View File

@ -4,4 +4,4 @@
Dependencies: Dependencies:
- 'on': ['@all'] - 'on': ['@all']
'require': 'require':
'frameworks/extra-cmake-modules': '@latest-kf6' 'frameworks/extra-cmake-modules': '@latest'

View File

@ -4,26 +4,25 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
project(layershellqt) project(layershellqt)
set(PROJECT_VERSION "5.27.80") set(PROJECT_VERSION "5.25.0")
set(PROJECT_VERSION_MAJOR 5) set(PROJECT_VERSION_MAJOR 5)
set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD 99)
set(QT_MIN_VERSION "6.5.0") set(QT_MIN_VERSION "5.15.0")
set(KF6_MIN_VERSION "5.240.0") set(KF5_MIN_VERSION "5.91")
set(KDE_COMPILERSETTINGS_LEVEL "5.82") set(KDE_COMPILERSETTINGS_LEVEL "5.82")
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(ECM ${KF6_MIN_VERSION} REQUIRED NO_MODULE) find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${ECM_MODULE_PATH}) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${ECM_MODULE_PATH})
include(KDEInstallDirs) include(KDEInstallDirs)
include(KDECMakeSettings) include(KDECMakeSettings)
include(KDECompilerSettings NO_POLICY_SCOPE) include(KDECompilerSettings NO_POLICY_SCOPE)
include(ECMSetupVersion) include(ECMSetupVersion)
include(ECMDeprecationSettings)
include(ECMGenerateHeaders) include(ECMGenerateHeaders)
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
include(FeatureSummary) include(FeatureSummary)
@ -31,7 +30,6 @@ include(GenerateExportHeader)
include(KDEClangFormat) include(KDEClangFormat)
include(ECMQtDeclareLoggingCategory) include(ECMQtDeclareLoggingCategory)
find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS WaylandClient Qml) find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS WaylandClient Qml)
if (QT_MAJOR_VERSION EQUAL "5") if (QT_MAJOR_VERSION EQUAL "5")
find_package(Qt5XkbCommonSupport REQUIRED PRIVATE) find_package(Qt5XkbCommonSupport REQUIRED PRIVATE)
@ -55,15 +53,10 @@ ecm_setup_version(${PROJECT_VERSION} VARIABLE_PREFIX LAYERSHELLQT
file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h) file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h)
kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES}) kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES})
ecm_set_disabled_deprecation_versions(QT 5.15.2
KF 5.101
)
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(tests) add_subdirectory(tests)
set(CMAKECONFIG_INSTALL_DIR ${KDE_INSTALL_CMAKEPACKAGEDIR}/LayerShellQt) set(CMAKECONFIG_INSTALL_DIR ${KDE_INSTALL_LIBDIR}/cmake/LayerShellQt)
install(EXPORT LayerShellQtTargets install(EXPORT LayerShellQtTargets
NAMESPACE LayerShellQt:: NAMESPACE LayerShellQt::
DESTINATION ${CMAKECONFIG_INSTALL_DIR} DESTINATION ${CMAKECONFIG_INSTALL_DIR}

View File

@ -1,6 +1,3 @@
# SPDX-FileCopyrightText: None
# SPDX-License-Identifier: CC0-1.0
maintainer: maintainer:
- vladz - vladz
description: Layer Shell Qt description: Layer Shell Qt

View File

@ -5,17 +5,10 @@
*/ */
#include "window.h" #include "window.h"
#include "../qwaylandlayershellintegration_p.h"
#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
#include "../qwaylandlayersurface_p.h" #include "../qwaylandlayersurface_p.h"
#endif
#include <layershellqt_logging.h> #include <layershellqt_logging.h>
#include <private/qwaylandshellsurface_p.h>
#include <QPointer> #include <private/qwaylandwindow_p.h>
#include <optional>
#include <QtWaylandClient/private/qwaylandwindow_p.h>
using namespace LayerShellQt; using namespace LayerShellQt;
@ -34,7 +27,8 @@ public:
Window::KeyboardInteractivity keyboardInteractivity = Window::KeyboardInteractivityExclusive; Window::KeyboardInteractivity keyboardInteractivity = Window::KeyboardInteractivityExclusive;
Window::Layer layer = Window::LayerTop; Window::Layer layer = Window::LayerTop;
QMargins margins; QMargins margins;
std::optional<QPointer<QScreen>> desiredOutput; QWaylandLayerSurface *getSurface() const;
QPointer<QScreen> desiredOutput;
}; };
static QMap<QWindow *, Window *> s_map; static QMap<QWindow *, Window *> s_map;
@ -47,7 +41,9 @@ Window::~Window()
void Window::setAnchors(Anchors anchors) void Window::setAnchors(Anchors anchors)
{ {
d->anchors = anchors; d->anchors = anchors;
Q_EMIT anchorsChanged(); if (auto surface = d->getSurface()) {
surface->setAnchor(anchors);
}
} }
Window::Anchors Window::anchors() const Window::Anchors Window::anchors() const
@ -58,7 +54,9 @@ Window::Anchors Window::anchors() const
void Window::setExclusiveZone(int32_t zone) void Window::setExclusiveZone(int32_t zone)
{ {
d->exclusionZone = zone; d->exclusionZone = zone;
Q_EMIT exclusionZoneChanged(); if (auto surface = d->getSurface()) {
surface->setExclusiveZone(zone);
}
} }
int32_t Window::exclusionZone() const int32_t Window::exclusionZone() const
@ -69,7 +67,9 @@ int32_t Window::exclusionZone() const
void Window::setMargins(const QMargins &margins) void Window::setMargins(const QMargins &margins)
{ {
d->margins = margins; d->margins = margins;
Q_EMIT marginsChanged(); if (auto surface = d->getSurface()) {
surface->setMargins(margins);
}
} }
QMargins Window::margins() const QMargins Window::margins() const
@ -80,7 +80,9 @@ QMargins Window::margins() const
void Window::setKeyboardInteractivity(KeyboardInteractivity interactivity) void Window::setKeyboardInteractivity(KeyboardInteractivity interactivity)
{ {
d->keyboardInteractivity = interactivity; d->keyboardInteractivity = interactivity;
Q_EMIT keyboardInteractivityChanged(); if (auto surface = d->getSurface()) {
surface->setKeyboardInteractivity(interactivity);
}
} }
Window::KeyboardInteractivity Window::keyboardInteractivity() const Window::KeyboardInteractivity Window::keyboardInteractivity() const
@ -91,6 +93,9 @@ Window::KeyboardInteractivity Window::keyboardInteractivity() const
void Window::setLayer(Layer layer) void Window::setLayer(Layer layer)
{ {
d->layer = layer; d->layer = layer;
if (auto surface = d->getSurface()) {
surface->setLayer(layer);
}
} }
void Window::setScope(const QString &scope) void Window::setScope(const QString &scope)
@ -111,12 +116,7 @@ Window::Layer Window::layer() const
QScreen *Window::desiredOutput() const QScreen *Window::desiredOutput() const
{ {
// Don't use .value_or here to avoid a temporary QPointer return d->desiredOutput;
if (d->desiredOutput.has_value()) {
return d->desiredOutput.value();
}
return d->parentWindow->screen();
} }
void Window::setDesiredOutput(QScreen *output) void Window::setDesiredOutput(QScreen *output)
@ -124,33 +124,11 @@ void Window::setDesiredOutput(QScreen *output)
d->desiredOutput = output; d->desiredOutput = output;
} }
#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
void Window::attachPopup(QWindow *window, xdg_popup *popup)
{
auto waylandWindow = dynamic_cast<QtWaylandClient::QWaylandWindow *>(window->handle());
if (!waylandWindow) {
return;
}
auto shellSurface = dynamic_cast<QWaylandLayerSurface *>(waylandWindow->shellSurface());
if (shellSurface) {
shellSurface->get_popup(popup);
}
}
#endif
Window::Window(QWindow *window) Window::Window(QWindow *window)
: QObject(window) : QObject(window)
, d(new WindowPrivate(window)) , d(new WindowPrivate(window))
{ {
s_map.insert(d->parentWindow, this); s_map.insert(d->parentWindow, this);
window->create();
if (auto waylandWindow = dynamic_cast<QtWaylandClient::QWaylandWindow *>(window->handle())) {
static QWaylandLayerShellIntegration integration;
waylandWindow->setShellIntegration(&integration);
}
} }
Window *Window::get(QWindow *window) Window *Window::get(QWindow *window)
@ -161,3 +139,21 @@ Window *Window::get(QWindow *window)
} }
return new Window(window); return new Window(window);
} }
QWaylandLayerSurface *WindowPrivate::getSurface() const
{
if (!parentWindow) {
return nullptr;
}
auto ww = dynamic_cast<QtWaylandClient::QWaylandWindow *>(parentWindow->handle());
if (!ww) {
qCDebug(LAYERSHELLQT) << "window not a wayland window" << parentWindow;
return nullptr;
}
QWaylandLayerSurface *s = qobject_cast<QWaylandLayerSurface *>(ww->shellSurface());
if (!s) {
qCDebug(LAYERSHELLQT) << "window not using wlr-layer-shell" << parentWindow << ww->shellSurface();
return nullptr;
}
return s;
}

View File

@ -14,10 +14,6 @@
#include "layershellqt_export.h" #include "layershellqt_export.h"
#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
struct xdg_popup;
#endif
namespace LayerShellQt namespace LayerShellQt
{ {
class WindowPrivate; class WindowPrivate;
@ -97,17 +93,6 @@ public:
*/ */
static Window *get(QWindow *window); static Window *get(QWindow *window);
#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
static void attachPopup(QWindow *window, xdg_popup *popup);
#endif
Q_SIGNALS:
void anchorsChanged();
void exclusionZoneChanged();
void marginsChanged();
void keyboardInteractivityChanged();
void layerChanged();
private: private:
Window(QWindow *window); Window(QWindow *window);
QScopedPointer<WindowPrivate> d; QScopedPointer<WindowPrivate> d;

View File

@ -10,11 +10,9 @@
namespace LayerShellQt namespace LayerShellQt
{ {
QWaylandLayerShell::QWaylandLayerShell() QWaylandLayerShell::QWaylandLayerShell(::wl_registry *registry, uint32_t id, uint32_t version)
: QWaylandClientExtensionTemplate<QWaylandLayerShell>(4) : QtWayland::zwlr_layer_shell_v1(registry, id, version)
, QtWayland::zwlr_layer_shell_v1()
{ {
initialize();
} }
QWaylandLayerShell::~QWaylandLayerShell() QWaylandLayerShell::~QWaylandLayerShell()
@ -23,4 +21,9 @@ QWaylandLayerShell::~QWaylandLayerShell()
zwlr_layer_shell_v1_destroy(object()); zwlr_layer_shell_v1_destroy(object());
} }
QWaylandLayerSurface *QWaylandLayerShell::createLayerSurface(QtWaylandClient::QWaylandWindow *window)
{
return new QWaylandLayerSurface(this, window);
}
} }

View File

@ -8,20 +8,23 @@
#ifndef _LAYERSHELL_H #ifndef _LAYERSHELL_H
#define _LAYERSHELL_H #define _LAYERSHELL_H
#include "layershellqt_export.h"
#include <wayland-client.h> #include <wayland-client.h>
#include <QtWaylandClient/private/qwaylandshellintegration_p.h> #include <QtWaylandClient/private/qwaylandshellintegration_p.h>
#include <qwayland-wlr-layer-shell-unstable-v1.h> #include <qwayland-wlr-layer-shell-unstable-v1.h>
#include "qwaylandlayersurface_p.h"
namespace LayerShellQt namespace LayerShellQt
{ {
class LAYERSHELLQT_EXPORT QWaylandLayerShell : public QWaylandClientExtensionTemplate<QWaylandLayerShell>, public QtWayland::zwlr_layer_shell_v1 class LAYERSHELLQT_EXPORT QWaylandLayerShell : public QtWayland::zwlr_layer_shell_v1
{ {
public: public:
QWaylandLayerShell(); QWaylandLayerShell(::wl_registry *registry, uint32_t id, uint32_t version);
~QWaylandLayerShell() override; ~QWaylandLayerShell() override;
QWaylandLayerSurface *createLayerSurface(QtWaylandClient::QWaylandWindow *window);
// TODO: Popups
}; };
} }

View File

@ -7,7 +7,6 @@
#include "qwaylandlayershell_p.h" #include "qwaylandlayershell_p.h"
#include "qwaylandlayershellintegration_p.h" #include "qwaylandlayershellintegration_p.h"
#include "qwaylandlayersurface_p.h"
#include <QtWaylandClient/private/qwaylanddisplay_p.h> #include <QtWaylandClient/private/qwaylanddisplay_p.h>
#include <QtWaylandClient/private/qwaylandwindow_p.h> #include <QtWaylandClient/private/qwaylandwindow_p.h>
@ -16,7 +15,6 @@
namespace LayerShellQt namespace LayerShellQt
{ {
QWaylandLayerShellIntegration::QWaylandLayerShellIntegration() QWaylandLayerShellIntegration::QWaylandLayerShellIntegration()
: m_layerShell(new QWaylandLayerShell())
{ {
} }
@ -26,14 +24,26 @@ QWaylandLayerShellIntegration::~QWaylandLayerShellIntegration()
bool QWaylandLayerShellIntegration::initialize(QtWaylandClient::QWaylandDisplay *display) bool QWaylandLayerShellIntegration::initialize(QtWaylandClient::QWaylandDisplay *display)
{ {
Q_UNUSED(display) #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
return m_layerShell->isActive(); QWaylandShellIntegration::initialize(display);
#endif
display->addRegistryListener(registryLayer, this);
return m_layerShell != nullptr;
} }
QtWaylandClient::QWaylandShellSurface *QWaylandLayerShellIntegration::createShellSurface(QtWaylandClient::QWaylandWindow *window) QtWaylandClient::QWaylandShellSurface *QWaylandLayerShellIntegration::createShellSurface(QtWaylandClient::QWaylandWindow *window)
{ {
return new QWaylandLayerSurface(m_layerShell.get(), window); return m_layerShell->createLayerSurface(window);
} }
void QWaylandLayerShellIntegration::registryLayer(void *data, struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
{
QWaylandLayerShellIntegration *shell = static_cast<QWaylandLayerShellIntegration *>(data);
if (interface == zwlr_layer_shell_v1_interface.name)
shell->m_layerShell.reset(new QWaylandLayerShell(registry, id, std::min(version, 4u)));
}
} }
//#include "qwaylandlayershellintegration.moc"

View File

@ -27,6 +27,8 @@ public:
QtWaylandClient::QWaylandShellSurface *createShellSurface(QtWaylandClient::QWaylandWindow *window) override; QtWaylandClient::QWaylandShellSurface *createShellSurface(QtWaylandClient::QWaylandWindow *window) override;
private: private:
static void registryLayer(void *data, struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version);
QScopedPointer<QWaylandLayerShell> m_layerShell; QScopedPointer<QWaylandLayerShell> m_layerShell;
}; };

View File

@ -5,7 +5,7 @@
* SPDX-License-Identifier: LGPL-3.0-or-later * SPDX-License-Identifier: LGPL-3.0-or-later
*/ */
#include "interfaces/window.h" #include "interfaces/shell.h"
#include "layershellqt_logging.h" #include "layershellqt_logging.h"
#include "qwaylandlayershell_p.h" #include "qwaylandlayershell_p.h"
#include "qwaylandlayersurface_p.h" #include "qwaylandlayersurface_p.h"
@ -36,31 +36,15 @@ QWaylandLayerSurface::QWaylandLayerSurface(QWaylandLayerShell *shell, QtWaylandC
} }
} }
init(shell->get_layer_surface(window->waylandSurface()->object(), output, interface->layer(), interface->scope())); init(shell->get_layer_surface(window->waylandSurface()->object(), output, interface->layer(), interface->scope()));
connect(interface, &Window::layerChanged, this, [this, interface]() {
setLayer(interface->layer()); Window::Anchors anchors = interface->anchors();
});
set_anchor(interface->anchors()); set_anchor(interface->anchors());
connect(interface, &Window::anchorsChanged, this, [this, interface]() {
set_anchor(interface->anchors());
});
setExclusiveZone(interface->exclusionZone());
connect(interface, &Window::exclusionZoneChanged, this, [this, interface]() {
setExclusiveZone(interface->exclusionZone());
});
setMargins(interface->margins()); setMargins(interface->margins());
connect(interface, &Window::marginsChanged, this, [this, interface]() {
setMargins(interface->margins());
});
setKeyboardInteractivity(interface->keyboardInteractivity()); setKeyboardInteractivity(interface->keyboardInteractivity());
connect(interface, &Window::keyboardInteractivityChanged, this, [this, interface]() { setExclusiveZone(interface->exclusionZone());
setKeyboardInteractivity(interface->keyboardInteractivity());
});
QSize size = window->surfaceSize(); QSize size = window->surfaceSize();
const Window::Anchors anchors = interface->anchors();
if ((anchors & Window::AnchorLeft) && (anchors & Window::AnchorRight)) { if ((anchors & Window::AnchorLeft) && (anchors & Window::AnchorRight)) {
size.setWidth(0); size.setWidth(0);
} }

View File

@ -14,6 +14,7 @@
#include <QMetaEnum> #include <QMetaEnum>
#include <interfaces/shell.h>
#include <interfaces/window.h> #include <interfaces/window.h>
using namespace LayerShellQt; using namespace LayerShellQt;
@ -50,6 +51,8 @@ class BasicWindow : public QRasterWindow
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
Shell::useLayerShell();
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
const auto layerMetaEnum = QMetaEnum::fromType<Window::Layer>(); const auto layerMetaEnum = QMetaEnum::fromType<Window::Layer>();
@ -76,8 +79,6 @@ int main(int argc, char **argv)
BasicWindow window; BasicWindow window;
LayerShellQt::Window *layerShell = LayerShellQt::Window::get(&window); LayerShellQt::Window *layerShell = LayerShellQt::Window::get(&window);
layerShell->setLayer(Window::LayerBottom);
if (parser.isSet(marginsOption)) { if (parser.isSet(marginsOption)) {
int margins = parser.value(marginsOption).toInt(); int margins = parser.value(marginsOption).toInt();
layerShell->setMargins({margins, margins, margins, margins}); layerShell->setMargins({margins, margins, margins, margins});
@ -101,10 +102,6 @@ int main(int argc, char **argv)
window.show(); window.show();
BasicWindow window2;
window2.resize(400, 400);
window2.show();
// just so you don't block yourself out whilst testing // just so you don't block yourself out whilst testing
QTimer::singleShot(5000, &app, &QGuiApplication::quit); QTimer::singleShot(5000, &app, &QGuiApplication::quit);
return app.exec(); return app.exec();