Compare commits

...

6 Commits

Author SHA1 Message Date
David Edmundson
678e54a49c support multi shells within Qt5 2022-06-28 09:38:46 +01:00
David Edmundson
3a9d0a490f Use change signals on Window interface class.
QWaylandLayerSurface pulled data from the Window on startup. The Window
pushed data into the QWaylandLayerSurface on changes. Having two
patterns is a bit off.

This moves everything to a single design, pulling from the public
interface. This allows us to drop a code path that meddles with
QWaylandWindow internals.
2022-06-27 23:25:28 +01:00
Jonathan Esk-Riddell
13961ef7b9 Update qt5 version requirement to 5.15.2
GIT_SILENT
2022-06-27 10:02:56 +01:00
Jonathan Esk-Riddell
ff6155a5af Update kf5 version requirement to 5.94
GIT_SILENT
2022-06-27 10:02:56 +01:00
Nicolas Fella
34e7c90c2d Mark required deps as required
BUG: 454912
2022-06-06 12:26:10 +02:00
Jonathan Esk-Riddell
563b61c75c Update version number for 5.25.80
GIT_SILENT
2022-05-19 12:26:13 +01:00
5 changed files with 57 additions and 45 deletions

View File

@@ -4,13 +4,13 @@
cmake_minimum_required(VERSION 3.16)
project(layershellqt)
set(PROJECT_VERSION "5.24.90")
set(PROJECT_VERSION "5.25.80")
set(PROJECT_VERSION_MAJOR 5)
set(CMAKE_C_STANDARD 99)
set(QT_MIN_VERSION "5.15.0")
set(KF5_MIN_VERSION "5.91")
set(QT_MIN_VERSION "5.15.2")
set(KF5_MIN_VERSION "5.94")
set(KDE_COMPILERSETTINGS_LEVEL "5.82")
set(CMAKE_CXX_STANDARD 17)
@@ -33,11 +33,11 @@ include(ECMQtDeclareLoggingCategory)
find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS WaylandClient Qml)
if (QT_MAJOR_VERSION EQUAL "5")
find_package(Qt5XkbCommonSupport REQUIRED PRIVATE)
find_package(QtWaylandScanner)
find_package(QtWaylandScanner REQUIRED)
endif()
find_package(WaylandScanner)
find_package(WaylandScanner REQUIRED)
find_package(Wayland 1.3 COMPONENTS Client Server)
find_package(WaylandProtocols)
find_package(WaylandProtocols REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(XKBCOMMON xkbcommon REQUIRED IMPORTED_TARGET)

View File

@@ -6,6 +6,7 @@
#include "window.h"
#include "../qwaylandlayersurface_p.h"
#include "../qwaylandlayershellintegration_p.h"
#include <layershellqt_logging.h>
#include <private/qwaylandshellsurface_p.h>
#include <private/qwaylandwindow_p.h>
@@ -27,7 +28,6 @@ public:
Window::KeyboardInteractivity keyboardInteractivity = Window::KeyboardInteractivityExclusive;
Window::Layer layer = Window::LayerTop;
QMargins margins;
QWaylandLayerSurface *getSurface() const;
QPointer<QScreen> desiredOutput;
};
@@ -41,9 +41,7 @@ Window::~Window()
void Window::setAnchors(Anchors anchors)
{
d->anchors = anchors;
if (auto surface = d->getSurface()) {
surface->setAnchor(anchors);
}
Q_EMIT anchorsChanged();
}
Window::Anchors Window::anchors() const
@@ -54,9 +52,7 @@ Window::Anchors Window::anchors() const
void Window::setExclusiveZone(int32_t zone)
{
d->exclusionZone = zone;
if (auto surface = d->getSurface()) {
surface->setExclusiveZone(zone);
}
Q_EMIT exclusionZoneChanged();
}
int32_t Window::exclusionZone() const
@@ -67,9 +63,7 @@ int32_t Window::exclusionZone() const
void Window::setMargins(const QMargins &margins)
{
d->margins = margins;
if (auto surface = d->getSurface()) {
surface->setMargins(margins);
}
Q_EMIT marginsChanged();
}
QMargins Window::margins() const
@@ -80,9 +74,7 @@ QMargins Window::margins() const
void Window::setKeyboardInteractivity(KeyboardInteractivity interactivity)
{
d->keyboardInteractivity = interactivity;
if (auto surface = d->getSurface()) {
surface->setKeyboardInteractivity(interactivity);
}
Q_EMIT keyboardInteractivityChanged();
}
Window::KeyboardInteractivity Window::keyboardInteractivity() const
@@ -93,9 +85,6 @@ Window::KeyboardInteractivity Window::keyboardInteractivity() const
void Window::setLayer(Layer layer)
{
d->layer = layer;
if (auto surface = d->getSurface()) {
surface->setLayer(layer);
}
}
void Window::setScope(const QString &scope)
@@ -129,6 +118,23 @@ Window::Window(QWindow *window)
, d(new WindowPrivate(window))
{
s_map.insert(d->parentWindow, this);
//BEGIN Compat mode
window->winId();
window->setFlag(Qt::BypassWindowManagerHint);
auto ww = dynamic_cast<QtWaylandClient::QWaylandWindow *>(d->parentWindow->handle());
if (!ww) {
qCDebug(LAYERSHELLQT) << "window not a wayland window" << d->parentWindow;
return;
}
QWaylandLayerShellIntegration shellIntegration;
shellIntegration.initialize(ww->display());
shellIntegration.createShellSurface(ww);
// we can't block for configure events
// a round trip should mean we'll have one by the time we attach the buffer
ww->display()->forceRoundTrip();
//END compat mode
}
Window *Window::get(QWindow *window)
@@ -139,21 +145,3 @@ Window *Window::get(QWindow *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

@@ -93,6 +93,13 @@ public:
*/
static Window *get(QWindow *window);
Q_SIGNALS:
void anchorsChanged();
void exclusionZoneChanged();
void marginsChanged();
void keyboardInteractivityChanged();
void layerChanged();
private:
Window(QWindow *window);
QScopedPointer<WindowPrivate> d;

View File

@@ -36,15 +36,31 @@ QWaylandLayerSurface::QWaylandLayerSurface(QWaylandLayerShell *shell, QtWaylandC
}
}
init(shell->get_layer_surface(window->waylandSurface()->object(), output, interface->layer(), interface->scope()));
Window::Anchors anchors = interface->anchors();
connect(interface, &Window::layerChanged, this, [this, interface]() {
set_layer(interface->layer());
});
set_anchor(interface->anchors());
setMargins(interface->margins());
setKeyboardInteractivity(interface->keyboardInteractivity());
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());
connect(interface, &Window::marginsChanged, this, [this, interface]() {
setMargins(interface->margins());
});
setKeyboardInteractivity(interface->keyboardInteractivity());
connect(interface, &Window::keyboardInteractivityChanged, this, [this, interface]() {
setKeyboardInteractivity(interface->keyboardInteractivity());
});
QSize size = window->surfaceSize();
const Window::Anchors anchors = interface->anchors();
if ((anchors & Window::AnchorLeft) && (anchors & Window::AnchorRight)) {
size.setWidth(0);
}

View File

@@ -51,7 +51,8 @@ class BasicWindow : public QRasterWindow
int main(int argc, char **argv)
{
Shell::useLayerShell();
// Shell::useLayerShell();
qputenv("QT_WAYLAND_USE_BYPASSWINDOWMANAGERHINT", "1");
QGuiApplication app(argc, argv);