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 54 additions and 42 deletions

View File

@@ -4,13 +4,13 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
project(layershellqt) project(layershellqt)
set(PROJECT_VERSION "5.25.0") set(PROJECT_VERSION "5.25.80")
set(PROJECT_VERSION_MAJOR 5) set(PROJECT_VERSION_MAJOR 5)
set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD 99)
set(QT_MIN_VERSION "5.15.0") set(QT_MIN_VERSION "5.15.2")
set(KF5_MIN_VERSION "5.91") set(KF5_MIN_VERSION "5.94")
set(KDE_COMPILERSETTINGS_LEVEL "5.82") set(KDE_COMPILERSETTINGS_LEVEL "5.82")
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)

View File

@@ -6,6 +6,7 @@
#include "window.h" #include "window.h"
#include "../qwaylandlayersurface_p.h" #include "../qwaylandlayersurface_p.h"
#include "../qwaylandlayershellintegration_p.h"
#include <layershellqt_logging.h> #include <layershellqt_logging.h>
#include <private/qwaylandshellsurface_p.h> #include <private/qwaylandshellsurface_p.h>
#include <private/qwaylandwindow_p.h> #include <private/qwaylandwindow_p.h>
@@ -27,7 +28,6 @@ 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;
QWaylandLayerSurface *getSurface() const;
QPointer<QScreen> desiredOutput; QPointer<QScreen> desiredOutput;
}; };
@@ -41,9 +41,7 @@ Window::~Window()
void Window::setAnchors(Anchors anchors) void Window::setAnchors(Anchors anchors)
{ {
d->anchors = anchors; d->anchors = anchors;
if (auto surface = d->getSurface()) { Q_EMIT anchorsChanged();
surface->setAnchor(anchors);
}
} }
Window::Anchors Window::anchors() const Window::Anchors Window::anchors() const
@@ -54,9 +52,7 @@ Window::Anchors Window::anchors() const
void Window::setExclusiveZone(int32_t zone) void Window::setExclusiveZone(int32_t zone)
{ {
d->exclusionZone = zone; d->exclusionZone = zone;
if (auto surface = d->getSurface()) { Q_EMIT exclusionZoneChanged();
surface->setExclusiveZone(zone);
}
} }
int32_t Window::exclusionZone() const int32_t Window::exclusionZone() const
@@ -67,9 +63,7 @@ int32_t Window::exclusionZone() const
void Window::setMargins(const QMargins &margins) void Window::setMargins(const QMargins &margins)
{ {
d->margins = margins; d->margins = margins;
if (auto surface = d->getSurface()) { Q_EMIT marginsChanged();
surface->setMargins(margins);
}
} }
QMargins Window::margins() const QMargins Window::margins() const
@@ -80,9 +74,7 @@ QMargins Window::margins() const
void Window::setKeyboardInteractivity(KeyboardInteractivity interactivity) void Window::setKeyboardInteractivity(KeyboardInteractivity interactivity)
{ {
d->keyboardInteractivity = interactivity; d->keyboardInteractivity = interactivity;
if (auto surface = d->getSurface()) { Q_EMIT keyboardInteractivityChanged();
surface->setKeyboardInteractivity(interactivity);
}
} }
Window::KeyboardInteractivity Window::keyboardInteractivity() const Window::KeyboardInteractivity Window::keyboardInteractivity() const
@@ -93,9 +85,6 @@ 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)
@@ -129,6 +118,23 @@ Window::Window(QWindow *window)
, d(new WindowPrivate(window)) , d(new WindowPrivate(window))
{ {
s_map.insert(d->parentWindow, this); 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) Window *Window::get(QWindow *window)
@@ -139,21 +145,3 @@ 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

@@ -93,6 +93,13 @@ public:
*/ */
static Window *get(QWindow *window); static Window *get(QWindow *window);
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

@@ -36,15 +36,31 @@ 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]() {
Window::Anchors anchors = interface->anchors(); set_layer(interface->layer());
});
set_anchor(interface->anchors()); set_anchor(interface->anchors());
setMargins(interface->margins()); connect(interface, &Window::anchorsChanged, this, [this, interface]() {
setKeyboardInteractivity(interface->keyboardInteractivity()); set_anchor(interface->anchors());
});
setExclusiveZone(interface->exclusionZone()); 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(); 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

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